Hi Neel, Reviewed and tested the patch. Ack from me.
BR, Hung Nguyen - DEK Technologies -------------------------------------------------------------------------------- From: Neelakanta Reddy [email protected] Sent: Monday, September 26, 2016 4:19PM To: Zoran Milinkovic, Hung Nguyen [email protected], [email protected] Cc: Opensaf-devel [email protected] Subject: [PATCH 1 of 1] imm:abort the uncommited ccbs when the implementer gracefully disconnects [#2056] osaf/services/saf/immsv/immnd/ImmModel.cc | 34 ++++++++++++++++++++++------- osaf/services/saf/immsv/immnd/ImmModel.hh | 4 ++- osaf/services/saf/immsv/immnd/immnd_evt.c | 16 ++++++++++++- osaf/services/saf/immsv/immnd/immnd_init.h | 3 +- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -1899,10 +1899,27 @@ immModel_discardImplementer(IMMND_CB* cb SaAisErrorT immModel_implementerClear(IMMND_CB *cb, const struct ImmsvOiImplSetReq* req, - SaUint32T implConn, SaUint32T implNodeId) -{ - return ImmModel::instance(&cb->immModel)->implementerClear(req, implConn, - implNodeId); + SaUint32T implConn, SaUint32T implNodeId, SaUint32T *globArrSize, SaUint32T** globccbIdArr) +{ + SaAisErrorT err; + ConnVector gv; + ConnVector::iterator gvi; + err = ImmModel::instance(&cb->immModel)->implementerClear(req, implConn, + implNodeId, gv, cb->mIsCoord); + + if (globArrSize && globccbIdArr) { + *globArrSize = (SaUint32T) gv.size(); + SaUint32T ix=0; + if(*globArrSize) { + *globccbIdArr = (SaUint32T *) malloc((*globArrSize)* sizeof(SaUint32T)); + for(gvi = gv.begin(); gvi!=gv.end(); ++gvi, ++ix) { + (*globccbIdArr)[ix] = (*gvi); + } + } + osafassert(ix==(*globArrSize)); + } + + return err; } SaAisErrorT @@ -15594,11 +15611,10 @@ SaAisErrorT ImmModel::adminOwnerRelease( */ SaAisErrorT ImmModel::implementerClear(const struct ImmsvOiImplSetReq* req, - SaUint32T conn, - unsigned int nodeId) + SaUint32T conn, unsigned int nodeId, + IdVector& gv, bool isAtCoord) { SaAisErrorT err = SA_AIS_OK; - ConnVector gv; TRACE_ENTER(); ImplementerInfo* info = findImplementer(req->impl_id); @@ -15607,7 +15623,7 @@ ImmModel::implementerClear(const struct /* Sync is ongoing and we are a sync client. Remember the death of the implementer. */ - discardImplementer(req->impl_id, true, gv, false); + discardImplementer(req->impl_id, true, gv, isAtCoord); goto done; } LOG_NO("ERR_BAD_HANDLE: Not a correct implementer handle? %llu id:%u", @@ -15620,7 +15636,7 @@ ImmModel::implementerClear(const struct conn, nodeId); err = SA_AIS_ERR_BAD_HANDLE; } else { - discardImplementer(req->impl_id, true, gv, false); + discardImplementer(req->impl_id, true, gv, isAtCoord); } } diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh b/osaf/services/saf/immsv/immnd/ImmModel.hh --- a/osaf/services/saf/immsv/immnd/ImmModel.hh +++ b/osaf/services/saf/immsv/immnd/ImmModel.hh @@ -439,7 +439,9 @@ public: SaAisErrorT implementerClear( const struct ImmsvOiImplSetReq* req, SaUint32T con, - unsigned int nodeId); + unsigned int nodeId, + IdVector& gv, + bool isAtCoord); SaAisErrorT rtObjectCreate( struct ImmsvOmCcbObjectCreate* req, 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 @@ -9948,13 +9948,25 @@ static void immnd_evt_proc_impl_clr(IMMN IMMND_IMM_CLIENT_NODE *cl_node = NULL; SaAisErrorT err; NCS_NODE_ID nodeId; - SaUint32T conn; + SaUint32T conn, globArrSize = 0; + SaUint32T * globIdArr = NULL; osafassert(evt); conn = m_IMMSV_UNPACK_HANDLE_HIGH(clnt_hdl); nodeId = m_IMMSV_UNPACK_HANDLE_LOW(clnt_hdl); - err = immModel_implementerClear(cb, &(evt->info.implSet), (originatedAtThisNd) ? conn : 0, nodeId); + err = immModel_implementerClear(cb, &(evt->info.implSet), (originatedAtThisNd) ? conn : 0, nodeId, &globArrSize, &globIdArr); + if (err == SA_AIS_OK && globArrSize) { + SaUint32T ix; + for (ix = 0; ix < globArrSize; ++ix) { + LOG_WA("Cleared implementer for id %u, abort Non-critical ccbId %u which has " + "cleared the implementer", evt->info.implSet.impl_id, globIdArr[ix]); + immnd_proc_global_abort_ccb(cb, globIdArr[ix]); + } + free(globIdArr); + globIdArr = NULL; + globArrSize = 0; + } if (originatedAtThisNd) { /*Send reply to client from this ND. */ immnd_client_node_get(cb, clnt_hdl, &cl_node); diff --git a/osaf/services/saf/immsv/immnd/immnd_init.h b/osaf/services/saf/immsv/immnd/immnd_init.h --- a/osaf/services/saf/immsv/immnd/immnd_init.h +++ b/osaf/services/saf/immsv/immnd/immnd_init.h @@ -242,7 +242,8 @@ extern "C" { SaAisErrorT immModel_implementerClear(IMMND_CB *cb, const struct ImmsvOiImplSetReq *req, - SaUint32T implConn, SaUint32T implNodeId); + SaUint32T implConn, SaUint32T implNodeId, + SaUint32T *globArrSize, SaUint32T** globccbIdArr); SaAisErrorT immModel_classImplementerSet(IMMND_CB *cb, const struct ImmsvOiImplSetReq *req, SaUint32T implConn, SaUint32T implNodeId, SaUint32T* ccbId); ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
