@fluidframework/container-runtime 2.31.1 → 2.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/container-runtime.test-files.tar +0 -0
- package/dist/channelCollection.d.ts +0 -14
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +10 -25
- package/dist/channelCollection.js.map +1 -1
- package/dist/containerRuntime.d.ts +16 -9
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +137 -103
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +1 -5
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +0 -8
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/messageTypes.d.ts +3 -7
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +4 -4
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +4 -4
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +40 -6
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +4 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +4 -3
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +10 -11
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +19 -18
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +9 -5
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +18 -22
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSerialization.d.ts +20 -0
- package/dist/opLifecycle/opSerialization.d.ts.map +1 -0
- package/dist/opLifecycle/opSerialization.js +40 -0
- package/dist/opLifecycle/opSerialization.js.map +1 -0
- package/dist/opLifecycle/opSplitter.d.ts +12 -13
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +13 -13
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +16 -18
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +57 -43
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +0 -7
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +1 -15
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +2 -2
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +1 -1
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/runtimeLayerCompatState.d.ts.map +1 -1
- package/dist/runtimeLayerCompatState.js +6 -5
- package/dist/runtimeLayerCompatState.js.map +1 -1
- package/dist/summary/index.d.ts +5 -8
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +20 -21
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.js +9 -9
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +0 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js +3 -3
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +3 -75
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js +2 -0
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/{lib/summary/summaryGenerator.d.ts → dist/summary/summarizerUtils.d.ts} +12 -43
- package/dist/summary/summarizerUtils.d.ts.map +1 -0
- package/dist/summary/summarizerUtils.js +71 -0
- package/dist/summary/summarizerUtils.js.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/index.d.ts +10 -0
- package/dist/summary/summaryDelayLoadedModule/index.d.ts.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/index.js +20 -0
- package/dist/summary/summaryDelayLoadedModule/index.js.map +1 -0
- package/dist/summary/{runWhileConnectedCoordinator.d.ts → summaryDelayLoadedModule/runWhileConnectedCoordinator.d.ts} +1 -1
- package/dist/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js.map +1 -0
- package/dist/summary/{runningSummarizer.d.ts → summaryDelayLoadedModule/runningSummarizer.d.ts} +4 -13
- package/dist/summary/summaryDelayLoadedModule/runningSummarizer.d.ts.map +1 -0
- package/dist/summary/{runningSummarizer.js → summaryDelayLoadedModule/runningSummarizer.js} +17 -24
- package/dist/summary/summaryDelayLoadedModule/runningSummarizer.js.map +1 -0
- package/dist/summary/{summarizer.d.ts → summaryDelayLoadedModule/summarizer.d.ts} +13 -2
- package/dist/summary/summaryDelayLoadedModule/summarizer.d.ts.map +1 -0
- package/dist/summary/{summarizer.js → summaryDelayLoadedModule/summarizer.js} +13 -3
- package/dist/summary/summaryDelayLoadedModule/summarizer.js.map +1 -0
- package/{lib/summary → dist/summary/summaryDelayLoadedModule}/summarizerHeuristics.d.ts +3 -3
- package/dist/summary/summaryDelayLoadedModule/summarizerHeuristics.d.ts.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/summarizerHeuristics.js.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/summaryGenerator.d.ts +36 -0
- package/dist/summary/summaryDelayLoadedModule/summaryGenerator.d.ts.map +1 -0
- package/dist/summary/{summaryGenerator.js → summaryDelayLoadedModule/summaryGenerator.js} +14 -99
- package/dist/summary/summaryDelayLoadedModule/summaryGenerator.js.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.d.ts +21 -0
- package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.d.ts.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.js +44 -0
- package/dist/summary/summaryDelayLoadedModule/summaryResultBuilder.js.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/summaryResultTypes.d.ts +80 -0
- package/dist/summary/summaryDelayLoadedModule/summaryResultTypes.d.ts.map +1 -0
- package/dist/summary/summaryDelayLoadedModule/summaryResultTypes.js +7 -0
- package/dist/summary/summaryDelayLoadedModule/summaryResultTypes.js.map +1 -0
- package/dist/summary/summaryHelpers.d.ts +1 -1
- package/dist/summary/summaryHelpers.d.ts.map +1 -1
- package/dist/summary/summaryHelpers.js +2 -2
- package/dist/summary/summaryHelpers.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +4 -3
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +2 -2
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/channelCollection.d.ts +0 -14
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +6 -21
- package/lib/channelCollection.js.map +1 -1
- package/lib/containerRuntime.d.ts +16 -9
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +140 -106
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +1 -5
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +0 -8
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/messageTypes.d.ts +3 -7
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +4 -4
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +4 -4
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +40 -6
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +4 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +3 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +10 -11
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +20 -19
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +9 -5
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +18 -22
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSerialization.d.ts +20 -0
- package/lib/opLifecycle/opSerialization.d.ts.map +1 -0
- package/lib/opLifecycle/opSerialization.js +35 -0
- package/lib/opLifecycle/opSerialization.js.map +1 -0
- package/lib/opLifecycle/opSplitter.d.ts +12 -13
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +13 -13
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +16 -18
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +56 -41
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +0 -7
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +0 -13
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +2 -2
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +1 -1
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/runtimeLayerCompatState.d.ts.map +1 -1
- package/lib/runtimeLayerCompatState.js +3 -2
- package/lib/runtimeLayerCompatState.js.map +1 -1
- package/lib/summary/index.d.ts +5 -8
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +5 -7
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.js +1 -1
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +0 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +3 -75
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/{dist/summary/summaryGenerator.d.ts → lib/summary/summarizerUtils.d.ts} +12 -43
- package/lib/summary/summarizerUtils.d.ts.map +1 -0
- package/lib/summary/summarizerUtils.js +64 -0
- package/lib/summary/summarizerUtils.js.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/index.d.ts +10 -0
- package/lib/summary/summaryDelayLoadedModule/index.d.ts.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/index.js +9 -0
- package/lib/summary/summaryDelayLoadedModule/index.js.map +1 -0
- package/lib/summary/{runWhileConnectedCoordinator.d.ts → summaryDelayLoadedModule/runWhileConnectedCoordinator.d.ts} +1 -1
- package/lib/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/runWhileConnectedCoordinator.js.map +1 -0
- package/lib/summary/{runningSummarizer.d.ts → summaryDelayLoadedModule/runningSummarizer.d.ts} +4 -13
- package/lib/summary/summaryDelayLoadedModule/runningSummarizer.d.ts.map +1 -0
- package/lib/summary/{runningSummarizer.js → summaryDelayLoadedModule/runningSummarizer.js} +5 -12
- package/lib/summary/summaryDelayLoadedModule/runningSummarizer.js.map +1 -0
- package/lib/summary/{summarizer.d.ts → summaryDelayLoadedModule/summarizer.d.ts} +13 -2
- package/lib/summary/summaryDelayLoadedModule/summarizer.d.ts.map +1 -0
- package/lib/summary/{summarizer.js → summaryDelayLoadedModule/summarizer.js} +11 -1
- package/lib/summary/summaryDelayLoadedModule/summarizer.js.map +1 -0
- package/{dist/summary → lib/summary/summaryDelayLoadedModule}/summarizerHeuristics.d.ts +3 -3
- package/lib/summary/summaryDelayLoadedModule/summarizerHeuristics.d.ts.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/summarizerHeuristics.js.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/summaryGenerator.d.ts +36 -0
- package/lib/summary/summaryDelayLoadedModule/summaryGenerator.d.ts.map +1 -0
- package/lib/summary/{summaryGenerator.js → summaryDelayLoadedModule/summaryGenerator.js} +4 -85
- package/lib/summary/summaryDelayLoadedModule/summaryGenerator.js.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.d.ts +21 -0
- package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.d.ts.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.js +40 -0
- package/lib/summary/summaryDelayLoadedModule/summaryResultBuilder.js.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/summaryResultTypes.d.ts +80 -0
- package/lib/summary/summaryDelayLoadedModule/summaryResultTypes.d.ts.map +1 -0
- package/lib/summary/summaryDelayLoadedModule/summaryResultTypes.js +6 -0
- package/lib/summary/summaryDelayLoadedModule/summaryResultTypes.js.map +1 -0
- package/lib/summary/summaryHelpers.d.ts +1 -1
- package/lib/summary/summaryHelpers.d.ts.map +1 -1
- package/lib/summary/summaryHelpers.js +1 -1
- package/lib/summary/summaryHelpers.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +4 -3
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +2 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +20 -19
- package/src/channelCollection.ts +5 -20
- package/src/containerRuntime.ts +220 -178
- package/src/dataStoreContext.ts +0 -11
- package/src/index.ts +0 -1
- package/src/messageTypes.ts +5 -19
- package/src/opLifecycle/batchManager.ts +19 -12
- package/src/opLifecycle/definitions.ts +45 -6
- package/src/opLifecycle/index.ts +14 -3
- package/src/opLifecycle/opCompressor.ts +25 -24
- package/src/opLifecycle/opGroupingManager.ts +27 -26
- package/src/opLifecycle/opSerialization.ts +46 -0
- package/src/opLifecycle/opSplitter.ts +20 -16
- package/src/opLifecycle/outbox.ts +101 -66
- package/src/opLifecycle/remoteMessageProcessor.ts +0 -17
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +3 -3
- package/src/runtimeLayerCompatState.ts +3 -2
- package/src/summary/index.ts +35 -31
- package/src/summary/orderedClientElection.ts +1 -1
- package/src/summary/summarizerClientElection.ts +1 -2
- package/src/summary/summarizerTypes.ts +7 -91
- package/src/summary/summarizerUtils.ts +132 -0
- package/src/summary/summaryDelayLoadedModule/index.ts +28 -0
- package/src/summary/{runWhileConnectedCoordinator.ts → summaryDelayLoadedModule/runWhileConnectedCoordinator.ts} +1 -1
- package/src/summary/{runningSummarizer.ts → summaryDelayLoadedModule/runningSummarizer.ts} +13 -28
- package/src/summary/{summarizer.ts → summaryDelayLoadedModule/summarizer.ts} +19 -8
- package/src/summary/{summarizerHeuristics.ts → summaryDelayLoadedModule/summarizerHeuristics.ts} +3 -3
- package/src/summary/{summaryGenerator.ts → summaryDelayLoadedModule/summaryGenerator.ts} +13 -179
- package/src/summary/summaryDelayLoadedModule/summaryResultBuilder.ts +70 -0
- package/src/summary/summaryDelayLoadedModule/summaryResultTypes.ts +100 -0
- package/src/summary/summaryHelpers.ts +6 -6
- package/src/summary/summaryManager.ts +8 -6
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +0 -1
- package/dist/summary/runningSummarizer.d.ts.map +0 -1
- package/dist/summary/runningSummarizer.js.map +0 -1
- package/dist/summary/summarizer.d.ts.map +0 -1
- package/dist/summary/summarizer.js.map +0 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +0 -1
- package/dist/summary/summarizerHeuristics.js.map +0 -1
- package/dist/summary/summaryGenerator.d.ts.map +0 -1
- package/dist/summary/summaryGenerator.js.map +0 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +0 -1
- package/lib/summary/runningSummarizer.d.ts.map +0 -1
- package/lib/summary/runningSummarizer.js.map +0 -1
- package/lib/summary/summarizer.d.ts.map +0 -1
- package/lib/summary/summarizer.js.map +0 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +0 -1
- package/lib/summary/summarizerHeuristics.js.map +0 -1
- package/lib/summary/summaryGenerator.d.ts.map +0 -1
- package/lib/summary/summaryGenerator.js.map +0 -1
- /package/dist/summary/{runWhileConnectedCoordinator.js → summaryDelayLoadedModule/runWhileConnectedCoordinator.js} +0 -0
- /package/dist/summary/{summarizerHeuristics.js → summaryDelayLoadedModule/summarizerHeuristics.js} +0 -0
- /package/lib/summary/{runWhileConnectedCoordinator.js → summaryDelayLoadedModule/runWhileConnectedCoordinator.js} +0 -0
- /package/lib/summary/{summarizerHeuristics.js → summaryDelayLoadedModule/summarizerHeuristics.js} +0 -0
|
@@ -4,13 +4,23 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.Summarizer = exports.createSummarizingWarning = exports.SummarizingWarning = void 0;
|
|
7
|
+
exports.Summarizer = exports.createSummarizingWarning = exports.SummarizingWarning = exports.defaultMaxAttemptsForSubmitFailures = exports.defaultMaxAttempts = void 0;
|
|
8
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
9
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
10
10
|
const internal_2 = require("@fluidframework/telemetry-utils/internal");
|
|
11
11
|
const runningSummarizer_js_1 = require("./runningSummarizer.js");
|
|
12
12
|
const summarizerHeuristics_js_1 = require("./summarizerHeuristics.js");
|
|
13
|
-
const
|
|
13
|
+
const summaryResultBuilder_js_1 = require("./summaryResultBuilder.js");
|
|
14
|
+
/**
|
|
15
|
+
* The maximum number of summarization attempts that will be done by default in case of failures
|
|
16
|
+
* that can be retried.
|
|
17
|
+
*/
|
|
18
|
+
exports.defaultMaxAttempts = 2;
|
|
19
|
+
/**
|
|
20
|
+
* The default value for maximum number of summarization attempts that will be done for summarization failures where
|
|
21
|
+
* submit fails and the failure can be retried.
|
|
22
|
+
*/
|
|
23
|
+
exports.defaultMaxAttemptsForSubmitFailures = 5;
|
|
14
24
|
class SummarizingWarning extends internal_2.LoggingError {
|
|
15
25
|
constructor(errorMessage, logged = false) {
|
|
16
26
|
super(errorMessage);
|
|
@@ -233,7 +243,7 @@ class Summarizer extends client_utils_1.TypedEventEmitter {
|
|
|
233
243
|
// each other.
|
|
234
244
|
throw new internal_2.UsageError("On-demand summary attempted while an elected summarizer is present");
|
|
235
245
|
}
|
|
236
|
-
const builder = new
|
|
246
|
+
const builder = new summaryResultBuilder_js_1.SummarizeResultBuilder();
|
|
237
247
|
if (this.runningSummarizer) {
|
|
238
248
|
// Summarizer is already running. Go ahead and start.
|
|
239
249
|
return this.runningSummarizer.summarizeOnDemand(options, builder);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarizer.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summarizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type {\n\tISummarizerEvents,\n\tSummarizerStopReason,\n} from \"@fluidframework/container-runtime-definitions/internal\";\nimport { IFluidHandleContext } from \"@fluidframework/core-interfaces/internal\";\nimport { Deferred } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIFluidErrorBase,\n\tITelemetryLoggerExt,\n\tLoggingError,\n\tUsageError,\n\tcreateChildLogger,\n\twrapErrorAndLog,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport {\n\tIConnectableRuntime,\n\tIEnqueueSummarizeOptions,\n\tIOnDemandSummarizeOptions,\n\tISummarizeHeuristicData,\n\tISummarizer,\n\tISummarizerInternalsProvider,\n\tISummarizerRuntime,\n\tISummarizingWarning,\n\ttype IRetriableFailureError,\n\ttype ISummaryConfiguration,\n} from \"../summarizerTypes.js\";\nimport { SummaryCollection } from \"../summaryCollection.js\";\n\nimport { ICancellableSummarizerController } from \"./runWhileConnectedCoordinator.js\";\nimport { RunningSummarizer } from \"./runningSummarizer.js\";\nimport { SummarizeHeuristicData } from \"./summarizerHeuristics.js\";\nimport { SummarizeResultBuilder } from \"./summaryResultBuilder.js\";\nimport type { EnqueueSummarizeResult, ISummarizeResults } from \"./summaryResultTypes.js\";\n\n/**\n * The maximum number of summarization attempts that will be done by default in case of failures\n * that can be retried.\n */\nexport const defaultMaxAttempts = 2;\n/**\n * The default value for maximum number of summarization attempts that will be done for summarization failures where\n * submit fails and the failure can be retried.\n */\nexport const defaultMaxAttemptsForSubmitFailures = 5;\n\nexport class SummarizingWarning\n\textends LoggingError\n\timplements ISummarizingWarning, IFluidErrorBase\n{\n\treadonly errorType = \"summarizingError\";\n\treadonly canRetry = true;\n\n\tconstructor(\n\t\terrorMessage: string,\n\t\treadonly logged: boolean = false,\n\t) {\n\t\tsuper(errorMessage);\n\t}\n\n\tstatic wrap(\n\t\terror: unknown,\n\t\tlogged: boolean = false,\n\t\tlogger: ITelemetryLoggerExt,\n\t): SummarizingWarning {\n\t\tconst newErrorFn = (errMsg: string): SummarizingWarning =>\n\t\t\tnew SummarizingWarning(errMsg, logged);\n\t\treturn wrapErrorAndLog<SummarizingWarning>(error, newErrorFn, logger);\n\t}\n}\n\nexport const createSummarizingWarning = (\n\terrorMessage: string,\n\tlogged: boolean,\n): SummarizingWarning => new SummarizingWarning(errorMessage, logged);\n\n/**\n * Summarizer is responsible for coordinating when to generate and send summaries.\n * It is the main entry point for summary work.\n * It is created only by summarizing container (i.e. one with clientType === \"summarizer\")\n * @internal\n */\nexport class Summarizer extends TypedEventEmitter<ISummarizerEvents> implements ISummarizer {\n\tpublic get ISummarizer(): this {\n\t\treturn this;\n\t}\n\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate runningSummarizer?: RunningSummarizer;\n\tprivate _disposed: boolean = false;\n\tprivate starting: boolean = false;\n\n\tprivate readonly stopDeferred = new Deferred<SummarizerStopReason>();\n\n\tconstructor(\n\t\t/**\n\t\t * Reference to runtime that created this object.\n\t\t * i.e. runtime with clientType === \"summarizer\"\n\t\t */\n\n\t\tprivate readonly runtime: ISummarizerRuntime,\n\t\tprivate readonly configurationGetter: () => ISummaryConfiguration,\n\t\t/**\n\t\t * Represents an object that can generate summary.\n\t\t * In practical terms, it's same runtime (this.runtime) with clientType === \"summarizer\".\n\t\t */\n\n\t\tprivate readonly internalsProvider: ISummarizerInternalsProvider,\n\t\thandleContext: IFluidHandleContext,\n\t\tpublic readonly summaryCollection: SummaryCollection,\n\t\tprivate readonly runCoordinatorCreateFn: (\n\t\t\truntime: IConnectableRuntime,\n\t\t) => Promise<ICancellableSummarizerController>,\n\t) {\n\t\tsuper();\n\t\tthis.logger = createChildLogger({\n\t\t\tlogger: this.runtime.baseLogger,\n\t\t\tnamespace: \"Summarizer\",\n\t\t});\n\t}\n\n\tpublic async run(onBehalfOf: string): Promise<SummarizerStopReason> {\n\t\ttry {\n\t\t\tconst stopReason = await this.runCore(onBehalfOf);\n\t\t\tthis.emit(\"summarizerStop\", {\n\t\t\t\tstopReason,\n\t\t\t\tnumUnsummarizedRuntimeOps: this._heuristicData?.numRuntimeOps,\n\t\t\t\tnumUnsummarizedNonRuntimeOps: this._heuristicData?.numNonRuntimeOps,\n\t\t\t});\n\t\t\treturn stopReason;\n\t\t} catch (error) {\n\t\t\tthis.stop(\"summarizerException\");\n\t\t\tthis.emit(\"summarizerStop\", {\n\t\t\t\tstopReason: \"summarizerException\",\n\t\t\t\terror,\n\t\t\t\tnumUnsummarizedRuntimeOps: this._heuristicData?.numRuntimeOps,\n\t\t\t\tnumUnsummarizedNonRuntimeOps: this._heuristicData?.numNonRuntimeOps,\n\t\t\t});\n\t\t\tthrow SummarizingWarning.wrap(error, false /* logged */, this.logger);\n\t\t} finally {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t/**\n\t * Stops the summarizer from running. This will complete\n\t * the run promise, and also close the container.\n\t * @param reason - reason code for stopping\n\t */\n\tpublic stop(reason: SummarizerStopReason): void {\n\t\tthis.stopDeferred.resolve(reason);\n\t}\n\n\tpublic close(): void {\n\t\t// This will result in \"summarizerClientDisconnected\" stop reason recorded in telemetry,\n\t\t// unless stop() was called earlier\n\t\tthis.dispose();\n\t\tthis.runtime.disposeFn();\n\t}\n\n\tprivate async runCore(onBehalfOf: string): Promise<SummarizerStopReason> {\n\t\tconst runCoordinator: ICancellableSummarizerController = await this.runCoordinatorCreateFn(\n\t\t\tthis.runtime,\n\t\t);\n\n\t\t// Wait for either external signal to cancel, or loss of connectivity.\n\t\tconst stopP = Promise.race([runCoordinator.waitCancelled, this.stopDeferred.promise]);\n\t\t// eslint-disable-next-line no-void\n\t\tvoid stopP.then((reason) => {\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"StoppingSummarizer\",\n\t\t\t\tonBehalfOf,\n\t\t\t\treason,\n\t\t\t});\n\t\t});\n\n\t\tif (runCoordinator.cancelled) {\n\t\t\tthis.emit(\"summarizerStartupFailed\", {\n\t\t\t\treason: await runCoordinator.waitCancelled,\n\t\t\t\tnumUnsummarizedRuntimeOps: this._heuristicData?.numRuntimeOps,\n\t\t\t\tnumUnsummarizedNonRuntimeOps: this._heuristicData?.numNonRuntimeOps,\n\t\t\t});\n\t\t\treturn runCoordinator.waitCancelled;\n\t\t}\n\n\t\tthis.emit(\"summarizerStart\", {\n\t\t\tonBehalfOf,\n\t\t\tnumUnsummarizedRuntimeOps: this._heuristicData?.numRuntimeOps,\n\t\t\tnumUnsummarizedNonRuntimeOps: this._heuristicData?.numNonRuntimeOps,\n\t\t});\n\n\t\tconst runningSummarizer = await this.start(onBehalfOf, runCoordinator);\n\n\t\t// Wait for either external signal to cancel, or loss of connectivity.\n\t\tconst stopReason = await stopP;\n\n\t\t// There are two possible approaches here:\n\t\t// 1. Propagate cancellation from this.stopDeferred to runCoordinator. This will ensure that we move to the exit\n\t\t// faster, including breaking out of the RunningSummarizer.trySummarize() faster.\n\t\t// We could create new coordinator and pass it to waitStop() -> trySummarizeOnce(\"lastSummary\") flow.\n\t\t// The con of this approach is that we might cancel active summary, and lastSummary will fail because it\n\t\t// did not wait for ack/nack from previous summary. Plus we disregard any 429 kind of info from service\n\t\t// that way (i.e. trySummarize() loop might have been waiting for 5 min because storage told us so).\n\t\t// In general, it's more wasted resources.\n\t\t// 2. We can not do it and make waitStop() do last summary only if there was no active summary. This ensures\n\t\t// that client behaves properly (from server POV) and we do not waste resources. But, it may mean we wait\n\t\t// substantially longer for trySummarize() retries to play out and thus this summary loop may run into\n\t\t// conflict with new summarizer client starting on different client.\n\t\t// As of now, #2 is implemented. It's more forward looking, as issue #7279 suggests changing design for new\n\t\t// summarizer client to not be created until current summarizer fully moves to exit, and that would reduce\n\t\t// cons of #2 substantially.\n\n\t\t// Cleanup after running\n\t\tawait runningSummarizer.waitStop(\n\t\t\t!runCoordinator.cancelled && Summarizer.stopReasonCanRunLastSummary(stopReason),\n\t\t);\n\n\t\t// Propagate reason and ensure that if someone is waiting for cancellation token, they are moving to exit\n\t\trunCoordinator.stop(stopReason);\n\n\t\treturn stopReason;\n\t}\n\n\t/**\n\t * Should we try to run a last summary for the given stop reason?\n\t * Currently only allows \"parentNotConnected\"\n\t * @param stopReason - SummarizerStopReason\n\t * @returns `true` if the stop reason can run a last summary, otherwise `false`.\n\t */\n\tpublic static stopReasonCanRunLastSummary(stopReason: SummarizerStopReason): boolean {\n\t\treturn stopReason === \"parentNotConnected\";\n\t}\n\n\tprivate _heuristicData: ISummarizeHeuristicData | undefined;\n\n\t/**\n\t * Put the summarizer in a started state, including creating and initializing the RunningSummarizer.\n\t * The start request can come either from the SummaryManager (in the auto-summarize case) or from the user\n\t * (in the on-demand case).\n\t * @param onBehalfOf - ID of the client that requested that the summarizer start\n\t * @param runCoordinator - cancellation token\n\t * @param newConfig - Summary configuration to override the existing config when invoking the RunningSummarizer.\n\t * @returns A promise that is fulfilled when the RunningSummarizer is ready.\n\t */\n\tprivate async start(\n\t\tonBehalfOf: string,\n\n\t\trunCoordinator: ICancellableSummarizerController,\n\t): Promise<RunningSummarizer> {\n\t\tif (this.runningSummarizer) {\n\t\t\tif (this.runningSummarizer.disposed) {\n\t\t\t\tthrow new UsageError(\"Starting a disposed summarizer\");\n\t\t\t}\n\t\t\treturn this.runningSummarizer;\n\t\t}\n\t\tif (this.starting) {\n\t\t\tthrow new UsageError(\"Attempting to start a summarizer that is already starting\");\n\t\t}\n\t\tthis.starting = true;\n\t\t// Initialize values and first ack (time is not exact)\n\t\tthis.logger.sendTelemetryEvent({\n\t\t\teventName: \"RunningSummarizer\",\n\t\t\tonBehalfOf,\n\t\t\tinitSummarySeqNumber: this.runtime.deltaManager.initialSequenceNumber,\n\t\t\tconfig: JSON.stringify(this.configurationGetter()),\n\t\t});\n\n\t\t// Summarizing container ID (with clientType === \"summarizer\")\n\t\tconst clientId = this.runtime.clientId;\n\t\tif (clientId === undefined) {\n\t\t\tthrow new UsageError(\"clientId should be defined if connected.\");\n\t\t}\n\n\t\tthis._heuristicData = new SummarizeHeuristicData(\n\t\t\tthis.runtime.deltaManager.lastSequenceNumber,\n\t\t\t{\n\t\t\t\t/**\n\t\t\t\t * summary attempt baseline for heuristics\n\t\t\t\t */\n\t\t\t\trefSequenceNumber: this.runtime.deltaManager.initialSequenceNumber,\n\t\t\t\tsummaryTime: Date.now(),\n\t\t\t} as const,\n\t\t);\n\n\t\tconst runningSummarizer = await RunningSummarizer.start(\n\t\t\tthis.logger,\n\t\t\tthis.summaryCollection.createWatcher(clientId),\n\t\t\tthis.configurationGetter(),\n\t\t\tasync (...args) => this.internalsProvider.submitSummary(...args), // submitSummaryCallback\n\t\t\tasync (...args) => this.internalsProvider.refreshLatestSummaryAck(...args), // refreshLatestSummaryAckCallback\n\t\t\tthis._heuristicData,\n\t\t\tthis.summaryCollection,\n\t\t\trunCoordinator /* cancellationToken */,\n\t\t\t(reason) => runCoordinator.stop(reason) /* stopSummarizerCallback */,\n\t\t\tthis.runtime,\n\t\t);\n\t\tthis.runningSummarizer = runningSummarizer;\n\t\tthis.setupForwardedEvents();\n\t\tthis.starting = false;\n\t\treturn runningSummarizer;\n\t}\n\n\t/**\n\t * Disposes of resources after running. This cleanup will\n\t * clear any outstanding timers and reset some of the state\n\t * properties.\n\t * Called by ContainerRuntime when it is disposed, as well as at the end the run().\n\t */\n\tpublic dispose(): void {\n\t\t// Given that the call can come from own ContainerRuntime, ensure that we stop all the processes.\n\t\tthis.stop(\"summarizerClientDisconnected\");\n\n\t\tthis._disposed = true;\n\t\tif (this.runningSummarizer) {\n\t\t\tthis.cleanupForwardedEvents();\n\t\t\tthis.runningSummarizer.dispose();\n\t\t\tthis.runningSummarizer = undefined;\n\t\t}\n\t}\n\n\tpublic summarizeOnDemand(options: IOnDemandSummarizeOptions): ISummarizeResults {\n\t\ttry {\n\t\t\tif (this._disposed || this.runningSummarizer?.disposed) {\n\t\t\t\tthrow new UsageError(\"Summarizer is already disposed.\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\tthis.runtime.summarizerClientId !== undefined &&\n\t\t\t\tthis.runtime.summarizerClientId !== this.runtime.clientId\n\t\t\t) {\n\t\t\t\t// If there is an elected summarizer, and it's not this one, don't allow on-demand summary.\n\t\t\t\t// This is to prevent the on-demand summary and heuristic-based summary from stepping on\n\t\t\t\t// each other.\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"On-demand summary attempted while an elected summarizer is present\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst builder = new SummarizeResultBuilder();\n\t\t\tif (this.runningSummarizer) {\n\t\t\t\t// Summarizer is already running. Go ahead and start.\n\t\t\t\treturn this.runningSummarizer.summarizeOnDemand(options, builder);\n\t\t\t}\n\n\t\t\t// Summarizer isn't running, so we need to start it, which is an async operation.\n\t\t\t// Manage the promise related to creating the cancellation token here.\n\t\t\t// The promises related to starting, summarizing,\n\t\t\t// and submitting are communicated to the caller through the results builder.\n\t\t\tconst coordinatorCreateP = this.runCoordinatorCreateFn(this.runtime);\n\n\t\t\tcoordinatorCreateP\n\t\t\t\t.then((runCoordinator) => {\n\t\t\t\t\t// Successfully created the cancellation token. Start the summarizer.\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tconst startP = this.start(this.runtime.clientId!, runCoordinator);\n\t\t\t\t\tstartP\n\t\t\t\t\t\t.then(async (runningSummarizer) => {\n\t\t\t\t\t\t\t// Successfully started the summarizer. Run it.\n\t\t\t\t\t\t\trunningSummarizer.summarizeOnDemand(options, builder);\n\t\t\t\t\t\t\t// Wait for a command to stop or loss of connectivity before tearing down the summarizer and client.\n\t\t\t\t\t\t\tconst stopReason = await Promise.race([\n\t\t\t\t\t\t\t\tthis.stopDeferred.promise,\n\t\t\t\t\t\t\t\trunCoordinator.waitCancelled,\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t\tawait runningSummarizer.waitStop(false);\n\t\t\t\t\t\t\trunCoordinator.stop(stopReason);\n\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((error: IRetriableFailureError) => {\n\t\t\t\t\t\t\tbuilder.fail(\"Failed to start summarizer\", error);\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch((error: IRetriableFailureError) => {\n\t\t\t\t\tbuilder.fail(\"Failed to create cancellation token\", error);\n\t\t\t\t});\n\n\t\t\treturn builder.build();\n\t\t} catch (error) {\n\t\t\tthrow SummarizingWarning.wrap(error, false /* logged */, this.logger);\n\t\t}\n\t}\n\n\tpublic enqueueSummarize(options: IEnqueueSummarizeOptions): EnqueueSummarizeResult {\n\t\tif (\n\t\t\tthis._disposed ||\n\t\t\tthis.runningSummarizer === undefined ||\n\t\t\tthis.runningSummarizer.disposed\n\t\t) {\n\t\t\tthrow new UsageError(\"Summarizer is not running or already disposed.\");\n\t\t}\n\t\treturn this.runningSummarizer.enqueueSummarize(options);\n\t}\n\n\tpublic recordSummaryAttempt?(summaryRefSeqNum?: number): void {\n\t\tthis._heuristicData?.recordAttempt(summaryRefSeqNum);\n\t}\n\n\tprivate readonly forwardedEvents = new Map<string, () => void>();\n\n\tprivate setupForwardedEvents(): void {\n\t\tfor (const event of [\"summarize\", \"summarizeAllAttemptsFailed\"]) {\n\t\t\tconst listener = (...args: unknown[]): void => {\n\t\t\t\tthis.emit(event, ...args);\n\t\t\t};\n\t\t\t// TODO: better typing here\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument\n\t\t\tthis.runningSummarizer?.on(event as any, listener);\n\t\t\tthis.forwardedEvents.set(event, listener);\n\t\t}\n\t}\n\n\tprivate cleanupForwardedEvents(): void {\n\t\tfor (const [event, listener] of this.forwardedEvents.entries()) {\n\t\t\tthis.runningSummarizer?.off(event, listener);\n\t\t}\n\t\tthis.forwardedEvents.clear();\n\t}\n}\n"]}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
|
|
6
|
-
import type { ISummaryConfigurationHeuristics } from "
|
|
7
|
-
import { ISummarizeAttempt, ISummarizeHeuristicData, ISummarizeHeuristicRunner, ISummaryHeuristicStrategy } from "
|
|
8
|
-
import { SummarizeReason } from "
|
|
6
|
+
import type { ISummaryConfigurationHeuristics } from "../summarizerTypes.js";
|
|
7
|
+
import { ISummarizeAttempt, ISummarizeHeuristicData, ISummarizeHeuristicRunner, ISummaryHeuristicStrategy } from "../summarizerTypes.js";
|
|
8
|
+
import { SummarizeReason } from "../summarizerUtils.js";
|
|
9
9
|
/**
|
|
10
10
|
* Simple implementation of class for tracking summarize heuristic data.
|
|
11
11
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarizerHeuristics.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summarizerHeuristics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAE/E,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACN,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;GAEG;AACH,qBAAa,sBAAuB,YAAW,uBAAuB;IAuC7D,oBAAoB,EAAE,MAAM;IAtCpC,SAAS,CAAC,YAAY,EAAE,iBAAiB,CAAC;IAC1C,IAAW,WAAW,IAAI,iBAAiB,CAE1C;IAED,SAAS,CAAC,sBAAsB,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC9D,IAAW,qBAAqB,IAAI,QAAQ,CAAC,iBAAiB,CAAC,CAE9D;IAED,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAEM,gBAAgB,EAAE,OAAO,CAAS;IAElC,YAAY,EAAE,MAAM,CAAK;IAChC;;;OAGG;IACH,OAAO,CAAC,kBAAkB,CAAa;IAEhC,gBAAgB,EAAE,MAAM,CAAK;IACpC;;;OAGG;IACH,OAAO,CAAC,sBAAsB,CAAa;IAEpC,aAAa,EAAE,MAAM,CAAK;IACjC;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAAa;gBAGhC,oBAAoB,EAAE,MAAM;IACnC;;OAEG;IACH,eAAe,EAAE,iBAAiB;IAM5B,4BAA4B,CAAC,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAK5E,aAAa,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI;IAW/C,2BAA2B,IAAI,IAAI;CAY1C;AAED;;GAEG;AACH,qBAAa,wBAAyB,YAAW,yBAAyB;IAKxE,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IARrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;gBAG/C,aAAa,EAAE,uBAAuB,EACtC,aAAa,EAAE,+BAA+B,EAC/D,YAAY,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,EAC9B,MAAM,EAAE,mBAAmB,EAC3B,mBAAmB,GAAE,yBAAyB,EAA2C;IAe3G,IAAW,QAAQ,IAAI,MAAM,CAiB5B;IAED,IAAW,eAAe,IAAI,MAAM,CAKnC;IAEM,KAAK,IAAI,IAAI;IAIb,GAAG,IAAI,IAAI;IAUX,oBAAoB,IAAI,OAAO;IAkB/B,OAAO,IAAI,IAAI;CAGtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarizerHeuristics.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summarizerHeuristics.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Timer } from \"@fluidframework/core-utils/internal\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { ISummaryConfigurationHeuristics } from \"../summarizerTypes.js\";\nimport {\n\tISummarizeAttempt,\n\tISummarizeHeuristicData,\n\tISummarizeHeuristicRunner,\n\tISummaryHeuristicStrategy,\n} from \"../summarizerTypes.js\";\nimport { SummarizeReason } from \"../summarizerUtils.js\";\n\n/**\n * Simple implementation of class for tracking summarize heuristic data.\n */\nexport class SummarizeHeuristicData implements ISummarizeHeuristicData {\n\tprotected _lastAttempt: ISummarizeAttempt;\n\tpublic get lastAttempt(): ISummarizeAttempt {\n\t\treturn this._lastAttempt;\n\t}\n\n\tprotected _lastSuccessfulSummary: Readonly<ISummarizeAttempt>;\n\tpublic get lastSuccessfulSummary(): Readonly<ISummarizeAttempt> {\n\t\treturn this._lastSuccessfulSummary;\n\t}\n\n\tpublic get opsSinceLastSummary(): number {\n\t\treturn this.numNonRuntimeOpsBefore + this.numRuntimeOpsBefore;\n\t}\n\n\tpublic hasMissingOpData: boolean = false;\n\n\tpublic totalOpsSize: number = 0;\n\t/**\n\t * Cumulative size in bytes of all the ops at the beginning of the summarization attempt.\n\t * Is used to adjust totalOpsSize appropriately after successful summarization.\n\t */\n\tprivate totalOpsSizeBefore: number = 0;\n\n\tpublic numNonRuntimeOps: number = 0;\n\t/**\n\t * Number of non-runtime ops at beginning of attempting to summarize.\n\t * Is used to adjust numNonRuntimeOps appropriately after successful summarization.\n\t */\n\tprivate numNonRuntimeOpsBefore: number = 0;\n\n\tpublic numRuntimeOps: number = 0;\n\t/**\n\t * Number of runtime ops at beginning of attempting to summarize.\n\t * Is used to adjust numRuntimeOps appropriately after successful summarization.\n\t */\n\tprivate numRuntimeOpsBefore: number = 0;\n\n\tconstructor(\n\t\tpublic lastOpSequenceNumber: number,\n\t\t/**\n\t\t * Baseline attempt data used for comparisons with subsequent attempts/calculations.\n\t\t */\n\t\tattemptBaseline: ISummarizeAttempt,\n\t) {\n\t\tthis._lastAttempt = attemptBaseline;\n\t\tthis._lastSuccessfulSummary = { ...attemptBaseline };\n\t}\n\n\tpublic updateWithLastSummaryAckInfo(lastSummary: Readonly<ISummarizeAttempt>): void {\n\t\tthis._lastAttempt = lastSummary;\n\t\tthis._lastSuccessfulSummary = { ...lastSummary };\n\t}\n\n\tpublic recordAttempt(refSequenceNumber?: number): void {\n\t\tthis._lastAttempt = {\n\t\t\trefSequenceNumber: refSequenceNumber ?? this.lastOpSequenceNumber,\n\t\t\tsummaryTime: Date.now(),\n\t\t};\n\n\t\tthis.numNonRuntimeOpsBefore = this.numNonRuntimeOps;\n\t\tthis.numRuntimeOpsBefore = this.numRuntimeOps;\n\t\tthis.totalOpsSizeBefore = this.totalOpsSize;\n\t}\n\n\tpublic markLastAttemptAsSuccessful(): void {\n\t\tthis._lastSuccessfulSummary = { ...this.lastAttempt };\n\n\t\tthis.numNonRuntimeOps -= this.numNonRuntimeOpsBefore;\n\t\tthis.numNonRuntimeOpsBefore = 0;\n\n\t\tthis.numRuntimeOps -= this.numRuntimeOpsBefore;\n\t\tthis.numRuntimeOpsBefore = 0;\n\n\t\tthis.totalOpsSize -= this.totalOpsSizeBefore;\n\t\tthis.totalOpsSizeBefore = 0;\n\t}\n}\n\n/**\n * This class contains the heuristics for when to summarize.\n */\nexport class SummarizeHeuristicRunner implements ISummarizeHeuristicRunner {\n\tprivate readonly idleTimer: Timer | undefined;\n\tprivate readonly runSummarize: (reason: SummarizeReason) => void;\n\n\tpublic constructor(\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly configuration: ISummaryConfigurationHeuristics,\n\t\ttrySummarize: (reason: SummarizeReason) => void,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tprivate readonly summarizeStrategies: ISummaryHeuristicStrategy[] = getDefaultSummaryHeuristicStrategies(),\n\t) {\n\t\tthis.idleTimer = new Timer(this.idleTime, () => this.runSummarize(\"idle\"));\n\n\t\tthis.runSummarize = (reason: SummarizeReason) => {\n\t\t\tthis.idleTimer?.clear();\n\n\t\t\t// We shouldn't attempt a summary if there are no new processed ops\n\t\t\tconst opsSinceLastAck = this.opsSinceLastAck;\n\t\t\tif (opsSinceLastAck > 0) {\n\t\t\t\ttrySummarize(reason);\n\t\t\t}\n\t\t};\n\t}\n\n\tpublic get idleTime(): number {\n\t\tconst maxIdleTime = this.configuration.maxIdleTime;\n\t\tconst minIdleTime = this.configuration.minIdleTime;\n\t\tconst weightedNumOfOps = getWeightedNumberOfOps(\n\t\t\tthis.heuristicData.numRuntimeOps,\n\t\t\tthis.heuristicData.numNonRuntimeOps,\n\t\t\tthis.configuration.runtimeOpWeight,\n\t\t\tthis.configuration.nonRuntimeOpWeight,\n\t\t);\n\t\tconst pToMaxOps = (weightedNumOfOps * 1) / this.configuration.maxOps;\n\n\t\tif (pToMaxOps >= 1) {\n\t\t\treturn minIdleTime;\n\t\t}\n\n\t\t// Return a ratioed idle time based on the percentage of ops\n\t\treturn maxIdleTime - (maxIdleTime - minIdleTime) * pToMaxOps;\n\t}\n\n\tpublic get opsSinceLastAck(): number {\n\t\treturn (\n\t\t\tthis.heuristicData.lastOpSequenceNumber -\n\t\t\tthis.heuristicData.lastSuccessfulSummary.refSequenceNumber\n\t\t);\n\t}\n\n\tpublic start(): void {\n\t\tthis.idleTimer?.start(this.idleTime);\n\t}\n\n\tpublic run(): void {\n\t\tfor (const strategy of this.summarizeStrategies) {\n\t\t\tif (strategy.shouldRunSummary(this.configuration, this.heuristicData)) {\n\t\t\t\treturn this.runSummarize(strategy.summarizeReason);\n\t\t\t}\n\t\t}\n\n\t\tthis.idleTimer?.restart(this.idleTime);\n\t}\n\n\tpublic shouldRunLastSummary(): boolean {\n\t\tconst weightedOpsSinceLastAck = getWeightedNumberOfOps(\n\t\t\tthis.heuristicData.numRuntimeOps,\n\t\t\tthis.heuristicData.numNonRuntimeOps,\n\t\t\tthis.configuration.runtimeOpWeight,\n\t\t\tthis.configuration.nonRuntimeOpWeight,\n\t\t);\n\t\tconst minOpsForLastSummaryAttempt = this.configuration.minOpsForLastSummaryAttempt;\n\n\t\tthis.logger.sendTelemetryEvent({\n\t\t\teventName: \"ShouldRunLastSummary\",\n\t\t\tweightedOpsSinceLastAck,\n\t\t\tminOpsForLastSummaryAttempt,\n\t\t});\n\n\t\treturn weightedOpsSinceLastAck >= minOpsForLastSummaryAttempt;\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.idleTimer?.clear();\n\t}\n}\n\n/**\n * Strategy used to run a summary when it's been a while since our last successful summary\n */\nclass MaxTimeSummaryHeuristicStrategy implements ISummaryHeuristicStrategy {\n\tpublic readonly summarizeReason: Readonly<SummarizeReason> = \"maxTime\";\n\n\tpublic shouldRunSummary(\n\t\tconfiguration: ISummaryConfigurationHeuristics,\n\t\theuristicData: ISummarizeHeuristicData,\n\t): boolean {\n\t\tconst timeSinceLastSummary = Date.now() - heuristicData.lastSuccessfulSummary.summaryTime;\n\t\treturn timeSinceLastSummary > configuration.maxTime;\n\t}\n}\n\nfunction getWeightedNumberOfOps(\n\truntimeOpCount: number,\n\tnonRuntimeOpCount: number,\n\truntimeOpWeight: number,\n\tnonRuntimeOpWeight: number,\n): number {\n\treturn runtimeOpWeight * runtimeOpCount + nonRuntimeOpWeight * nonRuntimeOpCount;\n}\n\n/**\n * Strategy used to do a weighted analysis on the ops we've processed since the last successful summary\n */\nclass WeightedOpsSummaryHeuristicStrategy implements ISummaryHeuristicStrategy {\n\tpublic readonly summarizeReason: Readonly<SummarizeReason> = \"maxOps\";\n\n\tpublic shouldRunSummary(\n\t\tconfiguration: ISummaryConfigurationHeuristics,\n\t\theuristicData: ISummarizeHeuristicData,\n\t): boolean {\n\t\tconst weightedNumOfOps = getWeightedNumberOfOps(\n\t\t\theuristicData.numRuntimeOps,\n\t\t\theuristicData.numNonRuntimeOps,\n\t\t\tconfiguration.runtimeOpWeight,\n\t\t\tconfiguration.nonRuntimeOpWeight,\n\t\t);\n\t\treturn weightedNumOfOps > configuration.maxOps;\n\t}\n}\n\nfunction getDefaultSummaryHeuristicStrategies(): (\n\t| MaxTimeSummaryHeuristicStrategy\n\t| WeightedOpsSummaryHeuristicStrategy\n)[] {\n\treturn [new MaxTimeSummaryHeuristicStrategy(), new WeightedOpsSummaryHeuristicStrategy()];\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { IPromiseTimer } from "@fluidframework/core-utils/internal";
|
|
6
|
+
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
|
|
7
|
+
import type { IRefreshSummaryAckOptions, ISubmitSummaryOptions, ISummarizeHeuristicData, SubmitSummaryResult } from "../summarizerTypes.js";
|
|
8
|
+
import type { IClientSummaryWatcher } from "../summaryCollection.js";
|
|
9
|
+
import { SummarizeResultBuilder } from "./summaryResultBuilder.js";
|
|
10
|
+
import { type ISummarizeResults } from "./summaryResultTypes.js";
|
|
11
|
+
/**
|
|
12
|
+
* This class generates and tracks a summary attempt.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SummaryGenerator {
|
|
15
|
+
private readonly pendingAckTimer;
|
|
16
|
+
private readonly heuristicData;
|
|
17
|
+
private readonly submitSummaryCallback;
|
|
18
|
+
private readonly successfulSummaryCallback;
|
|
19
|
+
private readonly refreshLatestSummaryCallback;
|
|
20
|
+
private readonly summaryWatcher;
|
|
21
|
+
private readonly logger;
|
|
22
|
+
private readonly summarizeTimer;
|
|
23
|
+
constructor(pendingAckTimer: IPromiseTimer, heuristicData: ISummarizeHeuristicData, submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>, successfulSummaryCallback: () => void, refreshLatestSummaryCallback: (options: IRefreshSummaryAckOptions) => Promise<void>, summaryWatcher: Pick<IClientSummaryWatcher, "watchSummary">, logger: ITelemetryLoggerExt);
|
|
24
|
+
/**
|
|
25
|
+
* Generates summary and listens for broadcast and ack/nack.
|
|
26
|
+
* Returns true for ack, false for nack, and undefined for failure or timeout.
|
|
27
|
+
* @param summaryOptions - options controlling how the summary is generated or submitted.
|
|
28
|
+
* @param resultsBuilder - optional, result builder to use to build pass or fail result.
|
|
29
|
+
*/
|
|
30
|
+
summarize(summaryOptions: ISubmitSummaryOptions, resultsBuilder?: SummarizeResultBuilder): ISummarizeResults;
|
|
31
|
+
private summarizeCore;
|
|
32
|
+
private addSummaryDataToTelemetryProps;
|
|
33
|
+
private summarizeTimerHandler;
|
|
34
|
+
dispose(): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=summaryGenerator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaryGenerator.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAU,aAAa,EAAS,MAAM,qCAAqC,CAAC;AAGnF,OAAO,EAEN,mBAAmB,EAGnB,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EACX,yBAAyB,EAEzB,qBAAqB,EACrB,uBAAuB,EAEvB,mBAAmB,EAEnB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAM1F;;GAEG;AACH,qBAAa,gBAAgB;IAG3B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAGtC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,4BAA4B;IAG7C,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAZxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;gBAErB,eAAe,EAAE,aAAa,EAC9B,aAAa,EAAE,uBAAuB,EACtC,qBAAqB,EAAE,CACvC,OAAO,EAAE,qBAAqB,KAC1B,OAAO,CAAC,mBAAmB,CAAC,EAChB,yBAAyB,EAAE,MAAM,IAAI,EACrC,4BAA4B,EAAE,CAC9C,OAAO,EAAE,yBAAyB,KAC9B,OAAO,CAAC,IAAI,CAAC,EACD,cAAc,EAAE,IAAI,CAAC,qBAAqB,EAAE,cAAc,CAAC,EAC3D,MAAM,EAAE,mBAAmB;IAO7C;;;;;OAKG;IACI,SAAS,CACf,cAAc,EAAE,qBAAqB,EACrC,cAAc,yBAA+B,GAC3C,iBAAiB;YAYN,aAAa;IAgR3B,OAAO,CAAC,8BAA8B;IAkDtC,OAAO,CAAC,qBAAqB;IAetB,OAAO,IAAI,IAAI;CAGtB"}
|
|
@@ -4,101 +4,16 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.SummaryGenerator =
|
|
7
|
+
exports.SummaryGenerator = void 0;
|
|
8
8
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
9
|
const internal_2 = require("@fluidframework/driver-definitions/internal");
|
|
10
10
|
const internal_3 = require("@fluidframework/driver-utils/internal");
|
|
11
11
|
const internal_4 = require("@fluidframework/telemetry-utils/internal");
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*/
|
|
15
|
-
async function raceTimer(promise, timer, cancellationToken) {
|
|
16
|
-
const promises = [
|
|
17
|
-
promise.then((value) => ({ result: "done", value })),
|
|
18
|
-
timer.then(({ timerResult: result }) => ({ result })),
|
|
19
|
-
];
|
|
20
|
-
if (cancellationToken !== undefined) {
|
|
21
|
-
promises.push(cancellationToken.waitCancelled.then(() => ({ result: "cancelled" })));
|
|
22
|
-
}
|
|
23
|
-
return Promise.race(promises);
|
|
24
|
-
}
|
|
25
|
-
exports.raceTimer = raceTimer;
|
|
12
|
+
const summarizerUtils_js_1 = require("../summarizerUtils.js");
|
|
13
|
+
const summaryResultBuilder_js_1 = require("./summaryResultBuilder.js");
|
|
26
14
|
// Send some telemetry if generate summary takes too long
|
|
27
15
|
const maxSummarizeTimeoutTime = 20000; // 20 sec
|
|
28
16
|
const maxSummarizeTimeoutCount = 5; // Double and resend 5 times
|
|
29
|
-
const summarizeErrors = {
|
|
30
|
-
/**
|
|
31
|
-
* Error encountered while generating the summary tree, uploading
|
|
32
|
-
* it to storage, or submitting the op. It could be a result of
|
|
33
|
-
* the client becoming disconnected while generating or an actual error.
|
|
34
|
-
*/
|
|
35
|
-
submitSummaryFailure: "Error while generating, uploading, or submitting summary",
|
|
36
|
-
/**
|
|
37
|
-
* The summaryAckWaitTimeout time has elapsed before receiving the summarize op
|
|
38
|
-
* sent by this summarize attempt. It is expected to be broadcast quickly.
|
|
39
|
-
*/
|
|
40
|
-
summaryOpWaitTimeout: "Timeout while waiting for summarize op broadcast",
|
|
41
|
-
/**
|
|
42
|
-
* The summaryAckWaitTimeout time has elapsed before receiving either a
|
|
43
|
-
* summaryAck or summaryNack op from the server in response to this
|
|
44
|
-
* summarize attempt. It is expected that the server should respond.
|
|
45
|
-
*/
|
|
46
|
-
summaryAckWaitTimeout: "Timeout while waiting for summaryAck/summaryNack op",
|
|
47
|
-
/**
|
|
48
|
-
* The server responded with a summaryNack op, thus rejecting this
|
|
49
|
-
* summarize attempt.
|
|
50
|
-
*/
|
|
51
|
-
summaryNack: "Server rejected summary via summaryNack op",
|
|
52
|
-
disconnect: "Summary cancelled due to summarizer or main client disconnect",
|
|
53
|
-
};
|
|
54
|
-
// Helper functions to report failures and return.
|
|
55
|
-
const getFailMessage = (errorCode) => `${errorCode}: ${summarizeErrors[errorCode]}`;
|
|
56
|
-
exports.getFailMessage = getFailMessage;
|
|
57
|
-
class SummarizeResultBuilder {
|
|
58
|
-
constructor() {
|
|
59
|
-
this.summarySubmitted = new internal_1.Deferred();
|
|
60
|
-
this.summaryOpBroadcasted = new internal_1.Deferred();
|
|
61
|
-
this.receivedSummaryAckOrNack = new internal_1.Deferred();
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Fails one or more of the three results as per the passed params.
|
|
65
|
-
* If submit fails, all three results fail.
|
|
66
|
-
* If op broadcast fails, only op broadcast result and ack nack result fails.
|
|
67
|
-
* If ack nack fails, only ack nack result fails.
|
|
68
|
-
*/
|
|
69
|
-
fail(message, error, submitFailureResult, nackSummaryResult) {
|
|
70
|
-
(0, internal_1.assert)(!this.receivedSummaryAckOrNack.isCompleted, 0x25e /* "no reason to call fail if all promises have been completed" */);
|
|
71
|
-
const result = {
|
|
72
|
-
success: false,
|
|
73
|
-
message,
|
|
74
|
-
data: undefined,
|
|
75
|
-
error,
|
|
76
|
-
};
|
|
77
|
-
// Note that if any of these are already resolved, it will be a no-op. For example, if ack nack failed but
|
|
78
|
-
// submit summary and op broadcast has already been resolved as passed, only ack nack result will get modified.
|
|
79
|
-
this.summarySubmitted.resolve({ ...result, data: submitFailureResult });
|
|
80
|
-
this.summaryOpBroadcasted.resolve(result);
|
|
81
|
-
this.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });
|
|
82
|
-
}
|
|
83
|
-
build() {
|
|
84
|
-
return {
|
|
85
|
-
summarySubmitted: this.summarySubmitted.promise,
|
|
86
|
-
summaryOpBroadcasted: this.summaryOpBroadcasted.promise,
|
|
87
|
-
receivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
exports.SummarizeResultBuilder = SummarizeResultBuilder;
|
|
92
|
-
/**
|
|
93
|
-
* Errors type for errors hit during summary that may be retriable.
|
|
94
|
-
*/
|
|
95
|
-
class RetriableSummaryError extends internal_4.LoggingError {
|
|
96
|
-
constructor(message, retryAfterSeconds, props) {
|
|
97
|
-
super(message, props);
|
|
98
|
-
this.retryAfterSeconds = retryAfterSeconds;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
exports.RetriableSummaryError = RetriableSummaryError;
|
|
102
17
|
/**
|
|
103
18
|
* This class generates and tracks a summary attempt.
|
|
104
19
|
*/
|
|
@@ -119,7 +34,7 @@ class SummaryGenerator {
|
|
|
119
34
|
* @param summaryOptions - options controlling how the summary is generated or submitted.
|
|
120
35
|
* @param resultsBuilder - optional, result builder to use to build pass or fail result.
|
|
121
36
|
*/
|
|
122
|
-
summarize(summaryOptions, resultsBuilder = new SummarizeResultBuilder()) {
|
|
37
|
+
summarize(summaryOptions, resultsBuilder = new summaryResultBuilder_js_1.SummarizeResultBuilder()) {
|
|
123
38
|
this.summarizeCore(summaryOptions, resultsBuilder).catch((error) => {
|
|
124
39
|
const message = "UnexpectedSummarizeError";
|
|
125
40
|
summaryOptions.summaryLogger.sendErrorEvent({ eventName: message }, error);
|
|
@@ -157,7 +72,7 @@ class SummaryGenerator {
|
|
|
157
72
|
((0, internal_4.isFluidError)(error) && error?.errorType === internal_2.DriverErrorTypes.offlineError)
|
|
158
73
|
? "generic"
|
|
159
74
|
: "error";
|
|
160
|
-
const reason = (0,
|
|
75
|
+
const reason = (0, summarizerUtils_js_1.getFailMessage)(errorCode);
|
|
161
76
|
summarizeEvent.cancel({
|
|
162
77
|
...properties,
|
|
163
78
|
reason,
|
|
@@ -185,7 +100,7 @@ class SummaryGenerator {
|
|
|
185
100
|
summarizeTelemetryProps = this.addSummaryDataToTelemetryProps(summaryData, summarizeTelemetryProps);
|
|
186
101
|
if (summaryData.stage !== "submit") {
|
|
187
102
|
const errorCode = "submitSummaryFailure";
|
|
188
|
-
const retriableError = summaryData.error ?? new RetriableSummaryError((0,
|
|
103
|
+
const retriableError = summaryData.error ?? new summarizerUtils_js_1.RetriableSummaryError((0, summarizerUtils_js_1.getFailMessage)(errorCode));
|
|
189
104
|
return fail(errorCode, retriableError, summarizeTelemetryProps, {
|
|
190
105
|
stage: summaryData.stage,
|
|
191
106
|
});
|
|
@@ -217,7 +132,7 @@ class SummaryGenerator {
|
|
|
217
132
|
resultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });
|
|
218
133
|
}
|
|
219
134
|
catch (error) {
|
|
220
|
-
return fail("submitSummaryFailure", (0, internal_4.wrapError)(error, (message) => new RetriableSummaryError(message, (0, internal_3.getRetryDelaySecondsFromError)(error))), undefined /* properties */, {
|
|
135
|
+
return fail("submitSummaryFailure", (0, internal_4.wrapError)(error, (message) => new summarizerUtils_js_1.RetriableSummaryError(message, (0, internal_3.getRetryDelaySecondsFromError)(error))), undefined /* properties */, {
|
|
221
136
|
stage: "unknown",
|
|
222
137
|
});
|
|
223
138
|
}
|
|
@@ -231,16 +146,16 @@ class SummaryGenerator {
|
|
|
231
146
|
const pendingTimeoutP = this.pendingAckTimer.start();
|
|
232
147
|
const summary = this.summaryWatcher.watchSummary(summaryData.clientSequenceNumber);
|
|
233
148
|
// Wait for broadcast
|
|
234
|
-
const waitBroadcastResult = await raceTimer(summary.waitBroadcast(), pendingTimeoutP, cancellationToken);
|
|
149
|
+
const waitBroadcastResult = await (0, summarizerUtils_js_1.raceTimer)(summary.waitBroadcast(), pendingTimeoutP, cancellationToken);
|
|
235
150
|
if (waitBroadcastResult.result === "cancelled") {
|
|
236
151
|
const errorCode = "disconnect";
|
|
237
|
-
return fail(errorCode, new RetriableSummaryError((0,
|
|
152
|
+
return fail(errorCode, new summarizerUtils_js_1.RetriableSummaryError((0, summarizerUtils_js_1.getFailMessage)(errorCode)));
|
|
238
153
|
}
|
|
239
154
|
if (waitBroadcastResult.result !== "done") {
|
|
240
155
|
// The summary op may not have been received within the timeout due to a transient error. So,
|
|
241
156
|
// fail with a retriable error to re-attempt the summary if possible.
|
|
242
157
|
const errorCode = "summaryOpWaitTimeout";
|
|
243
|
-
return fail(errorCode, new RetriableSummaryError((0,
|
|
158
|
+
return fail(errorCode, new summarizerUtils_js_1.RetriableSummaryError((0, summarizerUtils_js_1.getFailMessage)(errorCode), 0 /* retryAfterSeconds */));
|
|
244
159
|
}
|
|
245
160
|
const summarizeOp = waitBroadcastResult.value;
|
|
246
161
|
const broadcastDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;
|
|
@@ -257,16 +172,16 @@ class SummaryGenerator {
|
|
|
257
172
|
handle: summarizeOp.contents.handle,
|
|
258
173
|
});
|
|
259
174
|
// Wait for ack/nack
|
|
260
|
-
const waitAckNackResult = await raceTimer(summary.waitAckNack(), pendingTimeoutP, cancellationToken);
|
|
175
|
+
const waitAckNackResult = await (0, summarizerUtils_js_1.raceTimer)(summary.waitAckNack(), pendingTimeoutP, cancellationToken);
|
|
261
176
|
if (waitAckNackResult.result === "cancelled") {
|
|
262
177
|
const errorCode = "disconnect";
|
|
263
|
-
return fail(errorCode, new RetriableSummaryError((0,
|
|
178
|
+
return fail(errorCode, new summarizerUtils_js_1.RetriableSummaryError((0, summarizerUtils_js_1.getFailMessage)(errorCode)));
|
|
264
179
|
}
|
|
265
180
|
if (waitAckNackResult.result !== "done") {
|
|
266
181
|
const errorCode = "summaryAckWaitTimeout";
|
|
267
182
|
// The summary ack may not have been received within the timeout due to a transient error. So,
|
|
268
183
|
// fail with a retriable error to re-attempt the summary if possible.
|
|
269
|
-
return fail(errorCode, new RetriableSummaryError((0,
|
|
184
|
+
return fail(errorCode, new summarizerUtils_js_1.RetriableSummaryError((0, summarizerUtils_js_1.getFailMessage)(errorCode), 0 /* retryAfterSeconds */));
|
|
270
185
|
}
|
|
271
186
|
const ackNackOp = waitAckNackResult.value;
|
|
272
187
|
this.pendingAckTimer.clear();
|
|
@@ -310,7 +225,7 @@ class SummaryGenerator {
|
|
|
310
225
|
const retryAfterSeconds = summaryNack?.retryAfter;
|
|
311
226
|
const errorCode = "summaryNack";
|
|
312
227
|
// pre-0.58 error message prefix: summaryNack
|
|
313
|
-
const error = new RetriableSummaryError((0,
|
|
228
|
+
const error = new summarizerUtils_js_1.RetriableSummaryError((0, summarizerUtils_js_1.getFailMessage)(errorCode), retryAfterSeconds, {
|
|
314
229
|
errorMessage,
|
|
315
230
|
});
|
|
316
231
|
(0, internal_1.assert)((0, internal_3.getRetryDelaySecondsFromError)(error) === retryAfterSeconds, 0x25f /* "retryAfterSeconds" */);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaryGenerator.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryGenerator.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAAmF;AACnF,0EAA4F;AAC5F,oEAAsF;AACtF,uEAKkD;AAWlD,8DAK+B;AAG/B,uEAAmE;AAGnE,yDAAyD;AACzD,MAAM,uBAAuB,GAAG,KAAK,CAAC,CAAC,SAAS;AAChD,MAAM,wBAAwB,GAAG,CAAC,CAAC,CAAC,4BAA4B;AAEhE;;GAEG;AACH,MAAa,gBAAgB;IAE5B,YACkB,eAA8B,EAC9B,aAAsC,EACtC,qBAEgB,EAChB,yBAAqC,EACrC,4BAEC,EACD,cAA2D,EAC3D,MAA2B;QAV3B,oBAAe,GAAf,eAAe,CAAe;QAC9B,kBAAa,GAAb,aAAa,CAAyB;QACtC,0BAAqB,GAArB,qBAAqB,CAEL;QAChB,8BAAyB,GAAzB,yBAAyB,CAAY;QACrC,iCAA4B,GAA5B,4BAA4B,CAE3B;QACD,mBAAc,GAAd,cAAc,CAA6C;QAC3D,WAAM,GAAN,MAAM,CAAqB;QAE5C,IAAI,CAAC,cAAc,GAAG,IAAI,gBAAK,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAC7D,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,CAAC,CAAC,CACtD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,SAAS,CACf,cAAqC,EACrC,cAAc,GAAG,IAAI,gDAAsB,EAAE;QAE7C,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,KAAK,CACvD,CAAC,KAA6B,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,0BAA0B,CAAC;YAC3C,cAAc,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;YAC3E,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC,CACD,CAAC;QAEF,OAAO,cAAc,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,aAAa,CAC1B,oBAA2C,EAC3C,cAAsC;QAEtC,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,EAAE,GAAG,oBAAoB,CAAC;QAEvF,8DAA8D;QAC9D,wEAAwE;QACxE,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC;QACrF,MAAM,oBAAoB,GACzB,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,WAAW,CAAC;QACnE,IAAI,uBAAuB,GAA8B;YACxD,GAAG,gBAAgB;YACnB,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,IAAI,KAAK;YAC5C,oBAAoB;YACpB,oBAAoB;SACpB,CAAC;QAEF,MAAM,cAAc,GAAG,2BAAgB,CAAC,KAAK,CAC5C,aAAa,EACb;YACC,SAAS,EAAE,WAAW;YACtB,GAAG,uBAAuB;SAC1B,EACD,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAC7C,CAAC;QAEF,IAAI,WAA4C,CAAC;QAEjD;;;;WAIG;QACH,MAAM,IAAI,GAAG,CACZ,SAA6B,EAC7B,KAA6B,EAC7B,UAAsC,EACtC,mBAA8C,EAC9C,iBAAsC,EAC/B,EAAE;YACT,+FAA+F;YAC/F,4FAA4F;YAC5F,oBAAoB;YACpB,MAAM,QAAQ,GACb,iBAAiB,CAAC,SAAS;gBAC3B,CAAC,IAAA,uBAAY,EAAC,KAAK,CAAC,IAAI,KAAK,EAAE,SAAS,KAAK,2BAAgB,CAAC,YAAY,CAAC;gBAC1E,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,OAAO,CAAC;YAEZ,MAAM,MAAM,GAAG,IAAA,mCAAc,EAAC,SAAS,CAAC,CAAC;YACzC,cAAc,CAAC,MAAM,CACpB;gBACC,GAAG,UAAU;gBACb,MAAM;gBACN,QAAQ;gBACR,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;aAC1C,EACD,KAAK,CACL,CAAC,CAAC,2DAA2D;YAE9D,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;QAC5E,CAAC,CAAC;QAEF,oCAAoC;QACpC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC;YACJ,iGAAiG;YACjG,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,iBAAiB,CAAC;YAE9E,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;YAErE,+EAA+E;YAC/E,MAAM,uBAAuB,GAAG,WAAW,CAAC,uBAAuB,CAAC;YACpE,uBAAuB,GAAG;gBACzB,GAAG,uBAAuB;gBAC1B,uBAAuB;gBACvB,qBAAqB,EAAE,WAAW,CAAC,qBAAqB;gBACxD,mBAAmB,EAAE,uBAAuB,GAAG,oBAAoB;gBACnE,mBAAmB,EAClB,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,iBAAiB;gBACrF,KAAK,EAAE,WAAW,CAAC,KAAK;aACxB,CAAC;YACF,uBAAuB,GAAG,IAAI,CAAC,8BAA8B,CAC5D,WAAW,EACX,uBAAuB,CACvB,CAAC;YAEF,IAAI,WAAW,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,SAAS,GAAuB,sBAAsB,CAAC;gBAC7D,MAAM,cAAc,GACnB,WAAW,CAAC,KAAK,IAAI,IAAI,0CAAqB,CAAC,IAAA,mCAAc,EAAC,SAAS,CAAC,CAAC,CAAC;gBAC3E,OAAO,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,uBAAuB,EAAE;oBAC/D,KAAK,EAAE,WAAW,CAAC,KAAK;iBACxB,CAAC,CAAC;YACJ,CAAC;YAED;;;;;;;;;eASG;YACH,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM,EAAE,wBAAwB,EAAE,4BAA4B,GAAG,CAAC,EAAE,GACnE,WAAW,CAAC,YAAY,CAAC;gBAC1B,IACC,wBAAwB;oBACxB,4BAA4B,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EACpE,CAAC;oBACF,aAAa,CAAC,cAAc,CAAC;wBAC5B,SAAS,EAAE,6BAA6B;wBACxC,wBAAwB;wBACxB,4BAA4B;wBAC5B,mBAAmB,EAAE,IAAI,CAAC,aAAa,CAAC,mBAAmB;qBAC3D,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAED,0FAA0F;YAC1F,cAAc,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,GAAG,uBAAuB,EAAE,CAAC,CAAC;YACvE,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CACV,sBAAsB,EACtB,IAAA,oBAAS,EACR,KAAK,EACL,CAAC,OAAO,EAAE,EAAE,CACX,IAAI,0CAAqB,CAAC,OAAO,EAAE,IAAA,wCAA6B,EAAC,KAAK,CAAC,CAAC,CACzE,EACD,SAAS,CAAC,gBAAgB,EAC1B;gBACC,KAAK,EAAE,SAAS;aAChB,CACD,CAAC;QACH,CAAC;gBAAS,CAAC;YACV,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;YACpC,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;YAEnF,qBAAqB;YACrB,MAAM,mBAAmB,GAAG,MAAM,IAAA,8BAAS,EAC1C,OAAO,CAAC,aAAa,EAAE,EACvB,eAAe,EACf,iBAAiB,CACjB,CAAC;YACF,IAAI,mBAAmB,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAChD,MAAM,SAAS,GAAuB,YAAY,CAAC;gBACnD,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,0CAAqB,CAAC,IAAA,mCAAc,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,mBAAmB,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3C,6FAA6F;gBAC7F,qEAAqE;gBACrE,MAAM,SAAS,GAAuB,sBAAsB,CAAC;gBAC7D,OAAO,IAAI,CACV,SAAS,EACT,IAAI,0CAAqB,CAAC,IAAA,mCAAc,EAAC,SAAS,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,CAC/E,CAAC;YACH,CAAC;YACD,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,CAAC;YAE9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC;YAClF,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBAC3C,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE;aACxC,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,qBAAqB,GAAG,WAAW,CAAC,cAAc,CAAC;YAClF,aAAa,CAAC,kBAAkB,CAAC;gBAChC,SAAS,EAAE,cAAc;gBACzB,QAAQ,EAAE,iBAAiB;gBAC3B,uBAAuB,EAAE,WAAW,CAAC,uBAAuB;gBAC5D,qBAAqB,EAAE,WAAW,CAAC,cAAc;gBACjD,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM;aACnC,CAAC,CAAC;YAEH,oBAAoB;YACpB,MAAM,iBAAiB,GAAG,MAAM,IAAA,8BAAS,EACxC,OAAO,CAAC,WAAW,EAAE,EACrB,eAAe,EACf,iBAAiB,CACjB,CAAC;YACF,IAAI,iBAAiB,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAuB,YAAY,CAAC;gBACnD,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,0CAAqB,CAAC,IAAA,mCAAc,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9E,CAAC;YACD,IAAI,iBAAiB,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAuB,uBAAuB,CAAC;gBAC9D,8FAA8F;gBAC9F,qEAAqE;gBACrE,OAAO,IAAI,CACV,SAAS,EACT,IAAI,0CAAqB,CAAC,IAAA,mCAAc,EAAC,SAAS,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,CAC/E,CAAC;YACH,CAAC;YACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC;YAC1C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAE7B,6BAA6B;YAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC;YAEhF,wBAAwB;YACxB,uBAAuB,GAAG;gBACzB,eAAe,EAAE,eAAe;gBAChC,qBAAqB,EAAE,SAAS,CAAC,cAAc;gBAC/C,qBAAqB,EAAE,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,qBAAqB;gBAC/E,GAAG,uBAAuB;aAC1B,CAAC;YACF,IAAI,SAAS,CAAC,IAAI,KAAK,sBAAW,CAAC,UAAU,EAAE,CAAC;gBAC/C,IAAI,CAAC,aAAa,CAAC,2BAA2B,EAAE,CAAC;gBACjD,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,cAAc,CAAC,GAAG,CAAC;oBAClB,GAAG,uBAAuB;oBAC1B,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;iBACjC,CAAC,CAAC;gBACH,sGAAsG;gBACtG,6DAA6D;gBAC7D,MAAM,IAAI,CAAC,4BAA4B,CAAC;oBACvC,cAAc,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM;oBAC3C,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM;oBACpC,aAAa,EAAE,WAAW,CAAC,uBAAuB;oBAClD,aAAa;iBACb,CAAC,CAAC;gBACH,cAAc,CAAC,wBAAwB,CAAC,OAAO,CAAC;oBAC/C,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACL,YAAY,EAAE,SAAS;wBACvB,eAAe;qBACf;iBACD,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,gDAAgD;gBAChD,IAAA,iBAAM,EAAC,SAAS,CAAC,IAAI,KAAK,sBAAW,CAAC,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC7E,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC;gBACvC,MAAM,YAAY,GAAG,WAAW,EAAE,OAAO,CAAC;gBAC1C,MAAM,iBAAiB,GAAG,WAAW,EAAE,UAAU,CAAC;gBAElD,MAAM,SAAS,GAAuB,aAAa,CAAC;gBAEpD,6CAA6C;gBAC7C,MAAM,KAAK,GAAG,IAAI,0CAAqB,CAAC,IAAA,mCAAc,EAAC,SAAS,CAAC,EAAE,iBAAiB,EAAE;oBACrF,YAAY;iBACZ,CAAC,CAAC;gBAEH,IAAA,iBAAM,EACL,IAAA,wCAA6B,EAAC,KAAK,CAAC,KAAK,iBAAiB,EAC1D,KAAK,CAAC,yBAAyB,CAC/B,CAAC;gBACF,iGAAiG;gBACjG,OAAO,IAAI,CACV,SAAS,EACT,KAAK,EACL,EAAE,GAAG,uBAAuB,EAAE,cAAc,EAAE,iBAAiB,EAAE,EACjE,SAAS,CAAC,yBAAyB,EACnC,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,CAC7C,CAAC;YACH,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;IACF,CAAC;IAEO,8BAA8B,CACrC,WAAgC,EAChC,YAAuC;QAEvC,QAAQ,WAAW,CAAC,KAAK,EAAE,CAAC;YAC3B,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,OAAO,YAAY,CAAC;YACrB,CAAC;YAED,KAAK,UAAU,CAAC,CAAC,CAAC;gBACjB,OAAO;oBACN,GAAG,YAAY;oBACf,GAAG,WAAW,CAAC,YAAY;oBAC3B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;iBAC9C,CAAC;YACH,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACf,OAAO;oBACN,GAAG,YAAY;oBACf,GAAG,WAAW,CAAC,YAAY;oBAC3B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;oBAC9C,MAAM,EAAE,WAAW,CAAC,MAAM;oBAC1B,cAAc,EAAE,WAAW,CAAC,cAAc;iBAC1C,CAAC;YACH,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACf,OAAO;oBACN,GAAG,YAAY;oBACf,GAAG,WAAW,CAAC,YAAY;oBAC3B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;oBAC9C,MAAM,EAAE,WAAW,CAAC,MAAM;oBAC1B,cAAc,EAAE,WAAW,CAAC,cAAc;oBAC1C,oBAAoB,EAAE,WAAW,CAAC,oBAAoB;oBACtD,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB;oBACrD,wBAAwB,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY;oBACzD,6BAA6B,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB;oBAClE,0BAA0B,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa;iBAC5D,CAAC;YACH,CAAC;YAED,OAAO,CAAC,CAAC,CAAC;gBACT,IAAA,iBAAM,EAAC,IAAI,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACpD,CAAC;QACF,CAAC;QAED,OAAO,YAAY,CAAC;IACrB,CAAC;IAEO,qBAAqB,CAAC,IAAY,EAAE,KAAa;QACxD,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAChC,SAAS,EAAE,kBAAkB;YAC7B,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,IAAI,KAAK,GAAG,wBAAwB,EAAE,CAAC;YACtC,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,CACxC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAC/C,CAAC;QACH,CAAC;IACF,CAAC;IAEM,OAAO;QACb,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACD;AA7XD,4CA6XC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, IPromiseTimer, Timer } from \"@fluidframework/core-utils/internal\";\nimport { DriverErrorTypes, MessageType } from \"@fluidframework/driver-definitions/internal\";\nimport { getRetryDelaySecondsFromError } from \"@fluidframework/driver-utils/internal\";\nimport {\n\tisFluidError,\n\tITelemetryLoggerExt,\n\tPerformanceEvent,\n\twrapError,\n} from \"@fluidframework/telemetry-utils/internal\";\n\nimport type {\n\tIRefreshSummaryAckOptions,\n\tIRetriableFailureError,\n\tISubmitSummaryOptions,\n\tISummarizeHeuristicData,\n\tSubmitSummaryFailureData,\n\tSubmitSummaryResult,\n\tSummaryGeneratorTelemetry,\n} from \"../summarizerTypes.js\";\nimport {\n\tRetriableSummaryError,\n\tgetFailMessage,\n\traceTimer,\n\ttype SummarizeErrorCode,\n} from \"../summarizerUtils.js\";\nimport type { IClientSummaryWatcher } from \"../summaryCollection.js\";\n\nimport { SummarizeResultBuilder } from \"./summaryResultBuilder.js\";\nimport { type INackSummaryResult, type ISummarizeResults } from \"./summaryResultTypes.js\";\n\n// Send some telemetry if generate summary takes too long\nconst maxSummarizeTimeoutTime = 20000; // 20 sec\nconst maxSummarizeTimeoutCount = 5; // Double and resend 5 times\n\n/**\n * This class generates and tracks a summary attempt.\n */\nexport class SummaryGenerator {\n\tprivate readonly summarizeTimer: Timer;\n\tconstructor(\n\t\tprivate readonly pendingAckTimer: IPromiseTimer,\n\t\tprivate readonly heuristicData: ISummarizeHeuristicData,\n\t\tprivate readonly submitSummaryCallback: (\n\t\t\toptions: ISubmitSummaryOptions,\n\t\t) => Promise<SubmitSummaryResult>,\n\t\tprivate readonly successfulSummaryCallback: () => void,\n\t\tprivate readonly refreshLatestSummaryCallback: (\n\t\t\toptions: IRefreshSummaryAckOptions,\n\t\t) => Promise<void>,\n\t\tprivate readonly summaryWatcher: Pick<IClientSummaryWatcher, \"watchSummary\">,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.summarizeTimer = new Timer(maxSummarizeTimeoutTime, () =>\n\t\t\tthis.summarizeTimerHandler(maxSummarizeTimeoutTime, 1),\n\t\t);\n\t}\n\n\t/**\n\t * Generates summary and listens for broadcast and ack/nack.\n\t * Returns true for ack, false for nack, and undefined for failure or timeout.\n\t * @param summaryOptions - options controlling how the summary is generated or submitted.\n\t * @param resultsBuilder - optional, result builder to use to build pass or fail result.\n\t */\n\tpublic summarize(\n\t\tsummaryOptions: ISubmitSummaryOptions,\n\t\tresultsBuilder = new SummarizeResultBuilder(),\n\t): ISummarizeResults {\n\t\tthis.summarizeCore(summaryOptions, resultsBuilder).catch(\n\t\t\t(error: IRetriableFailureError) => {\n\t\t\t\tconst message = \"UnexpectedSummarizeError\";\n\t\t\t\tsummaryOptions.summaryLogger.sendErrorEvent({ eventName: message }, error);\n\t\t\t\tresultsBuilder.fail(message, error);\n\t\t\t},\n\t\t);\n\n\t\treturn resultsBuilder.build();\n\t}\n\n\tprivate async summarizeCore(\n\t\tsubmitSummaryOptions: ISubmitSummaryOptions,\n\t\tresultsBuilder: SummarizeResultBuilder,\n\t): Promise<void> {\n\t\tconst { summaryLogger, cancellationToken, ...summarizeOptions } = submitSummaryOptions;\n\n\t\t// Note: timeSinceLastAttempt and timeSinceLastSummary for the\n\t\t// first summary are basically the time since the summarizer was loaded.\n\t\tconst timeSinceLastAttempt = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\tconst timeSinceLastSummary =\n\t\t\tDate.now() - this.heuristicData.lastSuccessfulSummary.summaryTime;\n\t\tlet summarizeTelemetryProps: SummaryGeneratorTelemetry = {\n\t\t\t...summarizeOptions,\n\t\t\tfullTree: summarizeOptions.fullTree ?? false,\n\t\t\ttimeSinceLastAttempt,\n\t\t\ttimeSinceLastSummary,\n\t\t};\n\n\t\tconst summarizeEvent = PerformanceEvent.start(\n\t\t\tsummaryLogger,\n\t\t\t{\n\t\t\t\teventName: \"Summarize\",\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t},\n\t\t\t{ start: true, end: true, cancel: \"generic\" },\n\t\t);\n\n\t\tlet summaryData: SubmitSummaryResult | undefined;\n\n\t\t/**\n\t\t * Summarization can fail during submit, during op broadcast or during nack.\n\t\t * For submit failures, submitFailureResult should be provided. For nack failures, nackSummaryResult should\n\t\t * be provided. For op broadcast failures, only errors / properties should be provided.\n\t\t */\n\t\tconst fail = (\n\t\t\terrorCode: SummarizeErrorCode,\n\t\t\terror: IRetriableFailureError,\n\t\t\tproperties?: SummaryGeneratorTelemetry,\n\t\t\tsubmitFailureResult?: SubmitSummaryFailureData,\n\t\t\tnackSummaryResult?: INackSummaryResult,\n\t\t): void => {\n\t\t\t// Report any failure as an error unless it was due to cancellation (like \"disconnected\" error)\n\t\t\t// If failure happened on upload, we may not yet realized that socket disconnected, so check\n\t\t\t// offlineError too.\n\t\t\tconst category =\n\t\t\t\tcancellationToken.cancelled ||\n\t\t\t\t(isFluidError(error) && error?.errorType === DriverErrorTypes.offlineError)\n\t\t\t\t\t? \"generic\"\n\t\t\t\t\t: \"error\";\n\n\t\t\tconst reason = getFailMessage(errorCode);\n\t\t\tsummarizeEvent.cancel(\n\t\t\t\t{\n\t\t\t\t\t...properties,\n\t\t\t\t\treason,\n\t\t\t\t\tcategory,\n\t\t\t\t\tretryAfterSeconds: error.retryAfterSeconds,\n\t\t\t\t},\n\t\t\t\terror,\n\t\t\t); // disconnect & summaryAckTimeout do not have proper error.\n\n\t\t\tresultsBuilder.fail(reason, error, submitFailureResult, nackSummaryResult);\n\t\t};\n\n\t\t// Wait to generate and send summary\n\t\tthis.summarizeTimer.start();\n\t\ttry {\n\t\t\t// Need to save refSeqNum before we record new attempt (happens as part of submitSummaryCallback)\n\t\t\tconst lastAttemptRefSeqNum = this.heuristicData.lastAttempt.refSequenceNumber;\n\n\t\t\tsummaryData = await this.submitSummaryCallback(submitSummaryOptions);\n\n\t\t\t// Cumulatively add telemetry properties based on how far generateSummary went.\n\t\t\tconst referenceSequenceNumber = summaryData.referenceSequenceNumber;\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\treferenceSequenceNumber,\n\t\t\t\tminimumSequenceNumber: summaryData.minimumSequenceNumber,\n\t\t\t\topsSinceLastAttempt: referenceSequenceNumber - lastAttemptRefSeqNum,\n\t\t\t\topsSinceLastSummary:\n\t\t\t\t\treferenceSequenceNumber - this.heuristicData.lastSuccessfulSummary.refSequenceNumber,\n\t\t\t\tstage: summaryData.stage,\n\t\t\t};\n\t\t\tsummarizeTelemetryProps = this.addSummaryDataToTelemetryProps(\n\t\t\t\tsummaryData,\n\t\t\t\tsummarizeTelemetryProps,\n\t\t\t);\n\n\t\t\tif (summaryData.stage !== \"submit\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"submitSummaryFailure\";\n\t\t\t\tconst retriableError =\n\t\t\t\t\tsummaryData.error ?? new RetriableSummaryError(getFailMessage(errorCode));\n\t\t\t\treturn fail(errorCode, retriableError, summarizeTelemetryProps, {\n\t\t\t\t\tstage: summaryData.stage,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * With incremental summaries, if the full tree was not summarized, only data stores that changed should\n\t\t\t * be summarized. A data store is considered changed if either or both of the following is true:\n\t\t\t * - It has received an op.\n\t\t\t * - Its reference state changed, i.e., it went from referenced to unreferenced or vice-versa.\n\t\t\t *\n\t\t\t * In the extreme case, every op can be for a different data store and each op can result in the reference\n\t\t\t * state change of multiple data stores. So, the total number of data stores that are summarized should not\n\t\t\t * exceed the number of ops since last summary + number of data store whose reference state changed.\n\t\t\t */\n\t\t\tif (!submitSummaryOptions.fullTree) {\n\t\t\t\tconst { summarizedDataStoreCount, gcStateUpdatedDataStoreCount = 0 } =\n\t\t\t\t\tsummaryData.summaryStats;\n\t\t\t\tif (\n\t\t\t\t\tsummarizedDataStoreCount >\n\t\t\t\t\tgcStateUpdatedDataStoreCount + this.heuristicData.opsSinceLastSummary\n\t\t\t\t) {\n\t\t\t\t\tsummaryLogger.sendErrorEvent({\n\t\t\t\t\t\teventName: \"IncrementalSummaryViolation\",\n\t\t\t\t\t\tsummarizedDataStoreCount,\n\t\t\t\t\t\tgcStateUpdatedDataStoreCount,\n\t\t\t\t\t\topsSinceLastSummary: this.heuristicData.opsSinceLastSummary,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Log event here on summary success only, as Summarize_cancel duplicates failure logging.\n\t\t\tsummarizeEvent.reportEvent(\"generate\", { ...summarizeTelemetryProps });\n\t\t\tresultsBuilder.summarySubmitted.resolve({ success: true, data: summaryData });\n\t\t} catch (error) {\n\t\t\treturn fail(\n\t\t\t\t\"submitSummaryFailure\",\n\t\t\t\twrapError(\n\t\t\t\t\terror,\n\t\t\t\t\t(message) =>\n\t\t\t\t\t\tnew RetriableSummaryError(message, getRetryDelaySecondsFromError(error)),\n\t\t\t\t),\n\t\t\t\tundefined /* properties */,\n\t\t\t\t{\n\t\t\t\t\tstage: \"unknown\",\n\t\t\t\t},\n\t\t\t);\n\t\t} finally {\n\t\t\tif (summaryData === undefined) {\n\t\t\t\tthis.heuristicData.recordAttempt();\n\t\t\t}\n\t\t\tthis.summarizeTimer.clear();\n\t\t}\n\n\t\ttry {\n\t\t\tconst pendingTimeoutP = this.pendingAckTimer.start();\n\t\t\tconst summary = this.summaryWatcher.watchSummary(summaryData.clientSequenceNumber);\n\n\t\t\t// Wait for broadcast\n\t\t\tconst waitBroadcastResult = await raceTimer(\n\t\t\t\tsummary.waitBroadcast(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitBroadcastResult.result === \"cancelled\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"disconnect\";\n\t\t\t\treturn fail(errorCode, new RetriableSummaryError(getFailMessage(errorCode)));\n\t\t\t}\n\t\t\tif (waitBroadcastResult.result !== \"done\") {\n\t\t\t\t// The summary op may not have been received within the timeout due to a transient error. So,\n\t\t\t\t// fail with a retriable error to re-attempt the summary if possible.\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryOpWaitTimeout\";\n\t\t\t\treturn fail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\tnew RetriableSummaryError(getFailMessage(errorCode), 0 /* retryAfterSeconds */),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst summarizeOp = waitBroadcastResult.value;\n\n\t\t\tconst broadcastDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\t\t\tresultsBuilder.summaryOpBroadcasted.resolve({\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: { summarizeOp, broadcastDuration },\n\t\t\t});\n\n\t\t\tthis.heuristicData.lastAttempt.summarySequenceNumber = summarizeOp.sequenceNumber;\n\t\t\tsummaryLogger.sendTelemetryEvent({\n\t\t\t\teventName: \"Summarize_Op\",\n\t\t\t\tduration: broadcastDuration,\n\t\t\t\treferenceSequenceNumber: summarizeOp.referenceSequenceNumber,\n\t\t\t\tsummarySequenceNumber: summarizeOp.sequenceNumber,\n\t\t\t\thandle: summarizeOp.contents.handle,\n\t\t\t});\n\n\t\t\t// Wait for ack/nack\n\t\t\tconst waitAckNackResult = await raceTimer(\n\t\t\t\tsummary.waitAckNack(),\n\t\t\t\tpendingTimeoutP,\n\t\t\t\tcancellationToken,\n\t\t\t);\n\t\t\tif (waitAckNackResult.result === \"cancelled\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"disconnect\";\n\t\t\t\treturn fail(errorCode, new RetriableSummaryError(getFailMessage(errorCode)));\n\t\t\t}\n\t\t\tif (waitAckNackResult.result !== \"done\") {\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryAckWaitTimeout\";\n\t\t\t\t// The summary ack may not have been received within the timeout due to a transient error. So,\n\t\t\t\t// fail with a retriable error to re-attempt the summary if possible.\n\t\t\t\treturn fail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\tnew RetriableSummaryError(getFailMessage(errorCode), 0 /* retryAfterSeconds */),\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst ackNackOp = waitAckNackResult.value;\n\t\t\tthis.pendingAckTimer.clear();\n\n\t\t\t// Update for success/failure\n\t\t\tconst ackNackDuration = Date.now() - this.heuristicData.lastAttempt.summaryTime;\n\n\t\t\t// adding new properties\n\t\t\tsummarizeTelemetryProps = {\n\t\t\t\tackWaitDuration: ackNackDuration,\n\t\t\t\tackNackSequenceNumber: ackNackOp.sequenceNumber,\n\t\t\t\tsummarySequenceNumber: ackNackOp.contents.summaryProposal.summarySequenceNumber,\n\t\t\t\t...summarizeTelemetryProps,\n\t\t\t};\n\t\t\tif (ackNackOp.type === MessageType.SummaryAck) {\n\t\t\t\tthis.heuristicData.markLastAttemptAsSuccessful();\n\t\t\t\tthis.successfulSummaryCallback();\n\t\t\t\tsummarizeEvent.end({\n\t\t\t\t\t...summarizeTelemetryProps,\n\t\t\t\t\thandle: ackNackOp.contents.handle,\n\t\t\t\t});\n\t\t\t\t// This processes the summary ack of the successful summary. This is so that the next summary does not\n\t\t\t\t// start before the ack of the previous summary is processed.\n\t\t\t\tawait this.refreshLatestSummaryCallback({\n\t\t\t\t\tproposalHandle: summarizeOp.contents.handle,\n\t\t\t\t\tackHandle: ackNackOp.contents.handle,\n\t\t\t\t\tsummaryRefSeq: summarizeOp.referenceSequenceNumber,\n\t\t\t\t\tsummaryLogger,\n\t\t\t\t});\n\t\t\t\tresultsBuilder.receivedSummaryAckOrNack.resolve({\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsummaryAckOp: ackNackOp,\n\t\t\t\t\t\tackNackDuration,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Check for retryDelay in summaryNack response.\n\t\t\t\tassert(ackNackOp.type === MessageType.SummaryNack, 0x274 /* \"type check\" */);\n\t\t\t\tconst summaryNack = ackNackOp.contents;\n\t\t\t\tconst errorMessage = summaryNack?.message;\n\t\t\t\tconst retryAfterSeconds = summaryNack?.retryAfter;\n\n\t\t\t\tconst errorCode: SummarizeErrorCode = \"summaryNack\";\n\n\t\t\t\t// pre-0.58 error message prefix: summaryNack\n\t\t\t\tconst error = new RetriableSummaryError(getFailMessage(errorCode), retryAfterSeconds, {\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\n\t\t\t\tassert(\n\t\t\t\t\tgetRetryDelaySecondsFromError(error) === retryAfterSeconds,\n\t\t\t\t\t0x25f /* \"retryAfterSeconds\" */,\n\t\t\t\t);\n\t\t\t\t// This will only set resultsBuilder.receivedSummaryAckOrNack, as other promises are already set.\n\t\t\t\treturn fail(\n\t\t\t\t\terrorCode,\n\t\t\t\t\terror,\n\t\t\t\t\t{ ...summarizeTelemetryProps, nackRetryAfter: retryAfterSeconds },\n\t\t\t\t\tundefined /* submitFailureResult */,\n\t\t\t\t\t{ summaryNackOp: ackNackOp, ackNackDuration },\n\t\t\t\t);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.pendingAckTimer.clear();\n\t\t}\n\t}\n\n\tprivate addSummaryDataToTelemetryProps(\n\t\tsummaryData: SubmitSummaryResult,\n\t\tinitialProps: SummaryGeneratorTelemetry,\n\t): SummaryGeneratorTelemetry {\n\t\tswitch (summaryData.stage) {\n\t\t\tcase \"base\": {\n\t\t\t\treturn initialProps;\n\t\t\t}\n\n\t\t\tcase \"generate\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"upload\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"submit\": {\n\t\t\t\treturn {\n\t\t\t\t\t...initialProps,\n\t\t\t\t\t...summaryData.summaryStats,\n\t\t\t\t\tgenerateDuration: summaryData.generateDuration,\n\t\t\t\t\thandle: summaryData.handle,\n\t\t\t\t\tuploadDuration: summaryData.uploadDuration,\n\t\t\t\t\tclientSequenceNumber: summaryData.clientSequenceNumber,\n\t\t\t\t\thasMissingOpData: this.heuristicData.hasMissingOpData,\n\t\t\t\t\topsSizesSinceLastSummary: this.heuristicData.totalOpsSize,\n\t\t\t\t\tnonRuntimeOpsSinceLastSummary: this.heuristicData.numNonRuntimeOps,\n\t\t\t\t\truntimeOpsSinceLastSummary: this.heuristicData.numRuntimeOps,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tassert(true, 0x397 /* Unexpected summary stage */);\n\t\t\t}\n\t\t}\n\n\t\treturn initialProps;\n\t}\n\n\tprivate summarizeTimerHandler(time: number, count: number): void {\n\t\tthis.logger.sendPerformanceEvent({\n\t\t\teventName: \"SummarizeTimeout\",\n\t\t\ttimeoutTime: time,\n\t\t\ttimeoutCount: count,\n\t\t});\n\t\tif (count < maxSummarizeTimeoutCount) {\n\t\t\t// Double and start a new timer\n\t\t\tconst nextTime = time * 2;\n\t\t\tthis.summarizeTimer.start(nextTime, () =>\n\t\t\t\tthis.summarizeTimerHandler(nextTime, count + 1),\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.summarizeTimer.clear();\n\t}\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { Deferred } from "@fluidframework/core-utils/internal";
|
|
6
|
+
import { SubmitSummaryFailureData, SubmitSummaryResult, SummarizeResultPart, type IRetriableFailureError } from "../index.js";
|
|
7
|
+
import type { IAckSummaryResult, IBroadcastSummaryResult, INackSummaryResult, ISummarizeResults } from "./summaryResultTypes.js";
|
|
8
|
+
export declare class SummarizeResultBuilder {
|
|
9
|
+
readonly summarySubmitted: Deferred<SummarizeResultPart<SubmitSummaryResult, SubmitSummaryFailureData>>;
|
|
10
|
+
readonly summaryOpBroadcasted: Deferred<SummarizeResultPart<IBroadcastSummaryResult>>;
|
|
11
|
+
readonly receivedSummaryAckOrNack: Deferred<SummarizeResultPart<IAckSummaryResult, INackSummaryResult>>;
|
|
12
|
+
/**
|
|
13
|
+
* Fails one or more of the three results as per the passed params.
|
|
14
|
+
* If submit fails, all three results fail.
|
|
15
|
+
* If op broadcast fails, only op broadcast result and ack nack result fails.
|
|
16
|
+
* If ack nack fails, only ack nack result fails.
|
|
17
|
+
*/
|
|
18
|
+
fail(message: string, error: IRetriableFailureError, submitFailureResult?: SubmitSummaryFailureData, nackSummaryResult?: INackSummaryResult): void;
|
|
19
|
+
build(): ISummarizeResults;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=summaryResultBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaryResultBuilder.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryResultBuilder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAU,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EACN,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EACX,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,sBAAsB;IAClC,SAAgB,gBAAgB,+EAE5B;IACJ,SAAgB,oBAAoB,yDAEhC;IACJ,SAAgB,wBAAwB,uEAEpC;IAEJ;;;;;OAKG;IACI,IAAI,CACV,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,sBAAsB,EAC7B,mBAAmB,CAAC,EAAE,wBAAwB,EAC9C,iBAAiB,CAAC,EAAE,kBAAkB,GACpC,IAAI;IAmBA,KAAK,IAAI,iBAAiB;CAOjC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.SummarizeResultBuilder = void 0;
|
|
8
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
|
+
class SummarizeResultBuilder {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.summarySubmitted = new internal_1.Deferred();
|
|
12
|
+
this.summaryOpBroadcasted = new internal_1.Deferred();
|
|
13
|
+
this.receivedSummaryAckOrNack = new internal_1.Deferred();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Fails one or more of the three results as per the passed params.
|
|
17
|
+
* If submit fails, all three results fail.
|
|
18
|
+
* If op broadcast fails, only op broadcast result and ack nack result fails.
|
|
19
|
+
* If ack nack fails, only ack nack result fails.
|
|
20
|
+
*/
|
|
21
|
+
fail(message, error, submitFailureResult, nackSummaryResult) {
|
|
22
|
+
(0, internal_1.assert)(!this.receivedSummaryAckOrNack.isCompleted, 0x25e /* "no reason to call fail if all promises have been completed" */);
|
|
23
|
+
const result = {
|
|
24
|
+
success: false,
|
|
25
|
+
message,
|
|
26
|
+
data: undefined,
|
|
27
|
+
error,
|
|
28
|
+
};
|
|
29
|
+
// Note that if any of these are already resolved, it will be a no-op. For example, if ack nack failed but
|
|
30
|
+
// submit summary and op broadcast has already been resolved as passed, only ack nack result will get modified.
|
|
31
|
+
this.summarySubmitted.resolve({ ...result, data: submitFailureResult });
|
|
32
|
+
this.summaryOpBroadcasted.resolve(result);
|
|
33
|
+
this.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });
|
|
34
|
+
}
|
|
35
|
+
build() {
|
|
36
|
+
return {
|
|
37
|
+
summarySubmitted: this.summarySubmitted.promise,
|
|
38
|
+
summaryOpBroadcasted: this.summaryOpBroadcasted.promise,
|
|
39
|
+
receivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.SummarizeResultBuilder = SummarizeResultBuilder;
|
|
44
|
+
//# sourceMappingURL=summaryResultBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaryResultBuilder.js","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryResultBuilder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,kEAAuE;AAgBvE,MAAa,sBAAsB;IAAnC;QACiB,qBAAgB,GAAG,IAAI,mBAAQ,EAE5C,CAAC;QACY,yBAAoB,GAAG,IAAI,mBAAQ,EAEhD,CAAC;QACY,6BAAwB,GAAG,IAAI,mBAAQ,EAEpD,CAAC;IAuCL,CAAC;IArCA;;;;;OAKG;IACI,IAAI,CACV,OAAe,EACf,KAA6B,EAC7B,mBAA8C,EAC9C,iBAAsC;QAEtC,IAAA,iBAAM,EACL,CAAC,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAC1C,KAAK,CAAC,kEAAkE,CACxE,CAAC;QAEF,MAAM,MAAM,GAAmC;YAC9C,OAAO,EAAE,KAAK;YACd,OAAO;YACP,IAAI,EAAE,SAAS;YACf,KAAK;SACI,CAAC;QAEX,0GAA0G;QAC1G,+GAA+G;QAC/G,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC/E,CAAC;IACM,KAAK;QACX,OAAO;YACN,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO;YAC/C,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,CAAC,OAAO;YACvD,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,CAAC,OAAO;SACtD,CAAC;IACZ,CAAC;CACD;AAhDD,wDAgDC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, Deferred } from \"@fluidframework/core-utils/internal\";\n\nimport {\n\tSubmitSummaryFailureData,\n\tSubmitSummaryResult,\n\tSummarizeResultPart,\n\ttype IRetriableFailureError,\n} from \"../index.js\";\n\nimport type {\n\tIAckSummaryResult,\n\tIBroadcastSummaryResult,\n\tINackSummaryResult,\n\tISummarizeResults,\n} from \"./summaryResultTypes.js\";\n\nexport class SummarizeResultBuilder {\n\tpublic readonly summarySubmitted = new Deferred<\n\t\tSummarizeResultPart<SubmitSummaryResult, SubmitSummaryFailureData>\n\t>();\n\tpublic readonly summaryOpBroadcasted = new Deferred<\n\t\tSummarizeResultPart<IBroadcastSummaryResult>\n\t>();\n\tpublic readonly receivedSummaryAckOrNack = new Deferred<\n\t\tSummarizeResultPart<IAckSummaryResult, INackSummaryResult>\n\t>();\n\n\t/**\n\t * Fails one or more of the three results as per the passed params.\n\t * If submit fails, all three results fail.\n\t * If op broadcast fails, only op broadcast result and ack nack result fails.\n\t * If ack nack fails, only ack nack result fails.\n\t */\n\tpublic fail(\n\t\tmessage: string,\n\t\terror: IRetriableFailureError,\n\t\tsubmitFailureResult?: SubmitSummaryFailureData,\n\t\tnackSummaryResult?: INackSummaryResult,\n\t): void {\n\t\tassert(\n\t\t\t!this.receivedSummaryAckOrNack.isCompleted,\n\t\t\t0x25e /* \"no reason to call fail if all promises have been completed\" */,\n\t\t);\n\n\t\tconst result: SummarizeResultPart<undefined> = {\n\t\t\tsuccess: false,\n\t\t\tmessage,\n\t\t\tdata: undefined,\n\t\t\terror,\n\t\t} as const;\n\n\t\t// Note that if any of these are already resolved, it will be a no-op. For example, if ack nack failed but\n\t\t// submit summary and op broadcast has already been resolved as passed, only ack nack result will get modified.\n\t\tthis.summarySubmitted.resolve({ ...result, data: submitFailureResult });\n\t\tthis.summaryOpBroadcasted.resolve(result);\n\t\tthis.receivedSummaryAckOrNack.resolve({ ...result, data: nackSummaryResult });\n\t}\n\tpublic build(): ISummarizeResults {\n\t\treturn {\n\t\t\tsummarySubmitted: this.summarySubmitted.promise,\n\t\t\tsummaryOpBroadcasted: this.summaryOpBroadcasted.promise,\n\t\t\treceivedSummaryAckOrNack: this.receivedSummaryAckOrNack.promise,\n\t\t} as const;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import type { SubmitSummaryFailureData, SubmitSummaryResult, SummarizeResultPart } from "../summarizerTypes.js";
|
|
6
|
+
import type { ISummaryAckMessage, ISummaryNackMessage, ISummaryOpMessage } from "../summaryCollection.js";
|
|
7
|
+
/**
|
|
8
|
+
* @legacy
|
|
9
|
+
* @alpha
|
|
10
|
+
*/
|
|
11
|
+
export interface IBroadcastSummaryResult {
|
|
12
|
+
readonly summarizeOp: ISummaryOpMessage;
|
|
13
|
+
readonly broadcastDuration: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* @legacy
|
|
17
|
+
* @alpha
|
|
18
|
+
*/
|
|
19
|
+
export interface IAckSummaryResult {
|
|
20
|
+
readonly summaryAckOp: ISummaryAckMessage;
|
|
21
|
+
readonly ackNackDuration: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @legacy
|
|
25
|
+
* @alpha
|
|
26
|
+
*/
|
|
27
|
+
export interface INackSummaryResult {
|
|
28
|
+
readonly summaryNackOp: ISummaryNackMessage;
|
|
29
|
+
readonly ackNackDuration: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @legacy
|
|
33
|
+
* @alpha
|
|
34
|
+
*/
|
|
35
|
+
export interface ISummarizeResults {
|
|
36
|
+
/**
|
|
37
|
+
* Resolves when we generate, upload, and submit the summary.
|
|
38
|
+
*/
|
|
39
|
+
readonly summarySubmitted: Promise<SummarizeResultPart<SubmitSummaryResult, SubmitSummaryFailureData>>;
|
|
40
|
+
/**
|
|
41
|
+
* Resolves when we observe our summarize op broadcast.
|
|
42
|
+
*/
|
|
43
|
+
readonly summaryOpBroadcasted: Promise<SummarizeResultPart<IBroadcastSummaryResult>>;
|
|
44
|
+
/**
|
|
45
|
+
* Resolves when we receive a summaryAck or summaryNack.
|
|
46
|
+
*/
|
|
47
|
+
readonly receivedSummaryAckOrNack: Promise<SummarizeResultPart<IAckSummaryResult, INackSummaryResult>>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* @legacy
|
|
51
|
+
* @alpha
|
|
52
|
+
*/
|
|
53
|
+
export type EnqueueSummarizeResult = (ISummarizeResults & {
|
|
54
|
+
/**
|
|
55
|
+
* Indicates that another summarize attempt is not already enqueued,
|
|
56
|
+
* and this attempt has been enqueued.
|
|
57
|
+
*/
|
|
58
|
+
readonly alreadyEnqueued?: undefined;
|
|
59
|
+
}) | (ISummarizeResults & {
|
|
60
|
+
/**
|
|
61
|
+
* Indicates that another summarize attempt was already enqueued.
|
|
62
|
+
*/
|
|
63
|
+
readonly alreadyEnqueued: true;
|
|
64
|
+
/**
|
|
65
|
+
* Indicates that the other enqueued summarize attempt was abandoned,
|
|
66
|
+
* and this attempt has been enqueued enqueued.
|
|
67
|
+
*/
|
|
68
|
+
readonly overridden: true;
|
|
69
|
+
}) | {
|
|
70
|
+
/**
|
|
71
|
+
* Indicates that another summarize attempt was already enqueued.
|
|
72
|
+
*/
|
|
73
|
+
readonly alreadyEnqueued: true;
|
|
74
|
+
/**
|
|
75
|
+
* Indicates that the other enqueued summarize attempt remains enqueued,
|
|
76
|
+
* and this attempt has not been enqueued.
|
|
77
|
+
*/
|
|
78
|
+
readonly overridden?: undefined;
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=summaryResultTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summaryResultTypes.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryDelayLoadedModule/summaryResultTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACX,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACX,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,MAAM,yBAAyB,CAAC;AAEjC;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC;;OAEG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CACjC,mBAAmB,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAClE,CAAC;IACF;;OAEG;IACH,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACrF;;OAEG;IACH,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CACzC,mBAAmB,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAC1D,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAC/B,CAAC,iBAAiB,GAAG;IACrB;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC;CACpC,CAAC,GACF,CAAC,iBAAiB,GAAG;IACrB;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;CACzB,CAAC,GACF;IACA;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC;CAC/B,CAAC"}
|