Browse Source

Merge pull request #1807 from afishbeck/ecl_queries_cluster

gh-1728 Add ecl queries support for showing queries suspended given cluster

Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 13 years ago
parent
commit
0c44a1c1a0

+ 18 - 2
ecl/eclcmd/queries/ecl-queries.cpp

@@ -146,17 +146,33 @@ public:
     {
     {
         const char *queryid = query.getId();
         const char *queryid = query.getId();
         bool isActive = queryMap.isActive(queryid);
         bool isActive = queryMap.isActive(queryid);
+        bool suspendedOnCluster = false;
+        ForEachItemIn(idx, query.getClusters())
+        {
+            IConstClusterQueryState &state = query.getClusters().item(idx);
+            if (state.getSuspended())
+            {
+                suspendedOnCluster = true;
+                break;
+            }
+        }
+
         if (flags)
         if (flags)
         {
         {
             if (isActive && !(flags & QUERYLIST_SHOW_ACTIVE))
             if (isActive && !(flags & QUERYLIST_SHOW_ACTIVE))
                 return;
                 return;
             if (query.getSuspended() && !(flags & QUERYLIST_SHOW_SUSPENDED))
             if (query.getSuspended() && !(flags & QUERYLIST_SHOW_SUSPENDED))
                 return;
                 return;
+            if (suspendedOnCluster && !(flags & QUERYLIST_SHOW_CLUSTER_SUSPENDED))
+                return;
             if (!isActive && !query.getSuspended() &&  !(flags & QUERYLIST_SHOW_UNFLAGGED))
             if (!isActive && !query.getSuspended() &&  !(flags & QUERYLIST_SHOW_UNFLAGGED))
                 return;
                 return;
         }
         }
-        VStringBuffer line("  %c%c  ", query.getSuspended() ? 'S' : ' ', isActive ? 'A' : ' ');
-        line.append(queryid);
+        StringBuffer line(" ");
+        line.append(suspendedOnCluster ? 'X' : ' ');
+        line.append(query.getSuspended() ? 'S' : ' ');
+        line.append(isActive ? 'A' : ' ');
+        line.append(' ').append(queryid);
         if (isActive)
         if (isActive)
         {
         {
             Owned<IPropertyTreeIterator> activeNames = queryMap.getActiveNames(queryid);
             Owned<IPropertyTreeIterator> activeNames = queryMap.getActiveNames(queryid);

+ 40 - 16
esp/services/ws_workunits/ws_workunitsQuerySets.cpp

@@ -435,13 +435,26 @@ bool CWsWorkunitsEx::onWUQuerysets(IEspContext &context, IEspWUQuerysetsRequest
     return true;
     return true;
 }
 }
 
 
-void gatherQuerySetQueryDetails(IPropertyTree *query, IEspQuerySetQuery *queryInfo)
+void gatherQuerySetQueryDetails(IPropertyTree *query, IEspQuerySetQuery *queryInfo, const char *cluster, IPropertyTree *queriesOnCluster)
 {
 {
     queryInfo->setId(query->queryProp("@id"));
     queryInfo->setId(query->queryProp("@id"));
     queryInfo->setName(query->queryProp("@name"));
     queryInfo->setName(query->queryProp("@name"));
     queryInfo->setDll(query->queryProp("@dll"));
     queryInfo->setDll(query->queryProp("@dll"));
     queryInfo->setWuid(query->queryProp("@wuid"));
     queryInfo->setWuid(query->queryProp("@wuid"));
     queryInfo->setSuspended(query->getPropBool("@suspended", false));
     queryInfo->setSuspended(query->getPropBool("@suspended", false));
+    if (queriesOnCluster)
+    {
+        VStringBuffer xpath("Endpoint/Queries/Query[@id='%s']/@suspended", query->queryProp("@id"));
+        if (queriesOnCluster->getPropBool(xpath.str()))
+        {
+            IArrayOf<IEspClusterQueryState> clusters;
+            Owned<IEspClusterQueryState> clusterState = createClusterQueryState();
+            clusterState->setCluster(cluster);
+            clusterState->setSuspended(true);
+            clusters.append(*clusterState.getClear());
+            queryInfo->setClusters(clusters);
+        }
+    }
 }
 }
 
 
 void gatherQuerySetAliasDetails(IPropertyTree *alias, IEspQuerySetAlias *aliasInfo)
 void gatherQuerySetAliasDetails(IPropertyTree *alias, IEspQuerySetAlias *aliasInfo)
@@ -450,14 +463,14 @@ void gatherQuerySetAliasDetails(IPropertyTree *alias, IEspQuerySetAlias *aliasIn
     aliasInfo->setId(alias->queryProp("@id"));
     aliasInfo->setId(alias->queryProp("@id"));
 }
 }
 
 
-void retrieveAllQuerysetDetails(IPropertyTree *registry, IArrayOf<IEspQuerySetQuery> &queries, IArrayOf<IEspQuerySetAlias> &aliases)
+void retrieveAllQuerysetDetails(IPropertyTree *registry, IArrayOf<IEspQuerySetQuery> &queries, IArrayOf<IEspQuerySetAlias> &aliases, const char *cluster=NULL, IPropertyTree *queriesOnCluster=NULL)
 {
 {
     Owned<IPropertyTreeIterator> regQueries = registry->getElements("Query");
     Owned<IPropertyTreeIterator> regQueries = registry->getElements("Query");
     ForEach(*regQueries)
     ForEach(*regQueries)
     {
     {
         IPropertyTree &query = regQueries->query();
         IPropertyTree &query = regQueries->query();
         Owned<IEspQuerySetQuery> q = createQuerySetQuery();
         Owned<IEspQuerySetQuery> q = createQuerySetQuery();
-        gatherQuerySetQueryDetails(&query, q);
+        gatherQuerySetQueryDetails(&query, q, cluster, queriesOnCluster);
         queries.append(*q.getClear());
         queries.append(*q.getClear());
     }
     }
 
 
@@ -471,7 +484,7 @@ void retrieveAllQuerysetDetails(IPropertyTree *registry, IArrayOf<IEspQuerySetQu
     }
     }
 }
 }
 
 
-void retrieveQuerysetDetailsFromAlias(IPropertyTree *registry, const char *name, IArrayOf<IEspQuerySetQuery> &queries, IArrayOf<IEspQuerySetAlias> &aliases)
+void retrieveQuerysetDetailsFromAlias(IPropertyTree *registry, const char *name, IArrayOf<IEspQuerySetQuery> &queries, IArrayOf<IEspQuerySetAlias> &aliases, const char *cluster, IPropertyTree *queriesOnCluster)
 {
 {
     StringBuffer xpath;
     StringBuffer xpath;
     xpath.append("Alias[@name='").append(name).append("']");
     xpath.append("Alias[@name='").append(name).append("']");
@@ -495,11 +508,11 @@ void retrieveQuerysetDetailsFromAlias(IPropertyTree *registry, const char *name,
     }
     }
 
 
     Owned<IEspQuerySetQuery> q = createQuerySetQuery();
     Owned<IEspQuerySetQuery> q = createQuerySetQuery();
-    gatherQuerySetQueryDetails(query, q);
+    gatherQuerySetQueryDetails(query, q, cluster, queriesOnCluster);
     queries.append(*q.getClear());
     queries.append(*q.getClear());
 }
 }
 
 
-void retrieveQuerysetDetailsFromQuery(IPropertyTree *registry, const char *value, const char *type, IArrayOf<IEspQuerySetQuery> &queries, IArrayOf<IEspQuerySetAlias> &aliases)
+void retrieveQuerysetDetailsFromQuery(IPropertyTree *registry, const char *value, const char *type, IArrayOf<IEspQuerySetQuery> &queries, IArrayOf<IEspQuerySetAlias> &aliases, const char *cluster=NULL, IPropertyTree *queriesOnCluster=NULL)
 {
 {
     if (!strieq(type, "Id") && !strieq(type, "Name"))
     if (!strieq(type, "Id") && !strieq(type, "Name"))
         throw MakeStringException(ECLWATCH_INVALID_INPUT, "Unrecognized queryset filter type %s", type);
         throw MakeStringException(ECLWATCH_INVALID_INPUT, "Unrecognized queryset filter type %s", type);
@@ -515,7 +528,7 @@ void retrieveQuerysetDetailsFromQuery(IPropertyTree *registry, const char *value
     }
     }
 
 
     Owned<IEspQuerySetQuery> q = createQuerySetQuery();
     Owned<IEspQuerySetQuery> q = createQuerySetQuery();
-    gatherQuerySetQueryDetails(query, q);
+    gatherQuerySetQueryDetails(query, q, cluster, queriesOnCluster);
     xpath.clear().append("Alias[@id='").append(q->getId()).append("']");
     xpath.clear().append("Alias[@id='").append(q->getId()).append("']");
     queries.append(*q.getClear());
     queries.append(*q.getClear());
 
 
@@ -529,25 +542,25 @@ void retrieveQuerysetDetailsFromQuery(IPropertyTree *registry, const char *value
     }
     }
 }
 }
 
 
-void retrieveQuerysetDetails(IPropertyTree *registry, const char *type, const char *value, IArrayOf<IEspQuerySetQuery> &queries, IArrayOf<IEspQuerySetAlias> &aliases)
+void retrieveQuerysetDetails(IPropertyTree *registry, const char *type, const char *value, IArrayOf<IEspQuerySetQuery> &queries, IArrayOf<IEspQuerySetAlias> &aliases, const char *cluster=NULL, IPropertyTree *queriesOnCluster=NULL)
 {
 {
     if (strieq(type, "All"))
     if (strieq(type, "All"))
-        return retrieveAllQuerysetDetails(registry, queries, aliases);
+        return retrieveAllQuerysetDetails(registry, queries, aliases, cluster, queriesOnCluster);
     if (!value || !*value)
     if (!value || !*value)
         return;
         return;
     if (strieq(type, "Alias"))
     if (strieq(type, "Alias"))
-        return retrieveQuerysetDetailsFromAlias(registry, value, queries, aliases);
-    return retrieveQuerysetDetailsFromQuery(registry, value, type, queries, aliases);
+        return retrieveQuerysetDetailsFromAlias(registry, value, queries, aliases, cluster, queriesOnCluster);
+    return retrieveQuerysetDetailsFromQuery(registry, value, type, queries, aliases, cluster, queriesOnCluster);
 }
 }
 
 
-void retrieveQuerysetDetails(IArrayOf<IEspWUQuerySetDetail> &details, IPropertyTree *registry, const char *type, const char *value)
+void retrieveQuerysetDetails(IArrayOf<IEspWUQuerySetDetail> &details, IPropertyTree *registry, const char *type, const char *value, const char *cluster=NULL, IPropertyTree *queriesOnCluster=NULL)
 {
 {
     if (!registry)
     if (!registry)
         return;
         return;
 
 
     IArrayOf<IEspQuerySetQuery> queries;
     IArrayOf<IEspQuerySetQuery> queries;
     IArrayOf<IEspQuerySetAlias> aliases;
     IArrayOf<IEspQuerySetAlias> aliases;
-    retrieveQuerysetDetails(registry, type, value, queries, aliases);
+    retrieveQuerysetDetails(registry, type, value, queries, aliases, cluster, queriesOnCluster);
 
 
     Owned<IEspWUQuerySetDetail> detail = createWUQuerySetDetail();
     Owned<IEspWUQuerySetDetail> detail = createWUQuerySetDetail();
     detail->setQuerySetName(registry->queryProp("@id"));
     detail->setQuerySetName(registry->queryProp("@id"));
@@ -556,14 +569,14 @@ void retrieveQuerysetDetails(IArrayOf<IEspWUQuerySetDetail> &details, IPropertyT
     details.append(*detail.getClear());
     details.append(*detail.getClear());
 }
 }
 
 
-void retrieveQuerysetDetails(IArrayOf<IEspWUQuerySetDetail> &details, const char *queryset, const char *type, const char *value)
+void retrieveQuerysetDetails(IArrayOf<IEspWUQuerySetDetail> &details, const char *queryset, const char *type, const char *value, const char *cluster=NULL, IPropertyTree *queriesOnCluster=NULL)
 {
 {
     if (!queryset || !*queryset)
     if (!queryset || !*queryset)
         return;
         return;
     Owned<IPropertyTree> registry = getQueryRegistry(queryset, true);
     Owned<IPropertyTree> registry = getQueryRegistry(queryset, true);
     if (!registry)
     if (!registry)
         return;
         return;
-    retrieveQuerysetDetails(details, registry, type, value);
+    retrieveQuerysetDetails(details, registry, type, value, cluster, queriesOnCluster);
 }
 }
 
 
 void retrieveQuerysetDetailsByCluster(IArrayOf<IEspWUQuerySetDetail> &details, const char *cluster, const char *queryset, const char *type, const char *value)
 void retrieveQuerysetDetailsByCluster(IArrayOf<IEspWUQuerySetDetail> &details, const char *cluster, const char *queryset, const char *type, const char *value)
@@ -572,6 +585,17 @@ void retrieveQuerysetDetailsByCluster(IArrayOf<IEspWUQuerySetDetail> &details, c
     if (!info)
     if (!info)
         throw MakeStringException(ECLWATCH_CANNOT_RESOLVE_CLUSTER_NAME, "Cluster %s not found", cluster);
         throw MakeStringException(ECLWATCH_CANNOT_RESOLVE_CLUSTER_NAME, "Cluster %s not found", cluster);
 
 
+    Owned<IPropertyTree> queriesOnCluster;
+    if (info->getPlatform()==RoxieCluster)
+    {
+        const SocketEndpointArray &eps = info->getRoxieServers();
+        if (eps.length())
+        {
+            Owned<ISocket> sock = ISocket::connect_timeout(eps.item(0), 5);
+            queriesOnCluster.setown(sendRoxieControlQuery(sock, "<control:queries/>", 5));
+        }
+    }
+
     SCMStringBuffer clusterQueryset;
     SCMStringBuffer clusterQueryset;
     info->getQuerySetName(clusterQueryset);
     info->getQuerySetName(clusterQueryset);
     if (!clusterQueryset.length())
     if (!clusterQueryset.length())
@@ -579,7 +603,7 @@ void retrieveQuerysetDetailsByCluster(IArrayOf<IEspWUQuerySetDetail> &details, c
     if (notEmpty(queryset) && !strieq(clusterQueryset.str(), queryset))
     if (notEmpty(queryset) && !strieq(clusterQueryset.str(), queryset))
         throw MakeStringException(ECLWATCH_QUERYSET_NOT_ON_CLUSTER, "Cluster %s not configured to load QuerySet %s", cluster, queryset);
         throw MakeStringException(ECLWATCH_QUERYSET_NOT_ON_CLUSTER, "Cluster %s not configured to load QuerySet %s", cluster, queryset);
 
 
-    retrieveQuerysetDetails(details, clusterQueryset.str(), type, value);
+    retrieveQuerysetDetails(details, clusterQueryset.str(), type, value, cluster, queriesOnCluster);
 }
 }
 
 
 void retrieveAllQuerysetDetails(IArrayOf<IEspWUQuerySetDetail> &details, const char *type, const char *value)
 void retrieveAllQuerysetDetails(IArrayOf<IEspWUQuerySetDetail> &details, const char *type, const char *value)