osaf/services/saf/immsv/immd/immd_evt.c | 15 ++++++++++++--- osaf/services/saf/immsv/immnd/immnd_evt.c | 9 ++++++++- 2 files changed, 20 insertions(+), 4 deletions(-)
At the time of sync, when check-pointing to standby IMMD for IMMND_EVT_D2ND_GLOB_FEVS_REQ_2, the fevs message buffer will be set to NULL and message size will be set to 0. so, that the MBCSV check-pointing happens only for header. diff --git a/osaf/services/saf/immsv/immd/immd_evt.c b/osaf/services/saf/immsv/immd/immd_evt.c --- a/osaf/services/saf/immsv/immd/immd_evt.c +++ b/osaf/services/saf/immsv/immd/immd_evt.c @@ -251,7 +251,7 @@ uint32_t immd_evt_proc_fevs_req(IMMD_CB /* Populate & Send the FEVS Event to IMMND */ memset(&send_evt, 0, sizeof(IMMSV_EVT)); send_evt.type = IMMSV_EVT_TYPE_IMMND; - send_evt.info.immnd.type = (evt->type == IMMD_EVT_ND2D_FEVS_REQ_2)? + send_evt.info.immnd.type = ((evt->type == IMMD_EVT_ND2D_FEVS_REQ_2)||(evt->type == 0))? IMMND_EVT_D2ND_GLOB_FEVS_REQ_2: IMMND_EVT_D2ND_GLOB_FEVS_REQ; if ((evt->type == 0) && (fevs_req->sender_count > 0)) { @@ -266,8 +266,8 @@ uint32_t immd_evt_proc_fevs_req(IMMD_CB send_evt.info.immnd.info.fevsReq.msg.size = fevs_req->msg.size; /*Borrow the buffer from the input message instead of copying */ send_evt.info.immnd.info.fevsReq.msg.buf = fevs_req->msg.buf; - send_evt.info.immnd.info.fevsReq.isObjSync = (evt->type == IMMD_EVT_ND2D_FEVS_REQ_2)? - (fevs_req->isObjSync):0x0; + send_evt.info.immnd.info.fevsReq.isObjSync = ((evt->type == IMMD_EVT_ND2D_FEVS_REQ_2) || + (evt->type == 0 ))? (fevs_req->isObjSync):0x0; TRACE_5("immd_evt_proc_fevs_req send_count:%llu size:%u", send_evt.info.immnd.info.fevsReq.sender_count, send_evt.info.immnd.info.fevsReq.msg.size); @@ -280,6 +280,15 @@ uint32_t immd_evt_proc_fevs_req(IMMD_CB mbcp_msg.type = IMMD_A2S_MSG_FEVS; mbcp_msg.info.fevsReq = send_evt.info.immnd.info.fevsReq; + /* FEVS_REQ_2 messages are object sync messages. since this is mbcsv checkpointing + to standby, at the time of sync checkpointing complete fevs event is not required. + Checkpointing the header is sufficient to have the standby SC in sync with the fevs count.*/ + + if(evt->type == IMMD_EVT_ND2D_FEVS_REQ_2){ + mbcp_msg.info.fevsReq.msg.size = 0; + mbcp_msg.info.fevsReq.msg.buf = NULL; + mbcp_msg.info.fevsReq.isObjSync = 0x0; + } /*Checkpoint the message to standby director. Syncronous call=>wait for ack */ proc_rc = immd_mbcsv_sync_update(cb, &mbcp_msg); diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c b/osaf/services/saf/immsv/immnd/immnd_evt.c --- a/osaf/services/saf/immsv/immnd/immnd_evt.c +++ b/osaf/services/saf/immsv/immnd/immnd_evt.c @@ -8702,7 +8702,7 @@ static uint32_t immnd_evt_proc_fevs_rcv( SaBoolT originatedAtThisNd = (m_IMMSV_UNPACK_HANDLE_LOW(clnt_hdl) == cb->node_id); if (originatedAtThisNd) { - osafassert(!reply_dest || (reply_dest == cb->immnd_mdest_id)); + osafassert(!reply_dest || (reply_dest == cb->immnd_mdest_id) || isObjSync ); if (cb->fevs_replies_pending) { --(cb->fevs_replies_pending); /*flow control towards IMMD */ } @@ -8731,6 +8731,12 @@ static uint32_t immnd_evt_proc_fevs_rcv( } } + if ((evt->type == IMMND_EVT_D2ND_GLOB_FEVS_REQ_2) && (msg->size == 0) && (msg->buf == NULL)){ + // This is sync message Re-broadcasted by IMMD standby because of failover + TRACE("Re-broadcasted FEVS at the time of sync"); + goto done; + } + /*NORMAL CASE: Received the expected in-order message. */ SaAisErrorT err = SA_AIS_OK; @@ -8749,6 +8755,7 @@ static uint32_t immnd_evt_proc_fevs_rcv( } } + done: cb->highestProcessed++; dequeue_outgoing(cb); TRACE_LEAVE(); ------------------------------------------------------------------------------ Don't Limit Your Business. Reach for the Cloud. GigeNET's Cloud Solutions provide you with the tools and support that you need to offload your IT needs and focus on growing your business. Configured For All Businesses. Start Your Cloud Today. https://www.gigenetcloud.com/ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel