diff --git a/.github/actions/deploy-hpcc-k8s/action.yaml b/.github/actions/deploy-hpcc-k8s/action.yaml index 44f9bdd0f6a..deb51fbd97d 100644 --- a/.github/actions/deploy-hpcc-k8s/action.yaml +++ b/.github/actions/deploy-hpcc-k8s/action.yaml @@ -23,13 +23,13 @@ runs: shell: bash - name: Download Package - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.asset-name }} path: ${{ inputs.asset-name }} - name: Download Support Files - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.asset-name }}-support-files path: ${{ inputs.asset-name }}-support-files diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 7c5090750b6..81211e4dedb 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -158,7 +158,7 @@ jobs: - name: Upload Package if: ${{ inputs.upload-package == true }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.asset-name }} path: | @@ -168,7 +168,7 @@ jobs: - name: Upload Support Files if: ${{ inputs.upload-package == true }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.asset-name }}-support-files path: | @@ -178,7 +178,7 @@ jobs: - name: Upload UI Test Files if: ${{ inputs.upload-package == true }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.asset-name }}-ui_test-files path: | @@ -187,7 +187,7 @@ jobs: - name: Upload Error Logs if: ${{ failure() || cancelled() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.os }}-${{ inputs.ln == true && 'LN' || 'HPCC-Platform' }}-logs path: ${{ github.workspace }}/build/**/*.log diff --git a/.github/workflows/build-gh_runner.yml b/.github/workflows/build-gh_runner.yml index 3a83c51db3d..092e3dcd140 100644 --- a/.github/workflows/build-gh_runner.yml +++ b/.github/workflows/build-gh_runner.yml @@ -214,7 +214,7 @@ jobs: - name: Upload Package if: ${{ inputs.upload-package == true }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.asset-name }} path: | @@ -224,7 +224,7 @@ jobs: - name: Upload Support Files if: ${{ inputs.upload-package == true }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.asset-name }}-support-files path: | @@ -234,7 +234,7 @@ jobs: - name: Upload UI Test Files if: ${{ inputs.upload-package == true }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.asset-name }}-ui_test-files path: | @@ -243,7 +243,7 @@ jobs: - name: Upload Error Logs if: ${{ failure() || cancelled() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.os }}-${{ inputs.ln == true && 'LN' || 'HPCC-Platform' }}-logs path: ${{ github.workspace }}/build/**/*.log diff --git a/.github/workflows/test-smoke-gh_runner.yml b/.github/workflows/test-smoke-gh_runner.yml index cc37e0b32e2..52e68911eb1 100644 --- a/.github/workflows/test-smoke-gh_runner.yml +++ b/.github/workflows/test-smoke-gh_runner.yml @@ -53,13 +53,13 @@ jobs: sudo rm -rf /usr/local/lib/android - name: Download Package - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.asset-name }} path: ${{ inputs.asset-name }} - name: Download Support Files - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.asset-name }}-support-files path: ${{ inputs.asset-name }}-support-files @@ -132,7 +132,7 @@ jobs: - name: regression-run-logs-artifact if: ${{ failure() || cancelled() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: test-smoke-${{ inputs.asset-name }}-${{ matrix.engine }}-${{ steps.vars.outputs.matrix-setname }} path: | diff --git a/.github/workflows/test-ui-gh_runner.yml b/.github/workflows/test-ui-gh_runner.yml index ed1fad9bc21..57c86db615f 100644 --- a/.github/workflows/test-ui-gh_runner.yml +++ b/.github/workflows/test-ui-gh_runner.yml @@ -31,7 +31,7 @@ jobs: sudo rm -rf /usr/local/lib/android - name: Download UI Test Files - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.asset-name }}-ui_test-files path: ${{ inputs.asset-name }}-ui_test-files @@ -72,7 +72,7 @@ jobs: - name: Download Package if: steps.check.outputs.runtests - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.asset-name }} path: ${{ inputs.asset-name }} @@ -160,7 +160,7 @@ jobs: - name: eclwatch-ui-test-logs-artifact if: ${{ failure() || cancelled() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.asset-name }}-ui_test-logs path: | diff --git a/.github/workflows/test-unit-gh_runner.yml b/.github/workflows/test-unit-gh_runner.yml index eb8daf6a069..4c91a9d143d 100644 --- a/.github/workflows/test-unit-gh_runner.yml +++ b/.github/workflows/test-unit-gh_runner.yml @@ -30,7 +30,7 @@ jobs: sudo rm -rf /usr/local/lib/android - name: Download Package - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.asset-name }} path: ${{ inputs.asset-name }} @@ -58,7 +58,7 @@ jobs: - name: unittests-logs-artifact if: ${{ failure() || cancelled() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: test-unit-${{ inputs.asset-name }} path: | diff --git a/common/workunit/workunit.cpp b/common/workunit/workunit.cpp index fc7d1f23856..690d3421bf6 100644 --- a/common/workunit/workunit.cpp +++ b/common/workunit/workunit.cpp @@ -14576,6 +14576,11 @@ void executeThorGraph(const char * graphName, IConstWorkUnit &workunit, const IP // NB: check for expected success state (WUStateWait). If any other state, abort. { Owned w = &workunit.lock(); + //If the thor instance crashed, make sure that the workunit is no longer associated with it - otherwise a + //failure clause that causes a graph to run can abort because the instances has stopped. + if (w->getEngineSession() > 0) + w->setEngineSession(-1); + WUState state = w->getState(); if (WUStateWait != state) // expected state from successful Thor run from above { diff --git a/esp/src/src-react/components/Metrics.tsx b/esp/src/src-react/components/Metrics.tsx index c3819d13a25..64a61753c2f 100644 --- a/esp/src/src-react/components/Metrics.tsx +++ b/esp/src/src-react/components/Metrics.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { CommandBar, ContextualMenuItemType, ICommandBarItemProps, IIconProps, SearchBox, Stack } from "@fluentui/react"; +import { CommandBar, ContextualMenuItemType, ICommandBarItemProps, IIconProps, SearchBox, Stack, TooltipHost } from "@fluentui/react"; import { Label, Spinner, ToggleButton } from "@fluentui/react-components"; import { typographyStyles } from "@fluentui/react-theme"; import { useConst } from "@fluentui/react-hooks"; @@ -543,7 +543,9 @@ export const Metrics: React.FunctionComponent = ({ header={ : } title={nlsHPCC.IncludePendingItems} checked={includePendingItems} onClick={() => { setIncludePendingItems(!includePendingItems); }} /> - + + + : } title={nlsHPCC.MatchCase} checked={matchCase} onClick={() => { setMatchCase(!matchCase); }} /> } diff --git a/esp/src/src/ESPLog.ts b/esp/src/src/ESPLog.ts index 5f0c09ed115..f4b3b4a86a3 100644 --- a/esp/src/src/ESPLog.ts +++ b/esp/src/src/ESPLog.ts @@ -47,14 +47,14 @@ export function hasLogAccess(): Promise { return GetLogAccessInfo().then(response => { if (isExceptionResponse(response)) { const err = response.Exceptions.Exception[0].Message; - logger.error(err); + logger.info(err); return false; } else { response = response as WsLogaccess.GetLogAccessInfoResponse; return response?.RemoteLogManagerConnectionString !== null || response?.RemoteLogManagerType !== null; } }).catch(e => { - logger.error(e); + logger.info(e); return false; }); } diff --git a/esp/src/src/nls/hpcc.ts b/esp/src/src/nls/hpcc.ts index 225842d3b9a..592e8cb09d3 100644 --- a/esp/src/src/nls/hpcc.ts +++ b/esp/src/src/nls/hpcc.ts @@ -358,6 +358,7 @@ export = { FileUploadStillInProgress: "File upload still in progress", Filter: "Filter", FilterDetails: "Filter Details", + FilterMetricsTooltip: "This will filter based upon the \"Scope\" column by default. To filter on any other column, use the column name as a prefix to your search, eg: \"Filename:spill\"", FilterSet: "Filter Set", Find: "Find", Finished: "Finished", diff --git a/thorlcr/master/thgraphmanager.cpp b/thorlcr/master/thgraphmanager.cpp index 337aee40f9e..0b4412ed5de 100644 --- a/thorlcr/master/thgraphmanager.cpp +++ b/thorlcr/master/thgraphmanager.cpp @@ -1474,8 +1474,13 @@ void thorMain(ILogMsgHandler *logHandler, const char *wuid, const char *graphNam Owned workunit; factory.setown(getWorkUnitFactory()); workunit.setown(factory->openWorkUnit(currentWuid)); - SessionId agentSessionID = workunit->getAgentSession(); - if (agentSessionID <= 0) + SessionId agentSessionID = workunit ? workunit->getAgentSession() : 0; + if (!workunit) + { + WARNLOG("Discarding job with missing workunit wuid=%s, graph=%s", currentWuid.str(), currentGraphName.str()); + currentWuid.clear(); + } + else if (agentSessionID <= 0) { WARNLOG("Discarding job with invalid sessionID: wuid=%s, graph=%s (sessionID=%" I64F "d)", currentWuid.str(), currentGraphName.str(), agentSessionID); currentWuid.clear(); @@ -1525,8 +1530,8 @@ void thorMain(ILogMsgHandler *logHandler, const char *wuid, const char *graphNam } } } - currentGraphName.clear(); + currentGraphName.clear(); if (lingerPeriod) { PROGLOG("Lingering time left: %.2f", ((float)lingerPeriod)/1000); @@ -1546,15 +1551,27 @@ void thorMain(ILogMsgHandler *logHandler, const char *wuid, const char *graphNam break; // timeout/abort // else - reject/ignore duff message. } - if (0 == currentGraphName.length()) // only ever true if !multiJobLinger + + // The following is true if no workunit/graph have been received + // MORE: I think it should also be executed if lingerPeriod is 0 + if (0 == currentGraphName.length()) { - // De-register the idle lingering entry. - Owned factory; - Owned workunit; - factory.setown(getWorkUnitFactory()); - workunit.setown(factory->openWorkUnit(currentWuid)); - Owned w = &workunit->lock(); - w->setDebugValue(instance, "0", true); + if (!multiJobLinger) + { + // De-register the idle lingering entry. + Owned factory; + Owned workunit; + factory.setown(getWorkUnitFactory()); + workunit.setown(factory->openWorkUnit(currentWuid)); + //Unlikely, but the workunit could have been deleted while we were lingering + //currentWuid can also be blank if the workunit this started for died before thor started + //processing the graph. This test covers both (unlikely) situations. + if (workunit) + { + Owned w = &workunit->lock(); + w->setDebugValue(instance, "0", true); + } + } break; } }