If relaxed node promotion is enabled, allow a SC to remain active if the peer SC can be seen, even if access to the consensus service is lost. --- src/amf/amfd/ndfsm.cc | 2 +- src/amf/amfd/ndproc.cc | 13 +++++++++++-- src/amf/amfd/proc.h | 2 +- 3 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/amf/amfd/ndfsm.cc b/src/amf/amfd/ndfsm.cc index 4146ddc..8c8f3c5 100644 --- a/src/amf/amfd/ndfsm.cc +++ b/src/amf/amfd/ndfsm.cc @@ -817,7 +817,7 @@ void avd_mds_avnd_down_evh(AVD_CL_CB *cb, AVD_EVT *evt) { if (cb->node_failover_delay == 0) { avd_node_failover(node); } - check_quorum(); + check_quorum(cb); node->node_info.member = SA_FALSE; // Update standby out of sync if standby sc goes down if (avd_cb->node_id_avd_other == node->node_info.nodeId) { diff --git a/src/amf/amfd/ndproc.cc b/src/amf/amfd/ndproc.cc index c4eebb1..ec347fc 100644 --- a/src/amf/amfd/ndproc.cc +++ b/src/amf/amfd/ndproc.cc @@ -1245,15 +1245,24 @@ void avd_node_failover(AVD_AVND *node, const bool mw_only) { TRACE_LEAVE(); } -void check_quorum() { +void check_quorum(AVD_CL_CB *cb) { TRACE_ENTER(); Consensus consensus_service; if (consensus_service.IsRemoteFencingEnabled() == false && consensus_service.IsWritable() == false) { + // if relaxed mode is enabled, ignore failure if peer SC is up + if (consensus_service.IsRelaxedNodePromotionEnabled() == true) { + AVD_AVND* peer = avd_node_find_nodeid(cb->node_id_avd_other); + if (peer != nullptr && peer->node_state == AVD_AVND_STATE_PRESENT) { + LOG_NO("Relaxed node promotion is enabled, peer SC is connected"); + return; + } + } + // remote fencing is disabled and we have lost write access // reboot this node to prevent split brain opensaf_reboot(0, nullptr, "Quorum lost. Rebooting this node to prevent split-brain"); } -} \ No newline at end of file +} diff --git a/src/amf/amfd/proc.h b/src/amf/amfd/proc.h index a378218..f1dc7ba 100644 --- a/src/amf/amfd/proc.h +++ b/src/amf/amfd/proc.h @@ -96,7 +96,7 @@ void avd_process_hb_event(AVD_CL_CB *cb_now, struct AVD_EVT *evt); extern void avd_node_mark_absent(AVD_AVND *node); extern void avd_tmr_snd_hb_evh(AVD_CL_CB *cb, AVD_EVT *evt); extern void avd_node_failover(AVD_AVND *node, const bool mw_only = false); -extern void check_quorum(); +extern void check_quorum(AVD_CL_CB *cb); extern AVD_SU *get_other_su_from_oper_list(AVD_SU *su); extern void su_complete_admin_op(AVD_SU *su, SaAisErrorT result); extern void comp_complete_admin_op(AVD_COMP *comp, SaAisErrorT result); -- 2.7.4 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel