diff --git a/src/raft/RaftManager.cc b/src/raft/RaftManager.cc index 1023382c42..175752a78a 100644 --- a/src/raft/RaftManager.cc +++ b/src/raft/RaftManager.cc @@ -477,6 +477,10 @@ void RaftManager::leader() replica_manager.start_replica_threads(_follower_ids); heartbeat_manager.start_replica_threads(_follower_ids); + heartbeat_manager.replicate(); + + clock_gettime(CLOCK_REALTIME, &last_heartbeat); + pthread_mutex_unlock(&mutex); aclm->reload_rules(); @@ -555,12 +559,6 @@ void RaftManager::follower(unsigned int _term) requests.clear(); - //Reset heartbeat when turning into follower when a higher term is found: - // 1. On vote request - // 2. On heartbeat response - // 3. On log replicate request - clock_gettime(CLOCK_REALTIME, &last_heartbeat); - pthread_mutex_unlock(&mutex); if ( nd.is_federation_master() ) @@ -834,7 +832,6 @@ void RaftManager::timer_action(const ActionRequest& ar) time_t sec = last_heartbeat.tv_sec + broadcast_timeout.tv_sec; long nsec = last_heartbeat.tv_nsec + broadcast_timeout.tv_nsec; - if ((sec < the_time.tv_sec) || (sec == the_time.tv_sec && nsec <= the_time.tv_nsec)) { @@ -1024,6 +1021,12 @@ void RaftManager::request_vote() /* ------------------------------------------------------------------ */ pthread_mutex_lock(&mutex); + if ( state != CANDIDATE ) + { + pthread_mutex_unlock(&mutex); + break; + } + votedfor = -1; raft_state.replace("VOTEDFOR", votedfor); @@ -1034,7 +1037,6 @@ void RaftManager::request_vote() logdb->update_raft_state(raft_state_name, raft_state_xml); - ms = ( (float) rand() / RAND_MAX ) * (election_timeout.tv_sec * 1000 + election_timeout.tv_nsec / 1000000); diff --git a/src/rm/RequestManagerZone.cc b/src/rm/RequestManagerZone.cc index 3f9baf9dfd..6ffaeeed56 100644 --- a/src/rm/RequestManagerZone.cc +++ b/src/rm/RequestManagerZone.cc @@ -531,8 +531,6 @@ void ZoneVoteRequest::request_execute(xmlrpc_c::paramList const& paramList, return; } - raftm->update_last_heartbeat(-1); - success_response(static_cast(current_term), att); }