osaf/services/saf/immsv/immnd/ImmModel.cc | 18 +++++++++++++-----
osaf/services/saf/immsv/immnd/ImmModel.hh | 2 +-
osaf/services/saf/immsv/immnd/immnd_evt.c | 18 +++++++++++++++++-
osaf/services/saf/immsv/immnd/immnd_init.h | 2 +-
4 files changed, 32 insertions(+), 8 deletions(-)
Timeout on client while waiting for implementer happens when IMMA_SYNCR_TIMEOUT
< IMMA_OI_CALLBACK_TIMEOUT.
mOriginatingConn is clear and we can't send response in
::ccbObjCreate/Modify/Del/CompletedContinuation().
If the client invokes more ccb operations, it will get ERR_TIMEOUT.
We better abort the ccb in this case. This is the same behavior as when there's
a timeout from OI.
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
@@ -1154,9 +1154,9 @@ immModel_authorizedGroup(IMMND_CB *cb)
}
SaBoolT
-immModel_purgeSyncRequest(IMMND_CB *cb, SaUint32T clientId)
-{
- return (ImmModel::instance(&cb->immModel)->purgeSyncRequest(clientId)) ?
+immModel_purgeSyncRequest(IMMND_CB *cb, SaUint32T clientId, SaUint32T* ccbId)
+{
+ return (ImmModel::instance(&cb->immModel)->purgeSyncRequest(clientId,
ccbId)) ?
SA_TRUE : SA_FALSE;
}
@@ -5498,7 +5498,12 @@ ImmModel::ccbApply(SaUint32T ccbId,
}
}
- osafassert(reqConn==0 || (ccb->mOriginatingConn == reqConn));
+ if (reqConn && !ccb->mOriginatingConn) {
+ /* When the ccb continuation is purged, the ccb must be aborted */
+ osafassert(ccb->mState == IMM_CCB_ABORTED);
+ } else {
+ osafassert(!reqConn || ccb->mOriginatingConn == reqConn);
+ }
if(!ccb->isOk()) {
setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error
state");
@@ -13596,7 +13601,7 @@ ImmModel::getAdminOwnerIdsForCon(SaUint3
}
bool
-ImmModel::purgeSyncRequest(SaUint32T clientId)
+ImmModel::purgeSyncRequest(SaUint32T clientId, SaUint32T* ccbId)
{
TRACE_ENTER();
bool purged=false;
@@ -13700,6 +13705,9 @@ ImmModel::purgeSyncRequest(SaUint32T cli
on this ccb (e.g. a late arriving OI reply.
*/
(*ccbFound)->mOriginatingConn = 0;
+ /* mOriginatingConn is cleared so we can't send response to the client
if
+ they invoke more ccb operations. Abort the ccb now. */
+ *ccbId = (*ccbFound)->mId;
purged = true;
TRACE_5("Purged Ccb continuation for ccb:%u in state %u",
(*ccbFound)->mId, (*ccbFound)->mState);
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
@@ -117,7 +117,7 @@ public:
bool protocol47Allowed();
bool protocol50Allowed();
bool oneSafe2PBEAllowed();
- bool purgeSyncRequest(SaUint32T clientId);
+ bool purgeSyncRequest(SaUint32T clientId, SaUint32T* ccbId);
bool verifySchemaChange(const std::string& className,
ClassInfo* oldClass,
ClassInfo* newClass,
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
@@ -2118,8 +2118,9 @@ static uint32_t immnd_evt_proc_cl_imma_t
immnd_client_node_get(cb, evt->info.finReq.client_hdl, &cl_node);
if(!cl_node) {goto done;}
+ SaUint32T ccbId = 0;
SaUint32T clientId =
m_IMMSV_UNPACK_HANDLE_HIGH(evt->info.finReq.client_hdl);
- if(immModel_purgeSyncRequest(cb, clientId)) {
+ if(immModel_purgeSyncRequest(cb, clientId, &ccbId)) {
/* One and only one request has been purged => no reply message
send
will be attempted for *that* request. We can safely clear
the
MDS reply info. This will also clear the handle for new use
in
@@ -2141,6 +2142,21 @@ static uint32_t immnd_evt_proc_cl_imma_t
}
}
+ /* The client is timed out when we're still waiting for response from
OI.
+ This happens when IMMA_SYNCR_TIMEOUT < IMMA_OI_CALLBACK_TIMEOUT. */
+ if (ccbId) {
+ 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_ABORT_CCB;
+ send_evt.info.immd.info.ccbId = ccbId;
+
+ LOG_WA("Timeout on client while waiting for implementer,
aborting ccb:%u", ccbId);
+ 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 Ccb for ccbId:%u",
ccbId);
+ }
+ }
+
done:
TRACE_LEAVE();
return NCSCC_RC_SUCCESS;
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
@@ -324,7 +324,7 @@ extern "C" {
OsafImmAccessControlModeT immModel_accessControlMode(IMMND_CB *cb);
const char *immModel_authorizedGroup(IMMND_CB *cb);
- SaBoolT immModel_purgeSyncRequest(IMMND_CB *cb, SaUint32T clientId);
+ SaBoolT immModel_purgeSyncRequest(IMMND_CB *cb, SaUint32T clientId,
SaUint32T* ccbId);
void immModel_recognizedIsolated(IMMND_CB *cb);
------------------------------------------------------------------------------
Mobile security can be enabling, not merely restricting. Employees who
bring their own devices (BYOD) to work are irked by the imposition of MDM
restrictions. Mobile Device Manager Plus allows you to control only the
apps on BYO-devices by containerizing them, leaving personal data untouched!
https://ad.doubleclick.net/ddm/clk/304595813;131938128;j
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel