From b6f868fda1d5f7dcc5fbbd2e68c50bfcf370826b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Czern=C3=BD?= Date: Fri, 26 Feb 2021 15:13:32 +0100 Subject: [PATCH] M #-: Fix HA synchronization (#888) --- src/nebula/Nebula.cc | 3 ++- src/raft/RaftManager.cc | 6 +++--- src/rm/RequestManagerZone.cc | 10 +++++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/nebula/Nebula.cc b/src/nebula/Nebula.cc index 6ac5f986f7..d4d95688c9 100644 --- a/src/nebula/Nebula.cc +++ b/src/nebula/Nebula.cc @@ -1180,6 +1180,8 @@ void Nebula::start(bool bootstrap_only) rm->finalize(); + raftm->finalize(); + if (!cache) { vmm->finalize(); @@ -1206,7 +1208,6 @@ void Nebula::start(bool bootstrap_only) ipamm->join_thread(); } - raftm->finalize(); aclm->finalize(); authm->finalize(); diff --git a/src/raft/RaftManager.cc b/src/raft/RaftManager.cc index 60104ccf3c..3b33b347ba 100644 --- a/src/raft/RaftManager.cc +++ b/src/raft/RaftManager.cc @@ -128,9 +128,9 @@ RaftManager::RaftManager(int id, const VectorAttribute * leader_hook_mad, set_timeout(bcast, broadcast_timeout); set_timeout(elect, election_timeout); - // 5 seconds warm-up to start election + // 15 seconds warm-up to start election clock_gettime(CLOCK_REALTIME, &last_heartbeat); - last_heartbeat.tv_sec += 5; + last_heartbeat.tv_sec += 15; // ------------------------------------------------------------------------- // Initialize Hooks @@ -688,7 +688,7 @@ void RaftManager::timer_action() { Nebula& nd = Nebula::instance(); - if ( nd.is_cache() ) + if ( nd.is_cache() || server_id < 0) { return; } diff --git a/src/rm/RequestManagerZone.cc b/src/rm/RequestManagerZone.cc index b01b75a392..0db0be7345 100644 --- a/src/rm/RequestManagerZone.cc +++ b/src/rm/RequestManagerZone.cc @@ -459,7 +459,7 @@ void ZoneVoteRequest::request_execute(xmlrpc_c::paramList const& paramList, RaftManager * raftm = nd.get_raftm(); unsigned int candidate_term = xmlrpc_c::value_int(paramList.getInt(1)); - unsigned int candidate_id = xmlrpc_c::value_int(paramList.getInt(2)); + int candidate_id = xmlrpc_c::value_int(paramList.getInt(2)); uint64_t candidate_log_index = xmlrpc_c::value_i8(paramList.getI8(3)); unsigned int candidate_log_term = xmlrpc_c::value_int(paramList.getInt(4)); @@ -471,6 +471,14 @@ void ZoneVoteRequest::request_execute(xmlrpc_c::paramList const& paramList, logdb->get_last_record_index(log_index, log_term); + if (candidate_id < 0) + { + att.resp_id = current_term; + + failure_response(INTERNAL, att); + return; + } + if (!att.is_oneadmin()) { att.resp_id = current_term;