@@ -402,14 +402,22 @@ where
402
402
) -> Result < Self , ChangeMembershipError < NID > > {
403
403
tracing:: debug!( change = debug( & change) , "{}" , func_name!( ) ) ;
404
404
405
- let last = self . get_joint_config ( ) . last ( ) . unwrap ( ) ;
405
+ let last = self . get_joint_config ( ) . last ( ) . unwrap ( ) . clone ( ) ;
406
406
407
407
let new_membership = match change {
408
- ChangeMembers :: AddVoter ( add_voter_ids) => {
408
+ ChangeMembers :: AddVoterIds ( add_voter_ids) => {
409
409
let new_voter_ids = last. union ( & add_voter_ids) . copied ( ) . collect :: < BTreeSet < _ > > ( ) ;
410
410
self . next_coherent ( new_voter_ids, retain)
411
411
}
412
- ChangeMembers :: RemoveVoter ( remove_voter_ids) => {
412
+ ChangeMembers :: AddVoters ( add_voters) => {
413
+ // Add nodes without overriding existent
414
+ self . nodes = Self :: extend_nodes ( self . nodes , & add_voters) ;
415
+
416
+ let add_voter_ids = add_voters. keys ( ) . copied ( ) . collect :: < BTreeSet < _ > > ( ) ;
417
+ let new_voter_ids = last. union ( & add_voter_ids) . copied ( ) . collect :: < BTreeSet < _ > > ( ) ;
418
+ self . next_coherent ( new_voter_ids, retain)
419
+ }
420
+ ChangeMembers :: RemoveVoters ( remove_voter_ids) => {
413
421
let new_voter_ids = last. difference ( & remove_voter_ids) . copied ( ) . collect :: < BTreeSet < _ > > ( ) ;
414
422
self . next_coherent ( new_voter_ids, retain)
415
423
}
@@ -480,7 +488,7 @@ mod tests {
480
488
481
489
// Add: no such learner
482
490
{
483
- let res = m ( ) . change ( ChangeMembers :: AddVoter ( btreeset ! { 4 } ) , true ) ;
491
+ let res = m ( ) . change ( ChangeMembers :: AddVoterIds ( btreeset ! { 4 } ) , true ) ;
484
492
assert_eq ! (
485
493
Err ( ChangeMembershipError :: LearnerNotFound ( LearnerNotFound { node_id: 4 } ) ) ,
486
494
res
@@ -489,7 +497,7 @@ mod tests {
489
497
490
498
// Add: ok
491
499
{
492
- let res = m ( ) . change ( ChangeMembers :: AddVoter ( btreeset ! { 3 } ) , true ) ;
500
+ let res = m ( ) . change ( ChangeMembers :: AddVoterIds ( btreeset ! { 3 } ) , true ) ;
493
501
assert_eq ! (
494
502
Ok ( Membership :: <u64 , ( ) > {
495
503
configs: vec![ btreeset! { 1 , 2 } , btreeset! { 1 , 2 , 3 } ] ,
@@ -499,9 +507,21 @@ mod tests {
499
507
) ;
500
508
}
501
509
510
+ // AddVoters
511
+ {
512
+ let res = m ( ) . change ( ChangeMembers :: AddVoters ( btreemap ! { 5 =>( ) } ) , true ) ;
513
+ assert_eq ! (
514
+ Ok ( Membership :: <u64 , ( ) > {
515
+ configs: vec![ btreeset! { 1 , 2 } , btreeset! { 1 , 2 , 5 } ] ,
516
+ nodes: btreemap! { 1 =>( ) , 2 =>( ) , 3 =>( ) , 5 =>( ) }
517
+ } ) ,
518
+ res
519
+ ) ;
520
+ }
521
+
502
522
// Remove: no such voter
503
523
{
504
- let res = m ( ) . change ( ChangeMembers :: RemoveVoter ( btreeset ! { 5 } ) , true ) ;
524
+ let res = m ( ) . change ( ChangeMembers :: RemoveVoters ( btreeset ! { 5 } ) , true ) ;
505
525
assert_eq ! (
506
526
Ok ( Membership :: <u64 , ( ) > {
507
527
configs: vec![ btreeset! { 1 , 2 } ] ,
@@ -513,13 +533,13 @@ mod tests {
513
533
514
534
// Remove: become empty
515
535
{
516
- let res = m ( ) . change ( ChangeMembers :: RemoveVoter ( btreeset ! { 1 , 2 } ) , true ) ;
536
+ let res = m ( ) . change ( ChangeMembers :: RemoveVoters ( btreeset ! { 1 , 2 } ) , true ) ;
517
537
assert_eq ! ( Err ( ChangeMembershipError :: EmptyMembership ( EmptyMembership { } ) ) , res) ;
518
538
}
519
539
520
540
// Remove: OK retain
521
541
{
522
- let res = m ( ) . change ( ChangeMembers :: RemoveVoter ( btreeset ! { 1 } ) , true ) ;
542
+ let res = m ( ) . change ( ChangeMembers :: RemoveVoters ( btreeset ! { 1 } ) , true ) ;
523
543
assert_eq ! (
524
544
Ok ( Membership :: <u64 , ( ) > {
525
545
configs: vec![ btreeset! { 1 , 2 } , btreeset! { 2 } ] ,
@@ -531,7 +551,7 @@ mod tests {
531
551
532
552
// Remove: OK, not retain; learner not removed
533
553
{
534
- let res = m ( ) . change ( ChangeMembers :: RemoveVoter ( btreeset ! { 1 } ) , false ) ;
554
+ let res = m ( ) . change ( ChangeMembers :: RemoveVoters ( btreeset ! { 1 } ) , false ) ;
535
555
assert_eq ! (
536
556
Ok ( Membership :: <u64 , ( ) > {
537
557
configs: vec![ btreeset! { 1 , 2 } , btreeset! { 2 } ] ,
@@ -547,7 +567,7 @@ mod tests {
547
567
configs : vec ! [ btreeset! { 1 , 2 } , btreeset! { 2 } ] ,
548
568
nodes : btreemap ! { 1 =>( ) , 2 =>( ) , 3 =>( ) } ,
549
569
} ;
550
- let res = mem. change ( ChangeMembers :: RemoveVoter ( btreeset ! { 1 } ) , false ) ;
570
+ let res = mem. change ( ChangeMembers :: RemoveVoters ( btreeset ! { 1 } ) , false ) ;
551
571
assert_eq ! (
552
572
Ok ( Membership :: <u64 , ( ) > {
553
573
configs: vec![ btreeset! { 2 } ] ,
0 commit comments