osaf/services/saf/immsv/immnd/ImmModel.cc | 59 +++++++++++++++++++++++++++-
osaf/services/saf/immsv/immnd/ImmSearchOp.cc | 1 +
osaf/services/saf/immsv/immnd/ImmSearchOp.hh | 4 +
osaf/services/saf/immsv/immnd/immnd_cb.h | 4 +
4 files changed, 67 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,56 @@ immModel_cleanTheBasement(IMMND_CB *cb,
osafassert(ix==(*pbePrtoReqArrSize));
}
+ time_t now = time(NULL);
+ time_t nextSearch = 0;
+ time_t opSearchTime;
+ 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 && cl_node->searchOpList
+ && (now - cl_node->mLastSearch > SEARCH_TIMEOUT_SEC)) {
+ nextSearch = now;
+ clearCounter = 0;
+ searchOp = cl_node->searchOpList;
+ prevSearchOp = &cl_node->searchOpList;
+ while(searchOp) {
+ osafassert(searchOp->searchOp);
+ op = (ImmSearchOp *)searchOp->searchOp;
+ opSearchTime = op->getLastSearchTime();
+ if(!op->isSync() && now - opSearchTime > 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 {
+ if(opSearchTime < nextSearch) {
+ nextSearch = opSearchTime;
+ }
+ prevSearchOp = &searchOp->next;
+ searchOp = searchOp->next;
+ }
+ }
+
+ cl_node->mLastSearch = nextSearch;
+
+ 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;
}
@@ -1281,6 +1332,9 @@ immModel_nextResult(IMMND_CB *cb, void*
}
err = ImmModel::instance(&cb->immModel)->nextSyncResult(rsp, *op);
} else {
+ /* Reset search time */
+ op->updateSearchTime();
+
err = op->nextResult(rsp, implConn, implNodeId,
(rtAttrsToFetch)?(&rtAttrs):NULL,
(SaUint64T*) implDest);
@@ -9284,6 +9338,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 +9350,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);
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;
+ mLastSearch = 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 mLastSearch; }
+ void updateSearchTime() { mLastSearch = time(NULL); }
void* syncOsi;
void* attrNameList;
void* classInfo;
@@ -98,6 +101,7 @@ private:
AttributeList mRtsToFetch;
bool mIsSync;
bool mIsAccessor;
+ time_t mLastSearch;
};
#endif
diff --git a/osaf/services/saf/immsv/immnd/immnd_cb.h
b/osaf/services/saf/immsv/immnd/immnd_cb.h
--- a/osaf/services/saf/immsv/immnd/immnd_cb.h
+++ b/osaf/services/saf/immsv/immnd/immnd_cb.h
@@ -68,6 +68,10 @@ typedef struct immnd_immom_client_node {
The tmp client is then removed, anticipating
a resurrect request by the IMMA.
*/
+ time_t mLastSearch; /* Time of the latest used search handle
+ It is used to reduce
number of iterations
+ of inactive search
handles.
+ */
} IMMND_IMM_CLIENT_NODE;
/******************************************************************************
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel