osaf/services/saf/immsv/immnd/ImmModel.cc  |  11 +++++++-
 osaf/services/saf/immsv/immnd/immnd_evt.c  |  40 ++++++++++++++++++++++++++++++
 osaf/services/saf/immsv/immnd/immnd_init.h |   2 +
 3 files changed, 52 insertions(+), 1 deletions(-)


When saImmOiObjectImplementerSet, saImmOiClassImplementerSet, 
saImmOiObjectImplementerRelease and saImmOiClassImplementerRelease are invoked 
for appliers, the calls will be only local and will not use fevs.
Object and class applier set info will be stored only on the local node.

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
@@ -717,6 +717,15 @@ immModel_genSpecialModify(IMMND_CB *cb, 
         genSpecialModify(req);
 }
 
+SaBoolT
+immModel_isApplier(IMMND_CB *cb, SaUint32T implId) {
+    ImplementerInfo *info = 
ImmModel::instance(&cb->immModel)->findImplementer(implId);
+    if(!info) {
+        return SA_FALSE;
+    }
+
+    return (info->mApplier) ? SA_TRUE : SA_FALSE;
+}
 
 SaUint32T
 immModel_getLocalAppliersForObj(IMMND_CB *cb,
@@ -13104,7 +13113,7 @@ ImmModel::implementerSet(const IMMSV_OCT
                         goto done;
                     }
 
-                    if(isApplier) { 
+                    if(isApplier && conn) {
                         if( ! obj->mClassInfo->mAppliers.empty()) {
                             ImplementerSet::iterator ii = 
obj->mClassInfo->mAppliers.begin();
                             for(; ii != obj->mClassInfo->mAppliers.end(); 
++ii) {
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
@@ -2894,6 +2894,12 @@ static uint32_t immnd_evt_proc_fevs_forw
                                 */
                                osafassert(immModel_immNotWritable(cb));
                                error = SA_AIS_OK;
+                       } else if(error == SA_AIS_ERR_NO_OP) {
+                               /* Internal error code which means that
+                                * the message will not be sent over fevs.
+                                * Message is processed only locally.
+                                */
+                               error = SA_AIS_OK;
                        }
 
                        if(asyncReq) {
@@ -3349,6 +3355,15 @@ static SaAisErrorT immnd_fevs_local_chec
                } else if(cb->mSyncFinalizing) {
                        //Writable, but sync is finalizing at coord.
                        error = SA_AIS_ERR_TRY_AGAIN;
+               } else if(immModel_isApplier(cb, 
frwrd_evt.info.immnd.info.implSet.impl_id)) {
+                       SaUint32T ccbId=0;
+                       error = immModel_classImplementerSet(cb, 
&(frwrd_evt.info.immnd.info.implSet), conn,
+                               nodeId, &ccbId);
+
+                       /* Returning SA_AIS_ERR_NO_OP means that the message 
will not be sent over fevs */
+                       if(error == SA_AIS_OK || error == 
SA_AIS_ERR_NO_BINDINGS) {
+                               error = SA_AIS_ERR_NO_OP;
+                       }
                }
                /* Else when imm is writable, idempotency can not be trusted 
locally.
                   OK will be returned, which will trigger forwarding over 
fevs. */
@@ -3381,6 +3396,15 @@ static SaAisErrorT immnd_fevs_local_chec
                } else if(cb->mSyncFinalizing) {
                        //Writable, but sync is finalizing at coord.
                        error = SA_AIS_ERR_TRY_AGAIN;
+               } else if(immModel_isApplier(cb, 
frwrd_evt.info.immnd.info.implSet.impl_id)) {
+                       SaUint32T ccbId=0;
+                       error = immModel_objectImplementerSet(cb, 
&(frwrd_evt.info.immnd.info.implSet), conn,
+                               nodeId, &ccbId);
+
+                       /* Returning SA_AIS_ERR_NO_OP means that the message 
will not be sent over fevs */
+                       if(error == SA_AIS_OK || error == 
SA_AIS_ERR_NO_BINDINGS) {
+                               error = SA_AIS_ERR_NO_OP;
+                       }
                }
                /* Else when imm is writable, idempotency can not be trusted 
locally.
                   OK will be returned, which will trigger forwarding over 
fevs. */
@@ -3398,6 +3422,14 @@ static SaAisErrorT immnd_fevs_local_chec
                if(fevsReq->sender_count != 0x1) {
                        LOG_WA("ERR_LIBRARY: IMMND_EVT_A2ND_OI_CL_IMPL_REL 
fevsReq->sender_count != 0x1");
                        error = SA_AIS_ERR_LIBRARY;
+               } else if(immModel_isApplier(cb, 
frwrd_evt.info.immnd.info.implSet.impl_id)) {
+                       error = immModel_classImplementerRelease(cb, 
&(frwrd_evt.info.immnd.info.implSet),
+                                       conn, nodeId);
+
+                       /* Returning SA_AIS_ERR_NO_OP means that the message 
will not be sent over fevs */
+                       if(error == SA_AIS_OK || error == 
SA_AIS_ERR_NO_BINDINGS) {
+                               error = SA_AIS_ERR_NO_OP;
+                       }
                }
                break;
 
@@ -3405,6 +3437,14 @@ static SaAisErrorT immnd_fevs_local_chec
                if(fevsReq->sender_count != 0x1) {
                        LOG_WA("ERR_LIBRARY: IMMND_EVT_A2ND_OI_OBJ_IMPL_REL 
fevsReq->sender_count != 0x1");
                        error = SA_AIS_ERR_LIBRARY;
+               } else if(immModel_isApplier(cb, 
frwrd_evt.info.immnd.info.implSet.impl_id)) {
+                       error = immModel_objectImplementerRelease(cb, 
&(frwrd_evt.info.immnd.info.implSet),
+                                       conn, nodeId);
+
+                       /* Returning SA_AIS_ERR_NO_OP means that the message 
will not be sent over fevs */
+                       if(error == SA_AIS_OK || error == 
SA_AIS_ERR_NO_BINDINGS) {
+                               error = SA_AIS_ERR_NO_OP;
+                       }
                }
                break;
 
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
@@ -166,6 +166,8 @@ extern "C" {
                    SaUint32T *continuationId, SaUint32T *pbeConn, SaClmNodeIdT 
*pbeNodeId, 
                    SaNameT* objName, bool* dnOrRdnIsLong, bool isObjectDnUsed);
 
+       SaBoolT immModel_isApplier(IMMND_CB *cb, SaUint32T implId);
+
        SaUint32T immModel_getLocalAppliersForObj(IMMND_CB *cb, const SaNameT* 
objName, SaUint32T ccbId,
                 SaUint32T **aplConnArr, SaBoolT externalRep);
        SaUint32T immModel_getLocalAppliersForCcb(IMMND_CB *cb, SaUint32T 
ccbId, SaUint32T **aplConnArr,

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to