From c1679639da335df1849a9896998923e72b3493a3 Mon Sep 17 00:00:00 2001 From: Shamser Ahmed Date: Tue, 7 Nov 2023 05:00:05 +0000 Subject: [PATCH 01/13] HPCC-30993 Fix file access for index read activity Serialize jhtree and file io stats to thor manager. Record jhtree and file io stats for Index Read Activity (to activity scope) (Correct cost calculation for index reads require jhtree stats, so with this change the file access cost for index read should be correct.) Signed-off-by: Shamser Ahmed --- .../activities/indexread/thindexreadslave.cpp | 161 +++++++++++------- 1 file changed, 102 insertions(+), 59 deletions(-) diff --git a/thorlcr/activities/indexread/thindexreadslave.cpp b/thorlcr/activities/indexread/thindexreadslave.cpp index b4c7d0cd7cc..dd6cc9257d5 100644 --- a/thorlcr/activities/indexread/thindexreadslave.cpp +++ b/thorlcr/activities/indexread/thindexreadslave.cpp @@ -44,6 +44,7 @@ class CIndexReadSlaveBase : public CSlaveActivity protected: StringAttr logicalFilename; IArrayOf partDescs; + bool isSuperFile = false; IHThorIndexReadBaseArg *helper; IHThorSourceLimitTransformExtra * limitTransformExtra; Owned allocator; @@ -76,10 +77,9 @@ class CIndexReadSlaveBase : public CSlaveActivity rowcount_t rowLimit = RCMAX; bool useRemoteStreaming = false; Owned lazyIFileIO; - mutable CriticalSection ioStatsCS; + mutable CriticalSection keyManagersCS; // CS for any updates to keyManagers unsigned fileTableStart = NotFound; - CStatsContextLogger contextLogger; - CStatsCtxLoggerDeltaUpdater statsUpdater; + std::vector> contextLoggers; class TransformCallback : implements IThorIndexCallback , public CSimpleInterface { @@ -98,7 +98,7 @@ class CIndexReadSlaveBase : public CSlaveActivity if (!keyManager) throw MakeActivityException(&activity, 0, "Callback attempting to read blob with no key manager - index being read remotely?"); needsBlobCleaning = true; - return (byte *) keyManager->loadBlob(id, dummy, &activity.contextLogger); + return (byte *) keyManager->loadBlob(id, dummy, nullptr); } void prepareManager(IKeyManager *_keyManager) { @@ -166,10 +166,9 @@ class CIndexReadSlaveBase : public CSlaveActivity unsigned projectedFormatCrc = helper->getProjectedFormatCrc(); IOutputMetaData *projectedFormat = helper->queryProjectedDiskRecordSize(); - unsigned p = partNum; - while (p keyIndex = createKeyIndex(path, crc, *lazyIFileIO, (unsigned) -1, false); - Owned klManager = createLocalKeyManager(helper->queryDiskRecordSize()->queryRecordAccessor(true), keyIndex, &contextLogger, helper->hasNewSegmentMonitors(), false); + IContextLogger * contextLogger = isSuperFile?contextLoggers[p]:contextLoggers[0]; + Owned klManager = createLocalKeyManager(helper->queryDiskRecordSize()->queryRecordAccessor(true), keyIndex, contextLogger, helper->hasNewSegmentMonitors(), false); if (localMerge) { if (!keyIndexSet) @@ -315,7 +315,10 @@ class CIndexReadSlaveBase : public CSlaveActivity translators.append(translator.getClear()); } keyIndexSet->addIndex(keyIndex.getClear()); - keyManagers.append(*klManager.getLink()); + { + CriticalBlock b(keyManagersCS); + keyManagers.append(*klManager.getLink()); + } keyManager = klManager; } else @@ -325,13 +328,17 @@ class CIndexReadSlaveBase : public CSlaveActivity if (translator) klManager->setLayoutTranslator(&translator->queryTranslator()); translators.append(translator.getClear()); - keyManagers.append(*klManager.getLink()); + { + CriticalBlock b(keyManagersCS); + keyManagers.append(*klManager.getLink()); + } keyManager = klManager; - partNum = p; + partNum = (p+1); // NB: returning next part number to process. return createIndexLookup(keyManager); } } - keyMergerManager.setown(createKeyMerger(helper->queryDiskRecordSize()->queryRecordAccessor(true), keyIndexSet, seekGEOffset, &contextLogger, helper->hasNewSegmentMonitors(), false)); + //Not tracking jhtree cache stats in KeyMerger at the moment. Future: something to consider + keyMergerManager.setown(createKeyMerger(helper->queryDiskRecordSize()->queryRecordAccessor(true), keyIndexSet, seekGEOffset, nullptr, helper->hasNewSegmentMonitors(), false)); const ITranslator *translator = translators.item(0); if (translator) keyMergerManager->setLayoutTranslator(&translator->queryTranslator()); @@ -348,40 +355,12 @@ class CIndexReadSlaveBase : public CSlaveActivity else return nullptr; } - void mergeFileStats(IPartDescriptor *partDesc, IFileIO *partIO) - { - if (fileStats.size()>0) - { - ISuperFileDescriptor * superFDesc = partDesc->queryOwner().querySuperFileDescriptor(); - if (superFDesc) - { - unsigned subfile, lnum; - if(superFDesc->mapSubPart(partDesc->queryPartIndex(), subfile, lnum)) - mergeStats(*fileStats[fileTableStart+subfile], partIO); - } - else - mergeStats(*fileStats[fileTableStart], partIO); - } - } - void updateStats() - { - // NB: updateStats() should always be called whilst ioStatsCS is held. - if (lazyIFileIO) - { - mergeStats(inactiveStats, lazyIFileIO); - if (currentPartqueryHelper(); limitTransformExtra = nullptr; @@ -555,7 +533,6 @@ class CIndexReadSlaveBase : public CSlaveActivity break; if (keyManager) prepareManager(keyManager); - CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); if (hard) // checkCount checks hard key count only. count += indexInput->checkCount(keyedLimit-count); // part max, is total limit [keyedLimit] minus total so far [count] else @@ -589,7 +566,10 @@ class CIndexReadSlaveBase : public CSlaveActivity partDescs.kill(); keyIndexSet.clear(); translators.kill(); - keyManagers.kill(); + { + CriticalBlock b(keyManagersCS); + keyManagers.kill(); + } keyMergerManager.clear(); } else @@ -607,6 +587,7 @@ class CIndexReadSlaveBase : public CSlaveActivity IPartDescriptor &part0 = partDescs.item(0); IFileDescriptor &fileDesc = part0.queryOwner(); ISuperFileDescriptor *super = fileDesc.querySuperFileDescriptor(); + isSuperFile = super != nullptr; if ((0 == (helper->getFlags() & TIRusesblob)) && !localMerge) { @@ -684,7 +665,17 @@ class CIndexReadSlaveBase : public CSlaveActivity } } data.read(fileTableStart); - setupSpace4FileStats(fileTableStart, reInit, super!=nullptr, super?super->querySubFiles():0, indexReadActivityStatistics); + setupSpace4FileStats(fileTableStart, reInit, isSuperFile, isSuperFile?super->querySubFiles():0, indexReadFileStatistics); + if (isSuperFile) + { + // Only superfiles required multiple context loggers to track sublevel stats + for(unsigned i = 0; i < parts; ++i) + contextLoggers.push_back(new CStatsContextLogger(jhtreeCacheStatistics, thorJob)); + } + else + { + contextLoggers.push_back(new CStatsContextLogger(jhtreeCacheStatistics, thorJob)); + } } } // IThorDataLink @@ -719,10 +710,70 @@ class CIndexReadSlaveBase : public CSlaveActivity virtual void gatherActiveStats(CRuntimeStatisticCollection &activeStats) const { PARENT::gatherActiveStats(activeStats); + // *) jhtree stats will have been tracked as follows + // - For superfiles, there will be 1 IContextLogger in contextLoggers[] for each part + // - In all other cases, use 1st IContextLogger in contextLoggers[] for all parts + // *) File IO stats will have been tracked as follows + // - the io stats will be tracked in keyManagers[] + // - (There will be exactly 1 keyManager per part) + // Note: the KeyManagers[], contextLoggers[] and fileStats[] are not necessarilly the same size + // - KeyManagers[] will always be the same size as partDescs[] + // - contextLoggers[] will be the size of the number of subfiles for superfiles, otherwise 1 + // - fileStats[] may be size of #subfiles for superfiles, size 1 for dynamic/variable files, or + // zero for everything else + // This function will: + // 1) In all cases, activeStats will have activity level jhtree & io stats + // 2) For superfiles and variable/dynamic files, fileStats[] will have jhtree & io stats + // (If there are no fileStats, the file level stats can be extracted from activeStats) + // TODO: + // * When localMerge==true or when useMerger==true, stats may not correct. Revisit + // this section to ensure that the code handles these correctly. + if (partDescs.ordinality()) { - CriticalBlock b(ioStatsCS); - if (lazyIFileIO) - mergeStats(activeStats, lazyIFileIO); + // reset required because within loop below, mergeStats() is used to build up stats for each file + for (auto & fileStatItem: fileStats) + fileStatItem->reset(); + ISuperFileDescriptor *superFDesc = partDescs.item(0).queryOwner().querySuperFileDescriptor(); + for (unsigned partNum=0; partNum0) + { + unsigned subfile = 0; + // For super file workout entry number in filestats for subfile + // (For non-superfiles, subfile will be zero, so first entry from fileStats will be used) + if (isSuperFile) + { + unsigned lnum; + if(!superFDesc->mapSubPart(partDescs.item(partNum).queryPartIndex(), subfile, lnum)) + continue; // should not happen + } + CRuntimeStatisticCollection * fileStatItem = fileStats[fileTableStart+subfile]; + keyManager->mergeStats(*fileStatItem); // file level IO stats + // Merge subfile jhtree stats into fileStats and activeStats + if (isSuperFile) + { + fileStatItem->merge(contextLoggers[partNum]->queryStats()); + activeStats.merge(contextLoggers[partNum]->queryStats()); + } + } + // IO stats always needed in activeStats for activity level stats + keyManager->mergeStats(activeStats); + } + // ContextLoggers for non-superfile, not merged to activeStats or fileStats + // (Avoid doing in loop above, to avoid merging same jhtree stats multiple times) + if (!isSuperFile) + { + activeStats.merge(contextLoggers[0]->queryStats()); + if (fileStats.size()>0) + fileStats[fileTableStart]->merge(contextLoggers[0]->queryStats()); + } } activeStats.setStatistic(StNumRowsProcessed, progress); } @@ -735,11 +786,7 @@ class CIndexReadSlaveBase : public CSlaveActivity } virtual void done() override { - { - CriticalBlock b(ioStatsCS); - updateStats(); - lazyIFileIO.clear(); - } + lazyIFileIO.clear(); PARENT::done(); } }; @@ -819,7 +866,6 @@ class CIndexReadSlaveActivity : public CIndexReadSlaveBase helper->mapOutputToInput(tempBuilder, seek, numFields); // NOTE - weird interface to mapOutputToInput means that it STARTS writing at seekGEOffset... rawSeek = (byte *)temp; } - CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); if (!currentManager->lookupSkip(rawSeek, seekGEOffset, seekSize)) return NULL; const byte *row = currentManager->queryKeyBuffer(); @@ -972,7 +1018,6 @@ class CIndexReadSlaveActivity : public CIndexReadSlaveBase // IRowStream virtual void stop() override { - CStatsScopedDeltaUpdater scoped(statsUpdater); if (RCMAX != keyedLimit) // NB: will not be true if nextRow() has handled { keyedLimitCount = sendGetCount(keyedProcessed); @@ -1142,7 +1187,6 @@ class CIndexGroupAggregateSlaveActivity : public CIndexReadSlaveBase, implements if (keyManager) prepareManager(keyManager); - CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); while (true) { const void *key = indexInput->nextKey(); @@ -1301,7 +1345,6 @@ class CIndexCountSlaveActivity : public CIndexReadSlaveBase if (keyManager) prepareManager(keyManager); - CStatsScopedThresholdDeltaUpdater scoped(statsUpdater); while (true) { const void *key = indexInput->nextKey(); From 8592affd97984d3d755ad961f0e77c185a2816b4 Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Thu, 25 Jan 2024 08:22:48 +0000 Subject: [PATCH 02/13] HPCC-31173 Bump ECL Watch dependency versions (security) Signed-off-by: Gordon Smith --- esp/src/package-lock.json | 494 ++++++++++++++++++-------------------- esp/src/package.json | 30 +-- 2 files changed, 242 insertions(+), 282 deletions(-) diff --git a/esp/src/package-lock.json b/esp/src/package-lock.json index 2b4008311bf..c77045112ff 100644 --- a/esp/src/package-lock.json +++ b/esp/src/package-lock.json @@ -9,12 +9,12 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@fluentui/react": "8.114.0", - "@fluentui/react-components": "9.44.0", - "@fluentui/react-experiments": "8.14.122", - "@fluentui/react-hooks": "8.6.34", - "@fluentui/react-icons-mdl2": "1.3.53", - "@fluentui/react-migration-v8-v9": "9.4.42", + "@fluentui/react": "8.115.1", + "@fluentui/react-components": "9.46.0", + "@fluentui/react-experiments": "8.14.128", + "@fluentui/react-hooks": "8.6.36", + "@fluentui/react-icons-mdl2": "1.3.56", + "@fluentui/react-migration-v8-v9": "9.5.4", "@hpcc-js/chart": "2.81.9", "@hpcc-js/codemirror": "2.61.1", "@hpcc-js/common": "2.71.14", @@ -46,7 +46,7 @@ "query-string": "7.1.3", "react": "17.0.2", "react-dom": "17.0.2", - "react-hook-form": "7.49.2", + "react-hook-form": "7.49.3", "react-hot-toast": "2.4.1", "react-reflex": "4.2.1", "react-sizeme": "3.0.2", @@ -56,27 +56,27 @@ "devDependencies": { "@simbathesailor/use-what-changed": "^2.0.0", "@types/dojo": "1.9.48", - "@types/react": "17.0.74", + "@types/react": "17.0.75", "@types/react-dom": "17.0.25", - "@typescript-eslint/eslint-plugin": "6.17.0", - "@typescript-eslint/parser": "6.17.0", + "@typescript-eslint/eslint-plugin": "6.19.1", + "@typescript-eslint/parser": "6.19.1", "copyfiles": "2.4.1", - "css-loader": "6.8.1", + "css-loader": "6.9.1", "dojo-webpack-plugin": "3.0.6", "eslint": "8.56.0", "eslint-plugin-eclwatch": "file:./eslint", "eslint-plugin-react-hooks": "4.6.0", "file-loader": "6.2.0", - "local-web-server": "5.3.0", + "local-web-server": "5.3.1", "npm-run-all": "4.1.5", "rimraf": "5.0.5", - "source-map-loader": "4.0.2", + "source-map-loader": "5.0.0", "string-replace-loader": "3.1.0", - "style-loader": "3.3.3", + "style-loader": "3.3.4", "tslib": "2.6.2", "typescript": "5.3.3", "url-loader": "4.1.1", - "webpack": "5.89.0", + "webpack": "5.90.0", "webpack-cli": "5.1.4", "webpack-dev-server": "4.15.1" } @@ -271,48 +271,6 @@ "tslib": "^2.1.0" } }, - "node_modules/@fluentui/fluent2-theme/node_modules/@fluentui/react": { - "version": "8.115.1", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.115.1.tgz", - "integrity": "sha512-ffDEOTmP60Rwpf9Lyw7jUXDZSGWqQsR2DPhmDlBzgrOLoNgr/0QP+EZb2lOiUl62k6VQl0NO3YeNFSptIvYM2A==", - "dependencies": { - "@fluentui/date-time-utilities": "^8.5.16", - "@fluentui/font-icons-mdl2": "^8.5.31", - "@fluentui/foundation-legacy": "^8.2.51", - "@fluentui/merge-styles": "^8.5.15", - "@fluentui/react-focus": "^8.8.39", - "@fluentui/react-hooks": "^8.6.36", - "@fluentui/react-portal-compat-context": "^9.0.11", - "@fluentui/react-window-provider": "^2.2.18", - "@fluentui/set-version": "^8.2.14", - "@fluentui/style-utilities": "^8.10.2", - "@fluentui/theme": "^2.6.41", - "@fluentui/utilities": "^8.13.24", - "@microsoft/load-themed-styles": "^1.10.26", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@types/react": ">=16.8.0 <19.0.0", - "@types/react-dom": ">=16.8.0 <19.0.0", - "react": ">=16.8.0 <19.0.0", - "react-dom": ">=16.8.0 <19.0.0" - } - }, - "node_modules/@fluentui/fluent2-theme/node_modules/@fluentui/react-hooks": { - "version": "8.6.36", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.36.tgz", - "integrity": "sha512-kI0Z4Q4xHUs4SOmmI5n5OH5fPckqMSCovTRpiuxzCO2TNzLmfC861+nqf4Ygw/ChqNm2gWNZZfUADfnNAEsq+Q==", - "dependencies": { - "@fluentui/react-window-provider": "^2.2.18", - "@fluentui/set-version": "^8.2.14", - "@fluentui/utilities": "^8.13.24", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@types/react": ">=16.8.0 <19.0.0", - "react": ">=16.8.0 <19.0.0" - } - }, "node_modules/@fluentui/font-icons-mdl2": { "version": "8.5.31", "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.31.tgz", @@ -374,22 +332,22 @@ } }, "node_modules/@fluentui/react": { - "version": "8.114.0", - "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.114.0.tgz", - "integrity": "sha512-Ux/MYJ6qz7TaQEgMVUkB/vUQt2O/xUsRQX0v40XlXg76rQ3pQB3SzxJsi2d+CCaESkI9/YwVR4YVqXtCrvla/A==", - "dependencies": { - "@fluentui/date-time-utilities": "^8.5.15", - "@fluentui/font-icons-mdl2": "^8.5.28", - "@fluentui/foundation-legacy": "^8.2.48", - "@fluentui/merge-styles": "^8.5.14", - "@fluentui/react-focus": "^8.8.35", - "@fluentui/react-hooks": "^8.6.34", - "@fluentui/react-portal-compat-context": "^9.0.10", - "@fluentui/react-window-provider": "^2.2.17", - "@fluentui/set-version": "^8.2.13", - "@fluentui/style-utilities": "^8.9.21", - "@fluentui/theme": "^2.6.39", - "@fluentui/utilities": "^8.13.22", + "version": "8.115.1", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-8.115.1.tgz", + "integrity": "sha512-ffDEOTmP60Rwpf9Lyw7jUXDZSGWqQsR2DPhmDlBzgrOLoNgr/0QP+EZb2lOiUl62k6VQl0NO3YeNFSptIvYM2A==", + "dependencies": { + "@fluentui/date-time-utilities": "^8.5.16", + "@fluentui/font-icons-mdl2": "^8.5.31", + "@fluentui/foundation-legacy": "^8.2.51", + "@fluentui/merge-styles": "^8.5.15", + "@fluentui/react-focus": "^8.8.39", + "@fluentui/react-hooks": "^8.6.36", + "@fluentui/react-portal-compat-context": "^9.0.11", + "@fluentui/react-window-provider": "^2.2.18", + "@fluentui/set-version": "^8.2.14", + "@fluentui/style-utilities": "^8.10.2", + "@fluentui/theme": "^2.6.41", + "@fluentui/utilities": "^8.13.24", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" }, @@ -425,23 +383,23 @@ } }, "node_modules/@fluentui/react-alert": { - "version": "9.0.0-beta.98", - "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.98.tgz", - "integrity": "sha512-M9O4ZlmjU7CtpUtGDbyNFSM36vKIgJOorVPNBlBaDDCLuhH/GK6FaAHMB0IibdbzPZywfRAbQhETVZ9+MErrjA==", - "dependencies": { - "@fluentui/react-avatar": "^9.6.3", - "@fluentui/react-button": "^9.3.60", - "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.23", - "@fluentui/react-tabster": "^9.16.1", + "version": "9.0.0-beta.105", + "resolved": "https://registry.npmjs.org/@fluentui/react-alert/-/react-alert-9.0.0-beta.105.tgz", + "integrity": "sha512-poLnP41rjBu2nA14GUlj2MslNhF/Wyc1+LUUCcqSDgrF61uqSRe8QkHih2beRZ/kMg1ArnafFS0k7wSLO27zkg==", + "dependencies": { + "@fluentui/react-avatar": "^9.6.10", + "@fluentui/react-button": "^9.3.66", + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.28", + "@fluentui/react-tabster": "^9.17.4", "@fluentui/react-theme": "^9.1.16", - "@fluentui/react-utilities": "^9.15.5", + "@fluentui/react-utilities": "^9.17.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", "react": ">=16.14.0 <19.0.0", "react-dom": ">=16.14.0 <19.0.0" } @@ -628,65 +586,66 @@ } }, "node_modules/@fluentui/react-components": { - "version": "9.44.0", - "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.44.0.tgz", - "integrity": "sha512-CCV3aYBNLpTC+/6VcSBHoJwfmNbZOpbUN7i+biGmzrRbVvDrkta9CksgCQ6E4vXAM5tcQFSEP9iq3rRG3Zur9A==", - "dependencies": { - "@fluentui/react-accordion": "^9.3.33", - "@fluentui/react-alert": "9.0.0-beta.98", - "@fluentui/react-avatar": "^9.6.3", - "@fluentui/react-badge": "^9.2.18", - "@fluentui/react-breadcrumb": "^9.0.6", - "@fluentui/react-button": "^9.3.60", - "@fluentui/react-card": "^9.0.59", - "@fluentui/react-checkbox": "^9.2.4", - "@fluentui/react-combobox": "^9.5.37", - "@fluentui/react-dialog": "^9.9.2", - "@fluentui/react-divider": "^9.2.54", - "@fluentui/react-drawer": "^9.0.6", - "@fluentui/react-field": "^9.1.46", - "@fluentui/react-image": "^9.1.51", - "@fluentui/react-infobutton": "9.0.0-beta.82", - "@fluentui/react-infolabel": "^9.0.10", - "@fluentui/react-input": "^9.4.56", - "@fluentui/react-label": "^9.1.54", - "@fluentui/react-link": "^9.2.3", - "@fluentui/react-menu": "^9.12.39", - "@fluentui/react-message-bar": "^9.0.11", - "@fluentui/react-overflow": "^9.1.4", - "@fluentui/react-persona": "^9.2.62", - "@fluentui/react-popover": "^9.8.27", - "@fluentui/react-portal": "^9.4.6", - "@fluentui/react-positioning": "^9.10.6", - "@fluentui/react-progress": "^9.1.56", - "@fluentui/react-provider": "^9.13.4", - "@fluentui/react-radio": "^9.1.61", - "@fluentui/react-select": "^9.1.56", - "@fluentui/react-shared-contexts": "^9.13.2", - "@fluentui/react-skeleton": "^9.0.44", - "@fluentui/react-slider": "^9.1.61", - "@fluentui/react-spinbutton": "^9.2.56", - "@fluentui/react-spinner": "^9.3.34", - "@fluentui/react-switch": "^9.1.61", - "@fluentui/react-table": "^9.10.17", - "@fluentui/react-tabs": "^9.4.2", - "@fluentui/react-tabster": "^9.16.1", - "@fluentui/react-tags": "^9.0.16", - "@fluentui/react-text": "^9.4.3", - "@fluentui/react-textarea": "^9.3.56", + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@fluentui/react-components/-/react-components-9.46.0.tgz", + "integrity": "sha512-n8hftI4+zIrg3uE/oGUpG/jdNUZNeUAm+8CUtKtaU3e6/A4yBWBQkO0IAYuoo4anl5AmSa2RLHoQwEr4neQScw==", + "dependencies": { + "@fluentui/react-accordion": "^9.3.39", + "@fluentui/react-alert": "9.0.0-beta.105", + "@fluentui/react-aria": "^9.8.0", + "@fluentui/react-avatar": "^9.6.10", + "@fluentui/react-badge": "^9.2.23", + "@fluentui/react-breadcrumb": "^9.0.12", + "@fluentui/react-button": "^9.3.66", + "@fluentui/react-card": "^9.0.65", + "@fluentui/react-checkbox": "^9.2.9", + "@fluentui/react-combobox": "^9.7.1", + "@fluentui/react-dialog": "^9.9.8", + "@fluentui/react-divider": "^9.2.59", + "@fluentui/react-drawer": "^9.1.2", + "@fluentui/react-field": "^9.1.51", + "@fluentui/react-image": "^9.1.56", + "@fluentui/react-infobutton": "9.0.0-beta.89", + "@fluentui/react-infolabel": "^9.0.17", + "@fluentui/react-input": "^9.4.61", + "@fluentui/react-label": "^9.1.59", + "@fluentui/react-link": "^9.2.8", + "@fluentui/react-menu": "^9.12.46", + "@fluentui/react-message-bar": "^9.0.17", + "@fluentui/react-overflow": "^9.1.9", + "@fluentui/react-persona": "^9.2.69", + "@fluentui/react-popover": "^9.8.34", + "@fluentui/react-portal": "^9.4.11", + "@fluentui/react-positioning": "^9.12.5", + "@fluentui/react-progress": "^9.1.61", + "@fluentui/react-provider": "^9.13.9", + "@fluentui/react-radio": "^9.2.4", + "@fluentui/react-select": "^9.1.61", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-skeleton": "^9.0.49", + "@fluentui/react-slider": "^9.1.66", + "@fluentui/react-spinbutton": "^9.2.61", + "@fluentui/react-spinner": "^9.3.39", + "@fluentui/react-switch": "^9.1.66", + "@fluentui/react-table": "^9.11.6", + "@fluentui/react-tabs": "^9.4.7", + "@fluentui/react-tabster": "^9.17.4", + "@fluentui/react-tags": "^9.0.23", + "@fluentui/react-text": "^9.4.8", + "@fluentui/react-textarea": "^9.3.61", "@fluentui/react-theme": "^9.1.16", - "@fluentui/react-toast": "^9.3.22", - "@fluentui/react-toolbar": "^9.1.61", - "@fluentui/react-tooltip": "^9.4.5", - "@fluentui/react-tree": "^9.4.19", - "@fluentui/react-utilities": "^9.15.5", - "@fluentui/react-virtualizer": "9.0.0-alpha.62", + "@fluentui/react-toast": "^9.3.28", + "@fluentui/react-toolbar": "^9.1.67", + "@fluentui/react-tooltip": "^9.4.12", + "@fluentui/react-tree": "^9.4.26", + "@fluentui/react-utilities": "^9.17.0", + "@fluentui/react-virtualizer": "9.0.0-alpha.67", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", "react": ">=16.14.0 <19.0.0", "react-dom": ">=16.14.0 <19.0.0", "scheduler": "^0.19.0 || ^0.20.0" @@ -776,20 +735,20 @@ } }, "node_modules/@fluentui/react-experiments": { - "version": "8.14.122", - "resolved": "https://registry.npmjs.org/@fluentui/react-experiments/-/react-experiments-8.14.122.tgz", - "integrity": "sha512-8jz1lbtBomxEpJRQPC2+IavpyVSWeGF82BrSCAL//sUBTCsGddILYvSBJbZvM2I+DCkCjLzA5kd7PRDlElE+GQ==", - "dependencies": { - "@fluentui/example-data": "^8.4.14", - "@fluentui/font-icons-mdl2": "^8.5.28", - "@fluentui/foundation-legacy": "^8.2.48", - "@fluentui/merge-styles": "^8.5.14", - "@fluentui/react": "^8.114.0", - "@fluentui/react-hooks": "^8.6.34", - "@fluentui/set-version": "^8.2.13", - "@fluentui/style-utilities": "^8.9.21", - "@fluentui/theme": "^2.6.39", - "@fluentui/utilities": "^8.13.22", + "version": "8.14.128", + "resolved": "https://registry.npmjs.org/@fluentui/react-experiments/-/react-experiments-8.14.128.tgz", + "integrity": "sha512-aqfDEpohDhgfM48aGoikpf2F6wbI3r9sF1cmSdZTn9HG3pJbyOMvP4qWM/VYhTmZCzy1ZDe+6qy4YdMsrLAgnw==", + "dependencies": { + "@fluentui/example-data": "^8.4.15", + "@fluentui/font-icons-mdl2": "^8.5.31", + "@fluentui/foundation-legacy": "^8.2.51", + "@fluentui/merge-styles": "^8.5.15", + "@fluentui/react": "^8.115.1", + "@fluentui/react-hooks": "^8.6.36", + "@fluentui/set-version": "^8.2.14", + "@fluentui/style-utilities": "^8.10.2", + "@fluentui/theme": "^2.6.41", + "@fluentui/utilities": "^8.13.24", "@microsoft/load-themed-styles": "^1.10.26", "deep-assign": "^2.0.0", "prop-types": "^15.7.2", @@ -841,13 +800,13 @@ } }, "node_modules/@fluentui/react-hooks": { - "version": "8.6.34", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.34.tgz", - "integrity": "sha512-FtfvsOHuNz4JfmACAUpJKyh/62i14s5K8lk4GGoe4soETyaKAlmYX9HbBOrFi9FkKk6scrFytLCViQ8sR15bDA==", + "version": "8.6.36", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.6.36.tgz", + "integrity": "sha512-kI0Z4Q4xHUs4SOmmI5n5OH5fPckqMSCovTRpiuxzCO2TNzLmfC861+nqf4Ygw/ChqNm2gWNZZfUADfnNAEsq+Q==", "dependencies": { - "@fluentui/react-window-provider": "^2.2.17", - "@fluentui/set-version": "^8.2.13", - "@fluentui/utilities": "^8.13.22", + "@fluentui/react-window-provider": "^2.2.18", + "@fluentui/set-version": "^8.2.14", + "@fluentui/utilities": "^8.13.24", "tslib": "^2.1.0" }, "peerDependencies": { @@ -868,13 +827,13 @@ } }, "node_modules/@fluentui/react-icons-mdl2": { - "version": "1.3.53", - "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.53.tgz", - "integrity": "sha512-GJjyOkj7sau+hFkTMriRvoafcIVLrmfvo0xicryKIl5u0UcBJjIXuwlRpnWFTXQzPWJ42s1jvvlNV3S/zOCtvg==", + "version": "1.3.56", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons-mdl2/-/react-icons-mdl2-1.3.56.tgz", + "integrity": "sha512-3tjyfyS2qSeto0uQYGq/C6IRzSAaDkyfuVqlJ+e/B5o7qpgHEIE3kcX+Nl6aYIZyeR+fFdzrcXe97A9uFK+aaA==", "dependencies": { - "@fluentui/react-icon-provider": "^1.3.49", - "@fluentui/set-version": "^8.2.13", - "@fluentui/utilities": "^8.13.22", + "@fluentui/react-icon-provider": "^1.3.52", + "@fluentui/set-version": "^8.2.14", + "@fluentui/utilities": "^8.13.24", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" }, @@ -918,23 +877,23 @@ } }, "node_modules/@fluentui/react-infobutton": { - "version": "9.0.0-beta.82", - "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.82.tgz", - "integrity": "sha512-/fxZqCf0BWdoROFjFM89MKZf7QRY6RtH83B2ilEV5+kpOhUoSXkdqfUZJH4uDfn692VTz0nv3BccGQqQ0jzhEA==", - "dependencies": { - "@fluentui/react-icons": "^2.0.217", - "@fluentui/react-jsx-runtime": "^9.0.23", - "@fluentui/react-label": "^9.1.54", - "@fluentui/react-popover": "^9.8.27", - "@fluentui/react-tabster": "^9.16.1", + "version": "9.0.0-beta.89", + "resolved": "https://registry.npmjs.org/@fluentui/react-infobutton/-/react-infobutton-9.0.0-beta.89.tgz", + "integrity": "sha512-EKe1wwW/vL23Xj9CViSZdqT4Ywjfg90iA7JXYeRw0qP351+XV+J6WLuMUpGjsF7cURP/XVaH8ekXRv6QyQ+pBw==", + "dependencies": { + "@fluentui/react-icons": "^2.0.224", + "@fluentui/react-jsx-runtime": "^9.0.28", + "@fluentui/react-label": "^9.1.59", + "@fluentui/react-popover": "^9.8.34", + "@fluentui/react-tabster": "^9.17.4", "@fluentui/react-theme": "^9.1.16", - "@fluentui/react-utilities": "^9.15.5", + "@fluentui/react-utilities": "^9.17.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", "react": ">=16.14.0 <19.0.0", "react-dom": ">=16.14.0 <19.0.0" } @@ -1090,23 +1049,24 @@ } }, "node_modules/@fluentui/react-migration-v8-v9": { - "version": "9.4.42", - "resolved": "https://registry.npmjs.org/@fluentui/react-migration-v8-v9/-/react-migration-v8-v9-9.4.42.tgz", - "integrity": "sha512-oSCYrbCTp43dVfSGp5GwX74bKnkYflYeFCXo2kutMypRv5+oGlELBl2yRTglxlKe31BwnSnNRzovMtFEN4UTHA==", + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/@fluentui/react-migration-v8-v9/-/react-migration-v8-v9-9.5.4.tgz", + "integrity": "sha512-ygPjiMdrTfnpeP4ORYg688GfxNlaFl0V8NW/+TszvzbNtvxsxVqYfJjFqKjyLc8FYgd6MSqL4f+iOPuwOdd4fg==", "dependencies": { "@ctrl/tinycolor": "3.3.4", - "@fluentui/fluent2-theme": "^8.107.54", - "@fluentui/react": "^8.114.0", - "@fluentui/react-components": "^9.44.0", - "@fluentui/react-icons": "^2.0.217", + "@fluentui/fluent2-theme": "^8.107.59", + "@fluentui/react": "^8.115.0", + "@fluentui/react-components": "^9.46.0", + "@fluentui/react-hooks": "^8.6.36", + "@fluentui/react-icons": "^2.0.224", "@fluentui/react-theme": "^9.1.16", - "@fluentui/react-utilities": "^9.15.5", + "@fluentui/react-utilities": "^9.17.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", "react": ">=16.14.0 <19.0.0", "react-dom": ">=16.14.0 <19.0.0" } @@ -1709,19 +1669,19 @@ } }, "node_modules/@fluentui/react-virtualizer": { - "version": "9.0.0-alpha.62", - "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.62.tgz", - "integrity": "sha512-HOcH6kyumgFijLSeM3v4otRqFRvNjw217bFSEiCfO5xBMKqa5kzLDzOaiUQYwaPC9CV7FUoYkTwQ06IIOqTpOA==", + "version": "9.0.0-alpha.67", + "resolved": "https://registry.npmjs.org/@fluentui/react-virtualizer/-/react-virtualizer-9.0.0-alpha.67.tgz", + "integrity": "sha512-R/zxdlVymbRtZ/yHvd5cO4i9PZAc9u3hvMouJ8DrcTZeuudjEnPfH5svKZgW1h5XY5Oz8LzyWMmISP1oGkYeEw==", "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.23", - "@fluentui/react-shared-contexts": "^9.13.2", - "@fluentui/react-utilities": "^9.15.5", + "@fluentui/react-jsx-runtime": "^9.0.28", + "@fluentui/react-shared-contexts": "^9.14.0", + "@fluentui/react-utilities": "^9.17.0", "@griffel/react": "^1.5.14", "@swc/helpers": "^0.5.1" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", - "@types/react-dom": ">=16.14.0 <19.0.0", + "@types/react-dom": ">=16.9.0 <19.0.0", "react": ">=16.14.0 <19.0.0", "react-dom": ">=16.14.0 <19.0.0" } @@ -3162,9 +3122,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.74", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.74.tgz", - "integrity": "sha512-nBtFGaeTMzpiL/p73xbmCi00SiCQZDTJUk9ZuHOLtil3nI+y7l269LHkHIAYpav99ZwGnPJzuJsJpfLXjiQ52g==", + "version": "17.0.75", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.75.tgz", + "integrity": "sha512-MSA+NzEzXnQKrqpO63CYqNstFjsESgvJAdAyyJ1n6ZQq/GLgf6nOfIKwk+Twuz0L1N6xPe+qz5xRCJrbhMaLsw==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3260,16 +3220,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz", - "integrity": "sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz", + "integrity": "sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/type-utils": "6.17.0", - "@typescript-eslint/utils": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", + "@typescript-eslint/scope-manager": "6.19.1", + "@typescript-eslint/type-utils": "6.19.1", + "@typescript-eslint/utils": "6.19.1", + "@typescript-eslint/visitor-keys": "6.19.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -3295,15 +3255,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz", - "integrity": "sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz", + "integrity": "sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/typescript-estree": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", + "@typescript-eslint/scope-manager": "6.19.1", + "@typescript-eslint/types": "6.19.1", + "@typescript-eslint/typescript-estree": "6.19.1", + "@typescript-eslint/visitor-keys": "6.19.1", "debug": "^4.3.4" }, "engines": { @@ -3323,13 +3283,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz", - "integrity": "sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz", + "integrity": "sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0" + "@typescript-eslint/types": "6.19.1", + "@typescript-eslint/visitor-keys": "6.19.1" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3340,13 +3300,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz", - "integrity": "sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz", + "integrity": "sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.17.0", - "@typescript-eslint/utils": "6.17.0", + "@typescript-eslint/typescript-estree": "6.19.1", + "@typescript-eslint/utils": "6.19.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -3367,9 +3327,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz", - "integrity": "sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz", + "integrity": "sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -3380,13 +3340,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz", - "integrity": "sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz", + "integrity": "sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/visitor-keys": "6.17.0", + "@typescript-eslint/types": "6.19.1", + "@typescript-eslint/visitor-keys": "6.19.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3432,17 +3392,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz", - "integrity": "sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz", + "integrity": "sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.17.0", - "@typescript-eslint/types": "6.17.0", - "@typescript-eslint/typescript-estree": "6.17.0", + "@typescript-eslint/scope-manager": "6.19.1", + "@typescript-eslint/types": "6.19.1", + "@typescript-eslint/typescript-estree": "6.19.1", "semver": "^7.5.4" }, "engines": { @@ -3457,12 +3417,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz", - "integrity": "sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg==", + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz", + "integrity": "sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.17.0", + "@typescript-eslint/types": "6.19.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4781,19 +4741,19 @@ "peer": true }, "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", + "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", + "postcss": "^8.4.33", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -7646,19 +7606,19 @@ } }, "node_modules/local-web-server": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/local-web-server/-/local-web-server-5.3.0.tgz", - "integrity": "sha512-TGZ/+4eQ+1HtmoDalTspX1Cnn9oopxkIji7nGwIfn9ae1pT83VCwifnoxDu0bYleLSpqodsboUFUq/hgWvEzDw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/local-web-server/-/local-web-server-5.3.1.tgz", + "integrity": "sha512-SYMIyQsyIGSlhZ+px0NgMumIzK69KCifweF24FApdNcRzMs/+ENlvesiGamBzEO6njljOvCbBuNQK/7hWMoCCA==", "dev": true, "dependencies": { - "current-module-paths": "^1.1.0", + "current-module-paths": "^1.1.1", "lws": "^4.1.2", "lws-basic-auth": "^2.0.0", "lws-blacklist": "^3.0.0", "lws-body-parser": "^3.0.0", "lws-compress": "^3.1.0", "lws-conditional-get": "^2.0.0", - "lws-cors": "^4.2.0", + "lws-cors": "^4.2.1", "lws-index": "^3.1.1", "lws-json": "^2.0.0", "lws-log": "^2.0.0", @@ -9327,9 +9287,9 @@ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" }, "node_modules/react-hook-form": { - "version": "7.49.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.2.tgz", - "integrity": "sha512-TZcnSc17+LPPVpMRIDNVITY6w20deMdNi6iehTFLV1x8SqThXGwu93HjlUVU09pzFgZH7qZOvLMM7UYf2ShAHA==", + "version": "7.49.3", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.49.3.tgz", + "integrity": "sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ==", "engines": { "node": ">=18", "pnpm": "8" @@ -10231,16 +10191,16 @@ } }, "node_modules/source-map-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.2.tgz", - "integrity": "sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", "dev": true, "dependencies": { "iconv-lite": "^0.6.3", "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -10687,9 +10647,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -10765,11 +10725,11 @@ } }, "node_modules/tabster": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/tabster/-/tabster-5.2.1.tgz", - "integrity": "sha512-UGl95j5YHbn9wpNA3hX/mTfH7n+y/HFSHVGPkj9Nx06+CXT3mRwTR2/ub1dqii5pG83LJ6xn2F4jSFrUgOwhuA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/tabster/-/tabster-5.3.0.tgz", + "integrity": "sha512-3oqZ0gkWXrPSnc7LBbJ9FQmcZL9DFO+ToK8gGGshSvI5hCgp9AnCtq6CIqce3zpg2/aZZci51MUTgNQFbTUiUg==", "dependencies": { - "keyborg": "^2.2.0", + "keyborg": "^2.4.1", "tslib": "^2.3.1" } }, @@ -11356,19 +11316,19 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.90.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", + "integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", + "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", @@ -11382,7 +11342,7 @@ "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", + "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, diff --git a/esp/src/package.json b/esp/src/package.json index d22d47c8653..cc9421ec6a4 100644 --- a/esp/src/package.json +++ b/esp/src/package.json @@ -35,12 +35,12 @@ }, "main": "src/stub.js", "dependencies": { - "@fluentui/react": "8.114.0", - "@fluentui/react-components": "9.44.0", - "@fluentui/react-experiments": "8.14.122", - "@fluentui/react-hooks": "8.6.34", - "@fluentui/react-icons-mdl2": "1.3.53", - "@fluentui/react-migration-v8-v9": "9.4.42", + "@fluentui/react": "8.115.1", + "@fluentui/react-components": "9.46.0", + "@fluentui/react-experiments": "8.14.128", + "@fluentui/react-hooks": "8.6.36", + "@fluentui/react-icons-mdl2": "1.3.56", + "@fluentui/react-migration-v8-v9": "9.5.4", "@hpcc-js/chart": "2.81.9", "@hpcc-js/codemirror": "2.61.1", "@hpcc-js/common": "2.71.14", @@ -72,7 +72,7 @@ "octokit": "3.1.2", "react": "17.0.2", "react-dom": "17.0.2", - "react-hook-form": "7.49.2", + "react-hook-form": "7.49.3", "react-hot-toast": "2.4.1", "react-reflex": "4.2.1", "react-sizeme": "3.0.2", @@ -82,27 +82,27 @@ "devDependencies": { "@simbathesailor/use-what-changed": "^2.0.0", "@types/dojo": "1.9.48", - "@types/react": "17.0.74", + "@types/react": "17.0.75", "@types/react-dom": "17.0.25", - "@typescript-eslint/eslint-plugin": "6.17.0", - "@typescript-eslint/parser": "6.17.0", + "@typescript-eslint/eslint-plugin": "6.19.1", + "@typescript-eslint/parser": "6.19.1", "copyfiles": "2.4.1", - "css-loader": "6.8.1", + "css-loader": "6.9.1", "dojo-webpack-plugin": "3.0.6", "eslint": "8.56.0", "eslint-plugin-eclwatch": "file:./eslint", "eslint-plugin-react-hooks": "4.6.0", "file-loader": "6.2.0", - "local-web-server": "5.3.0", + "local-web-server": "5.3.1", "npm-run-all": "4.1.5", "rimraf": "5.0.5", - "source-map-loader": "4.0.2", + "source-map-loader": "5.0.0", "string-replace-loader": "3.1.0", - "style-loader": "3.3.3", + "style-loader": "3.3.4", "tslib": "2.6.2", "typescript": "5.3.3", "url-loader": "4.1.1", - "webpack": "5.89.0", + "webpack": "5.90.0", "webpack-cli": "5.1.4", "webpack-dev-server": "4.15.1" }, From 9ea4daafb1417651586a83a7d646c13e83bbac6b Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Thu, 25 Jan 2024 17:24:22 +0000 Subject: [PATCH 03/13] Split off 9.2.56 Signed-off-by: Jake Smith --- helm/hpcc/Chart.yaml | 4 ++-- helm/hpcc/templates/_helpers.tpl | 2 +- helm/hpcc/templates/dafilesrv.yaml | 2 +- helm/hpcc/templates/dali.yaml | 2 +- helm/hpcc/templates/dfuserver.yaml | 2 +- helm/hpcc/templates/eclagent.yaml | 4 ++-- helm/hpcc/templates/eclccserver.yaml | 4 ++-- helm/hpcc/templates/eclscheduler.yaml | 2 +- helm/hpcc/templates/esp.yaml | 2 +- helm/hpcc/templates/localroxie.yaml | 2 +- helm/hpcc/templates/roxie.yaml | 8 ++++---- helm/hpcc/templates/sasha.yaml | 2 +- helm/hpcc/templates/thor.yaml | 10 +++++----- version.cmake | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/helm/hpcc/Chart.yaml b/helm/hpcc/Chart.yaml index eb3d3892fba..e31f8d48649 100644 --- a/helm/hpcc/Chart.yaml +++ b/helm/hpcc/Chart.yaml @@ -6,9 +6,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 9.2.55-closedown0 +version: 9.2.57-closedown0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 9.2.55-closedown0 +appVersion: 9.2.57-closedown0 diff --git a/helm/hpcc/templates/_helpers.tpl b/helm/hpcc/templates/_helpers.tpl index 4e7f2574464..aa07df5d0fe 100644 --- a/helm/hpcc/templates/_helpers.tpl +++ b/helm/hpcc/templates/_helpers.tpl @@ -1405,7 +1405,7 @@ kind: Service metadata: name: {{ $lvars.serviceName | quote }} labels: - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $.root "instance" $lvars.serviceName ) | indent 4 }} {{- if $lvars.labels }} {{ toYaml $lvars.labels | indent 4 }} diff --git a/helm/hpcc/templates/dafilesrv.yaml b/helm/hpcc/templates/dafilesrv.yaml index 391601eca32..ddc3953c360 100644 --- a/helm/hpcc/templates/dafilesrv.yaml +++ b/helm/hpcc/templates/dafilesrv.yaml @@ -50,7 +50,7 @@ spec: labels: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dafilesrv" "name" "dafilesrv" "instance" .name) | indent 8 }} server: {{ .name | quote }} - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 annotations: checksum/config: {{ $configSHA }} {{- include "hpcc.generateAnnotations" $commonCtx | indent 8 }} diff --git a/helm/hpcc/templates/dali.yaml b/helm/hpcc/templates/dali.yaml index c93139c9aaa..3720a38eeb5 100644 --- a/helm/hpcc/templates/dali.yaml +++ b/helm/hpcc/templates/dali.yaml @@ -82,7 +82,7 @@ spec: run: {{ $dali.name | quote }} server: {{ $dali.name | quote }} app: dali - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} {{- end }} diff --git a/helm/hpcc/templates/dfuserver.yaml b/helm/hpcc/templates/dfuserver.yaml index a09587c73cc..e0ac9565f2d 100644 --- a/helm/hpcc/templates/dfuserver.yaml +++ b/helm/hpcc/templates/dfuserver.yaml @@ -56,7 +56,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "dfuserver" "name" "dfuserver" "instance" .name) | indent 8 }} run: {{ .name | quote }} accessDali: "yes" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclagent.yaml b/helm/hpcc/templates/eclagent.yaml index 840a561f42d..12cb1f9a271 100644 --- a/helm/hpcc/templates/eclagent.yaml +++ b/helm/hpcc/templates/eclagent.yaml @@ -58,7 +58,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" $apptype "name" "eclagent" "instance" $appJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -133,7 +133,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclccserver.yaml b/helm/hpcc/templates/eclccserver.yaml index 5c956c7ed75..866edf3f0f2 100644 --- a/helm/hpcc/templates/eclccserver.yaml +++ b/helm/hpcc/templates/eclccserver.yaml @@ -57,7 +57,7 @@ data: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclccserver" "name" "eclccserver" "instance" $compileJobName "instanceOf" (printf "%s-job" .me.name)) | indent 12 }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} {{- end }} @@ -140,7 +140,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: {{ .useChildProcesses | default false | ternary "yes" "no" | quote }} - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/eclscheduler.yaml b/helm/hpcc/templates/eclscheduler.yaml index 753259bb9e8..2bceee619b4 100644 --- a/helm/hpcc/templates/eclscheduler.yaml +++ b/helm/hpcc/templates/eclscheduler.yaml @@ -64,7 +64,7 @@ spec: run: {{ .name | quote }} accessDali: "yes" accessEsp: "no" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/esp.yaml b/helm/hpcc/templates/esp.yaml index ed0dcbfb776..c32ddb44710 100644 --- a/helm/hpcc/templates/esp.yaml +++ b/helm/hpcc/templates/esp.yaml @@ -120,7 +120,7 @@ spec: accessSasha: "yes" {{- end }} app: {{ $application }} - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "name" $application "component" "esp" "instance" .name) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8 }} diff --git a/helm/hpcc/templates/localroxie.yaml b/helm/hpcc/templates/localroxie.yaml index 988377d83b7..711904ccb2b 100644 --- a/helm/hpcc/templates/localroxie.yaml +++ b/helm/hpcc/templates/localroxie.yaml @@ -70,7 +70,7 @@ spec: server: {{ $servername | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $roxie.name) | indent 8 }} {{- if hasKey . "labels" }} {{ toYaml .labels | indent 8 }} diff --git a/helm/hpcc/templates/roxie.yaml b/helm/hpcc/templates/roxie.yaml index 4115e66038d..3f44a65a7cd 100644 --- a/helm/hpcc/templates/roxie.yaml +++ b/helm/hpcc/templates/roxie.yaml @@ -120,7 +120,7 @@ spec: {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 8 }} run: {{ $commonCtx.toponame | quote }} roxie-cluster: {{ $roxie.name | quote }} - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} @@ -178,7 +178,7 @@ kind: Service metadata: name: {{ $commonCtx.toponame | quote }} labels: - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "topology-server" "name" "roxie" "instance" $commonCtx.toponame) | indent 4 }} spec: ports: @@ -240,7 +240,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "roxie-server" "name" "roxie" "instance" $servername) | indent 8 }} {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} @@ -346,7 +346,7 @@ spec: roxie-cluster: {{ $roxie.name | quote }} accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey $.Values.global "metrics" }} {{- include "hpcc.generateMetricsReporterLabel" $.Values.global.metrics | nindent 8}} {{- end }} diff --git a/helm/hpcc/templates/sasha.yaml b/helm/hpcc/templates/sasha.yaml index 5f69c3793d5..29a3d75e26d 100644 --- a/helm/hpcc/templates/sasha.yaml +++ b/helm/hpcc/templates/sasha.yaml @@ -53,7 +53,7 @@ spec: server: {{ $serviceName | quote }} app: sasha accessDali: {{ (has "dali" $sasha.access) | ternary "yes" "no" | quote }} - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- if hasKey $sasha "labels" }} {{ toYaml $sasha.labels | indent 8 }} {{- end }} diff --git a/helm/hpcc/templates/thor.yaml b/helm/hpcc/templates/thor.yaml index 0e477656da5..d4aa5ed160a 100644 --- a/helm/hpcc/templates/thor.yaml +++ b/helm/hpcc/templates/thor.yaml @@ -82,7 +82,7 @@ data: labels: accessDali: "yes" accessEsp: "yes" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $eclAgentJobName "instanceOf" (printf "%s-job" .eclAgentName)) | indent 8 }} {{- if hasKey .me "labels" }} {{ toYaml .me.labels | indent 12 }} @@ -145,7 +145,7 @@ data: accessEsp: "yes" app: "thor" component: "thormanager" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thormanager" "name" "thor" "instance" $thorManagerJobName "instanceOf" (printf "%s-thormanager-job" .me.name)) | indent 12 }} @@ -210,7 +210,7 @@ data: accessEsp: "yes" app: "thor" component: "thorworker" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 instance: "_HPCC_JOBNAME_" job: "_HPCC_JOBNAME_" {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "thorworker" "name" "thor" "instance" $thorWorkerJobName "instanceOf" (printf "%s-thorworker-job" .me.name)) | indent 12 }} @@ -341,7 +341,7 @@ spec: accessEsp: {{ $commonCtx.eclAgentUseChildProcesses | ternary "yes" "no" | quote }} app: "thor" component: "thor-eclagent" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 instance: {{ $commonCtx.eclAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.eclAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} @@ -404,7 +404,7 @@ spec: accessEsp: "no" app: "thor" component: "thor-thoragent" - helmVersion: 9.2.55-closedown0 + helmVersion: 9.2.57-closedown0 instance: {{ $commonCtx.thorAgentName | quote }} {{- include "hpcc.addStandardLabels" (dict "root" $ "component" "eclagent" "name" "thor" "instance" $commonCtx.thorAgentName ) | indent 8 }} {{- if hasKey $commonCtx.me "labels" }} diff --git a/version.cmake b/version.cmake index ab26f91674f..4c77584ba12 100644 --- a/version.cmake +++ b/version.cmake @@ -5,8 +5,8 @@ set ( HPCC_NAME "Community Edition" ) set ( HPCC_PROJECT "community" ) set ( HPCC_MAJOR 9 ) set ( HPCC_MINOR 2 ) -set ( HPCC_POINT 55 ) +set ( HPCC_POINT 57 ) set ( HPCC_MATURITY "closedown" ) set ( HPCC_SEQUENCE 0 ) -set ( HPCC_TAG_TIMESTAMP "2024-01-19T17:52:36Z" ) +set ( HPCC_TAG_TIMESTAMP "2024-01-25T17:24:21Z" ) ### From 3d68c077b00bcd60b16cc30081a02609c8e8ed2e Mon Sep 17 00:00:00 2001 From: Gavin Halliday Date: Fri, 26 Jan 2024 10:26:38 +0000 Subject: [PATCH 04/13] HPCC-31182 Fix ResolveHostName to return the resolved ip, not the hostname Signed-off-by: Gavin Halliday --- plugins/fileservices/fileservices.cpp | 3 ++- testing/regress/ecl/fileservice.ecl | 2 ++ testing/regress/ecl/key/fileservice.xml | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/fileservices/fileservices.cpp b/plugins/fileservices/fileservices.cpp index cc91a866ded..74aba30bdd0 100644 --- a/plugins/fileservices/fileservices.cpp +++ b/plugins/fileservices/fileservices.cpp @@ -2720,7 +2720,8 @@ FILESERVICES_API char * FILESERVICES_CALL fsfResolveHostName(const char *hostna { StringBuffer ret; SocketEndpoint ep(hostname); - ep.getHostText(ret); + //NB: Get a string for the resolved IP, not the hostname + ep.getIpText(ret); return ret.detach(); } diff --git a/testing/regress/ecl/fileservice.ecl b/testing/regress/ecl/fileservice.ecl index fed992751ee..1e94c806368 100644 --- a/testing/regress/ecl/fileservice.ecl +++ b/testing/regress/ecl/fileservice.ecl @@ -17,6 +17,7 @@ import Std.File; import Std.Str; +import Std.System; import $.setup; prefix := setup.Files(false, false).QueryFilePrefix; @@ -57,4 +58,5 @@ SEQUENTIAL( RemovePrefix(File.ForeignLogicalFileName('somescope::somefilename', '192.168.168.168', false), 3); RemovePrefix(File.ForeignLogicalFileName('somescope::somefilename', '192.168.168.168', true, true), 2); RemovePrefix(File.ForeignLogicalFileName('somescope::somefilename', '192.168.168.168', false, true), 2); + OUTPUT((INTEGER)System.Util.ResolveHostName('localhost') != 0); // Check that host names are resolved to actual IP addresses ); diff --git a/testing/regress/ecl/key/fileservice.xml b/testing/regress/ecl/key/fileservice.xml index 9ac1317e71a..558947437eb 100644 --- a/testing/regress/ecl/key/fileservice.xml +++ b/testing/regress/ecl/key/fileservice.xml @@ -26,3 +26,6 @@ somescope::somefilename + + true + From ac50035cf9cfba6b9f1aacd8881a485d4491d56a Mon Sep 17 00:00:00 2001 From: Gavin Halliday Date: Fri, 26 Jan 2024 13:31:40 +0000 Subject: [PATCH 05/13] HPCC-31187 Remove excessive tracing of unmanaged file scopes Signed-off-by: Gavin Halliday --- system/security/shared/caching.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/security/shared/caching.cpp b/system/security/shared/caching.cpp index bc131920b4c..27a7fdb6707 100644 --- a/system/security/shared/caching.cpp +++ b/system/security/shared/caching.cpp @@ -663,7 +663,8 @@ bool CPermissionsCache::queryPermsManagedFileScope(ISecUser& sec_user, const cha else { *accessFlags = queryDefaultPermission(sec_user); - OWARNLOG("FileScope %s for %s not managed, using default %s(%d), took %dms", fullScope, sec_user.getName(), getSecAccessFlagName(*accessFlags), *accessFlags, msTick()-start); + if (isDebugBuild()) + OWARNLOG("FileScope %s for %s not managed, using default %s(%d), took %dms", fullScope, sec_user.getName(), getSecAccessFlagName(*accessFlags), *accessFlags, msTick()-start); rc = true; } return rc; From 40b09cc56ba734e0c25c7f2dc3ec0d8590398e3c Mon Sep 17 00:00:00 2001 From: Gordon Smith Date: Fri, 26 Jan 2024 13:32:33 +0000 Subject: [PATCH 06/13] HPCC-31186 Free up additional space for GH Actions + Docker Builds Signed-off-by: Gordon Smith --- .github/workflows/build-assets.yml | 16 +++++++++++++++- .github/workflows/build-docker.yml | 16 +++++++++++++++- vcpkg | 2 +- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-assets.yml b/.github/workflows/build-assets.yml index 829aa864195..5feb755ac6f 100644 --- a/.github/workflows/build-assets.yml +++ b/.github/workflows/build-assets.yml @@ -130,8 +130,22 @@ jobs: steps: - name: Free additional disk space (remove Android SDK + Tools) + continue-on-error: true run: | - sudo rm -rf /usr/local/lib/android + df -h + sudo rm -rf ${ANDROID_HOME} + sudo rm -rf ${JAVA_HOME_8_X64} + sudo rm -rf ${JAVA_HOME_11_X64} + sudo rm -rf ${JAVA_HOME_17_X64} + sudo rm -rf ${JAVA_HOME_21_X64} + sudo rm -rf ${CHROMEWEBDRIVER} + sudo rm -rf ${EDGEWEBDRIVER} + sudo rm -rf ${GECKOWEBDRIVER} + sudo rm -rf ${SELENIUM_JAR_PATH} + + - name: Display disk space (post free) + run: | + df -h - name: Checkout HPCC-Platform uses: actions/checkout@v3 diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 24560aa6331..cef3b61a380 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -68,8 +68,22 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Free additional disk space (remove Android SDK + Tools) + continue-on-error: true run: | - sudo rm -rf /usr/local/lib/android + df -h + sudo rm -rf ${ANDROID_HOME} + sudo rm -rf ${JAVA_HOME_8_X64} + sudo rm -rf ${JAVA_HOME_11_X64} + sudo rm -rf ${JAVA_HOME_17_X64} + sudo rm -rf ${JAVA_HOME_21_X64} + sudo rm -rf ${CHROMEWEBDRIVER} + sudo rm -rf ${EDGEWEBDRIVER} + sudo rm -rf ${GECKOWEBDRIVER} + sudo rm -rf ${SELENIUM_JAR_PATH} + + - name: Display disk space (post free) + run: | + df -h - name: Checkout HPCC-Platform uses: actions/checkout@v3 diff --git a/vcpkg b/vcpkg index a65a37760ac..e0042a2ed27 160000 --- a/vcpkg +++ b/vcpkg @@ -1 +1 @@ -Subproject commit a65a37760ac2a85527b72b2d81aa50d882ec2e70 +Subproject commit e0042a2ed2734e621bd59c2723298f3d630825f7 From 283f6ad508f51a1ac926d9f4e4c19dbc8a8143c5 Mon Sep 17 00:00:00 2001 From: g-pan Date: Mon, 22 Jan 2024 10:04:04 -0500 Subject: [PATCH 07/13] HPCC-18331 Document wutool info option Signed-off-by: g-pan --- docs/BuildTools/fo.xsl | 8 +- docs/BuildTools/fo.xsl.in | 8 +- docs/EN_US/HPCCSystemAdmin/SA-Mods/WUTool.xml | 240 +++++++++++++++++- 3 files changed, 247 insertions(+), 9 deletions(-) diff --git a/docs/BuildTools/fo.xsl b/docs/BuildTools/fo.xsl index 9b108fe8dfd..d47047f7723 100644 --- a/docs/BuildTools/fo.xsl +++ b/docs/BuildTools/fo.xsl @@ -110,7 +110,7 @@ - serif + sans-serif 10pt @@ -123,6 +123,12 @@ + + + serif + + + diff --git a/docs/BuildTools/fo.xsl.in b/docs/BuildTools/fo.xsl.in index 2af8fd2435f..d71af90244c 100644 --- a/docs/BuildTools/fo.xsl.in +++ b/docs/BuildTools/fo.xsl.in @@ -110,7 +110,7 @@ - serif + sans-serif 10pt @@ -123,6 +123,12 @@ + + + serif + + + diff --git a/docs/EN_US/HPCCSystemAdmin/SA-Mods/WUTool.xml b/docs/EN_US/HPCCSystemAdmin/SA-Mods/WUTool.xml index ff0abda6adc..b75c459406d 100644 --- a/docs/EN_US/HPCCSystemAdmin/SA-Mods/WUTool.xml +++ b/docs/EN_US/HPCCSystemAdmin/SA-Mods/WUTool.xml @@ -17,16 +17,15 @@ - + - Actions + Actions - + @@ -53,6 +52,21 @@ Dump results from specified workunits. + + info <workunits> <filter> + + This command provides filtered access to statistics and other + information from a workunit. See the following table for + additional info parameter information. + + + + analyze <workunit> + + Analyze the workunit to highlight potential cost + savings + + archive <workunits> @@ -81,10 +95,10 @@ - validate + validate [FIX=1] - Check contents of workunit repository for errors. [FIX=1] - will try to repair any issues found. + Check contents of workunit repository for errors. With + [FIX=1] will try to repair any issues found. @@ -99,6 +113,218 @@ Initialize new workunit repository + + + graph <wu> + + Generate an alternative representation of the graph with + execution details + + + + activity <wu> + + What activities are executed between a range of times + (in time order)<wu> [">scope|mintime"] + ["<scope|maxtime"] [threshold=n%] + + + + hotspot <wu> [<activity>] + + Find the hotspots for workunit (or one particular + activity) + + + + critical <wu> <activity> + + What activities are executed in order to execute + activity + + + + depend <wu> <activity> +<activity> + + Find the common paths between two activities + + + + depend <wu> ?<activity>:startTime + + Which dependencies take a large % of the start time for this + activity + + + + help <command> + + More help on a command + + + + + + The following table provides further information for the wutool + utility issued with the action=info parameter: + + + + + + + + + + info + parameters + + + + + + info <workunits> <filter> + + This command provides filtered access to statistics and other + information from a workunit. The filter can include the + following elements (those denoted by * can be repeated): + + + + + + + Which scopes are + matched: + + + + + scope[<scope-id>]* + + scope to match + + + + + stype[<scope-type>]* + + scope type to match + + + + id[<id>]* + + the id of a scope to to match + + + + + + NOTE: scope, stype and id + cannot be specified in the same filter + + + + depth[n | + low..high] + + range of depths to search for a match + + + + source[global|stats|graph|all]* + + which sources within the workunit to search. Defaults to the + optimal sources for the rest of the filter + + + + where[<statistickind> | <statistickind> +(=|<|<=|>|>=) value | +<statistickind>=low..high] + + filter by statistic existence or value range + + + + + + Which scopes are include in the + results: + + + + matched[true|false] + + are the matched scopes returned? + + + + nested[<depth>|all] + + what nesting of scopes within a matched scope are in the + results (defaults to '0' if matched[true] and 'all' if + matched[false]) + + + + includetype[<scope-type>]* + + which scope types should be included? + + + + + + Which information about a scope is + reported: + + + + properties[statistics|hints| +attributes|scope|all]* + + + + + + statistic[<statistic-kind>|none|all]* + + + + + + attribute[<attribute-name>|none|all]* + + + + + + hint[<hint-name>]* + + + + + + property[<statistic-kind>| +<attribute-name>|<hint-name>]* + + include property (category is deduced) + + + + measure[<measure>] + + all statistics with a particular measure + + + + version[<version>] + + minimum version to return + From db116649b6bbbfce9db8fb9c4b6b083d7941d779 Mon Sep 17 00:00:00 2001 From: wangkx Date: Thu, 18 Jan 2024 10:24:46 -0500 Subject: [PATCH 08/13] HPCC-22056 Add DFU wuid to reason string in job blocked message When an ecl workunit was blocked in fileservices, the existing ECLWatch shows a message: 'Blocked by fileservice activity: ' + fileservice_name. In this PR, the DFU wuid is added to the message. Signed-off-by: wangkx --- plugins/fileservices/fileservices.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/fileservices/fileservices.cpp b/plugins/fileservices/fileservices.cpp index 74aba30bdd0..51cf3e26f5f 100644 --- a/plugins/fileservices/fileservices.cpp +++ b/plugins/fileservices/fileservices.cpp @@ -609,7 +609,7 @@ static void blockUntilComplete(const char * label, IClientFileSpray &server, ICo unsigned polltime = 1; - VStringBuffer reason("Blocked by fileservice activity: %s",label); + VStringBuffer reason("Blocked by fileservice activity: %s, workunit: %s", label, wuid); setWorkunitState(ctx, WUStateBlocked, reason.str()); while(true) From 4cae4a0de5e5288e706864e7455e599586cce9a5 Mon Sep 17 00:00:00 2001 From: wangkx Date: Mon, 22 Jan 2024 17:13:34 -0500 Subject: [PATCH 09/13] HPCC-29679 Fix isPathInPlane issue when similar prefixes The existing isPathInPlane() uses the startsWith() to check whether a path is a plane path or not. It may return a wrong result when 2 planes have similar path prefixes (ex. /abcd and /abc). Revise based on review: return false if prefix is empty/path is not Signed-off-by: wangkx --- dali/base/dautils.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/dali/base/dautils.cpp b/dali/base/dautils.cpp index cfdd1fc3ba1..3532f4c575f 100644 --- a/dali/base/dautils.cpp +++ b/dali/base/dautils.cpp @@ -119,7 +119,28 @@ IPropertyTree * getDropZonePlane(const char * name) bool isPathInPlane(IPropertyTree *plane, const char *path) { - return isEmptyString(path) || startsWith(path, plane->queryProp("@prefix")); + if (isEmptyString(path)) + return true; + + const char *prefix = plane->queryProp("@prefix"); + if (isEmptyString(prefix)) + return false; //prefix is empty, path is not - can't match. + + while (*prefix && *prefix == *path) + { + path++; + prefix++; + } + if (0 == *prefix) + { + if (0 == *path || isPathSepChar(*path)) + return true; + if (isPathSepChar(*(path - 1))) //implies both last characters of prefix and path were '/' + return true; + } + else if (0 == *path && isPathSepChar(*prefix) && (0 == *(prefix + 1))) + return true; + return false; } bool validateDropZone(IPropertyTree * plane, const char * path, const char * host, bool ipMatch) From 1891aa6ffda1d6de2e2725063cd84d023bf1d2a4 Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Wed, 31 Jan 2024 11:15:50 +0000 Subject: [PATCH 10/13] HPCC-31204 Improve MP protocol error message Signed-off-by: Jake Smith --- system/mp/mpcomm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/mp/mpcomm.cpp b/system/mp/mpcomm.cpp index 299f674e1fb..e5d21853f4c 100644 --- a/system/mp/mpcomm.cpp +++ b/system/mp/mpcomm.cpp @@ -1686,7 +1686,7 @@ class CMPPacketReader: public ISocketSelectNotify, public CInterface if (hdr.version/0x100 != MP_PROTOCOL_VERSION/0x100) { // TBD IPV6 here SocketEndpoint ep; - hdr.sender.get(ep); + sock->getPeerEndpoint(ep); IMP_Exception *e=new CMPException(MPERR_protocol_version_mismatch,ep); throw e; } From 779d09b4231a0b0bec2526732c82daeac2e21570 Mon Sep 17 00:00:00 2001 From: Richard Chapman Date: Wed, 31 Jan 2024 12:02:46 +0000 Subject: [PATCH 11/13] HPCC-31193 ROXIE_UNLOAD messages should not wait for IBYTI Similarly, PING. IBYTI are not sent for these messages. For UNLOAD we need to process per channel per agent, so IBYTI would be inappropriate. For PING you could argue wither way, but since they are never sent, there's no point waiting for them. Signed-off-by: Richard Chapman --- roxie/ccd/ccdqueue.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/roxie/ccd/ccdqueue.cpp b/roxie/ccd/ccdqueue.cpp index 06a156edca6..401d2334969 100644 --- a/roxie/ccd/ccdqueue.cpp +++ b/roxie/ccd/ccdqueue.cpp @@ -2790,7 +2790,7 @@ class RoxieSocketQueueManager : public RoxieReceiverBase { #ifdef NEW_IBYTI unsigned delay = 0; - if (mySubchannel != 0) // i.e. I am not the primary here + if (mySubchannel != 0 && (header.activityId & ~ROXIE_PRIORITY_MASK) < ROXIE_ACTIVITY_SPECIAL_FIRST) // i.e. I am not the primary here, and never delay special { for (unsigned subChannel = 0; subChannel < mySubchannel; subChannel++) delay += getIbytiDelay(header.subChannels[subChannel]); @@ -3880,8 +3880,9 @@ IPacketDiscarder *createPacketDiscarder() // Reply as soon as receive, or put it on the queue like other messages? // Reply for every channel, or just once for every agent? // Should I send on channel 0 or round-robin the channels? -// My gut feeling is that knowing what channels are responding is useful so should reply on every unsuspended channel, -// and that the delay caused by queuing system is an interesting part of what we want to measure (though nice to know minimum possible too) +// My gut feeling is that knowing what channels and agents are responding is useful so should reply on every unsuspended channel +// Don't use IBYTI mechanism or ack/retry mechanism. + class PingTimer : public Thread { From 5d342861047c1175c56a66a810a8fee2b3149b8c Mon Sep 17 00:00:00 2001 From: wangkx Date: Wed, 3 Jan 2024 13:57:43 -0500 Subject: [PATCH 12/13] HPCC-23064 Improve error messages when no access to ECL WUs When access denied to ECL WUs, the WsWorkunits should report which access feature (OwnWorkunitsAccess or OthersWorkunitsAccess) is denied so that an administrator may know how to change user's access permission. The code changes are: 1. add the code to report which access feature is validated in the validateWsWorkunitAccess() and validateWsWorkunitAccessByOwnerId(). If the validation fails, the feature name can be used inside error messages. 2. Change the validateWsWorkunitAccess() function to 2 validateWsWorkunitAccess() functions: one for IConstWorkUnit input and one for wuid input. The 1st one is called by the 2nd one and other functions. 3. In the functions below, if the WU access validation fails, add the name of the access feature into the error message: ensureWsWorkunitAccess() ensureWsWorkunitAccessByOwnerId() ensureWsCreateWorkunitAccess() doAction(). 4. In the doWUQueryByFile(), call the validateWsWorkunitAccess() to validate WU access. Change the error message if the validation fails. Also clean the code. 5. Simplify the onWUQuery by switching validateWsWorkunitAccess() call to the ensureWsWorkunitAccess() call. 6. In the onStartUpload(), when importing a WU ZAP report, change the error message if the user does not have the access permission. Signed-off-by: wangkx --- .../ws_workunits/ws_workunitsHelpers.cpp | 29 +++++++++++------ .../ws_workunits/ws_workunitsHelpers.hpp | 5 +-- .../ws_workunits/ws_workunitsService.cpp | 31 ++++++++++--------- 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/esp/services/ws_workunits/ws_workunitsHelpers.cpp b/esp/services/ws_workunits/ws_workunitsHelpers.cpp index 00ecb28b988..ad7211e1c54 100644 --- a/esp/services/ws_workunits/ws_workunitsHelpers.cpp +++ b/esp/services/ws_workunits/ws_workunitsHelpers.cpp @@ -91,35 +91,46 @@ SecAccessFlags getWsWorkunitAccess(IEspContext& ctx, IConstWorkUnit& cw) return accessFlag; } -bool validateWsWorkunitAccess(IEspContext& ctx, const char* wuid, SecAccessFlags minAccess) +bool validateWsWorkunitAccess(IEspContext& ctx, IConstWorkUnit& cw, SecAccessFlags minAccess, StringBuffer& secAccessFeature) +{ + secAccessFeature.set(getWuAccessType(cw, ctx.queryUserId())); + return ctx.validateFeatureAccess(secAccessFeature, minAccess, false); +} + +bool validateWsWorkunitAccess(IEspContext& ctx, const char* wuid, SecAccessFlags minAccess, StringBuffer& secAccessFeature) { Owned wf = getWorkUnitFactory(ctx.querySecManager(), ctx.queryUser()); Owned cw = wf->openWorkUnit(wuid); if (!cw) throw MakeStringException(ECLWATCH_CANNOT_OPEN_WORKUNIT, "Failed to open workunit %s when validating workunit access", wuid); - return ctx.validateFeatureAccess(getWuAccessType(*cw, ctx.queryUserId()), minAccess, false); + return validateWsWorkunitAccess(ctx, *cw, minAccess, secAccessFeature); } -bool validateWsWorkunitAccessByOwnerId(IEspContext& ctx, const char* owner, SecAccessFlags minAccess) +bool validateWsWorkunitAccessByOwnerId(IEspContext& ctx, const char* owner, SecAccessFlags minAccess, StringBuffer& secAccessFeature) { - return ctx.validateFeatureAccess(getWuAccessType(owner, ctx.queryUserId()), minAccess, false); + secAccessFeature.set(getWuAccessType(owner, ctx.queryUserId())); + return ctx.validateFeatureAccess(secAccessFeature, minAccess, false); } void ensureWsWorkunitAccessByOwnerId(IEspContext& ctx, const char* owner, SecAccessFlags minAccess) { - if (!ctx.validateFeatureAccess(getWuAccessType(owner, ctx.queryUserId()), minAccess, false)) + const char * secAccessFeature = getWuAccessType(owner, ctx.queryUserId()); + if (!ctx.validateFeatureAccess(secAccessFeature, minAccess, false)) { ctx.setAuthStatus(AUTH_STATUS_NOACCESS); - throw MakeStringException(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to access workunit. Permission denied."); + throw makeStringExceptionV(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to access workunit. Resource %s : Permission denied. %s Access Required.", + secAccessFeature, getSecAccessFlagName(minAccess)); } } void ensureWsWorkunitAccess(IEspContext& ctx, IConstWorkUnit& cw, SecAccessFlags minAccess) { - if (!ctx.validateFeatureAccess(getWuAccessType(cw, ctx.queryUserId()), minAccess, false)) + const char * secAccessFeature = getWuAccessType(cw, ctx.queryUserId()); + if (!ctx.validateFeatureAccess(secAccessFeature, minAccess, false)) { ctx.setAuthStatus(AUTH_STATUS_NOACCESS); - throw MakeStringException(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to access workunit. Permission denied."); + throw makeStringExceptionV(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to access workunit %s. Resource %s : Permission denied. %s Access Required.", + cw.queryWuid(), secAccessFeature, getSecAccessFlagName(minAccess)); } } @@ -137,7 +148,7 @@ void ensureWsCreateWorkunitAccess(IEspContext& ctx) if (!ctx.validateFeatureAccess(OWN_WU_ACCESS, SecAccess_Write, false)) { ctx.setAuthStatus(AUTH_STATUS_NOACCESS); - throw MakeStringException(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to create workunit. Permission denied."); + throw makeStringExceptionV(ECLWATCH_ECL_WU_ACCESS_DENIED, "Failed to create workunit. Resource %s : Permission denied. Write Access Required.", OWN_WU_ACCESS); } } diff --git a/esp/services/ws_workunits/ws_workunitsHelpers.hpp b/esp/services/ws_workunits/ws_workunitsHelpers.hpp index 78b0347795f..219e2fe75f6 100644 --- a/esp/services/ws_workunits/ws_workunitsHelpers.hpp +++ b/esp/services/ws_workunits/ws_workunitsHelpers.hpp @@ -81,8 +81,9 @@ void ensureWsWorkunitAccess(IEspContext& cxt, IConstWorkUnit& cw, SecAccessFlags void ensureWsWorkunitAccess(IEspContext& context, const char* wuid, SecAccessFlags minAccess); void ensureWsWorkunitAccessByOwnerId(IEspContext& context, const char* owner, SecAccessFlags minAccess); void ensureWsCreateWorkunitAccess(IEspContext& cxt); -bool validateWsWorkunitAccess(IEspContext& context, const char* wuid, SecAccessFlags minAccess); -bool validateWsWorkunitAccessByOwnerId(IEspContext& context, const char* owner, SecAccessFlags minAccess); +bool validateWsWorkunitAccess(IEspContext& context, IConstWorkUnit& cw, SecAccessFlags minAccess, StringBuffer& secAccessFeature); +bool validateWsWorkunitAccess(IEspContext& context, const char* wuid, SecAccessFlags minAccess, StringBuffer& secAccessFeature); +bool validateWsWorkunitAccessByOwnerId(IEspContext& context, const char* owner, SecAccessFlags minAccess, StringBuffer& secAccessFeature); const char *getGraphNum(const char *s,unsigned &num); diff --git a/esp/services/ws_workunits/ws_workunitsService.cpp b/esp/services/ws_workunits/ws_workunitsService.cpp index 7e3a0d49605..752c8c0de98 100644 --- a/esp/services/ws_workunits/ws_workunitsService.cpp +++ b/esp/services/ws_workunits/ws_workunitsService.cpp @@ -151,7 +151,7 @@ bool doAction(IEspContext& context, StringArray& wuids, CECLWUActions action, IP if ((action == CECLWUActions_Restore) || (action == CECLWUActions_Archive)) { - StringBuffer msg; + StringBuffer msg, secAccessFeature; ForEachItemIn(i, wuids) { StringBuffer wuidStr(wuids.item(i)); @@ -161,15 +161,15 @@ bool doAction(IEspContext& context, StringArray& wuids, CECLWUActions action, IP msg.appendf("Empty Workunit ID at %u. ", i); continue; } - if ((action == CECLWUActions_Archive) && !validateWsWorkunitAccess(context, wuid, SecAccess_Full)) - msg.appendf("Access denied for Workunit %s. ", wuid); + if ((action == CECLWUActions_Archive) && !validateWsWorkunitAccess(context, wuid, SecAccess_Full, secAccessFeature.clear())) + msg.appendf("Resource %s : Access denied for Workunit %s. Full Access Required. ", secAccessFeature.str(), wuid); else if (action == CECLWUActions_Restore) { Owned wuProps = getArchivedWorkUnitProperties(wuid, false); if (!wuProps) msg.appendf("Archived workunit %s not found.", wuid); - else if (!validateWsWorkunitAccessByOwnerId(context, wuProps->queryProp("@submitID"), SecAccess_Full)) - msg.appendf("Access denied for Workunit %s. ", wuid); + else if (!validateWsWorkunitAccessByOwnerId(context, wuProps->queryProp("@submitID"), SecAccess_Full, secAccessFeature.clear())) + msg.appendf("Resource %s : Access denied for Workunit %s. Full Access Required. ", secAccessFeature.str(), wuid); } } if (!msg.isEmpty()) @@ -1724,15 +1724,19 @@ void doWUQueryByFile(IEspContext &context, const char *logicalFile, IEspWUQueryR { StringBuffer wuid; getWuidFromLogicalFileName(context, logicalFile, wuid); - if (!wuid.length()) - throw MakeStringException(ECLWATCH_CANNOT_GET_WORKUNIT,"Cannot find the workunit for file %s.", logicalFile); + if (wuid.isEmpty()) + throw makeStringExceptionV(ECLWATCH_CANNOT_GET_WORKUNIT, "Cannot find the workunit for file %s.", logicalFile); Owned factory = getWorkUnitFactory(context.querySecManager(), context.queryUser()); - Owned cw= factory->openWorkUnit(wuid.str()); + Owned cw = factory->openWorkUnit(wuid.str()); if (!cw) - throw MakeStringException(ECLWATCH_CANNOT_OPEN_WORKUNIT,"Cannot find the workunit for file %s.", logicalFile); - if (getWsWorkunitAccess(context, *cw) < SecAccess_Read) - throw MakeStringException(ECLWATCH_ECL_WU_ACCESS_DENIED,"Cannot access the workunit for file %s.",logicalFile); + throw makeStringExceptionV(ECLWATCH_CANNOT_OPEN_WORKUNIT, "Cannot find the workunit for file %s.", logicalFile); + + StringBuffer secAccessFeature; + if (!validateWsWorkunitAccess(context, *cw, SecAccess_Read, secAccessFeature)) + throw makeStringExceptionV(ECLWATCH_ECL_WU_ACCESS_DENIED, + "Cannot access the workunit for file %s. Resource %s : Permission denied. Read Access Required.", + logicalFile, secAccessFeature.str()); doWUQueryBySingleWuid(context, wuid.str(), resp); @@ -2589,8 +2593,7 @@ bool CWsWorkunitsEx::onWUQuery(IEspContext &context, IEspWUQueryRequest & req, I doWUQueryFromArchive(context, sashaServerIp.get(), sashaServerPort, *archivedWuCache, awusCacheMinutes, req, resp); else if(notEmpty(wuid) && looksLikeAWuid(wuid, 'W')) { - if (!validateWsWorkunitAccess(context, wuid, SecAccess_Read)) - throw makeStringExceptionV(ECLWATCH_ECL_WU_ACCESS_DENIED, "WorkUnit access denied: %s.", wuid); + ensureWsWorkunitAccess(context, wuid, SecAccess_Read); doWUQueryBySingleWuid(context, wuid, resp); } else if (notEmpty(req.getLogicalFile()) && req.getLogicalFileSearchType() && strieq(req.getLogicalFileSearchType(), "Created")) @@ -4571,7 +4574,7 @@ int CWsWorkunitsSoapBindingEx::onStartUpload(IEspContext &ctx, CHttpRequest* req SecAccessFlags accessOwn, accessOthers; getUserWuAccessFlags(ctx, accessOwn, accessOthers, false); if ((accessOwn != SecAccess_Full) || (accessOthers != SecAccess_Full)) - throw MakeStringException(-1, "Permission denied."); + throw makeStringExceptionV(-1, "Resources %s and/or %s : Permission denied. Full Access Required.", OWN_WU_ACCESS, OTHERS_WU_ACCESS); StringBuffer password; request->getParameter("Password", password); From a9bb1ca2bcfe171a4fde1382442e084d75a6ab4a Mon Sep 17 00:00:00 2001 From: Jake Smith Date: Wed, 31 Jan 2024 14:06:44 +0000 Subject: [PATCH 13/13] HPCC-31141 Validate global sort connect protocol Add a const signature to the global sort connect protocol, and validate it in the header on connect. This is to exclude 'rogue' attempts to connect to the sort socket, possibly from k8s health type checks. Also remove pointless byte ordering on serialize/deserialize in this context, where both sides are implicitly on same OS/byte-order/version. Signed-off-by: Jake Smith --- thorlcr/msort/tsortl.cpp | 19 +++++++++++++++---- thorlcr/msort/tsorts1.cpp | 9 +++++++-- thorlcr/shared/thexception.hpp | 5 +++-- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/thorlcr/msort/tsortl.cpp b/thorlcr/msort/tsortl.cpp index d038c59e3bb..00d33a9aeb2 100644 --- a/thorlcr/msort/tsortl.cpp +++ b/thorlcr/msort/tsortl.cpp @@ -60,8 +60,12 @@ class CREcheck { #define RECHECK(b) CREcheck checkRE(b) +// unique/random pattern used to validate header is of expected protocol on connect +static constexpr unsigned __int64 transferStreamSignature = 0x0ea614193fb99496; + struct TransferStreamHeader { + unsigned __int64 hdrSig = transferStreamSignature; // used to validate hdr is of expected protocol on connect rowcount_t numrecs; rowcount_t pos; unsigned id; @@ -72,7 +76,6 @@ struct TransferStreamHeader crc = getCrc(); } TransferStreamHeader() {} - void winrev() { _WINREV(pos); _WINREV(numrecs); _WINREV(id); _WINREV(crc); } unsigned getCrc() const { unsigned retCrc = crc32((const char *)&numrecs, sizeof(numrecs), 0); @@ -288,7 +291,6 @@ IRowStream *ConnectMergeRead(unsigned id, IThorRowInterfaces *rowif,SocketEndpoi nodeaddr.getEndpointHostText(s); LOG(MCthorDetailedDebugInfo, thorJob, "ConnectMergeRead(%d,%s,%x,%" RCPF "d,%" RCPF "u)",id,s.str(),(unsigned)(memsize_t)socket.get(),startrec,numrecs); #endif - hdr.winrev(); socket->write(&hdr,sizeof(hdr)); return new CSocketRowStream(id,rowif->queryRowAllocator(),rowif->queryRowDeserializer(),socket); } @@ -314,12 +316,21 @@ ISocketRowWriter *ConnectMergeWrite(IThorRowInterfaces *rowif,ISocket *socket,si remaining -= read; dst += read; } - hdr.winrev(); + if (hdr.hdrSig != transferStreamSignature) + { + char name[100]; + int port = socket->peer_name(name,sizeof(name)); + StringBuffer hdrRaw; + hexdump2string((byte const *)&hdr, sizeof(hdr), hdrRaw); + throw makeStringExceptionV(TE_SortConnectProtocolErr, "SORT connection protocol mismatch from: %s:%u, raw hdr = %s", name, port, hdrRaw.str()); + } if (hdr.getCrc() != hdr.crc) { char name[100]; int port = socket->peer_name(name,sizeof(name)); - throw makeStringExceptionV(TE_InvalidSortConnect, "Invalid SORT connection from: %s:%u", name, port); + StringBuffer hdrRaw; + hexdump2string((byte const *)&hdr, sizeof(hdr), hdrRaw); + throw makeStringExceptionV(TE_SortConnectCrcErr, "SORT connection failed crc check from: %s:%u, raw hdr = %s", name, port, hdrRaw.str()); } startrec = hdr.pos; numrecs = hdr.numrecs; diff --git a/thorlcr/msort/tsorts1.cpp b/thorlcr/msort/tsorts1.cpp index abe76aeeef9..a0810adae20 100644 --- a/thorlcr/msort/tsorts1.cpp +++ b/thorlcr/msort/tsorts1.cpp @@ -403,8 +403,13 @@ protected: friend class CSortMerge; catch (IException *e) // only retry if serialization check failed, indicating possible foreign client connect { PrintExceptionLog(e, "WARNING: Exception(ConnectMergeWrite)"); - if (TE_InvalidSortConnect != e->errorCode() || (--numretries==0)) - throw; + + if (TE_SortConnectProtocolErr != e->errorCode()) + { + if (TE_SortConnectCrcErr != e->errorCode() || (--numretries==0)) + throw; + } + e->Release(); continue; } diff --git a/thorlcr/shared/thexception.hpp b/thorlcr/shared/thexception.hpp index 4d928550a67..ca0ce33a7a7 100644 --- a/thorlcr/shared/thexception.hpp +++ b/thorlcr/shared/thexception.hpp @@ -158,8 +158,9 @@ #define TE_RemoteReadFailure THOR_ERROR_START + 137 #define TE_UnsupportedSortOrder THOR_ERROR_START + 138 #define TE_CostExceeded THOR_ERROR_START + 139 -#define TE_InvalidSortConnect THOR_ERROR_START + 140 -#define TE_Final THOR_ERROR_START + 141 // keep this last +#define TE_SortConnectCrcErr THOR_ERROR_START + 140 +#define TE_SortConnectProtocolErr THOR_ERROR_START + 141 +#define TE_Final THOR_ERROR_START + 142 // keep this last #define ISTHOREXCEPTION(n) (n > THOR_ERROR_START && n < TE_Final) #endif