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