@@ -499,11 +499,44 @@ static void raft_beat(raft_t r, int dst) {
499
499
free (m );
500
500
}
501
501
502
+ static void raft_reset_bytes_acked (raft_t r ) {
503
+ for (int i = 0 ; i < r -> config .peernum_max ; i ++ ) {
504
+ r -> peers [i ].acked .bytes = 0 ;
505
+ }
506
+ }
507
+
508
+ static void raft_reset_silent_time (raft_t r , int id ) {
509
+ for (int i = 0 ; i < r -> config .peernum_max ; i ++ ) {
510
+ if ((i == id ) || (id == NOBODY )) {
511
+ r -> peers [i ].silent_ms = 0 ;
512
+ }
513
+ }
514
+ }
515
+
516
+ // Returns true if we got the support of a majority and became the leader
517
+ static bool raft_become_leader (raft_t r ) {
518
+ if (r -> votes * 2 > r -> peernum ) {
519
+ // got the support of a majority
520
+ r -> role = LEADER ;
521
+ r -> leader = r -> me ;
522
+ raft_reset_bytes_acked (r );
523
+ raft_reset_silent_time (r , NOBODY );
524
+ raft_reset_timer (r );
525
+ shout ("became the leader\n" );
526
+ return true;
527
+ }
528
+ return false;
529
+ }
530
+
502
531
static void raft_claim (raft_t r ) {
503
532
assert (r -> role == CANDIDATE );
504
533
assert (r -> leader == NOBODY );
505
534
506
535
r -> votes = 1 ; // vote for self
536
+ if (raft_become_leader (r )) {
537
+ // no need to send any messages, since we are alone
538
+ return ;
539
+ }
507
540
508
541
raft_msg_claim_t m ;
509
542
@@ -995,20 +1028,6 @@ static void raft_handle_claim(raft_t r, raft_msg_claim_t *m) {
995
1028
raft_send (r , candidate , & reply , sizeof (reply ));
996
1029
}
997
1030
998
- static void raft_reset_bytes_acked (raft_t r ) {
999
- for (int i = 0 ; i < r -> config .peernum_max ; i ++ ) {
1000
- r -> peers [i ].acked .bytes = 0 ;
1001
- }
1002
- }
1003
-
1004
- static void raft_reset_silent_time (raft_t r , int id ) {
1005
- for (int i = 0 ; i < r -> config .peernum_max ; i ++ ) {
1006
- if ((i == id ) || (id == NOBODY )) {
1007
- r -> peers [i ].silent_ms = 0 ;
1008
- }
1009
- }
1010
- }
1011
-
1012
1031
static void raft_handle_vote (raft_t r , raft_msg_vote_t * m ) {
1013
1032
int sender = m -> msg .from ;
1014
1033
raft_peer_t * peer = r -> peers + sender ;
@@ -1022,14 +1041,7 @@ static void raft_handle_vote(raft_t r, raft_msg_vote_t *m) {
1022
1041
r -> votes ++ ;
1023
1042
}
1024
1043
1025
- if (r -> votes * 2 > r -> peernum ) {
1026
- // got the support of a majority
1027
- r -> role = LEADER ;
1028
- r -> leader = r -> me ;
1029
- raft_reset_bytes_acked (r );
1030
- raft_reset_silent_time (r , NOBODY );
1031
- raft_reset_timer (r );
1032
- }
1044
+ raft_become_leader (r );
1033
1045
}
1034
1046
1035
1047
void raft_handle_message (raft_t r , raft_msg_t m ) {
0 commit comments