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

Reply via email to