Hi Hung,

Reviewed the patch.
Ack from me.

Thanks,
Zoran

-----Original Message-----
From: Hung Duc Nguyen 
Sent: den 14 juni 2016 12:38
To: Zoran Milinkovic; [email protected]
Cc: [email protected]
Subject: [PATCH 1 of 1] imm: Allow admo hard finalize messages for sync-clients 
during sync [#1827]

 osaf/services/saf/immsv/immnd/ImmModel.cc  |  23 ++++++++++++++++++++---
 osaf/services/saf/immsv/immnd/immnd_evt.c  |  29 ++++++++---------------------
 osaf/services/saf/immsv/immnd/immnd_init.h |   1 +
 3 files changed, 29 insertions(+), 24 deletions(-)


This patch is an alternative solution for discarding dead admo during
finalizing sync which is introduced in ticket #1820.
Admo hard finalize message are allowed for sync-clients during sync
and the sync-clients remember the dead admo.
That way, sync-clients can remove dead admo when finalizing sync.

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
@@ -534,6 +534,7 @@ static IdVector         sImplsDeadDuring
                                               // but before it arrives over 
fevs. 
                                               // This to avoid apparent 
implementor
                                               // re-create by finalizeSync (at 
non coord). 
+static IdVector         sAdmosDeadDuringSync; /* Keep track of admo that die 
during sync */
 
 static DeferredObjUpdatesMap sDeferredObjUpdatesMap;
 
@@ -710,6 +711,16 @@ immModel_adminOwnerDelete(IMMND_CB *cb, 
         adminOwnerDelete(ownerId, hard, cb->m2Pbe);
 }
 
+void
+immModel_addDeadAdminOwnerDuringSync(SaUint32T ownerId)
+{
+    osafassert(sImmNodeState == IMM_NODE_W_AVAILABLE); /* Sync client */
+    osafassert(sOwnerVector.empty());
+    /* Remember the dead admo during sync.
+     * They will be cleaned up when finalizing sync. */
+    TRACE("Adding admo id=%u to sAdmosDeadDuringSync", ownerId);
+    sAdmosDeadDuringSync.push_back(ownerId);
+}
 
 SaAisErrorT
 immModel_ccbCreate(IMMND_CB *cb, 
@@ -2758,6 +2769,7 @@ ImmModel::abortSync()
             sImmNodeState = IMM_NODE_FULLY_AVAILABLE; 
             sNodesDeadDuringSync.clear(); 
             sImplsDeadDuringSync.clear(); 
+            osafassert(sAdmosDeadDuringSync.empty());
 
             LOG_NO("NODE STATE-> IMM_NODE_FULLY_AVAILABLE (%u)", 
                 __LINE__);
@@ -2823,6 +2835,7 @@ ImmModel::abortSync()
 
             sNodesDeadDuringSync.clear(); 
             sImplsDeadDuringSync.clear(); 
+            sAdmosDeadDuringSync.clear();
             sImplDetachTime.clear();
 
            if(!sImplementerVector.empty()) {
@@ -17992,6 +18005,7 @@ ImmModel::objectSync(const ImmsvOmObject
  objectSyncExit:
     sImplsDeadDuringSync.clear();
     sNodesDeadDuringSync.clear();
+    sAdmosDeadDuringSync.clear();
     /* Clear the "tombstones" for Implementers and Nodes for each sync message
        received. The tiny hole that we need to plug only exists after the
        last sync message, when coord sends the finalizeSync message until
@@ -18366,15 +18380,17 @@ ImmModel::finalizeSync(ImmsvOmFinalizeSy
                 (unsigned int) sOwnerVector.size());
 
             for(i=sOwnerVector.begin(); i!=sOwnerVector.end();) {
-                if((*i)->mDying) {
-                    if(!((*i)->mReleaseOnFinalize)) {
+                IdVector::iterator ivi;
+                ivi = find(sAdmosDeadDuringSync.begin(), 
sAdmosDeadDuringSync.end(), (*i)->mId);
+                if((*i)->mDying || ivi != sAdmosDeadDuringSync.end()) {
+                    if((*i)->mDying && !((*i)->mReleaseOnFinalize)) {
                         LOG_ER("finalizeSync client: Admo %u is dying yet 
releaseOnFinalize is false",
                             (*i)->mId);
                         err = SA_AIS_ERR_FAILED_OPERATION;
                         goto done;
                     }
 
-                    LOG_WA("Removing admin owner %u %s (ROF==TRUE) which is in 
demise, "
+                    LOG_WA("Removing admin owner %u %s which is in demise, "
                            "AFTER receiving finalize sync message", (*i)->mId,
                         (*i)->mAdminOwnerName.c_str());
                     //This does a lookup of admin owner again.
@@ -18938,6 +18954,7 @@ ImmModel::finalizeSync(ImmsvOmFinalizeSy
 
     sImplsDeadDuringSync.clear(); /* for coord, sync-client & veterans. */
     sNodesDeadDuringSync.clear(); /* should only be relevant for sync-client. 
*/
+    sAdmosDeadDuringSync.clear(); /* should only be relevant for sync-client. 
*/
 
     /* De-comment to get a dump of childcounts after each sync
     if(true) {
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
@@ -8174,7 +8174,8 @@ static uint32_t immnd_restricted_ok(IMMN
                    id == IMMND_EVT_D2ND_SYNC_FEVS_BASE ||
                    id == IMMND_EVT_A2ND_OI_OBJ_MODIFY ||
                    id == IMMND_EVT_D2ND_IMPLSET_RSP ||
-                   id == IMMND_EVT_D2ND_IMPLSET_RSP_2) {
+                   id == IMMND_EVT_D2ND_IMPLSET_RSP_2 ||
+                   id == IMMND_EVT_D2ND_ADMO_HARD_FINALIZE) {
                        return 1;
                }
        }
@@ -9799,7 +9800,7 @@ void immnd_evt_proc_admo_hard_finalize(I
                                              IMMND_EVT *evt,
                                              SaBoolT originatedAtThisNd, 
SaImmHandleT clnt_hdl, MDS_DEST reply_dest)
 {
-       SaAisErrorT err;
+       SaAisErrorT err = SA_AIS_OK;
        TRACE_ENTER();
 
        /* TODO: ABT should really remove any open ccbs owned by this admowner.
@@ -9809,7 +9810,11 @@ void immnd_evt_proc_admo_hard_finalize(I
 
        osafassert(evt);
        TRACE("immnd_evt_proc_admo_hard_finalize of adm_owner_id: %u", 
evt->info.admFinReq.adm_owner_id);
-       err = immModel_adminOwnerDelete(cb, evt->info.admFinReq.adm_owner_id, 
1);
+       if (cb->mSync && !cb->mAccepted) { /* Sync client */
+               
immModel_addDeadAdminOwnerDuringSync(evt->info.admFinReq.adm_owner_id);
+       } else {
+               err = immModel_adminOwnerDelete(cb, 
evt->info.admFinReq.adm_owner_id, 1);
+       }
        if (err != SA_AIS_OK) {
                if(cb->loaderPid != (-1)) {
                        LOG_WA("Failed in hard remove of admin owner %u", 
evt->info.admFinReq.adm_owner_id);
@@ -9817,24 +9822,6 @@ void immnd_evt_proc_admo_hard_finalize(I
                        TRACE("Failed in hard remove of admin owner %u. 
Preload?", evt->info.admFinReq.adm_owner_id);
                }
        }
-
-       /* If we receive admo hard finalize in the gap between sending 
sync-finalize message and
-        * receiving it back from fevs (mSyncFinalizing == true), we need to 
re-broadcast the message again.
-        * The sync-clients need this re-broadcasted message because
-        * the dead admo are included in sync-finalize message.
-        * The coord (this) and veterans will also recevie this as duplicated 
message
-        * but they will just drop it as the admo id can't be found. */
-       if (cb->mSyncFinalizing) {
-               IMMSV_EVT send_evt;
-               memset(&send_evt, '\0', sizeof(IMMSV_EVT));
-               send_evt.type = IMMSV_EVT_TYPE_IMMD;
-               send_evt.info.immd.type = IMMD_EVT_ND2D_ADMO_HARD_FINALIZE;
-               send_evt.info.immd.info.admoId = 
evt->info.admFinReq.adm_owner_id;
-               if(immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, 
cb->immd_mdest_id, &send_evt) != NCSCC_RC_SUCCESS) {
-                       LOG_ER("Failure to broadcast discard admo id:%u ", 
evt->info.admFinReq.adm_owner_id);
-               }
-       }
-
        TRACE_LEAVE();
 }
 
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
@@ -89,6 +89,7 @@ extern "C" {
                                      const struct ImmsvOmAdminOwnerInitialize 
*req,
                                      SaUint32T ownerId, SaUint32T conn, 
unsigned int nodeId);
        SaAisErrorT immModel_adminOwnerDelete(IMMND_CB *cb, SaUint32T ownerId, 
SaUint32T hard);
+       void immModel_addDeadAdminOwnerDuringSync(SaUint32T ownerId);
 
        SaAisErrorT
            immModel_ccbCreate(IMMND_CB *cb,

------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to