immnd going to headless twice when receive event NCSMDS_DOWN, NCSMDS_RED_DOWN in the same time.
The fix is prevent go to headless many time. --- src/imm/immnd/immnd_evt.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/imm/immnd/immnd_evt.c b/src/imm/immnd/immnd_evt.c index 656ec9398..9257529e8 100644 --- a/src/imm/immnd/immnd_evt.c +++ b/src/imm/immnd/immnd_evt.c @@ -12230,6 +12230,7 @@ static uint32_t immnd_evt_proc_mds_evt(IMMND_CB *cb, IMMND_EVT *evt) /*TRACE_ENTER(); */ uint32_t rc = NCSCC_RC_SUCCESS; bool is_headless = false; + bool already_headless = false; IMMSV_MDS_INFO *mdsInfo = &evt->info.mds_info; if ((mdsInfo->change == NCSMDS_DOWN) && @@ -12243,11 +12244,17 @@ static uint32_t immnd_evt_proc_mds_evt(IMMND_CB *cb, IMMND_EVT *evt) /* In multi partitioned clusters rejoin, IMMND may not realize * headless due to see IMMDs from different partitions */ if (mdsInfo->svc_id == NCSMDS_SVC_ID_IMMD) { + if ((cb->immd_node_id == 0) && (cb->other_immd_id == 0)) { + TRACE_2("Node already headless"); + already_headless = true; + } switch (mdsInfo->change) { case NCSMDS_DOWN: - is_headless = true; - cb->immd_node_id = 0; - cb->other_immd_id = 0; + if (!already_headless) { + is_headless = true; + cb->immd_node_id = 0; + cb->other_immd_id = 0; + } break; case NCSMDS_RED_UP: if ((mdsInfo->role == V_DEST_RL_STANDBY) && @@ -12286,7 +12293,8 @@ static uint32_t immnd_evt_proc_mds_evt(IMMND_CB *cb, IMMND_EVT *evt) TRACE_2("IMMD RED_DOWN EVENT %x role=%d ==> ACT:%x SBY:%x", mdsInfo->node_id, mdsInfo->role, cb->immd_node_id, cb->other_immd_id); - if ((cb->immd_node_id == 0) && (cb->other_immd_id == 0)) { + if (!already_headless && (cb->immd_node_id == 0) && + (cb->other_immd_id == 0)) { LOG_WA("Both Active & Standby DOWN, going to headless"); is_headless = true; } -- 2.25.1 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel