瀏覽代碼

Cache and reuse postfilter

Signed-off-by: Jake Smith <jake.smith@lexisnexis.com>
Jake Smith 12 年之前
父節點
當前提交
88703ff24f
共有 3 個文件被更改,包括 29 次插入13 次删除
  1. 20 8
      common/workunit/workunit.cpp
  2. 8 4
      dali/base/dautils.cpp
  3. 1 1
      dali/base/dautils.hpp

+ 20 - 8
common/workunit/workunit.cpp

@@ -2186,13 +2186,16 @@ public:
                                                 ISecUser *secuser,
                                                 unsigned *total)
     {
-        class cScopeChecker: implements ISortedElementsTreeFilter
+        class CScopeChecker : public CSimpleInterface, implements ISortedElementsTreeFilter
         {
             UniqueScopes done;
             ISecManager *secmgr;
             ISecUser *secuser;
+            CriticalSection crit;
         public:
-            cScopeChecker(ISecManager *_secmgr,ISecUser *_secuser)
+            IMPLEMENT_IINTERFACE_USING(CSimpleInterface);
+
+            CScopeChecker(ISecManager *_secmgr,ISecUser *_secuser)
             {
                 secmgr = _secmgr;
                 secuser = _secuser;
@@ -2202,14 +2205,23 @@ public:
                 const char *scopename = tree.queryProp("@scope");
                 if (!scopename||!*scopename)
                     return true;
-                const bool *b = done.getValue(scopename);
-                if (b)
-                    return *b;
+
+                {
+                    CriticalBlock block(crit);
+                    const bool *b = done.getValue(scopename);
+                    if (b)
+                        return *b;
+                }
                 bool ret = checkWuScopeSecAccess(scopename,*secmgr,secuser,SecAccess_Read,"iterating",false,false);
-                done.setValue(scopename,ret);
+                {
+                    // conceivably could have already been checked and added, but ok.
+                    CriticalBlock block(crit);
+                    done.setValue(scopename,ret);
+                }
                 return ret;
             }
-        } sc(secmgr,secuser);
+        };
+        Owned<ISortedElementsTreeFilter> sc = new CScopeChecker(secmgr,secuser);
         StringBuffer query("*");
         StringBuffer so;
         StringAttr namefilterlo;
@@ -2250,7 +2262,7 @@ public:
         }
         IArrayOf<IPropertyTree> results;
         Owned<IRemoteConnection> conn=getElementsPaged( "WorkUnits", query.str(), so.length()?so.str():NULL,startoffset,maxnum,
-            secmgr?&sc:NULL,queryowner,cachehint,namefilterlo.get(),namefilterhi.get(),results,total);
+            secmgr?sc:NULL,queryowner,cachehint,namefilterlo.get(),namefilterhi.get(),results,total);
         return new CConstWUArrayIterator(conn, results, secmgr, secuser);
     }
 

+ 8 - 4
dali/base/dautils.cpp

@@ -1809,8 +1809,8 @@ class CPECacheElem: public CTimedCacheItem
 {
 public:
     IMPLEMENT_IINTERFACE;
-    CPECacheElem(const char *owner)
-        : CTimedCacheItem(owner), postFiltered(0)
+    CPECacheElem(const char *owner, ISortedElementsTreeFilter *_postFilter)
+        : CTimedCacheItem(owner), postFilter(_postFilter), postFiltered(0)
     {
         passesFilter.setown(createBitSet());
     }
@@ -1819,6 +1819,7 @@ public:
     }
     Owned<IRemoteConnection> conn;
     IArrayOf<IPropertyTree> totalres;
+    Linked<ISortedElementsTreeFilter> postFilter;
     unsigned postFiltered;
     Owned<IBitSet> passesFilter;
 };
@@ -1847,9 +1848,12 @@ IRemoteConnection *getElementsPaged( const char *basexpath,
     }
     Owned<CPECacheElem> elem;
     if (hint&&*hint)
-        elem.setown(QUERYINTERFACE(pagedElementsCache->get(owner,*hint),CPECacheElem));
+    {
+        elem.setown(QUERYINTERFACE(pagedElementsCache->get(owner,*hint),CPECacheElem)); // NB: removes from cache in process, added back at end
+        postfilter = elem->postFilter; // reuse cached postfilter
+    }
     if (!elem)
-        elem.setown(new CPECacheElem(owner));
+        elem.setown(new CPECacheElem(owner, postfilter));
     if (!elem->conn)
         elem->conn.setown(getSortedElements(basexpath,xpath,sortorder,namefilterlo,namefilterhi,elem->totalres));
     if (!elem->conn)

+ 1 - 1
dali/base/dautils.hpp

@@ -259,7 +259,7 @@ IRemoteConnection *getSortedElements( const char *basexpath,
                                      const char *namefilterlo, // if non null filter less than this value
                                      const char *namefilterhi, // if non null filter greater than this value
                                      IArrayOf<IPropertyTree> &results);
-interface ISortedElementsTreeFilter
+interface ISortedElementsTreeFilter : extends IInterface
 {
     virtual bool isOK(IPropertyTree &tree) = 0;
 };