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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel