HPCC-30365 Add XRef Sasha service to K8s#19639
HPCC-30365 Add XRef Sasha service to K8s#19639ghalliday merged 1 commit intohpcc-systems:candidate-9.12.xfrom
Conversation
|
Jira Issue: https://hpccsystems.atlassian.net//browse/HPCC-30365 Jirabot Action Result: |
| } | ||
| if (isDirPerPart) { | ||
| // MORE: Should maybe check this doesn't contain any subdirectories to make | ||
| // sure it is really a dirPerPart directory. Is an all numbers subdirectory valid in ecl? |
There was a problem hiding this comment.
in practice yes, a scope must have a leading alpha char. So worth clarifying the comment.
There was a problem hiding this comment.
Clarified comment.
| isDirPerPart = false; | ||
| } | ||
| if (isDirPerPart) { | ||
| // MORE: Should maybe check this doesn't contain any subdirectories to make |
There was a problem hiding this comment.
can check pdir.dirs after the scanDirectory, should be empty.
Let's add a check and throw an exception if not.
There was a problem hiding this comment.
Added check (pdir->dirs.ordinality()>0)
| unsigned maxMb = serverConfig->getPropInt("DfuXRef/@memoryLimit", DEFAULT_MAXMEMORY); | ||
| unsigned maxMb; | ||
| if (isContainerized()) { | ||
| const char *resourcedMemory = getComponentConfigSP()->queryProp("resources/@memory"); |
There was a problem hiding this comment.
now 'props' is saved, should used it instead of getComponentConfigSP() here.
There was a problem hiding this comment.
Fixed to use new props member.
| char next = *(s++); | ||
| if (next=='$') { | ||
| if (dirPerPart) | ||
| { |
There was a problem hiding this comment.
trivial/formatting: Allman vs K&R
| { | ||
| const char * start = buf.str(); | ||
| const char * slash = start + buf.length(); | ||
| while (slash > start && *slash != PATHSEPCHAR) |
There was a problem hiding this comment.
'slash' at the start is potentially beyond the end of the allocated buffer I think.
| while (slash > start && *slash != PATHSEPCHAR) | ||
| slash--; | ||
| buf.insert(slash-start, PATHSEPCHAR); | ||
| buf.insert((slash+1)-start, p+1); |
There was a problem hiding this comment.
not safe, buf may have reallocated after 1st insert, meaning 'slash' points to a free'd pointer.
There was a problem hiding this comment.
These insert also don't look right in that they're inserting "/", but the mask is typically something like "myfilename._$P$_of_10", so it's going to end up with e.g. "/5myfilename._5_of_10" afaics.
If it did find a slash, it would prob be okay, but there isn't necessarily a full path so there's no guarantee there's a slash.
There was a problem hiding this comment.
Also, the mask can be "myfilename._$P$_of_$N$" (see 'N' handleing below)
This insert code is going to be hit twice in that case, and therefore insert the dir-per-part directory twice...
There was a problem hiding this comment.
Reverted changes to expandMask in favor of storing prefix and scope directory paths in cFileDesc and building up full paths in getPartName instead.
| StringBuffer &expandMask(StringBuffer &buf, const char *mask, unsigned p, unsigned n, unsigned stripeNum, bool dirPerPart) | ||
| { | ||
| if (stripeNum>0) | ||
| addPathSepChar(buf.append('d').append(stripeNum)); |
There was a problem hiding this comment.
hm, how is this strip dir going to be in right place?
There was a problem hiding this comment.
Removed changes to expandMask.
jakesmith
left a comment
There was a problem hiding this comment.
As discussed in our meeting, there's are some issues with the way the info. is being scanned and stored in the hierarchical structure built up during the physical file scan and used subsequently.
Currently too much information is being stored per cFileDesc - as before, the file path shouldn't be needed, only the deduced filename mask.
Lost files are probably being misreported (at least during initial phase), because the paths they walk do not match the physical representation on disk (due to striping and dir-per-part directories).
saxref should:
- ensure runXRef is dealing with 1 plane a time (i.e. if multiple selected, process 1 at a time).
- store plane details (IPT) so accessible to other xref tasks during scan.
- during scanDirectories, if striped, detected when at stripe level, and 'skip'
- detect dir-per-part directory and 'skip'. But, check after recursing the dir, that contains no subdirs.
- Keep the filename mask only in cFileDesc
- Add scope/lfn to listOrphans. Build up in same way as 'basedir' is now.
Think we can get rid of baseDir altogether. - during scanLogicalFiles, parse file paths fetched from parts (add helper func), to remove stripe and dir-part-part, so can marry the pathing with the cDirDesc tree.
NB: LATER- may be better to assume that the cDirDesc is a representation of scopes, and walk scopes of logical file (+part endpoints), instead of getting part directories. - In listOrphans(cFileDesc), deduce file path from lfn, partNum and plane. Add a utility func that deduces and uses stripe num and dir-per-part if relevant (based on plane details).
| if (mname.isEmpty()) | ||
| // Assume that if prefix is passed in a match is required | ||
| if (prefix && prefix->isEmpty()) | ||
| throw makeStringExceptionV(-1, "Could not find matching prefix in plane definition for file %s", filename); |
There was a problem hiding this comment.
I think throwing an exception here, will mean 1 path that fails to match, will cause the whole xref process to fail?
True of any exception in parseFilename. NB: addFile only issues warnings.
addFile should likely have a try/catch and issue warnings in case of any exception in parseFilename.
There was a problem hiding this comment.
There's something that doesn't make sense here in fact I think..
How would the files not match prefix?
And, why is it scanning planes every file being added, to determine which plane the prefix path is in?
Given, we are specifically xref'ing a given plane, and therefore start at the prefix path..
This relates to HPCC-33151.
Let's discuss.
There was a problem hiding this comment.
Instead of matching the prefix for each file, the XRefManager stores the current storage plane.
| mname.append((d+1)-name, name).append(cur-(tailSlash+1), tailSlash+1); | ||
| if (dirs) | ||
| dirs->append((d+1)-name, name); | ||
| mname.append(cur-(tailSlash+1), tailSlash+1); |
There was a problem hiding this comment.
common with line 3881, could go outside if/else
There was a problem hiding this comment.
Removed use of parseFileName from addfile. Now the striped and dir-per-part status are deduced from the directory structure while building up cDirDescs in scanDirectory and passed to recursive calls.
|
|
||
| StringBuffer &getPartName(StringBuffer &buf,unsigned p) | ||
| { | ||
| // In baremetal, buf can be prepoulated with replicate directory |
There was a problem hiding this comment.
The old code was:
StringBuffer &getPartName(StringBuffer &buf,unsigned p)
{
StringBuffer mask;
getName(mask);
return expandMask(buf, mask, p, N);
}
If buf is prepopulated, didn't that mean that as it was, it added the whole path again?
There was a problem hiding this comment.
This feels like it's masking a problem, rather than the correct fix.
Something not quite right here..
the cFileDesc (and cDirDesc) contain the name only, not a path.
getPartName should be returning an expanded form of the name mask only, as it was before.
There was a problem hiding this comment.
Changed cFileDesc to contain just the file name.
71efafe to
1edf7ce
Compare
|
@jakesmith I made the changes to remove adding path and scope to cFileDesc and instead pass the plane information and striped and dir-per-part statuses down to cFIleDesc::create. This avoids having to match the prefix and lookup storage planes for every file. It seems in scanLogicalFiles there is more wrong than just not being able to include stripe and dir-per-part numbers. It is trying to match the current directory with the root. In bare-metal the root prefix looks like /var/lib/HPCCSystems/hpcc-data/thor based on which cluster is currently running xref. This will always fail to find files in directories for other components e.g. it will always say files under /var/lib/HPCCSystems/hpcc-data/roxie are potential lost files if doing the search on thor. In containerized this doesn't happen since the prefix won't contain the component name at the tail and will instead be /var/lib/HPCCSystems/hpcc-data. In this case the missing stripeNum and dir-per-part nums do cause an issue. Other than that, my tests for found/orphan files are working and everything is showing up correctly in results on bm and containerized versions. |
|
@jackdelv There are some Unit test errors. See: https://github.com/hpcc-systems/HPCC-Platform/actions/runs/14222208906/job/39855851609?pr=19639 |
@streeterd - hit similar problems when testing https://hpccsystems.atlassian.net/browse/HPCC-27051. |
|
@AttilaVamos @jakesmith I fixed the issue with the DFUXrefLibTests. I had made some changes to parseFileName and didn't notice the tests were failing. If the unittests are reporting errors, why is the github action being marked as "Succeeded" (I just saw your comment about opening a jira. Disregard) ? Also, it seems like the DFUAccessTests failures are occurring in other PR's. Should I ignore them? |
|
@jakesmith I noticed another error is occurring that I have never seen before.
In the test: https://github.com/hpcc-systems/HPCC-Platform/actions/runs/14222208906/job/39856041969 This probably has something to do with how I instantiated the sasha xref service, but I'm not sure what I did wrong. |
| f->getPartName(path,pn); | ||
| RemoteFilename rfn; | ||
| rfn.setPath(grp->queryNode((pn+drv)%numnodes).endpoint(),path.str()); | ||
| rfn.setPath(grp->queryNode((pn+drv)%numnodes).endpoint(),getPhysicalPartName(path,storagePlane,lfn.get(), pn, f->N, f->isDirPerPart, f->isStriped).str()); |
There was a problem hiding this comment.
quite a long hard to read line, would benefit from the getPhysicalPartName call begin on its own line.
But, can you check if constructPartFilename (dadfs.hpp) doesn't do what's required already?
I think it also covers the replicate case (in BM case only).
There was a problem hiding this comment.
Moved getPhysicalPartName to its own line.
There was a problem hiding this comment.
It looks like constructPartFilename does build up the correct physical part name, and all the information it needs is available in listOrphans. However, right before constructPartFilename returns the finished string, it lowercases the return buffer which causes checkOrphanPhysicalFile to not find the file.
I'm not sure why it does this, but I didn't want to change since it is probably relied on for other uses.
There was a problem hiding this comment.
I'm not sure why it does this, but I didn't want to change since it is probably relied on for other uses.
I think it's because all logical files are caseless by definition.. e.g. a::b::c is same as A::B::C - physical files should be lower cased in DFS.
which causes checkOrphanPhysicalFile to not find the file.
it failed because there was a physical file with mixed case? (there shouldn't be)
There was a problem hiding this comment.
Changed to use constructPartFilename and removed lower casing from the function.
| if (!scanDirectory(node,ep,path,drv,pdir,NULL,!isStriped,isStriped)) | ||
| return false; | ||
| if (!isStriped && pdir->dirs.ordinality()>0) | ||
| throw makeStringExceptionV(-1, LOGPFX "Directory Per Part %s contains other subdirectories.", path.str()); |
There was a problem hiding this comment.
need to be careful that 1 malformed file, doesn't cause all efforts to xref to be unrunnable.
Should report and skip, but not abort completely.
There was a problem hiding this comment.
Changed to log an error rather than throw an exception.
There was a problem hiding this comment.
See other comment, we need to revisit these rejections, they should appear in the orphaned report I think (needs JIRA to be done after this one).
There was a problem hiding this comment.
Currently, it is calling OERRLOG to report that the dir per part contains sub dirs. Is there a better way to log what is happening?
| // sure it is really a dirPerPart directory. Is an all numbers subdirectory valid in ecl? | ||
| if (!scanDirectory(node,ep,path,drv,pdir,NULL)) | ||
| if (isSpecialDir) { | ||
| // Files inside a special directory should be scanned with the current directory as the parent |
There was a problem hiding this comment.
can you expand on this. Explaining why structure is being built up without stripe and dir-per-part cDirDesc's
There was a problem hiding this comment.
Added more comments.
| if (!scanDirectory(node,ep,path,drv,pdir,NULL)) | ||
| if (isSpecialDir) { | ||
| // Files inside a special directory should be scanned with the current directory as the parent | ||
| if (!scanDirectory(node,ep,path,drv,pdir,NULL,!isStriped,isStriped)) |
There was a problem hiding this comment.
I think isStriped shouldn't be a recursively passed property.
We know whether files should be in stripe directories or not from the outset (from the plane details).
scanDirectories should check that the 1st level is a stripe directory format, skip it like this if it is, report an error if not and ignore directory.
There was a problem hiding this comment.
I'm not sure how to tell if there should be a stripe directory from the plane details.
I was trying to use numDevices, but in bare-metal I have a test file that does not have a stripeDir despite numDevices>1 being in the plane info.
Also, if there is something in the plane details saying there should be stripeDir, does this apply to all files in the plane i.e. could there be a plane where some files are striped on it and some aren't?
There was a problem hiding this comment.
I was trying to use numDevices, but in bare-metal I have a test file that does not have a stripeDir despite numDevices>1 being in the plane info.
If a plane has numDevices and it is not a 'hostGroup' (!plane->hasProp("@HoStGroup")) then it is striped.
@HoStGroup planes have a list of planes, although supported in containerized, they are generally going to be BM planes mapped over a set of hosts.
Also, if there is something in the plane details saying there should be stripeDir, does this apply to all files in the plane i.e. could there be a plane where some files are striped on it and some aren't?
No, if a plane implies striped, all files must be. It's because the plane defined the storage, the lfn's only know they layout based on the plane.
You could imagine a different scenario where the lfn's stored more detail - that might imply that the underlying original plane could change, and the existing lfn's remained associated with the old info, but that is not the design. Plane essentially need to be thought of as immutable, if different storage configuration were needed, then a new plane would need defining, and e.g. set as default, and pre-existing files would either remain on the old plane, or would need migrating.
There was a problem hiding this comment.
So:
- isStriped should be deduced at the start of the scan (NB: dirPerPart could vary per file).
- Should be remove as a member of cFileDesc
- scanDirectory should assert that the top-level directory looks like a strip-directory, and reject the files if not.
NB: TBD (open a new sub JIRA place) - rejecting files both for this and other places, e.g. when "Directory Per Part %s contains other subdirectories.", should probably not short-circuit and ignore them, but add them, such that they are picked up as orphans, or misplaced.
There was a problem hiding this comment.
Removed isStriped from cFileDesc and added a check to scanDirectories to log an error when expected stripe directories are not found in the toplevel.
| StringBuffer path; | ||
| if (drv) | ||
| setReplicateFilename(path,drv); | ||
| setReplicateFilename(addPathSepChar(path.append(basedir)),drv); |
There was a problem hiding this comment.
may be able to use constructPartFilename vs getPhysicalPartName and not special case here.
There was a problem hiding this comment.
If constructPartFilename didn't return a lowercased string, then it could be used here to avoid the special case.
There was a problem hiding this comment.
Why did lower casing causes issues? (see other comment).
There was a problem hiding this comment.
Removed lower casing in constructPartFilename because it was lower casing the prefix along with the filename.
| if (!scanDirectory(node,ep,path,drv,pdir,NULL)) | ||
| if (isSpecialDir) { | ||
| // Files inside a special directory should be scanned with the current directory as the parent | ||
| if (!scanDirectory(node,ep,path,drv,pdir,NULL,!isStriped,isStriped)) |
There was a problem hiding this comment.
I was trying to use numDevices, but in bare-metal I have a test file that does not have a stripeDir despite numDevices>1 being in the plane info.
If a plane has numDevices and it is not a 'hostGroup' (!plane->hasProp("@HoStGroup")) then it is striped.
@HoStGroup planes have a list of planes, although supported in containerized, they are generally going to be BM planes mapped over a set of hosts.
Also, if there is something in the plane details saying there should be stripeDir, does this apply to all files in the plane i.e. could there be a plane where some files are striped on it and some aren't?
No, if a plane implies striped, all files must be. It's because the plane defined the storage, the lfn's only know they layout based on the plane.
You could imagine a different scenario where the lfn's stored more detail - that might imply that the underlying original plane could change, and the existing lfn's remained associated with the old info, but that is not the design. Plane essentially need to be thought of as immutable, if different storage configuration were needed, then a new plane would need defining, and e.g. set as default, and pre-existing files would either remain on the old plane, or would need migrating.
| if (!scanDirectory(node,ep,path,drv,pdir,NULL)) | ||
| if (isSpecialDir) { | ||
| // Files inside a special directory should be scanned with the current directory as the parent | ||
| if (!scanDirectory(node,ep,path,drv,pdir,NULL,!isStriped,isStriped)) |
There was a problem hiding this comment.
So:
- isStriped should be deduced at the start of the scan (NB: dirPerPart could vary per file).
- Should be remove as a member of cFileDesc
- scanDirectory should assert that the top-level directory looks like a strip-directory, and reject the files if not.
NB: TBD (open a new sub JIRA place) - rejecting files both for this and other places, e.g. when "Directory Per Part %s contains other subdirectories.", should probably not short-circuit and ignore them, but add them, such that they are picked up as orphans, or misplaced.
| f->getPartName(path,pn); | ||
| RemoteFilename rfn; | ||
| rfn.setPath(grp->queryNode((pn+drv)%numnodes).endpoint(),path.str()); | ||
| rfn.setPath(grp->queryNode((pn+drv)%numnodes).endpoint(),getPhysicalPartName(path,storagePlane,lfn.get(), pn, f->N, f->isDirPerPart, f->isStriped).str()); |
There was a problem hiding this comment.
I'm not sure why it does this, but I didn't want to change since it is probably relied on for other uses.
I think it's because all logical files are caseless by definition.. e.g. a::b::c is same as A::B::C - physical files should be lower cased in DFS.
which causes checkOrphanPhysicalFile to not find the file.
it failed because there was a physical file with mixed case? (there shouldn't be)
| if (!scanDirectory(node,ep,path,drv,pdir,NULL,!isStriped,isStriped)) | ||
| return false; | ||
| if (!isStriped && pdir->dirs.ordinality()>0) | ||
| throw makeStringExceptionV(-1, LOGPFX "Directory Per Part %s contains other subdirectories.", path.str()); |
There was a problem hiding this comment.
See other comment, we need to revisit these rejections, they should appear in the orphaned report I think (needs JIRA to be done after this one).
| // sure it is really a dirPerPart directory. Is an all numbers subdirectory valid in ecl? | ||
| if (!scanDirectory(node,ep,path,drv,pdir,NULL)) | ||
| if (isSpecialDir) { | ||
| // Files inside a special directory should be scanned with the current directory as the parent |
| StringBuffer path; | ||
| if (drv) | ||
| setReplicateFilename(path,drv); | ||
| setReplicateFilename(addPathSepChar(path.append(basedir)),drv); |
There was a problem hiding this comment.
Why did lower casing causes issues? (see other comment).
|
@jakesmith Removing the call to StringBuffer::lowercase in constructPartFilename provided the expected physical filename, so I have removed getPhysicalPartName. I removed isStriped from the parameters of scanDirectory and the cFileDesc member since it can be deduced from the plane info. I've taken note of the two JIRAs you have mentioned. Am I missing anything?
|
| if (!isdigit(*(dir++))) | ||
| isSpecialDir = false; | ||
| } | ||
| // If numDevices>0, check that top-level directories are striped |
There was a problem hiding this comment.
should be >1 (see earlier comments)
| if (plane) | ||
| { | ||
| storagePlane.set(plane); | ||
| isPlaneStriped = !storagePlane->hasProp("@hostGroup") && (storagePlane->getPropInt("@numDevices", 1)>1); |
There was a problem hiding this comment.
trivial: no point in the default value in this context.
| unsigned numuniqnodes = 0; | ||
| Owned<IUserDescriptor> udesc; | ||
| Linked<IPropertyTree> storagePlane; | ||
| bool isPlaneStriped; |
There was a problem hiding this comment.
trivial: even though itialized in ctor, it's good practice for all members (for new code at least) to have member initializers. Helps if code is ever refactored etc., and compiler is usually smart enough not to initialize twice anyway.
| } | ||
|
|
||
| StringBuffer &getName(StringBuffer &buf) | ||
| bool getName(StringBuffer &buf) |
There was a problem hiding this comment.
trivial/not new: should be a const method really (as should get some of the members below)
Not that I can recall. Please open sub-jira's under parent, if haven't already. |
|
@jakesmith Fixed the trivial items. I added a check to the initializer for isDirStriped that dir[1] != '\0'. It seemed to be the best way to fix it, but is there a better way? Can the whole stripe/dirperpart check be refactored in a cleaner way? |
|
@jakesmith Opened two JIRAs relating to our discussion: https://hpccsystems.atlassian.net/browse/HPCC-33889 |
jakesmith
left a comment
There was a problem hiding this comment.
@jakesmith Fixed the trivial items. I added a check to the initializer for isDirStriped that dir[1] != '\0'. It seemed to be the best way to fix it, but is there a better way? Can the whole stripe/dirperpart check be refactored in a cleaner way?
I think it works as is.
I'd probably have introduced a isRestDigits inline helper and code like:
bool isDirStriped = false; // format 'd[0-9]+'
bool isSpecialDir = false; // isDirStriped || dirPerPart format '[0-9]+'
if (*dir == 'd')
{
dir++;
isDirStriped = (*dir != '\0') && isRestDigits(dir);
isSpecialDir = isDirStriped;
}
else
isSpecialDir = isRestDigits(dir);
untested!
@jackdelv - looks good I think. Please squash, and I'll hopefully do a final review in the morning.
f989f89 to
d9e01f4
Compare
| makePhysicalPartName(lname, partNo+1, max, fullname, 0, DFD_OSdefault, prefix, dirPerPart, stripeNum); | ||
|
|
||
| // revisit: constructPartFilename should be refactored not to deal with replicate directories, by pre-determining the alternate prefix if copy>0 | ||
| // If copy>0 it could do calPartLocation, find the replicate plane, get it's prefix, and pass to makePhysicalPartName |
There was a problem hiding this comment.
trivial: typo calcPartLocation
| IPropertyTree * plane = storage->addPropTree("planes"); | ||
|
|
||
| // Revisit: Ignore hthor planes when running XRef on storage planes | ||
| if (groupType == grp_hthor) |
There was a problem hiding this comment.
I'm 99% sure these group types only exist in BM/not created in containerized.
Comment should be updated.
| #endif | ||
|
|
||
| // takes filename and creates mask filename with $P$ extension | ||
| extern da_decl void parseFileName(const char *name,StringBuffer &mname,unsigned &num,unsigned &max,unsigned &stripeNum,unsigned &dirPerPart,bool &replicate) |
There was a problem hiding this comment.
it would be good to move this back into dfuxreflib.cpp where it was, as not shared anymore.
| for (unsigned m=0; m<n; m++) { | ||
| RemoteFilename rfn; | ||
| constructPartFilename(group,m+1,n,NULL,partmask.str(),dir.str(),false,1,rfn); | ||
| constructPartFilename(group,m+1,1,n,0,0,false,"",dir.str(),partmask.str(),0,rfn); |
There was a problem hiding this comment.
shouldn't the 3d parameter be 0 ? (copy=0)
| ndone[0] = 0; | ||
| ndone[1] = 0; | ||
| for (drv=0;drv<2;drv++) { | ||
| unsigned numDevices = storagePlane->hasProp("@HostGroup") ? 1 : storagePlane->getPropInt("@numDevices", 1); |
There was a problem hiding this comment.
.. but would make sense to add numDevices as a member and set at same time as isPlaneStriped
| ClusterPartDiskMapSpec mspec; | ||
| Owned<IGroup> grp = createIGroup("10.150.10.1-3"); | ||
| RemoteFilename rfn; | ||
| IStoragePlane *plane = getDataStoragePlane("mystorageplane", true); |
There was a problem hiding this comment.
leaks, but also not used - this line should be deleted.
8f9269d to
d0ef745
Compare
|
@jakesmith Squashed. |
jakesmith
left a comment
There was a problem hiding this comment.
@jackdelv - looks good.
As discussed, the dfuxreflib should likely be deprecated altogether. It is not the default or ever used in BM afaik (saxref is the standard setuip).
It would be good to assert that it is never used in k8s, and remove changes to it in this PR.
| if (!plane) | ||
| throw makeStringExceptionV(0, "Plane definition \"%s\" is missing for File", grpname.str()); | ||
| unsigned numDevices = plane->numDevices(); | ||
| bool r = replicate?1:0; |
|
@jakesmith Removed the dfuXRefLib changes. Since the constructPartFilename function was updated and is used in saxref, I changed dfuXRefLib to use the now deprecated version. I also added an assert that containerized should be using the new saxref path. |
| { | ||
| // MORE: Containerized should only be using saxref and dfuXRefLib should probably be removed | ||
| assert(xRefNode->useSasha()); | ||
| xRefNode->setStatus("Submitted"); |
There was a problem hiding this comment.
I think better to remove this line and the else. i.e. just the assert (should use assertex),
There was a problem hiding this comment.
Good to catch/assert here, but what I meant/was referring to, was the code in saxref.cpp:
bool eclwatchProviderDefault = false;
// NB: Default to start Xref using sasha service in containerized without having to change values.yaml
// eclwatchProvider sets useSasha in call to setSubmittedOk
if (isContainerized())
eclwatchProviderDefault = true;
bool eclwatchprovider = props->getPropBool("@eclwatchProvider",eclwatchProviderDefault);
That should explicitly only support the eclwatch provide option in containerized, e.g.:
bool eclwatchprovider = true;
if (!isContainerized()) // NB: containerized does not support xref any other way.
{
// eclwatchProvider sets useSasha in call to setSubmittedOk
eclwatchprovider = props->getPropBool("@eclwatchProvider");
}
jakesmith
left a comment
There was a problem hiding this comment.
@jackdelv - a couple of comments.
I notice some whitespaces creeping in (at end of lines).
(more obvious when using git diff on the CLI)
I haven't used it personally, but there is a vscode option:
"files.trimTailingWhitespace" : true
which may be useful
|
@jakesmith Fixed the assert. I also turned on that setting to hopefully prevent that from happening in the future. Which files had trailing whitespaces? I know the dfuXRefLib diff shows whitespace changes still, but those are removals. |
hm, I don't see them now. Maybe I was looking at wrong diff. |
|
@jackdelv - now that candidate-9.12.x exists, this needs to be rebased onto it. |
706fd44 to
7e55d41
Compare
|
@jakesmith Squashed, and Rebased on 9.12.x. Back to you. |
jakesmith
left a comment
There was a problem hiding this comment.
@jackdelv - looks good.
@ghalliday - please take a look.
| static cFileDesc * create(CLargeMemoryAllocator &mem,const char *_name,unsigned n) | ||
| static cFileDesc * create(CLargeMemoryAllocator &mem,const char *_name,unsigned n,bool d,unsigned fnLen) | ||
| { | ||
| size32_t sl = strlen(_name); |
There was a problem hiding this comment.
future: add an assert that fnLen <= 255
| if (dir.length()&&isPathSepChar(dir.charAt(dir.length()-1))) | ||
| dir.setLength(dir.length()-1); | ||
| unsigned drv = getPathDrive(dir.str()); // should match c | ||
| unsigned drv = isContainerized() ? getPathDrive(dir.str()) : 0; // should match c |
There was a problem hiding this comment.
Is this test around the correct way?
There was a problem hiding this comment.
No, that is wrong. It should be isContainerized() ? 0 : getPathDrive(dir.str());
457cef5 to
c4c0177
Compare
|
@ghalliday Squashed. |
| ForEachItemIn(i1, list) { | ||
| const char *planeName = list.item(i1); | ||
| Owned<IPropertyTree> plane = getStoragePlane(planeName); | ||
| if (isContainerized) { |
c4c0177 to
858cef8
Compare
7695468
into
hpcc-systems:candidate-9.12.x
Type of change:
Checklist:
Smoketest:
Testing: