Skip to content

Commit 38bc0c5

Browse files
authored
Merge pull request #18242 from jakesmith/HPCC-30996-roxie-copy-from-wsdfs
HPCC-30996 Fix issues with roxie copying from remote storage source Reviewed-By: Anthony Fishbeck <[email protected]> Reviewed-by: Gavin Halliday <[email protected]> Merged-by: Gavin Halliday <[email protected]>
2 parents 5c4eb3c + edf49f0 commit 38bc0c5

File tree

2 files changed

+41
-11
lines changed

2 files changed

+41
-11
lines changed

dali/dfu/dfuutil.cpp

+33-10
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ class CFileCloner
406406
throw afor2.exc.getClear();
407407
}
408408

409-
void updateCloneFrom(const char *lfn, IPropertyTree &attrs, IFileDescriptor *srcfdesc, INode *srcdali, const char *srcCluster)
409+
void updateCloneFrom(const char *lfn, IPropertyTree &attrs, IFileDescriptor *srcfdesc, const IPropertyTree *srcTree, INode *srcdali, const char *srcCluster)
410410
{
411411
DBGLOG("updateCloneFrom %s", lfn);
412412
if (!srcdali || srcdali->endpoint().isNull())
@@ -421,8 +421,17 @@ class CFileCloner
421421
if (prefix.length())
422422
attrs.setProp("@cloneFromPrefix", prefix.get());
423423

424-
while(attrs.removeProp("cloneFromGroup"));
425424

425+
// for now, only use source file descriptor as cloned source if it's from
426+
// wsdfs file backed by remote storage using dafilesrv (NB: if it is '_remoteStoragePlane' will be set)
427+
// JCSMORE: it may be this can replace the need for the other 'clone*' attributes altogether.
428+
if (srcfdesc->queryProperties().hasProp("_remoteStoragePlane"))
429+
{
430+
attrs.setPropTree("cloneFromFDesc", createPTreeFromIPT(srcTree));
431+
return;
432+
}
433+
434+
while(attrs.removeProp("cloneFromGroup"));
426435
unsigned numClusters = srcfdesc->numClusters();
427436
for (unsigned clusterNum = 0; clusterNum < numClusters; clusterNum++)
428437
{
@@ -438,15 +447,15 @@ class CFileCloner
438447
}
439448
}
440449
}
441-
void updateCloneFrom(IDistributedFile *dfile, IFileDescriptor *srcfdesc, INode *srcdali, const char *srcCluster)
450+
void updateCloneFrom(IDistributedFile *dfile, IFileDescriptor *srcfdesc, const IPropertyTree *srcTree, INode *srcdali, const char *srcCluster)
442451
{
443452
DistributedFilePropertyLock lock(dfile);
444453
IPropertyTree &attrs = lock.queryAttributes();
445-
updateCloneFrom(dfile->queryLogicalName(), attrs, srcfdesc, srcdali, srcCluster);
454+
updateCloneFrom(dfile->queryLogicalName(), attrs, srcfdesc, srcTree, srcdali, srcCluster);
446455
}
447-
void updateCloneFrom(const char *lfn, IFileDescriptor *dstfdesc, IFileDescriptor *srcfdesc, INode *srcdali, const char *srcCluster)
456+
void updateCloneFrom(const char *lfn, IFileDescriptor *dstfdesc, IFileDescriptor *srcfdesc, const IPropertyTree *srcTree, INode *srcdali, const char *srcCluster)
448457
{
449-
updateCloneFrom(lfn, dstfdesc->queryProperties(), srcfdesc, srcdali, srcCluster);
458+
updateCloneFrom(lfn, dstfdesc->queryProperties(), srcfdesc, srcTree, srcdali, srcCluster);
450459
}
451460

452461
void cloneSubFile(IPropertyTree *ftree,const char *destfilename, INode *srcdali, const char *srcCluster) // name already has prefix added
@@ -455,7 +464,11 @@ class CFileCloner
455464
const char * kind = srcfdesc->queryProperties().queryProp("@kind");
456465
bool iskey = kind&&(strcmp(kind,"key")==0);
457466

458-
Owned<IFileDescriptor> dstfdesc = createFileDescriptor(srcfdesc->getProperties());
467+
Owned<IPropertyTree> dstProps = createPTreeFromIPT(&srcfdesc->queryProperties());
468+
// If present, we do not want this as part of the cloned properties of this new local roxie file
469+
dstProps->removeProp("_remoteStoragePlane");
470+
Owned<IFileDescriptor> dstfdesc = createFileDescriptor(dstProps.getClear());
471+
459472
if (!nameprefix.isEmpty())
460473
dstfdesc->queryProperties().setProp("@roxiePrefix", nameprefix.get());
461474
if (!copyphysical)
@@ -507,7 +520,7 @@ class CFileCloner
507520
}
508521

509522
if (!copyphysical) //cloneFrom tells roxie where to copy from.. it's unnecessary if we already did the copy
510-
updateCloneFrom(destfilename, dstfdesc, srcfdesc, srcdali, srcCluster);
523+
updateCloneFrom(destfilename, dstfdesc, srcfdesc, ftree, srcdali, srcCluster);
511524
else
512525
{
513526
DBGLOG("copyphysical dst=%s", destfilename);
@@ -771,7 +784,7 @@ class CFileCloner
771784
{
772785
Owned<IFileDescriptor> dstfdesc=dfile->getFileDescriptor();
773786
Owned<IFileDescriptor> srcfdesc = deserializeFileDescriptorTree(ftree, NULL, 0);
774-
updateCloneFrom(filename, dstfdesc, srcfdesc, srcdali, srcCluster);
787+
updateCloneFrom(filename, dstfdesc, srcfdesc, ftree, srcdali, srcCluster);
775788
}
776789
return;
777790
}
@@ -832,6 +845,16 @@ class CFileCloner
832845
}
833846
else
834847
{
848+
IPropertyTree *dstClonedFDesc = dfile->queryAttributes().queryPropTree("cloneFromFDesc");
849+
IPropertyTree *srcClonedFDesc = srcfdesc->queryProperties().queryPropTree("cloneFromFDesc");
850+
if (dstClonedFDesc && srcClonedFDesc)
851+
{
852+
// if both based on cloneFromFDesc, no need to check other varieties.
853+
return !areMatchingPTrees(dstClonedFDesc, srcClonedFDesc);
854+
}
855+
else if (dstClonedFDesc || srcClonedFDesc) // one has cloneFromFDesc, the other doesn't
856+
return true;
857+
// else - neither based on cloneFromFDesc
835858
StringBuffer s;
836859
if (checkValueChanged(dfile->queryAttributes().queryProp("@cloneFrom"), srcdali->endpoint().getUrlStr(s).str()))
837860
return true;
@@ -921,7 +944,7 @@ class CFileCloner
921944
{
922945
Owned<IFileDescriptor> srcfdesc = deserializeFileDescriptorTree(ftree, NULL, 0);
923946
if (checkCloneFromChanged(dfile, srcfdesc, srcdali, srcCluster))
924-
updateCloneFrom(dfile, srcfdesc, srcdali, srcCluster);
947+
updateCloneFrom(dfile, srcfdesc, ftree, srcdali, srcCluster);
925948
}
926949
return;
927950
}

roxie/ccd/ccddali.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,13 @@ class CRoxieDaliHelper : implements IRoxieDaliHelper, public CInterface
356356

357357
IFileDescriptor *recreateCloneSource(IFileDescriptor *srcfdesc, const char *destfilename)
358358
{
359+
IPropertyTree *clonedFDescTree = srcfdesc->queryProperties().queryPropTree("cloneFromFDesc");
360+
if (clonedFDescTree)
361+
{
362+
Owned<IFileDescriptor> srcFDesc = deserializeFileDescriptorTree(clonedFDescTree);
363+
return srcFDesc.getClear();
364+
}
365+
359366
Owned<IFileDescriptor> dstfdesc = createFileDescriptor(srcfdesc->getProperties());
360367
// calculate dest dir
361368

@@ -596,7 +603,7 @@ class CRoxieDaliHelper : implements IRoxieDaliHelper, public CInterface
596603
return resolveCachedLFN(foreignLfn); // Note - cache only used when no dali connection available
597604
try
598605
{
599-
if (fdesc->queryProperties().hasProp("cloneFromGroup") && fdesc->queryProperties().hasProp("@cloneFromDir"))
606+
if (fdesc->queryProperties().hasProp("cloneFromFDesc") || (fdesc->queryProperties().hasProp("cloneFromGroup") && fdesc->queryProperties().hasProp("@cloneFromDir")))
600607
{
601608
Owned<IFileDescriptor> ret = recreateCloneSource(fdesc, _lfn);
602609
if (cacheIt)

0 commit comments

Comments
 (0)