- Split-brain recovery in headless enable, IMMND may expected restart.
If AMFND not wait IMMND restart but reinit CLM, CLM callback trigger,
clm_to_amf_node() is called then AMFND stuck in init IMM OM causes delay
restart IMMND, delay resend node_up then AMFD will order reboot node.
- In clm_to_amf_node(), use old amf node name if immnd is down.
---
src/amf/amfnd/avnd_cb.h | 1 +
src/amf/amfnd/clc.cc | 8 ++++++++
src/amf/amfnd/clm.cc | 7 ++++---
src/amf/amfnd/main.cc | 1 +
4 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/src/amf/amfnd/avnd_cb.h b/src/amf/amfnd/avnd_cb.h
index 8b0cc2304..0fa0590ff 100644
--- a/src/amf/amfnd/avnd_cb.h
+++ b/src/amf/amfnd/avnd_cb.h
@@ -125,6 +125,7 @@ typedef struct avnd_cb_tag {
SaTimeT scs_absence_max_duration;
/* the timer for supervision of the absence of SC */
AVND_TMR sc_absence_tmr;
+ bool immnd_down;
} AVND_CB;
#define AVND_CB_NULL ((AVND_CB *)0)
diff --git a/src/amf/amfnd/clc.cc b/src/amf/amfnd/clc.cc
index f78e1a707..f96f3b3a9 100644
--- a/src/amf/amfnd/clc.cc
+++ b/src/amf/amfnd/clc.cc
@@ -3333,6 +3333,14 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_CB *cb,
AVND_COMP *comp,
// outcome of command is reported in comp_clc_resp_callback()
}
+ if (comp->su->is_ncs &&
+ comp->name.find("safComp=IMMND,") != std::string::npos) {
+ if (cmd_type == AVND_COMP_CLC_CMD_TYPE_CLEANUP)
+ cb->immnd_down = true;
+ else if (cmd_type == AVND_COMP_CLC_CMD_TYPE_INSTANTIATE)
+ cb->immnd_down = false;
+ }
+
TRACE_2("success");
goto done;
diff --git a/src/amf/amfnd/clm.cc b/src/amf/amfnd/clm.cc
index 06eb229c7..7fef38daa 100644
--- a/src/amf/amfnd/clm.cc
+++ b/src/amf/amfnd/clm.cc
@@ -106,7 +106,7 @@ done:
}
static void clm_to_amf_node(void) {
- SaAisErrorT error;
+ SaAisErrorT error = SA_AIS_ERR_UNAVAILABLE;
SaImmSearchHandleT searchHandle;
SaNameT amfdn, clmdn;
SaImmSearchParametersT_2 searchParam;
@@ -122,9 +122,10 @@ static void clm_to_amf_node(void) {
searchParam.searchOneAttr.attrValueType = SA_IMM_ATTR_SASTRINGT;
searchParam.searchOneAttr.attrValue = &className;
- error = saImmOmInitialize_cond(&immOmHandle, nullptr, &immVersion);
+ if (avnd_cb->immnd_down == false)
+ error = saImmOmInitialize_cond(&immOmHandle, nullptr, &immVersion);
if (SA_AIS_OK != error) {
- LOG_WA("saImmOmInitialize failed. Use previous value of nodeName.");
+ LOG_WA("Use previous value of nodeName %s", avnd_cb->amf_nodeName.c_str());
osafassert(avnd_cb->amf_nodeName.empty() == false);
goto done1;
}
diff --git a/src/amf/amfnd/main.cc b/src/amf/amfnd/main.cc
index d7857fabe..cef0543e6 100644
--- a/src/amf/amfnd/main.cc
+++ b/src/amf/amfnd/main.cc
@@ -334,6 +334,7 @@ AVND_CB *avnd_cb_create() {
cb->is_avd_down = true;
cb->amfd_sync_required = false;
+ cb->immnd_down = false;
// retrieve hydra configuration from IMM
hydra_config_get(cb);
--
2.17.1
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel