@@ -406,7 +406,7 @@ class CFileCloner
406
406
throw afor2.exc .getClear ();
407
407
}
408
408
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)
410
410
{
411
411
DBGLOG (" updateCloneFrom %s" , lfn);
412
412
if (!srcdali || srcdali->endpoint ().isNull ())
@@ -421,8 +421,17 @@ class CFileCloner
421
421
if (prefix.length ())
422
422
attrs.setProp (" @cloneFromPrefix" , prefix.get ());
423
423
424
- while (attrs.removeProp (" cloneFromGroup" ));
425
424
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" ));
426
435
unsigned numClusters = srcfdesc->numClusters ();
427
436
for (unsigned clusterNum = 0 ; clusterNum < numClusters; clusterNum++)
428
437
{
@@ -438,15 +447,15 @@ class CFileCloner
438
447
}
439
448
}
440
449
}
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)
442
451
{
443
452
DistributedFilePropertyLock lock (dfile);
444
453
IPropertyTree &attrs = lock.queryAttributes ();
445
- updateCloneFrom (dfile->queryLogicalName (), attrs, srcfdesc, srcdali, srcCluster);
454
+ updateCloneFrom (dfile->queryLogicalName (), attrs, srcfdesc, srcTree, srcdali, srcCluster);
446
455
}
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)
448
457
{
449
- updateCloneFrom (lfn, dstfdesc->queryProperties (), srcfdesc, srcdali, srcCluster);
458
+ updateCloneFrom (lfn, dstfdesc->queryProperties (), srcfdesc, srcTree, srcdali, srcCluster);
450
459
}
451
460
452
461
void cloneSubFile (IPropertyTree *ftree,const char *destfilename, INode *srcdali, const char *srcCluster) // name already has prefix added
@@ -455,7 +464,11 @@ class CFileCloner
455
464
const char * kind = srcfdesc->queryProperties ().queryProp (" @kind" );
456
465
bool iskey = kind&&(strcmp (kind," key" )==0 );
457
466
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
+
459
472
if (!nameprefix.isEmpty ())
460
473
dstfdesc->queryProperties ().setProp (" @roxiePrefix" , nameprefix.get ());
461
474
if (!copyphysical)
@@ -507,7 +520,7 @@ class CFileCloner
507
520
}
508
521
509
522
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);
511
524
else
512
525
{
513
526
DBGLOG (" copyphysical dst=%s" , destfilename);
@@ -771,7 +784,7 @@ class CFileCloner
771
784
{
772
785
Owned<IFileDescriptor> dstfdesc=dfile->getFileDescriptor ();
773
786
Owned<IFileDescriptor> srcfdesc = deserializeFileDescriptorTree (ftree, NULL , 0 );
774
- updateCloneFrom (filename, dstfdesc, srcfdesc, srcdali, srcCluster);
787
+ updateCloneFrom (filename, dstfdesc, srcfdesc, ftree, srcdali, srcCluster);
775
788
}
776
789
return ;
777
790
}
@@ -832,6 +845,16 @@ class CFileCloner
832
845
}
833
846
else
834
847
{
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
835
858
StringBuffer s;
836
859
if (checkValueChanged (dfile->queryAttributes ().queryProp (" @cloneFrom" ), srcdali->endpoint ().getUrlStr (s).str ()))
837
860
return true ;
@@ -921,7 +944,7 @@ class CFileCloner
921
944
{
922
945
Owned<IFileDescriptor> srcfdesc = deserializeFileDescriptorTree (ftree, NULL , 0 );
923
946
if (checkCloneFromChanged (dfile, srcfdesc, srcdali, srcCluster))
924
- updateCloneFrom (dfile, srcfdesc, srcdali, srcCluster);
947
+ updateCloneFrom (dfile, srcfdesc, ftree, srcdali, srcCluster);
925
948
}
926
949
return ;
927
950
}
0 commit comments