osaf/services/saf/immsv/immnd/ImmModel.cc | 49 +++++++++++++++++++++++++++-
osaf/services/saf/immsv/immnd/ImmSearchOp.cc | 1 +
osaf/services/saf/immsv/immnd/ImmSearchOp.hh | 4 ++
3 files changed, 53 insertions(+), 1 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
@@ -33,6 +33,7 @@
#define PRT_LOW_THRESHOLD 1 /* See ImmModel::immNotPbeWritable */
#define PRT_HIGH_THRESHOLD 4 /* See ImmModel::immNotPbeWritable */
#define CCB_CRIT_THRESHOLD 8 /* See ImmModel::immNotPbeWritable */
+#define SEARCH_TIMEOUT_SEC 600 /* Search timeout */
struct ContinuationInfo2
@@ -968,6 +969,46 @@ immModel_cleanTheBasement(IMMND_CB *cb,
osafassert(ix==(*pbePrtoReqArrSize));
}
+ time_t now = time(NULL);
+ ImmSearchOp *op;
+ IMMND_OM_SEARCH_NODE *searchOp;
+ IMMND_OM_SEARCH_NODE **prevSearchOp;
+ IMMND_IMM_CLIENT_NODE *cl_node =
+ (IMMND_IMM_CLIENT_NODE
*)ncs_patricia_tree_getnext(&cb->client_info_db, NULL);
+ int clearCounter = 0;
+ while(cl_node) {
+ if(!cl_node->mIsSync) {
+ clearCounter = 0;
+ searchOp = cl_node->searchOpList;
+ prevSearchOp = &cl_node->searchOpList;
+ while(searchOp) {
+ assert(searchOp->searchOp);
+ op = (ImmSearchOp *)searchOp->searchOp;
+ if(!op->isSync() && now - op->getLastSearchTime() >
SEARCH_TIMEOUT_SEC) {
+ TRACE_2("Clear search result. Timeout %dsec. Search id:
%d, OM handle: %llx",
+ SEARCH_TIMEOUT_SEC, searchOp->searchId,
cl_node->imm_app_hdl);
+ *prevSearchOp = searchOp->next;
+ immModel_deleteSearchOp(op);
+ free(searchOp);
+ searchOp = *prevSearchOp;
+ clearCounter++;
+ } else {
+ prevSearchOp = &searchOp->next;
+ searchOp = searchOp->next;
+ }
+ }
+
+ if(clearCounter) {
+ LOG_NO("Clear %d search result(s) for OM handle %llx. Search
timeout %dsec",
+ clearCounter, cl_node->imm_app_hdl,
SEARCH_TIMEOUT_SEC);
+ }
+ }
+
+ cl_node = (IMMND_IMM_CLIENT_NODE *)ncs_patricia_tree_getnext(
+ &cb->client_info_db,
+ cl_node->patnode.key_info);
+ }
+
return stuck;
}
@@ -9284,6 +9325,9 @@ ImmModel::searchInitialize(ImmsvOmSearch
std::string refObjectName;
SaUint32T childCount=0;
+ /* Reset search time */
+ op.updateSearchTime();
+
if(scope == SA_IMM_ONE) {
if(noDanglingSearch) {
LOG_NO("ERR_INVALID_PARAM: SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS "
@@ -9293,7 +9337,7 @@ ImmModel::searchInitialize(ImmsvOmSearch
return this->accessorGet(req, op);
}
-
+
size_t sz = strnlen((char *) req->rootName.buf,
(size_t)req->rootName.size);
std::string rootName((const char*)req->rootName.buf, sz);
@@ -9723,6 +9767,9 @@ SaAisErrorT ImmModel::nextSyncResult(Imm
ImmAttrValueMap::iterator j;
IMMSV_OM_RSP_SEARCH_NEXT* p = NULL;
+ /* Reset search time */
+ op.updateSearchTime();
+
if((*osip) == classInfo->mExtent.end()) {
delete osip;
op.syncOsi = NULL;
diff --git a/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
b/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
--- a/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
+++ b/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
@@ -27,6 +27,7 @@ ImmSearchOp::ImmSearchOp()
syncOsi=NULL;
attrNameList=NULL;
classInfo=NULL;
+ lastSearch = 0;
}
ImmSearchOp::~ImmSearchOp()
diff --git a/osaf/services/saf/immsv/immnd/ImmSearchOp.hh
b/osaf/services/saf/immsv/immnd/ImmSearchOp.hh
--- a/osaf/services/saf/immsv/immnd/ImmSearchOp.hh
+++ b/osaf/services/saf/immsv/immnd/ImmSearchOp.hh
@@ -22,6 +22,7 @@
#include "ImmAttrValue.hh"
#include <string>
#include <list>
+#include <time.h>
struct SearchAttribute
@@ -88,6 +89,8 @@ public:
void setIsAccessor() {mIsAccessor = true;}
bool isSync() {return mIsSync;}
bool isAccessor() {return mIsAccessor;}
+ time_t getLastSearchTime() { return lastSearch; }
+ void updateSearchTime() { lastSearch = time(NULL); }
void* syncOsi;
void* attrNameList;
void* classInfo;
@@ -98,6 +101,7 @@ private:
AttributeList mRtsToFetch;
bool mIsSync;
bool mIsAccessor;
+ time_t lastSearch;
};
#endif
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel