If relaxed node promotion is enabled, allow this node to be promoted active if it can see a peer SC and this node has the lowest node ID. --- src/rde/rded/role.cc | 14 +++++++++++++- src/rde/rded/role.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/rde/rded/role.cc b/src/rde/rded/role.cc index 593ccf0eb..7ca020d5d 100644 --- a/src/rde/rded/role.cc +++ b/src/rde/rded/role.cc @@ -260,7 +260,8 @@ bool Role::IsCandidate() { // if relaxed node promotion is enabled, allow this node to be promoted // active if it can see a peer SC and this node has the lowest node ID if (consensus_service.IsRelaxedNodePromotionEnabled() == true && - cb->state == State::kNotActiveSeenPeer) { + cb->state == State::kNotActiveSeenPeer && + IsLowestNodeid() == true) { LOG_NO("Relaxed node promotion enabled. This node is a candidate."); result = true; } @@ -279,6 +280,17 @@ bool Role::IsPeerPresent() { return result; } +bool Role::IsLowestNodeid() { + bool result = true; + RDE_CONTROL_BLOCK* cb = rde_get_control_block(); + + for (auto peer_id : cb->peer_controllers) { + if (peer_id < own_node_id_) + return false; + } + return result; +} + uint32_t Role::SetRole(PCS_RDA_ROLE new_role) { TRACE_ENTER(); PCS_RDA_ROLE old_role = role_; diff --git a/src/rde/rded/role.h b/src/rde/rded/role.h index 9c63cbe7b..9bf1b10bd 100644 --- a/src/rde/rded/role.h +++ b/src/rde/rded/role.h @@ -38,6 +38,7 @@ class Role { void AddPeer(NODE_ID node_id); bool IsCandidate(); bool IsPeerPresent(); + bool IsLowestNodeid(); void SetPeerState(PCS_RDA_ROLE node_role, NODE_ID node_id); timespec* Poll(timespec* ts); uint32_t SetRole(PCS_RDA_ROLE new_role); -- 2.17.1 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel