瀏覽代碼

HPCC-13912 Return Replicate for files on >2 clusters

Also add BaseDir and ReplicateDir for file on clusters.

Signed-off-by: wangkx <kevin.wang@lexisnexis.com>
wangkx 10 年之前
父節點
當前提交
7a93c225ee
共有 2 個文件被更改,包括 23 次插入21 次删除
  1. 4 2
      esp/scm/ws_dfu.ecm
  2. 19 19
      esp/services/ws_dfu/ws_dfuService.cpp

+ 4 - 2
esp/scm/ws_dfu.ecm

@@ -74,9 +74,12 @@ ESPStruct DFUFileStat
     string MaxSkew;
 };
 
-ESPStruct DFUFilePartsOnCluster
+ESPStruct [nil_remove] DFUFilePartsOnCluster
 {
     string Cluster;
+    [min_ver("1.31")] string BaseDir;
+    [min_ver("1.31")] string ReplicateDir;
+    [min_ver("1.31")] bool Replicate;
     ESParray<ESPstruct DFUPart> DFUFileParts;
 };
 
@@ -123,7 +126,6 @@ ESPStruct [nil_remove] DFUFileDetail
     [min_ver("1.22")] int64 CompressedFileSize;
     [min_ver("1.22")] bool IsCompressed(false);
     [min_ver("1.28")] bool BrowseData(true);
-    [min_ver("1.31")] bool Replicate;
 };
 
 ESPStruct DFUSpaceItem

+ 19 - 19
esp/services/ws_dfu/ws_dfuService.cpp

@@ -1741,6 +1741,7 @@ bool CWsDfuEx::getUserFilePermission(IEspContext &context, IUserDescriptor* udes
 void CWsDfuEx::getFilePartsOnClusters(IEspContext &context, const char* clusterReq, StringArray& clusters, IDistributedFile* df, IEspDFUFileDetail& FileDetails,
     offset_t& mn, offset_t& mx, offset_t& sum, offset_t& count)
 {
+    double version = context.getClientVersion();
     IArrayOf<IConstDFUFilePartsOnCluster>& partsOnClusters = FileDetails.getDFUFilePartsOnClusters();
     ForEachItemIn(i, clusters)
     {
@@ -1790,6 +1791,24 @@ void CWsDfuEx::getFilePartsOnClusters(IEspContext &context, const char* clusterR
             }
         }
 
+        if (version >= 1.31)
+        {
+            IClusterInfo* clusterInfo = fdesc->queryCluster(clusterName);
+            if (clusterInfo) //Should be valid. But, check it just in case.
+            {
+                partsOnCluster->setReplicate(clusterInfo->queryPartDiskMapping().isReplicated());
+                const char* defaultDir = fdesc->queryDefaultDir();
+                if (defaultDir && *defaultDir)
+                {
+                    DFD_OS os = SepCharBaseOs(getPathSepChar(defaultDir));
+                    StringBuffer baseDir, repDir;
+                    clusterInfo->getBaseDir(baseDir, os);
+                    clusterInfo->getReplicateDir(repDir, os);
+                    partsOnCluster->setBaseDir(baseDir.str());
+                    partsOnCluster->setReplicateDir(baseDir.str());
+                }
+            }
+        }
         partsOnClusters.append(*partsOnCluster.getClear());
     }
 }
@@ -1905,25 +1924,6 @@ void CWsDfuEx::doGetFileDetails(IEspContext &context, IUserDescriptor* udesc, co
     if (version >= 1.28)
         FileDetails.setNumParts(df->numParts());
 
-    if (version >= 1.31)
-    {
-        const char* clusterName = NULL;
-        if (cluster && *cluster)
-            clusterName = cluster;
-        else if (clusters.length() == 1)
-            clusterName = clusters.item(0);
-        if (clusterName)
-        {
-            Owned<IFileDescriptor> fdesc = df->getFileDescriptor();
-            if (fdesc)
-            {
-                IClusterInfo* c = fdesc->queryCluster(clusterName);
-                if (c)
-                    FileDetails.setReplicate(c->queryPartDiskMapping().isReplicated());
-            }
-        }
-    }
-
     //#17430
     {
         IArrayOf<IEspDFULogicalFile> LogicalFiles;