|
@@ -65,13 +65,51 @@ const char *skipForeign(const char *name, StringBuffer *ip)
|
|
return name;
|
|
return name;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void splitDfsLocation(const char *address, StringBuffer &cluster, StringBuffer &ip, StringBuffer &prefix, const char *defaultCluster)
|
|
|
|
+{
|
|
|
|
+ if (!address || !*address)
|
|
|
|
+ {
|
|
|
|
+ cluster.append(defaultCluster);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const char *s=strchr(address, '@');
|
|
|
|
+ if (s)
|
|
|
|
+ {
|
|
|
|
+ cluster.append(s - address, address);
|
|
|
|
+ address = s + 1;
|
|
|
|
+ }
|
|
|
|
+ else if (defaultCluster && *defaultCluster)
|
|
|
|
+ cluster.append(defaultCluster);
|
|
|
|
+ s=strchr(address, '/');
|
|
|
|
+ if (!s)
|
|
|
|
+ ip.append(address);
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ ip.append(s - address, address);
|
|
|
|
+ prefix.append(s+1);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void splitDerivedDfsLocation(const char *address, StringBuffer &cluster, StringBuffer &ip, StringBuffer &prefix, const char *defaultCluster, const char *baseCluster, const char *baseIP, const char *basePrefix)
|
|
|
|
+{
|
|
|
|
+ if (address && *address)
|
|
|
|
+ {
|
|
|
|
+ splitDfsLocation(address, cluster, ip, prefix, defaultCluster);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ ip.append(baseIP);
|
|
|
|
+ cluster.append(baseCluster);
|
|
|
|
+ prefix.append(basePrefix);
|
|
|
|
+}
|
|
|
|
+
|
|
class ReferencedFileList;
|
|
class ReferencedFileList;
|
|
|
|
|
|
class ReferencedFile : public CInterface, implements IReferencedFile
|
|
class ReferencedFile : public CInterface, implements IReferencedFile
|
|
{
|
|
{
|
|
public:
|
|
public:
|
|
IMPLEMENT_IINTERFACE;
|
|
IMPLEMENT_IINTERFACE;
|
|
- ReferencedFile(const char *lfn, const char *sourceIP, const char *srcCluster, bool isSubFile, unsigned _flags, const char *_pkgid) : flags(_flags), pkgid(_pkgid)
|
|
|
|
|
|
+ ReferencedFile(const char *lfn, const char *sourceIP, const char *srcCluster, const char *prefix, bool isSubFile, unsigned _flags, const char *_pkgid) : flags(_flags), pkgid(_pkgid)
|
|
{
|
|
{
|
|
logicalName.set(skipForeign(lfn, &daliip)).toLowerCase();
|
|
logicalName.set(skipForeign(lfn, &daliip)).toLowerCase();
|
|
if (daliip.length())
|
|
if (daliip.length())
|
|
@@ -79,6 +117,7 @@ public:
|
|
else
|
|
else
|
|
daliip.set(sourceIP);
|
|
daliip.set(sourceIP);
|
|
fileSrcCluster.set(srcCluster);
|
|
fileSrcCluster.set(srcCluster);
|
|
|
|
+ filePrefix.set(prefix);
|
|
if (isSubFile)
|
|
if (isSubFile)
|
|
flags |= RefSubFile;
|
|
flags |= RefSubFile;
|
|
}
|
|
}
|
|
@@ -87,14 +126,16 @@ public:
|
|
{
|
|
{
|
|
flags &= RefSubFile;
|
|
flags &= RefSubFile;
|
|
}
|
|
}
|
|
- IPropertyTree *getForeignOrRemoteFileTree(IUserDescriptor *user, INode *remote);
|
|
|
|
|
|
+
|
|
|
|
+ IPropertyTree *getRemoteFileTree(IUserDescriptor *user, INode *remote, const char *remotePrefix);
|
|
|
|
+ IPropertyTree *getSpecifiedOrRemoteFileTree(IUserDescriptor *user, INode *remote, const char *remotePrefix);
|
|
|
|
|
|
void processLocalFileInfo(IDistributedFile *df, const char *dstCluster, const char *srcCluster, StringArray *subfiles);
|
|
void processLocalFileInfo(IDistributedFile *df, const char *dstCluster, const char *srcCluster, StringArray *subfiles);
|
|
void processRemoteFileTree(IPropertyTree *tree, const char *srcCluster, StringArray *subfiles);
|
|
void processRemoteFileTree(IPropertyTree *tree, const char *srcCluster, StringArray *subfiles);
|
|
|
|
|
|
void resolveLocal(const char *dstCluster, const char *srcCluster, IUserDescriptor *user, StringArray *subfiles);
|
|
void resolveLocal(const char *dstCluster, const char *srcCluster, IUserDescriptor *user, StringArray *subfiles);
|
|
- void resolveRemote(IUserDescriptor *user, INode *remote, const char *dstCluster, const char *srcCluster, bool checkLocalFirst, StringArray *subfiles, bool resolveForeign=false);
|
|
|
|
- void resolve(const char *dstCluster, const char *srcCluster, IUserDescriptor *user, INode *remote, bool checkLocalFirst, StringArray *subfiles, bool resolveForeign=false);
|
|
|
|
|
|
+ void resolveRemote(IUserDescriptor *user, INode *remote, const char *remotePrefix, const char *dstCluster, const char *srcCluster, bool checkLocalFirst, StringArray *subfiles, bool resolveForeign=false);
|
|
|
|
+ void resolve(const char *dstCluster, const char *srcCluster, IUserDescriptor *user, INode *remote, const char *remotePrefix, bool checkLocalFirst, StringArray *subfiles, bool resolveForeign=false);
|
|
|
|
|
|
virtual const char *getLogicalName() const {return logicalName.str();}
|
|
virtual const char *getLogicalName() const {return logicalName.str();}
|
|
virtual unsigned getFlags() const {return flags;}
|
|
virtual unsigned getFlags() const {return flags;}
|
|
@@ -106,7 +147,7 @@ public:
|
|
ep.set(NULL);
|
|
ep.set(NULL);
|
|
return ep;
|
|
return ep;
|
|
}
|
|
}
|
|
- virtual void cloneInfo(IDFUhelper *helper, IUserDescriptor *user, INode *remote, const char *dstCluster, const char *srcCluster, bool overwrite=false, bool cloneForeign=false);
|
|
|
|
|
|
+ virtual void cloneInfo(IDFUhelper *helper, IUserDescriptor *user, const char *dstCluster, const char *srcCluster, bool overwrite=false, bool cloneForeign=false);
|
|
void cloneSuperInfo(ReferencedFileList *list, IUserDescriptor *user, INode *remote, bool overwrite);
|
|
void cloneSuperInfo(ReferencedFileList *list, IUserDescriptor *user, INode *remote, bool overwrite);
|
|
virtual const char *queryPackageId() const {return pkgid.get();}
|
|
virtual const char *queryPackageId() const {return pkgid.get();}
|
|
|
|
|
|
@@ -114,6 +155,7 @@ public:
|
|
StringBuffer logicalName;
|
|
StringBuffer logicalName;
|
|
StringAttr pkgid;
|
|
StringAttr pkgid;
|
|
StringBuffer daliip;
|
|
StringBuffer daliip;
|
|
|
|
+ StringBuffer filePrefix;
|
|
StringAttr fileSrcCluster;
|
|
StringAttr fileSrcCluster;
|
|
unsigned flags;
|
|
unsigned flags;
|
|
};
|
|
};
|
|
@@ -131,18 +173,18 @@ public:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- void ensureFile(const char *ln, unsigned flags, const char *pkgid, const char *daliip=NULL, const char *srcCluster=NULL);
|
|
|
|
|
|
+ void ensureFile(const char *ln, unsigned flags, const char *pkgid, const char *daliip=NULL, const char *srcCluster=NULL, const char *remotePrefix=NULL);
|
|
|
|
|
|
- virtual void addFile(const char *ln, const char *daliip=NULL, const char *srcCluster=NULL);
|
|
|
|
|
|
+ virtual void addFile(const char *ln, const char *daliip=NULL, const char *srcCluster=NULL, const char *remotePrefix=NULL);
|
|
virtual void addFiles(StringArray &files);
|
|
virtual void addFiles(StringArray &files);
|
|
virtual void addFilesFromWorkUnit(IConstWorkUnit *cw);
|
|
virtual void addFilesFromWorkUnit(IConstWorkUnit *cw);
|
|
virtual void addFilesFromQuery(IConstWorkUnit *cw, const IHpccPackageMap *pm, const char *queryid);
|
|
virtual void addFilesFromQuery(IConstWorkUnit *cw, const IHpccPackageMap *pm, const char *queryid);
|
|
virtual void addFilesFromQuery(IConstWorkUnit *cw, const IHpccPackage *pkg);
|
|
virtual void addFilesFromQuery(IConstWorkUnit *cw, const IHpccPackage *pkg);
|
|
virtual void addFilesFromPackageMap(IPropertyTree *pm);
|
|
virtual void addFilesFromPackageMap(IPropertyTree *pm);
|
|
|
|
|
|
- void addFileFromSubFile(IPropertyTree &subFile, const char *_daliip, const char *srcCluster);
|
|
|
|
- void addFilesFromSuperFile(IPropertyTree &superFile, const char *_daliip, const char *srcCluster);
|
|
|
|
- void addFilesFromPackage(IPropertyTree &package, const char *_daliip, const char *srcCluster);
|
|
|
|
|
|
+ void addFileFromSubFile(IPropertyTree &subFile, const char *_daliip, const char *srcCluster, const char *_remotePrefix);
|
|
|
|
+ void addFilesFromSuperFile(IPropertyTree &superFile, const char *_daliip, const char *srcCluster, const char *_remotePrefix);
|
|
|
|
+ void addFilesFromPackage(IPropertyTree &package, const char *_daliip, const char *srcCluster, const char *_remotePrefix);
|
|
|
|
|
|
virtual IReferencedFileIterator *getFiles();
|
|
virtual IReferencedFileIterator *getFiles();
|
|
virtual void cloneFileInfo(IDFUhelper *helper, bool overwrite, bool cloneSuperInfo, bool cloneForeign=false);
|
|
virtual void cloneFileInfo(IDFUhelper *helper, bool overwrite, bool cloneSuperInfo, bool cloneForeign=false);
|
|
@@ -152,7 +194,7 @@ public:
|
|
cloneFileInfo(helper, overwrite, cloneSuperInfo, cloneForeign);
|
|
cloneFileInfo(helper, overwrite, cloneSuperInfo, cloneForeign);
|
|
cloneRelationships();
|
|
cloneRelationships();
|
|
}
|
|
}
|
|
- virtual void resolveFiles(const char *process, const char *remoteIP, const char *srcCluster, bool checkLocalFirst, bool addSubFiles, bool resolveForeign=false);
|
|
|
|
|
|
+ virtual void resolveFiles(const char *process, const char *remoteIP, const char *_remotePrefix, const char *srcCluster, bool checkLocalFirst, bool addSubFiles, bool resolveForeign=false);
|
|
void resolveSubFiles(StringArray &subfiles, bool checkLocalFirst, bool resolveForeign);
|
|
void resolveSubFiles(StringArray &subfiles, bool checkLocalFirst, bool resolveForeign);
|
|
|
|
|
|
public:
|
|
public:
|
|
@@ -161,6 +203,7 @@ public:
|
|
MapStringToMyClass<ReferencedFile> map;
|
|
MapStringToMyClass<ReferencedFile> map;
|
|
StringAttr process;
|
|
StringAttr process;
|
|
StringAttr srcCluster;
|
|
StringAttr srcCluster;
|
|
|
|
+ StringAttr remotePrefix;
|
|
};
|
|
};
|
|
|
|
|
|
void ReferencedFile::processLocalFileInfo(IDistributedFile *df, const char *dstCluster, const char *srcCluster, StringArray *subfiles)
|
|
void ReferencedFile::processLocalFileInfo(IDistributedFile *df, const char *dstCluster, const char *srcCluster, StringArray *subfiles)
|
|
@@ -232,20 +275,36 @@ void ReferencedFile::resolveLocal(const char *dstCluster, const char *srcCluster
|
|
flags |= RefFileNotFound;
|
|
flags |= RefFileNotFound;
|
|
}
|
|
}
|
|
|
|
|
|
-IPropertyTree *ReferencedFile::getForeignOrRemoteFileTree(IUserDescriptor *user, INode *remote)
|
|
|
|
|
|
+IPropertyTree *ReferencedFile::getRemoteFileTree(IUserDescriptor *user, INode *remote, const char *remotePrefix)
|
|
|
|
+{
|
|
|
|
+ if (!remote)
|
|
|
|
+ return NULL;
|
|
|
|
+ StringBuffer remoteLFN;
|
|
|
|
+ if (remotePrefix && *remotePrefix)
|
|
|
|
+ remoteLFN.append(remotePrefix).append("::").append(logicalName);
|
|
|
|
+ return queryDistributedFileDirectory().getFileTree(remoteLFN.length() ? remoteLFN : logicalName, user, remote, WF_LOOKUP_TIMEOUT, false, false);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+IPropertyTree *ReferencedFile::getSpecifiedOrRemoteFileTree(IUserDescriptor *user, INode *remote, const char *remotePrefix)
|
|
{
|
|
{
|
|
- Owned<INode> daliNode;
|
|
|
|
if (daliip.length())
|
|
if (daliip.length())
|
|
{
|
|
{
|
|
|
|
+ Owned<INode> daliNode;
|
|
daliNode.setown(createINode(daliip));
|
|
daliNode.setown(createINode(daliip));
|
|
- remote = daliNode;
|
|
|
|
|
|
+ return getRemoteFileTree(user, daliNode, filePrefix);
|
|
}
|
|
}
|
|
if (!remote)
|
|
if (!remote)
|
|
return NULL;
|
|
return NULL;
|
|
- return queryDistributedFileDirectory().getFileTree(logicalName.str(), user, remote, WF_LOOKUP_TIMEOUT, false, false);
|
|
|
|
|
|
+ StringBuffer remoteLFN;
|
|
|
|
+ Owned<IPropertyTree> fileTree = getRemoteFileTree(user, remote, remotePrefix);
|
|
|
|
+ if (!fileTree)
|
|
|
|
+ return NULL;
|
|
|
|
+ remote->endpoint().getUrlStr(daliip);
|
|
|
|
+ filePrefix.set(remotePrefix);
|
|
|
|
+ return fileTree.getClear();
|
|
}
|
|
}
|
|
|
|
|
|
-void ReferencedFile::resolveRemote(IUserDescriptor *user, INode *remote, const char *dstCluster, const char *srcCluster, bool checkLocalFirst, StringArray *subfiles, bool resolveForeign)
|
|
|
|
|
|
+void ReferencedFile::resolveRemote(IUserDescriptor *user, INode *remote, const char *remotePrefix, const char *dstCluster, const char *srcCluster, bool checkLocalFirst, StringArray *subfiles, bool resolveForeign)
|
|
{
|
|
{
|
|
if ((flags & RefFileForeign) && !resolveForeign)
|
|
if ((flags & RefFileForeign) && !resolveForeign)
|
|
return;
|
|
return;
|
|
@@ -261,22 +320,22 @@ void ReferencedFile::resolveRemote(IUserDescriptor *user, INode *remote, const c
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- Owned<IPropertyTree> tree = getForeignOrRemoteFileTree(user, remote);
|
|
|
|
|
|
+ Owned<IPropertyTree> tree = getSpecifiedOrRemoteFileTree(user, remote, remotePrefix);
|
|
if (tree)
|
|
if (tree)
|
|
processRemoteFileTree(tree, srcCluster, subfiles);
|
|
processRemoteFileTree(tree, srcCluster, subfiles);
|
|
else
|
|
else
|
|
flags |= RefFileNotFound;
|
|
flags |= RefFileNotFound;
|
|
}
|
|
}
|
|
|
|
|
|
-void ReferencedFile::resolve(const char *dstCluster, const char *srcCluster, IUserDescriptor *user, INode *remote, bool checkLocalFirst, StringArray *subfiles, bool resolveForeign)
|
|
|
|
|
|
+void ReferencedFile::resolve(const char *dstCluster, const char *srcCluster, IUserDescriptor *user, INode *remote, const char *remotePrefix, bool checkLocalFirst, StringArray *subfiles, bool resolveForeign)
|
|
{
|
|
{
|
|
if (daliip.length() || remote)
|
|
if (daliip.length() || remote)
|
|
- resolveRemote(user, remote, dstCluster, srcCluster, checkLocalFirst, subfiles, resolveForeign);
|
|
|
|
|
|
+ resolveRemote(user, remote, remotePrefix, dstCluster, srcCluster, checkLocalFirst, subfiles, resolveForeign);
|
|
else
|
|
else
|
|
resolveLocal(dstCluster, srcCluster, user, subfiles);
|
|
resolveLocal(dstCluster, srcCluster, user, subfiles);
|
|
}
|
|
}
|
|
|
|
|
|
-void ReferencedFile::cloneInfo(IDFUhelper *helper, IUserDescriptor *user, INode *remote, const char *dstCluster, const char *srcCluster, bool overwrite, bool cloneForeign)
|
|
|
|
|
|
+void ReferencedFile::cloneInfo(IDFUhelper *helper, IUserDescriptor *user, const char *dstCluster, const char *srcCluster, bool overwrite, bool cloneForeign)
|
|
{
|
|
{
|
|
if ((flags & RefFileCloned) || (flags & RefFileSuper) || (flags & RefFileInPackage))
|
|
if ((flags & RefFileCloned) || (flags & RefFileSuper) || (flags & RefFileInPackage))
|
|
return;
|
|
return;
|
|
@@ -284,20 +343,20 @@ void ReferencedFile::cloneInfo(IDFUhelper *helper, IUserDescriptor *user, INode
|
|
return;
|
|
return;
|
|
if (!(flags & (RefFileRemote | RefFileForeign | RefFileNotOnCluster)))
|
|
if (!(flags & (RefFileRemote | RefFileForeign | RefFileNotOnCluster)))
|
|
return;
|
|
return;
|
|
-
|
|
|
|
- StringBuffer addr;
|
|
|
|
- if (flags & RefFileForeign)
|
|
|
|
- addr.set(daliip);
|
|
|
|
- else if (remote)
|
|
|
|
- remote->endpoint().getUrlStr(addr);
|
|
|
|
-
|
|
|
|
|
|
+ if (!daliip.length())
|
|
|
|
+ return;
|
|
if (fileSrcCluster.length())
|
|
if (fileSrcCluster.length())
|
|
srcCluster = fileSrcCluster;
|
|
srcCluster = fileSrcCluster;
|
|
|
|
|
|
try
|
|
try
|
|
{
|
|
{
|
|
- helper->createSingleFileClone(logicalName.str(), srcCluster, logicalName.str(), dstCluster,
|
|
|
|
- DFUcpdm_c_replicated_by_d, true, NULL, user, addr.str(), NULL, overwrite, false);
|
|
|
|
|
|
+ StringBuffer srcLFN;
|
|
|
|
+ if (filePrefix.length())
|
|
|
|
+ srcLFN.append(filePrefix.str()).append("::");
|
|
|
|
+ srcLFN.append(logicalName.str());
|
|
|
|
+
|
|
|
|
+ helper->createSingleFileClone(srcLFN, srcCluster, logicalName, dstCluster, filePrefix,
|
|
|
|
+ DFUcpdm_c_replicated_by_d, true, NULL, user, daliip, NULL, overwrite, false);
|
|
flags |= RefFileCloned;
|
|
flags |= RefFileCloned;
|
|
}
|
|
}
|
|
catch (IException *e)
|
|
catch (IException *e)
|
|
@@ -309,7 +368,7 @@ void ReferencedFile::cloneInfo(IDFUhelper *helper, IUserDescriptor *user, INode
|
|
catch (...)
|
|
catch (...)
|
|
{
|
|
{
|
|
flags |= RefFileCopyInfoFailed;
|
|
flags |= RefFileCopyInfoFailed;
|
|
- DBGLOG("Unknown error copying file info for %s, from %s", logicalName.str(), addr.str());
|
|
|
|
|
|
+ DBGLOG("Unknown error copying file info for [%s::] %s, from %s on dfs-dali %s", filePrefix.str(), logicalName.str(), fileSrcCluster.length() ? fileSrcCluster.get() : "*", daliip.str());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -320,7 +379,7 @@ void ReferencedFile::cloneSuperInfo(ReferencedFileList *list, IUserDescriptor *u
|
|
|
|
|
|
try
|
|
try
|
|
{
|
|
{
|
|
- Owned<IPropertyTree> tree = getForeignOrRemoteFileTree(user, remote);
|
|
|
|
|
|
+ Owned<IPropertyTree> tree = getSpecifiedOrRemoteFileTree(user, remote, NULL);
|
|
if (!tree)
|
|
if (!tree)
|
|
return;
|
|
return;
|
|
|
|
|
|
@@ -402,9 +461,9 @@ public:
|
|
Owned<HashIterator> iter;
|
|
Owned<HashIterator> iter;
|
|
};
|
|
};
|
|
|
|
|
|
-void ReferencedFileList::ensureFile(const char *ln, unsigned flags, const char *pkgid, const char *daliip, const char *srcCluster)
|
|
|
|
|
|
+void ReferencedFileList::ensureFile(const char *ln, unsigned flags, const char *pkgid, const char *daliip, const char *srcCluster, const char *prefix)
|
|
{
|
|
{
|
|
- Owned<ReferencedFile> file = new ReferencedFile(ln, daliip, srcCluster, false, flags, pkgid);
|
|
|
|
|
|
+ Owned<ReferencedFile> file = new ReferencedFile(ln, daliip, srcCluster, prefix, false, flags, pkgid);
|
|
if (!file->logicalName.length())
|
|
if (!file->logicalName.length())
|
|
return;
|
|
return;
|
|
ReferencedFile *existing = map.getValue(file->getLogicalName());
|
|
ReferencedFile *existing = map.getValue(file->getLogicalName());
|
|
@@ -417,9 +476,9 @@ void ReferencedFileList::ensureFile(const char *ln, unsigned flags, const char *
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-void ReferencedFileList::addFile(const char *ln, const char *daliip, const char *srcCluster)
|
|
|
|
|
|
+void ReferencedFileList::addFile(const char *ln, const char *daliip, const char *srcCluster, const char *prefix)
|
|
{
|
|
{
|
|
- ensureFile(ln, 0, NULL, daliip, srcCluster);
|
|
|
|
|
|
+ ensureFile(ln, 0, NULL, daliip, srcCluster, prefix);
|
|
}
|
|
}
|
|
|
|
|
|
void ReferencedFileList::addFiles(StringArray &files)
|
|
void ReferencedFileList::addFiles(StringArray &files)
|
|
@@ -428,42 +487,49 @@ void ReferencedFileList::addFiles(StringArray &files)
|
|
addFile(files.item(i));
|
|
addFile(files.item(i));
|
|
}
|
|
}
|
|
|
|
|
|
-void ReferencedFileList::addFileFromSubFile(IPropertyTree &subFile, const char *daliip, const char *srcCluster)
|
|
|
|
|
|
+void ReferencedFileList::addFileFromSubFile(IPropertyTree &subFile, const char *ip, const char *cluster, const char *prefix)
|
|
{
|
|
{
|
|
- addFile(subFile.queryProp("@value"), daliip, srcCluster);
|
|
|
|
|
|
+ addFile(subFile.queryProp("@value"), ip, cluster, prefix);
|
|
}
|
|
}
|
|
|
|
|
|
-void ReferencedFileList::addFilesFromSuperFile(IPropertyTree &superFile, const char *daliip, const char *srcCluster)
|
|
|
|
|
|
+void ReferencedFileList::addFilesFromSuperFile(IPropertyTree &superFile, const char *_ip, const char *_cluster, const char *_prefix)
|
|
{
|
|
{
|
|
- if (superFile.hasProp("@daliip"))
|
|
|
|
- daliip = superFile.queryProp("@daliip");
|
|
|
|
|
|
+ StringBuffer ip;
|
|
|
|
+ StringBuffer cluster;
|
|
|
|
+ StringBuffer prefix;
|
|
|
|
+ splitDerivedDfsLocation(superFile.queryProp("@daliip"), cluster, ip, prefix, NULL, _cluster, _ip, _prefix);
|
|
if (superFile.hasProp("@sourceCluster"))
|
|
if (superFile.hasProp("@sourceCluster"))
|
|
- srcCluster = superFile.queryProp("@sourceCluster");
|
|
|
|
|
|
+ cluster.set(superFile.queryProp("@sourceCluster"));
|
|
|
|
|
|
Owned<IPropertyTreeIterator> subFiles = superFile.getElements("SubFile[@value]");
|
|
Owned<IPropertyTreeIterator> subFiles = superFile.getElements("SubFile[@value]");
|
|
ForEach(*subFiles)
|
|
ForEach(*subFiles)
|
|
- addFileFromSubFile(subFiles->query(), daliip, srcCluster);
|
|
|
|
|
|
+ addFileFromSubFile(subFiles->query(), ip, cluster, prefix);
|
|
}
|
|
}
|
|
|
|
|
|
-void ReferencedFileList::addFilesFromPackage(IPropertyTree &package, const char *daliip, const char *srcCluster)
|
|
|
|
|
|
+void ReferencedFileList::addFilesFromPackage(IPropertyTree &package, const char *_ip, const char *_cluster, const char *_prefix)
|
|
{
|
|
{
|
|
- if (package.hasProp("@daliip"))
|
|
|
|
- daliip = package.queryProp("@daliip");
|
|
|
|
|
|
+ StringBuffer ip;
|
|
|
|
+ StringBuffer cluster;
|
|
|
|
+ StringBuffer prefix;
|
|
|
|
+ splitDerivedDfsLocation(package.queryProp("@daliip"), cluster, ip, prefix, NULL, _cluster, _ip, _prefix);
|
|
if (package.hasProp("@sourceCluster"))
|
|
if (package.hasProp("@sourceCluster"))
|
|
- srcCluster = package.queryProp("@sourceCluster");
|
|
|
|
|
|
+ cluster.set(package.queryProp("@sourceCluster"));
|
|
|
|
|
|
Owned<IPropertyTreeIterator> supers = package.getElements("SuperFile");
|
|
Owned<IPropertyTreeIterator> supers = package.getElements("SuperFile");
|
|
ForEach(*supers)
|
|
ForEach(*supers)
|
|
- addFilesFromSuperFile(supers->query(), daliip, srcCluster);
|
|
|
|
|
|
+ addFilesFromSuperFile(supers->query(), ip, cluster, prefix);
|
|
}
|
|
}
|
|
|
|
|
|
void ReferencedFileList::addFilesFromPackageMap(IPropertyTree *pm)
|
|
void ReferencedFileList::addFilesFromPackageMap(IPropertyTree *pm)
|
|
{
|
|
{
|
|
- const char *daliip = pm->queryProp("@daliip");
|
|
|
|
|
|
+ StringBuffer ip;
|
|
|
|
+ StringBuffer cluster;
|
|
|
|
+ StringBuffer prefix;
|
|
const char *srcCluster = pm->queryProp("@sourceCluster");
|
|
const char *srcCluster = pm->queryProp("@sourceCluster");
|
|
|
|
+ splitDerivedDfsLocation(pm->queryProp("@daliip"), cluster, ip, prefix, srcCluster, srcCluster, NULL, NULL);
|
|
Owned<IPropertyTreeIterator> packages = pm->getElements("Package");
|
|
Owned<IPropertyTreeIterator> packages = pm->getElements("Package");
|
|
ForEach(*packages)
|
|
ForEach(*packages)
|
|
- addFilesFromPackage(packages->query(), daliip, srcCluster);
|
|
|
|
|
|
+ addFilesFromPackage(packages->query(), ip, cluster, prefix);
|
|
}
|
|
}
|
|
|
|
|
|
void ReferencedFileList::addFilesFromQuery(IConstWorkUnit *cw, const IHpccPackage *pkg)
|
|
void ReferencedFileList::addFilesFromQuery(IConstWorkUnit *cw, const IHpccPackage *pkg)
|
|
@@ -533,10 +599,10 @@ void ReferencedFileList::resolveSubFiles(StringArray &subfiles, bool checkLocalF
|
|
StringArray childSubFiles;
|
|
StringArray childSubFiles;
|
|
ForEachItemIn(i, subfiles)
|
|
ForEachItemIn(i, subfiles)
|
|
{
|
|
{
|
|
- Owned<ReferencedFile> file = new ReferencedFile(subfiles.item(i), NULL, NULL, true, 0, NULL);
|
|
|
|
|
|
+ Owned<ReferencedFile> file = new ReferencedFile(subfiles.item(i), NULL, NULL, NULL, true, 0, NULL);
|
|
if (file->logicalName.length() && !map.getValue(file->getLogicalName()))
|
|
if (file->logicalName.length() && !map.getValue(file->getLogicalName()))
|
|
{
|
|
{
|
|
- file->resolve(process.get(), srcCluster, user, remote, checkLocalFirst, &childSubFiles, resolveForeign);
|
|
|
|
|
|
+ file->resolve(process.get(), srcCluster, user, remote, remotePrefix, checkLocalFirst, &childSubFiles, resolveForeign);
|
|
const char *ln = file->getLogicalName();
|
|
const char *ln = file->getLogicalName();
|
|
map.setValue(ln, file.getClear());
|
|
map.setValue(ln, file.getClear());
|
|
}
|
|
}
|
|
@@ -545,17 +611,18 @@ void ReferencedFileList::resolveSubFiles(StringArray &subfiles, bool checkLocalF
|
|
resolveSubFiles(childSubFiles, checkLocalFirst, resolveForeign);
|
|
resolveSubFiles(childSubFiles, checkLocalFirst, resolveForeign);
|
|
}
|
|
}
|
|
|
|
|
|
-void ReferencedFileList::resolveFiles(const char *_process, const char *remoteIP, const char *_srcCluster, bool checkLocalFirst, bool expandSuperFiles, bool resolveForeign)
|
|
|
|
|
|
+void ReferencedFileList::resolveFiles(const char *_process, const char *remoteIP, const char *_remotePrefix, const char *_srcCluster, bool checkLocalFirst, bool expandSuperFiles, bool resolveForeign)
|
|
{
|
|
{
|
|
process.set(_process);
|
|
process.set(_process);
|
|
remote.setown((remoteIP && *remoteIP) ? createINode(remoteIP, 7070) : NULL);
|
|
remote.setown((remoteIP && *remoteIP) ? createINode(remoteIP, 7070) : NULL);
|
|
srcCluster.set(_srcCluster);
|
|
srcCluster.set(_srcCluster);
|
|
|
|
+ remotePrefix.set(_remotePrefix);
|
|
|
|
|
|
StringArray subfiles;
|
|
StringArray subfiles;
|
|
{
|
|
{
|
|
ReferencedFileIterator files(this);
|
|
ReferencedFileIterator files(this);
|
|
ForEach(files)
|
|
ForEach(files)
|
|
- files.queryObject().resolve(process, srcCluster, user, remote, checkLocalFirst, expandSuperFiles ? &subfiles : NULL, resolveForeign);
|
|
|
|
|
|
+ files.queryObject().resolve(process, srcCluster, user, remote, remotePrefix, checkLocalFirst, expandSuperFiles ? &subfiles : NULL, resolveForeign);
|
|
}
|
|
}
|
|
if (expandSuperFiles)
|
|
if (expandSuperFiles)
|
|
resolveSubFiles(subfiles, checkLocalFirst, resolveForeign);
|
|
resolveSubFiles(subfiles, checkLocalFirst, resolveForeign);
|
|
@@ -565,7 +632,7 @@ void ReferencedFileList::cloneFileInfo(IDFUhelper *helper, bool overwrite, bool
|
|
{
|
|
{
|
|
ReferencedFileIterator files(this);
|
|
ReferencedFileIterator files(this);
|
|
ForEach(files)
|
|
ForEach(files)
|
|
- files.queryObject().cloneInfo(helper, user, remote, process, srcCluster, overwrite, cloneForeign);
|
|
|
|
|
|
+ files.queryObject().cloneInfo(helper, user, process, srcCluster, overwrite, cloneForeign);
|
|
if (cloneSuperInfo)
|
|
if (cloneSuperInfo)
|
|
ForEach(files)
|
|
ForEach(files)
|
|
files.queryObject().cloneSuperInfo(this, user, remote, overwrite);
|
|
files.queryObject().cloneSuperInfo(this, user, remote, overwrite);
|