浏览代码

HPCC-18857 Replace queue name string in WsSMC ServerJobQueue

In WsSMC.Activity response, the ServerJobQueue object contains
job queue information for ECLServer, ECLCCServer and DFUServer.
The server's @queue attribute is stored as a string in the
existing ServerJobQueue. When the @queue attribute contains
>1 job queues, a client has to parse the string. In this fix,
the string is replaced by a StringArray.

Signed-off-by: wangkx <kevin.wang@lexisnexis.com>
wangkx 7 年之前
父节点
当前提交
f0b356508e
共有 3 个文件被更改,包括 19 次插入10 次删除
  1. 3 2
      esp/scm/ws_smc.ecm
  2. 14 6
      esp/services/ws_smc/ws_smcService.cpp
  3. 2 2
      esp/services/ws_smc/ws_smcService.hpp

+ 3 - 2
esp/scm/ws_smc.ecm

@@ -102,7 +102,8 @@ ESPStruct DFUJob
 
 
 ESPStruct ServerJobQueue
 ESPStruct ServerJobQueue
 {
 {
-    string QueueName;
+    [depr_ver("1.20")] string QueueName;
+    [min_ver("1.20")] ESParray<string, QueueName> QueueNames;
     string ServerName;
     string ServerName;
     string ServerType;
     string ServerType;
     string QueueStatus;
     string QueueStatus;
@@ -397,7 +398,7 @@ ESPresponse [exceptions_inline] LockQueryResponse
     int NumLocks;
     int NumLocks;
 };
 };
 
 
-ESPservice [auth_feature("DEFERRED"), noforms, version("1.19"), exceptions_inline("./smc_xslt/exceptions.xslt"), use_method_name] WsSMC
+ESPservice [auth_feature("DEFERRED"), noforms, version("1.20"), exceptions_inline("./smc_xslt/exceptions.xslt"), use_method_name] WsSMC
 {
 {
     ESPmethod Index(SMCIndexRequest, SMCIndexResponse);
     ESPmethod Index(SMCIndexRequest, SMCIndexResponse);
     ESPmethod [resp_xsl_default("/esp/xslt/index.xslt")] Activity(ActivityRequest, ActivityResponse);
     ESPmethod [resp_xsl_default("/esp/xslt/index.xslt")] Activity(ActivityRequest, ActivityResponse);

+ 14 - 6
esp/services/ws_smc/ws_smcService.cpp

@@ -422,7 +422,7 @@ void CActivityInfo::readActiveWUsAndQueuedWUs(IEspContext& context, IPropertyTre
     readRunningWUsAndJobQueueforOtherStatusServers(context, serverStatusRoot);
     readRunningWUsAndJobQueueforOtherStatusServers(context, serverStatusRoot);
     //TODO: add queued WUs for ECLCCServer/ECLServer here. Right now, they are under target clusters.
     //TODO: add queued WUs for ECLCCServer/ECLServer here. Right now, they are under target clusters.
 
 
-    getDFUServersAndWUs(envRoot, serverStatusRoot);
+    getDFUServersAndWUs(context, envRoot, serverStatusRoot);
     getDFURecoveryJobs();
     getDFURecoveryJobs();
 }
 }
 
 
@@ -699,7 +699,7 @@ void CActivityInfo::readRunningWUsAndJobQueueforOtherStatusServers(IEspContext&
         if (!found || !*found)
         if (!found || !*found)
         {
         {
             uniqueServers.setValue(instanceName, true);
             uniqueServers.setValue(instanceName, true);
-            getServerJobQueue(queueName, instanceName, serverName, node, port);
+            getServerJobQueue(context, queueName, instanceName, serverName, node, port);
 
 
             //Now, we found a new server. we need to add queued jobs from the queues the server is monitoring.
             //Now, we found a new server. we need to add queued jobs from the queues the server is monitoring.
             StringArray qList;
             StringArray qList;
@@ -716,7 +716,7 @@ void CActivityInfo::readRunningWUsAndJobQueueforOtherStatusServers(IEspContext&
     return;
     return;
 }
 }
 
 
-void CActivityInfo::getDFUServersAndWUs(IPropertyTree* envRoot, IPropertyTree* serverStatusRoot)
+void CActivityInfo::getDFUServersAndWUs(IEspContext& context, IPropertyTree* envRoot, IPropertyTree* serverStatusRoot)
 {
 {
     if (!envRoot)
     if (!envRoot)
         return;
         return;
@@ -738,7 +738,7 @@ void CActivityInfo::getDFUServersAndWUs(IPropertyTree* envRoot, IPropertyTree* s
             StringArray wuidList;
             StringArray wuidList;
             const char *queueName = queues.item(q);
             const char *queueName = queues.item(q);
             readDFUWUDetails(queueName, serverName, wuidList, readDFUWUIDs(serverStatusRoot, queueName, wuidList));
             readDFUWUDetails(queueName, serverName, wuidList, readDFUWUIDs(serverStatusRoot, queueName, wuidList));
-            getServerJobQueue(queueName, serverName, STATUS_SERVER_DFUSERVER, NULL, 0);
+            getServerJobQueue(context, queueName, serverName, STATUS_SERVER_DFUSERVER, NULL, 0);
         }
         }
     }
     }
 }
 }
@@ -859,14 +859,22 @@ void CActivityInfo::getDFURecoveryJobs()
     }
     }
 }
 }
 
 
-void CActivityInfo::getServerJobQueue(const char* queueName, const char* serverName,
+void CActivityInfo::getServerJobQueue(IEspContext &context, const char* queueName, const char* serverName,
     const char* serverType, const char* networkAddress, unsigned port)
     const char* serverType, const char* networkAddress, unsigned port)
 {
 {
     if (!queueName || !*queueName || !serverName || !*serverName || !serverType || !*serverType)
     if (!queueName || !*queueName || !serverName || !*serverName || !serverType || !*serverType)
         return;
         return;
 
 
+    double version = context.getClientVersion();
     Owned<IEspServerJobQueue> jobQueue = createServerJobQueue("", "");
     Owned<IEspServerJobQueue> jobQueue = createServerJobQueue("", "");
-    jobQueue->setQueueName(queueName);
+    if (version < 1.20)
+        jobQueue->setQueueName(queueName);
+    else
+    {
+        StringArray queueNames;
+        queueNames.appendListUniq(queueName, ",");
+        jobQueue->setQueueNames(queueNames);
+    }
     jobQueue->setServerName(serverName);
     jobQueue->setServerName(serverName);
     jobQueue->setServerType(serverType);
     jobQueue->setServerType(serverType);
     if (networkAddress && *networkAddress)
     if (networkAddress && *networkAddress)

+ 2 - 2
esp/services/ws_smc/ws_smcService.hpp

@@ -124,11 +124,11 @@ class CActivityInfo : public CInterface, implements IInterface
     void readRunningWUsAndJobQueueforOtherStatusServers(IEspContext& context, IPropertyTree* serverStatusRoot);
     void readRunningWUsAndJobQueueforOtherStatusServers(IEspContext& context, IPropertyTree* serverStatusRoot);
     void createActiveWorkUnit(IEspContext& context, Owned<IEspActiveWorkunit>& ownedWU, const char* wuid, const char* location,
     void createActiveWorkUnit(IEspContext& context, Owned<IEspActiveWorkunit>& ownedWU, const char* wuid, const char* location,
         unsigned index, const char* serverName, const char* queueName, const char* instanceName, const char* targetClusterName, bool useContext);
         unsigned index, const char* serverName, const char* queueName, const char* instanceName, const char* targetClusterName, bool useContext);
-    void getDFUServersAndWUs(IPropertyTree* envRoot, IPropertyTree* serverStatusRoot);
+    void getDFUServersAndWUs(IEspContext& context, IPropertyTree* envRoot, IPropertyTree* serverStatusRoot);
     unsigned readDFUWUIDs(IPropertyTree* serverStatusRoot, const char* queueName, StringArray& wuidList);
     unsigned readDFUWUIDs(IPropertyTree* serverStatusRoot, const char* queueName, StringArray& wuidList);
     void readDFUWUDetails(const char* queueName, const char* serverName, StringArray& wuidList, unsigned runningWUCount);
     void readDFUWUDetails(const char* queueName, const char* serverName, StringArray& wuidList, unsigned runningWUCount);
     void getDFURecoveryJobs();
     void getDFURecoveryJobs();
-    void getServerJobQueue(const char* queueName, const char* serverName, const char* serverType, const char* networkAddress, unsigned port);
+    void getServerJobQueue(IEspContext &context, const char* queueName, const char* serverName, const char* serverType, const char* networkAddress, unsigned port);
     void readServerJobQueueStatus(IEspServerJobQueue* jobQueue);
     void readServerJobQueueStatus(IEspServerJobQueue* jobQueue);
     CWsSMCTargetCluster* findWUClusterInfo(const char* wuid, bool isOnECLAgent, CIArrayOf<CWsSMCTargetCluster>& targetClusters,
     CWsSMCTargetCluster* findWUClusterInfo(const char* wuid, bool isOnECLAgent, CIArrayOf<CWsSMCTargetCluster>& targetClusters,
         CIArrayOf<CWsSMCTargetCluster>& targetClusters1, CIArrayOf<CWsSMCTargetCluster>& targetClusters2);
         CIArrayOf<CWsSMCTargetCluster>& targetClusters1, CIArrayOf<CWsSMCTargetCluster>& targetClusters2);