Hi Neel, I think the solution for this should be
> 2) Since the remote nodes doesn't have the applier mapping, they should not > do the ccb interference check. > In the ccb check of ImmModel::implementerSet(), 'if(isApplier)' should be > changed to 'if(isApplier && conn)'. When the same applier name is set on a newly joined node, we don't do the ccb check on the 'old' nodes. Of course, implicit class/object-implementer set won't work when the applier is moved to a different node. And I think 2) can be considered a defect rather than an enhancement. In the original design/protocol, class/obj-applier mapping is synced to remote nodes, so the remote nodes shouldn't do any check related to the mapping. Best Regards, Hung Nguyen - DEK Technologies -------------------------------------------------------------------------------- From: Neelakanta Reddy reddy.neelaka...@oracle.com Sent: Thursday, October 08, 2015 8:17PM To: Zoran Milinkovic zoran.milinko...@ericsson.com Cc: Opensaf-devel opensaf-devel@lists.sourceforge.net Subject: Re: [devel] [PATCH 1 of 1] imm: synchronize applier set on all nodes [#1504] Hi zoran, The below patch does not solve the problem indicated in the ticket. . if (originatedAtThisNd) { /*Send reply to client from this ND. */ immnd_client_node_get(cb, clnt_hdl, &cl_node); - if (cl_node == NULL) { + if ((cl_node == NULL) || (discardImplementer == SA_TRUE)) { The above lines will only send IMMD_EVT_ND2D_DISCARD_IMPL when the implementer is connected from the originating node. In case , if the same applier is connected from the newly joined node DISCARD_IMPL is not sent. The solution is DISCARD_IMPL in immnd_evt_proc_cl_impl_set and immnd_evt_proc_obj_impl_set. Allow creation of applier in immnd_evt_proc_impl_set_rsp(i.e Remove the applier checks, so that the applier get connected with saImmOiImplementerSet(). If there is any active CCBs then the applier will be discarded either in class/object implementer set. /Neel. On Wednesday 07 October 2015 08:16 PM, Zoran Milinkovic wrote: > osaf/services/saf/immsv/immnd/ImmModel.cc | 12 +++++++++--- > osaf/services/saf/immsv/immnd/ImmModel.hh | 3 ++- > osaf/services/saf/immsv/immnd/immnd_evt.c | 15 ++++++++++----- > osaf/services/saf/immsv/immnd/immnd_init.h | 2 +- > 4 files changed, 22 insertions(+), 10 deletions(-) > > > If applier fails on the local node, the global discard implementer message > will be broadcasted to all nodes. > > 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 > @@ -1589,7 +1589,7 @@ SaAisErrorT > immModel_implementerSet(IMMND_CB *cb, const IMMSV_OCTET_STRING* implName, > SaUint32T implConn, SaUint32T implNodeId, > SaUint32T implId, MDS_DEST mds_dest, > - SaUint32T implTimeout) > + SaUint32T implTimeout, SaBoolT *discardImplementer) > { > return > ImmModel::instance(&cb->immModel)->implementerSet(implName, > @@ -1597,7 +1597,8 @@ immModel_implementerSet(IMMND_CB *cb, co > implNodeId, > implId, > (SaUint64T) mds_dest, > - implTimeout); > + implTimeout, > + discardImplementer); > } > > SaAisErrorT > @@ -13030,12 +13031,15 @@ ImmModel::implementerSet(const IMMSV_OCT > SaUint32T nodeId, > SaUint32T implementerId, > SaUint64T mds_dest, > - SaUint32T implTimeout) > + SaUint32T implTimeout, > + SaBoolT *discardImplementer) > { > SaAisErrorT err = SA_AIS_OK; > CcbVector::iterator i; > TRACE_ENTER(); > > + *discardImplementer = SA_FALSE; > + > if(immNotWritable() && !protocol43Allowed()) { > TRACE_LEAVE(); > return SA_AIS_ERR_TRY_AGAIN; > @@ -13108,6 +13112,7 @@ ImmModel::implementerSet(const IMMSV_OCT > TRACE("TRY_AGAIN: ccb %u is active on > object '%s' " > "bound to class applier '%s'. Can > not re-attach applier", > ccb->mId, omit->first.c_str(), > implName.c_str()); > + *discardImplementer = SA_TRUE; > err = SA_AIS_ERR_TRY_AGAIN; > goto done; > } > @@ -13121,6 +13126,7 @@ ImmModel::implementerSet(const IMMSV_OCT > TRACE("TRY_AGAIN: ccb %u is active on > object '%s' " > "bound to object applier '%s'. Can > not re-attach applier", > ccb->mId, omit->first.c_str(), > implName.c_str()); > + *discardImplementer = SA_TRUE; > err = SA_AIS_ERR_TRY_AGAIN; > goto done; > } > 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 > @@ -397,7 +397,8 @@ public: > SaUint32T nodeId, > SaUint32T ownerId, > SaUint64T mds_dest, > - SaUint32T implTimeout); > + SaUint32T implTimeout, > + SaBoolT *discardImplementer); > > SaAisErrorT classImplementerSet( > const struct > ImmsvOiImplSetReq* 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 > @@ -9523,6 +9523,7 @@ static void immnd_evt_proc_impl_set_rsp( > NCS_NODE_ID nodeId; > SaUint32T conn; > SaUint32T implId = 0; > + SaBoolT discardImplementer = SA_FALSE; > > osafassert(evt); > osafassert(!originatedAtThisNd || reply_dest == cb->immnd_mdest_id); > @@ -9539,13 +9540,13 @@ static void immnd_evt_proc_impl_set_rsp( > > err = immModel_implementerSet(cb, &(evt->info.implSet.impl_name), > (originatedAtThisNd) ? conn : 0, nodeId, implId, > - reply_dest, evt->info.implSet.oi_timeout); > + reply_dest, evt->info.implSet.oi_timeout, > &discardImplementer); > > if (originatedAtThisNd) { /*Send reply to client from this ND. */ > immnd_client_node_get(cb, clnt_hdl, &cl_node); > - if (cl_node == NULL) { > + if ((cl_node == NULL) || (discardImplementer == SA_TRUE)) { > /* Client was down */ > - TRACE_5("Failed to get client node, discarding > implementer id:%u for connection: %u", implId, conn); > + TRACE_5("Discarding implementer id:%u for connection: > %u", implId, conn); > memset(&send_evt, '\0', sizeof(IMMSV_EVT)); > send_evt.type = IMMSV_EVT_TYPE_IMMD; > send_evt.info.immd.type = IMMD_EVT_ND2D_DISCARD_IMPL; > @@ -9556,8 +9557,12 @@ static void immnd_evt_proc_impl_set_rsp( > /* Mark the implementer as dying to make sure no upcall > is sent to the client. > The implementer will be really discarded when > global-discard message comes */ > immModel_discardImplementer(cb, implId, SA_FALSE, NULL, > NULL); > - return; > - } else if (cl_node->mIsStale) { > + > + if(cl_node == NULL) { > + return; > + } > + } > + if (cl_node->mIsStale) { > LOG_WA("IMMND - Client went down so no response"); > return; > } > 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 > @@ -225,7 +225,7 @@ extern "C" { > SaAisErrorT > immModel_implementerSet(IMMND_CB *cb, const IMMSV_OCTET_STRING > *implName, > SaUint32T implConn, SaUint32T implNodeId, > SaUint32T implId, > - MDS_DEST mds_dest, SaUint32T implTimeout); > + MDS_DEST mds_dest, SaUint32T implTimeout, > SaBoolT *discardImplementer); > > SaAisErrorT > immModel_implementerClear(IMMND_CB *cb, const struct > ImmsvOiImplSetReq *req, ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel