Browse Source

HPCC-11940 Avoid multiple control:queries calls for same queryset

The code is backported from: https://github.com/hpcc-systems/
HPCC-Platform/pull/6158.

To get query status, the existing code does control:queries call
for each query. It takes a long time for WUListQueries. This
fix collects unique QuerySetIDs for all of the queries and calls
the control:queries for each unique QuerySetID. Then, set query
status for the queries which belong to the QuerySet.

Signed-off-by: wangkx <kevin.wang@lexisnexis.com>
wangkx 11 years ago
parent
commit
5edfb1150d

+ 47 - 21
esp/services/ws_workunits/ws_workunitsQuerySets.cpp

@@ -1183,6 +1183,40 @@ unsigned CWsWorkunitsEx::getGraphIdsByQueryId(const char *target, const char *qu
     return graphIds.length();
 }
 
+void CWsWorkunitsEx::checkAndSetClusterQueryState(IEspContext &context, const char* cluster, const char* querySetId, IArrayOf<IEspQuerySetQuery>& queries)
+{
+    try
+    {
+        double version = context.getClientVersion();
+        if (isEmpty(cluster))
+            cluster = querySetId;
+        Owned<IPropertyTree> queriesOnCluster = getQueriesOnCluster(cluster, querySetId);
+        if (!queriesOnCluster)
+        {
+            DBGLOG("getQueriesOnCluster() returns NULL for cluster<%s> and querySetId<%s>", cluster, querySetId);
+            return;
+        }
+
+        ForEachItemIn(i, queries)
+        {
+            IEspQuerySetQuery& query = queries.item(i);
+            const char* queryId = query.getId();
+            const char* querySetId0 = query.getQuerySetId();
+            if (!queryId || !querySetId0 || !strieq(querySetId0, querySetId))
+                continue;
+
+            IArrayOf<IEspClusterQueryState> clusters;
+            addClusterQueryStates(queriesOnCluster, cluster, queryId, clusters, version);
+            query.setClusters(clusters);
+        }
+    }
+    catch(IException *e)
+    {
+        EXCLOG(e, "CWsWorkunitsEx::checkAndSetClusterQueryState: Failed to read Query State On Cluster");
+        e->Release();
+    }
+}
+
 bool CWsWorkunitsEx::onWUListQueries(IEspContext &context, IEspWUListQueriesRequest & req, IEspWUListQueriesResponse & resp)
 {
     bool descending = req.getDescending();
@@ -1249,15 +1283,17 @@ bool CWsWorkunitsEx::onWUListQueries(IEspContext &context, IEspWUListQueriesRequ
     Owned<IConstQuerySetQueryIterator> it = factory->getQuerySetQueriesSorted(sortOrder, filters, filterBuf.bufferBase(), pageStartFrom, pageSize, &cacheHint, &numberOfQueries);
     resp.setCacheHint(cacheHint);
 
+    StringArray querySetIds;
     IArrayOf<IEspQuerySetQuery> queries;
     double version = context.getClientVersion();
     ForEach(*it)
     {
         IPropertyTree &query=it->query();
+        const char *queryTarget = query.queryProp("@querySetId");
         Owned<IEspQuerySetQuery> q = createQuerySetQuery();
         q->setId(query.queryProp("@id"));
         q->setName(query.queryProp("@name"));
-        q->setQuerySetId(query.queryProp("@querySetId"));
+        q->setQuerySetId(queryTarget);
         q->setDll(query.queryProp("@dll"));
         q->setWuid(query.queryProp("@wuid"));
         q->setActivated(query.getPropBool("@activated", false));
@@ -1282,28 +1318,18 @@ bool CWsWorkunitsEx::onWUListQueries(IEspContext &context, IEspWUListQueriesRequ
             q->setIsLibrary(query.getPropBool("@isLibrary"));
         }
 
-        try
-        {
-            const char* cluster = clusterReq;
-            const char* querySetId = query.queryProp("@querySetId");
-            if (isEmpty(cluster))
-                cluster = querySetId;
-            Owned<IPropertyTree> queriesOnCluster = getQueriesOnCluster(cluster, querySetId);
-            if (queriesOnCluster)
-            {
-                IArrayOf<IEspClusterQueryState> clusters;
-                addClusterQueryStates(queriesOnCluster, cluster, query.queryProp("@id"), clusters, version);
-                q->setClusters(clusters);
-            }
-        }
-        catch(IException *e)
-        {
-            StringBuffer err;
-            DBGLOG("Get exception in WUListQueries: %s", e->errorMessage(err.append(e->errorCode()).append(' ')).str());
-            e->Release();
-        }
+        if (!querySetIds.contains(queryTarget))
+            querySetIds.append(queryTarget);
         queries.append(*q.getClear());
     }
+
+    ForEachItemIn(i, querySetIds)
+    {
+        const char* querySetId = querySetIds.item(i);
+        if(querySetId && *querySetId)
+            checkAndSetClusterQueryState(context, clusterReq, querySetId, queries);
+    }
+
     resp.setQuerysetQueries(queries);
     resp.setNumberOfQueries(numberOfQueries);
 

+ 1 - 0
esp/services/ws_workunits/ws_workunitsService.hpp

@@ -179,6 +179,7 @@ public:
     unsigned getGraphIdsByQueryId(const char *target, const char *queryId, StringArray& graphIds);
     bool getQueryFiles(const char* query, const char* target, StringArray& logicalFiles, IArrayOf<IEspQuerySuperFile> *superFiles);
     void getGraphsByQueryId(const char *target, const char *queryId, const char *graphName, const char *subGraphId, IArrayOf<IEspECLGraphEx>& ECLGraphs);
+    void checkAndSetClusterQueryState(IEspContext &context, const char* cluster, const char* querySetId, IArrayOf<IEspQuerySetQuery>& queries);
 
     bool onWUQuery(IEspContext &context, IEspWUQueryRequest &req, IEspWUQueryResponse &resp);
     bool onWUPublishWorkunit(IEspContext &context, IEspWUPublishWorkunitRequest & req, IEspWUPublishWorkunitResponse & resp);