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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to