Skip to content

Commit 67375a2

Browse files
committed
Change: RaftStorage: use EffectiveMembership instead of Option<_>
The value of membership config of an uninitialized raft-node should be: ```rust EffectiveMembership { log_id: None, membership: Membership::default(), } ``` I.e., there is always a membership config for either an initialized or an uninitialized raft-node. Because `EffectiveMembership` is not a value that could be `None`, but it is more like a container of values. Changed struct: ```rust struct InitialState { pub last_membership: EffectiveMembership<C>, ... } ``` Changed methods: ```rust RaftStorage::get_membership() -> Result<EffectiveMembership<C>, _>; RaftStorage::last_applied_state() -> Result<(_, EffectiveMembership<C>), _>; ```
1 parent 81cd344 commit 67375a2

13 files changed

Lines changed: 30 additions & 59 deletions

File tree

example-raft-kv/src/store/mod.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ pub struct ExampleStateMachine {
7373
pub last_applied_log: Option<LogId<ExampleNodeId>>,
7474

7575
// TODO: it should not be Option.
76-
pub last_membership: Option<EffectiveMembership<ExampleTypeConfig>>,
76+
pub last_membership: EffectiveMembership<ExampleTypeConfig>,
7777

7878
/// Application data.
7979
pub data: BTreeMap<String, String>,
@@ -252,13 +252,8 @@ impl RaftStorage<ExampleTypeConfig> for Arc<ExampleStore> {
252252

253253
async fn last_applied_state(
254254
&mut self,
255-
) -> Result<
256-
(
257-
Option<LogId<ExampleNodeId>>,
258-
Option<EffectiveMembership<ExampleTypeConfig>>,
259-
),
260-
StorageError<ExampleNodeId>,
261-
> {
255+
) -> Result<(Option<LogId<ExampleNodeId>>, EffectiveMembership<ExampleTypeConfig>), StorageError<ExampleNodeId>>
256+
{
262257
let state_machine = self.state_machine.read().await;
263258
Ok((state_machine.last_applied_log, state_machine.last_membership.clone()))
264259
}
@@ -288,7 +283,7 @@ impl RaftStorage<ExampleTypeConfig> for Arc<ExampleStore> {
288283
}
289284
},
290285
EntryPayload::Membership(ref mem) => {
291-
sm.last_membership = Some(EffectiveMembership::new(Some(entry.log_id), mem.clone()));
286+
sm.last_membership = EffectiveMembership::new(Some(entry.log_id), mem.clone());
292287
res.push(ExampleResponse { value: None })
293288
}
294289
};

memstore/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ pub struct MemStoreSnapshot {
9090
pub struct MemStoreStateMachine {
9191
pub last_applied_log: Option<LogId<MemNodeId>>,
9292

93-
pub last_membership: Option<EffectiveMembership<Config>>,
93+
pub last_membership: EffectiveMembership<Config>,
9494

9595
/// A mapping of client IDs to their state info.
9696
pub client_serial_responses: HashMap<String, (u64, Option<String>)>,
@@ -263,7 +263,7 @@ impl RaftStorage<Config> for Arc<MemStore> {
263263

264264
async fn last_applied_state(
265265
&mut self,
266-
) -> Result<(Option<LogId<MemNodeId>>, Option<EffectiveMembership<Config>>), StorageError<MemNodeId>> {
266+
) -> Result<(Option<LogId<MemNodeId>>, EffectiveMembership<Config>), StorageError<MemNodeId>> {
267267
let sm = self.sm.read().await;
268268
Ok((sm.last_applied_log, sm.last_membership.clone()))
269269
}
@@ -343,7 +343,7 @@ impl RaftStorage<Config> for Arc<MemStore> {
343343
res.push(ClientResponse(previous));
344344
}
345345
EntryPayload::Membership(ref mem) => {
346-
sm.last_membership = Some(EffectiveMembership::new(Some(entry.log_id), mem.clone()));
346+
sm.last_membership = EffectiveMembership::new(Some(entry.log_id), mem.clone());
347347
res.push(ClientResponse(None))
348348
}
349349
};

openraft/src/core/append_entries.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,6 @@ impl<C: RaftTypeConfig, N: RaftNetworkFactory<C>, S: RaftStorage<C>> RaftCore<C,
7777
// initialized. Because a node always commit a membership log as the first log entry.
7878
let membership = self.storage.get_membership().await?;
7979

80-
// NOTE: the first log, i.e. log at index 0 can also conflict with the leader and is removed.
81-
let membership = membership.unwrap_or_default();
82-
8380
self.update_membership(membership);
8481

8582
tracing::debug!("Done update membership");

openraft/src/core/install_snapshot.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,6 @@ impl<C: RaftTypeConfig, N: RaftNetworkFactory<C>, S: RaftStorage<C>> RaftCore<C,
232232
let membership = self.storage.get_membership().await?;
233233
tracing::debug!("storage membership: {:?}", membership);
234234

235-
assert!(membership.is_some());
236-
237-
let membership = membership.unwrap();
238-
239235
self.update_membership(membership);
240236

241237
self.snapshot_last_log_id = self.last_applied;

openraft/src/core/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ impl<C: RaftTypeConfig, N: RaftNetworkFactory<C>, S: RaftStorage<C>> RaftCore<C,
292292

293293
self.last_log_id = state.last_log_id;
294294
self.vote = state.vote;
295-
self.effective_membership = Arc::new(state.last_membership.unwrap_or_default());
295+
self.effective_membership = Arc::new(state.last_membership);
296296
self.last_applied = state.last_applied;
297297

298298
// NOTE: The commit index must be determined by a leader after

openraft/src/storage.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub struct InitialState<C: RaftTypeConfig> {
6161

6262
/// The latest cluster membership configuration found, in log or in state machine, else a new initial
6363
/// membership config consisting only of this node's ID.
64-
pub last_membership: Option<EffectiveMembership<C>>,
64+
pub last_membership: EffectiveMembership<C>,
6565
}
6666

6767
/// The state about logs.
@@ -193,18 +193,15 @@ where C: RaftTypeConfig
193193
/// TODO(xp): if there is no membership log, return `{log_id:None, membership: vec![]}`.
194194
/// The raft core should always have an effective_membership.
195195
/// Initially, it is empty.
196-
async fn get_membership(&mut self) -> Result<Option<EffectiveMembership<C>>, StorageError<C::NodeId>> {
196+
async fn get_membership(&mut self) -> Result<EffectiveMembership<C>, StorageError<C::NodeId>> {
197197
let (_, sm_mem) = self.last_applied_state().await?;
198198

199-
let sm_mem_next_index = match &sm_mem {
200-
None => 0,
201-
Some(mem) => mem.log_id.next_index(),
202-
};
199+
let sm_mem_next_index = sm_mem.log_id.next_index();
203200

204201
let log_mem = self.last_membership_in_log(sm_mem_next_index).await?;
205202

206-
if log_mem.is_some() {
207-
return Ok(log_mem);
203+
if let Some(x) = log_mem {
204+
return Ok(x);
208205
}
209206

210207
return Ok(sm_mem);
@@ -311,7 +308,7 @@ where C: RaftTypeConfig
311308
// NOTE: This can be made into sync, provided all state machines will use atomic read or the like.
312309
async fn last_applied_state(
313310
&mut self,
314-
) -> Result<(Option<LogId<C::NodeId>>, Option<EffectiveMembership<C>>), StorageError<C::NodeId>>;
311+
) -> Result<(Option<LogId<C::NodeId>>, EffectiveMembership<C>), StorageError<C::NodeId>>;
315312

316313
/// Apply the given payload of entries to the state machine.
317314
///

openraft/src/store_ext.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ where
124124
#[tracing::instrument(level = "trace", skip(self))]
125125
async fn last_applied_state(
126126
&mut self,
127-
) -> Result<(Option<LogId<C::NodeId>>, Option<EffectiveMembership<C>>), StorageError<C::NodeId>> {
127+
) -> Result<(Option<LogId<C::NodeId>>, EffectiveMembership<C>), StorageError<C::NodeId>> {
128128
self.inner().last_applied_state().await
129129
}
130130

openraft/src/testing/suite.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ where
194194

195195
let membership = store.get_membership().await?;
196196

197-
assert!(membership.is_none());
197+
assert_eq!(EffectiveMembership::default(), membership);
198198

199199
Ok(())
200200
}
@@ -218,7 +218,6 @@ where
218218
.await?;
219219

220220
let mem = store.get_membership().await?;
221-
let mem = mem.unwrap();
222221

223222
assert_eq!(Membership::new(vec![btreeset! {3,4,5}], None), mem.membership,);
224223
}
@@ -234,8 +233,6 @@ where
234233

235234
let mem = store.get_membership().await?;
236235

237-
let mem = mem.unwrap();
238-
239236
assert_eq!(Membership::new(vec![btreeset! {3, 4, 5}], None), mem.membership,);
240237
}
241238

@@ -250,8 +247,6 @@ where
250247

251248
let mem = store.get_membership().await?;
252249

253-
let mem = mem.unwrap();
254-
255250
assert_eq!(Membership::new(vec![btreeset! {7,8,9}], None), mem.membership,);
256251
}
257252

@@ -335,7 +330,7 @@ where
335330

336331
assert_eq!(
337332
Membership::new(vec![btreeset! {3,4,5}], None),
338-
initial.last_membership.unwrap().membership,
333+
initial.last_membership.membership,
339334
);
340335
}
341336

@@ -352,7 +347,7 @@ where
352347

353348
assert_eq!(
354349
Membership::new(vec![btreeset! {3,4,5}], None),
355-
initial.last_membership.unwrap().membership,
350+
initial.last_membership.membership,
356351
);
357352
}
358353

@@ -369,7 +364,7 @@ where
369364

370365
assert_eq!(
371366
Membership::new(vec![btreeset! {1,2,3}], None),
372-
initial.last_membership.unwrap().membership,
367+
initial.last_membership.membership,
373368
);
374369
}
375370

@@ -623,7 +618,7 @@ where
623618

624619
let (applied, membership) = store.last_applied_state().await?;
625620
assert_eq!(None, applied);
626-
assert_eq!(None, membership);
621+
assert_eq!(EffectiveMembership::default(), membership);
627622

628623
tracing::info!("--- with last_applied and last_membership");
629624
{
@@ -637,10 +632,10 @@ where
637632
let (applied, membership) = store.last_applied_state().await?;
638633
assert_eq!(Some(LogId::new(LeaderId::new(1, NODE_ID.into()), 3)), applied);
639634
assert_eq!(
640-
Some(EffectiveMembership::new(
635+
EffectiveMembership::new(
641636
Some(LogId::new(LeaderId::new(1, NODE_ID.into()), 3)),
642637
Membership::new(vec![btreeset! {1,2}], None)
643-
)),
638+
),
644639
membership
645640
);
646641
}
@@ -657,10 +652,10 @@ where
657652
let (applied, membership) = store.last_applied_state().await?;
658653
assert_eq!(Some(LogId::new(LeaderId::new(1, NODE_ID.into()), 5)), applied);
659654
assert_eq!(
660-
Some(EffectiveMembership::new(
655+
EffectiveMembership::new(
661656
Some(LogId::new(LeaderId::new(1, NODE_ID.into()), 3)),
662657
Membership::new(vec![btreeset! {1,2}], None)
663-
)),
658+
),
664659
membership
665660
);
666661
}

openraft/tests/initialization.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ async fn initialization() -> Result<()> {
8787

8888
let sm_mem = sto.last_applied_state().await?.1;
8989
assert_eq!(
90-
Some(EffectiveMembership::new(
90+
EffectiveMembership::new(
9191
Some(LogId::new(LeaderId::new(0, 0), 0)),
9292
Membership::new(vec![btreeset! {0,1,2}], None)
93-
)),
93+
),
9494
sm_mem
9595
);
9696
}

openraft/tests/membership/t10_add_learner.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,6 @@ async fn check_learner_after_leader_transfered() -> Result<()> {
220220
{
221221
let mut sto = router.get_storage_handle(&1)?;
222222
let m = sto.get_membership().await?;
223-
let m = m.unwrap();
224223

225224
assert_eq!(
226225
Membership::new(vec![btreeset! {1,3,4}], Some(btreeset! {2})),

0 commit comments

Comments
 (0)