@fluidframework/container-runtime 2.23.0 → 2.31.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 +593 -537
- package/api-report/container-runtime.legacy.alpha.api.md +0 -246
- package/dist/blobManager/blobManager.d.ts +11 -9
- package/dist/blobManager/blobManager.d.ts.map +1 -1
- package/dist/blobManager/blobManager.js +38 -39
- package/dist/blobManager/blobManager.js.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.d.ts +2 -4
- package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.js +6 -6
- package/dist/blobManager/blobManagerSnapSum.js.map +1 -1
- package/dist/channelCollection.d.ts +1 -7
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +2 -27
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +0 -43
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +40 -145
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +149 -364
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +6 -14
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +14 -26
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +2 -20
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +0 -2
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +8 -24
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +1 -3
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +1 -4
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +0 -1
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +6 -18
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +0 -29
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +16 -5
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +12 -3
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +41 -21
- package/dist/opLifecycle/outbox.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 +1 -0
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +12 -2
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/runCounter.d.ts +11 -0
- package/dist/runCounter.d.ts.map +1 -0
- package/dist/runCounter.js +43 -0
- package/dist/runCounter.js.map +1 -0
- package/dist/runtimeLayerCompatState.d.ts +51 -0
- package/dist/runtimeLayerCompatState.d.ts.map +1 -0
- package/dist/runtimeLayerCompatState.js +123 -0
- package/dist/runtimeLayerCompatState.js.map +1 -0
- package/dist/signalTelemetryProcessing.d.ts +33 -0
- package/dist/signalTelemetryProcessing.d.ts.map +1 -0
- package/dist/signalTelemetryProcessing.js +149 -0
- package/dist/signalTelemetryProcessing.js.map +1 -0
- package/dist/summary/documentSchema.d.ts +7 -31
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +2 -18
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +7 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +1 -3
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -3
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +2 -7
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +1 -2
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +4 -23
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +2 -5
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +3 -11
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js +0 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +4 -4
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -18
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +0 -27
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -2
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +109 -22
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +3 -9
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +3 -9
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryHelpers.d.ts +19 -0
- package/dist/summary/summaryHelpers.d.ts.map +1 -0
- package/dist/summary/summaryHelpers.js +90 -0
- package/dist/summary/summaryHelpers.js.map +1 -0
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +0 -2
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/blobManager/blobManager.d.ts +11 -9
- package/lib/blobManager/blobManager.d.ts.map +1 -1
- package/lib/blobManager/blobManager.js +37 -37
- package/lib/blobManager/blobManager.js.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.d.ts +2 -4
- package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.js +6 -6
- package/lib/blobManager/blobManagerSnapSum.js.map +1 -1
- package/lib/channelCollection.d.ts +1 -7
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +3 -30
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +0 -43
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +40 -145
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +151 -372
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +6 -14
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +14 -26
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +3 -23
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +0 -2
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +8 -24
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +1 -3
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +1 -4
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +0 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +7 -21
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +0 -29
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +16 -5
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +12 -3
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +43 -23
- package/lib/opLifecycle/outbox.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 +1 -0
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +12 -2
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/runCounter.d.ts +11 -0
- package/lib/runCounter.d.ts.map +1 -0
- package/lib/runCounter.js +39 -0
- package/lib/runCounter.js.map +1 -0
- package/lib/runtimeLayerCompatState.d.ts +51 -0
- package/lib/runtimeLayerCompatState.d.ts.map +1 -0
- package/lib/runtimeLayerCompatState.js +118 -0
- package/lib/runtimeLayerCompatState.js.map +1 -0
- package/lib/signalTelemetryProcessing.d.ts +33 -0
- package/lib/signalTelemetryProcessing.d.ts.map +1 -0
- package/lib/signalTelemetryProcessing.js +145 -0
- package/lib/signalTelemetryProcessing.js.map +1 -0
- package/lib/summary/documentSchema.d.ts +7 -31
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +2 -18
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/index.d.ts +2 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -0
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +1 -3
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -3
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +2 -7
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +1 -2
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +4 -23
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +2 -5
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -11
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js +0 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +5 -5
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -18
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -25
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -2
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +109 -22
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +3 -9
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +3 -9
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryHelpers.d.ts +19 -0
- package/lib/summary/summaryHelpers.d.ts.map +1 -0
- package/lib/summary/summaryHelpers.js +84 -0
- package/lib/summary/summaryHelpers.js.map +1 -0
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +0 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +20 -23
- package/src/blobManager/blobManager.ts +70 -62
- package/src/blobManager/blobManagerSnapSum.ts +7 -9
- package/src/channelCollection.ts +4 -32
- package/src/connectionTelemetry.ts +0 -51
- package/src/containerRuntime.ts +259 -622
- package/src/dataStoreContext.ts +24 -33
- package/src/gc/{garbageCollection.md → README.md} +17 -19
- package/src/gc/garbageCollection.ts +9 -26
- package/src/gc/gcConfigs.ts +3 -6
- package/src/gc/gcDefinitions.ts +10 -28
- package/src/gc/gcHelpers.ts +0 -5
- package/src/gc/gcSummaryStateTracker.ts +1 -2
- package/src/gc/gcTelemetry.ts +8 -15
- package/src/index.ts +6 -6
- package/src/messageTypes.ts +0 -2
- package/src/opLifecycle/batchManager.ts +20 -6
- package/src/opLifecycle/outbox.ts +64 -24
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +18 -2
- package/src/runCounter.ts +25 -0
- package/src/runtimeLayerCompatState.ts +143 -0
- package/src/signalTelemetryProcessing.ts +233 -0
- package/src/summary/documentSchema.ts +7 -38
- package/src/summary/index.ts +12 -0
- package/src/summary/orderedClientElection.ts +1 -3
- package/src/summary/runWhileConnectedCoordinator.ts +3 -8
- package/src/summary/runningSummarizer.ts +12 -20
- package/src/summary/summarizer.ts +6 -18
- package/src/summary/summarizerClientElection.ts +0 -2
- package/src/summary/summarizerHeuristics.ts +1 -2
- package/src/summary/summarizerNode/summarizerNode.ts +6 -5
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -27
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +2 -3
- package/src/summary/summarizerTypes.ts +119 -23
- package/src/summary/summaryFormat.ts +4 -13
- package/src/summary/summaryGenerator.ts +1 -8
- package/src/summary/summaryHelpers.ts +118 -0
- package/src/summary/summaryManager.ts +0 -2
- package/tsconfig.json +1 -0
- package/dist/layerCompatState.d.ts +0 -19
- package/dist/layerCompatState.d.ts.map +0 -1
- package/dist/layerCompatState.js +0 -64
- package/dist/layerCompatState.js.map +0 -1
- package/lib/layerCompatState.d.ts +0 -19
- package/lib/layerCompatState.d.ts.map +0 -1
- package/lib/layerCompatState.js +0 -60
- package/lib/layerCompatState.js.map +0 -1
- package/prettier.config.cjs +0 -8
- package/src/layerCompatState.ts +0 -75
package/dist/containerRuntime.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ContainerRuntime = exports.loadContainerRuntime = exports.getSingleUseLegacyLogCallback = exports.makeLegacySendBatchFn = exports.getDeviceSpec = exports.agentSchedulerId = exports.isUnpackedRuntimeMessage = exports.defaultPendingOpsRetryDelayMs = exports.defaultPendingOpsWaitTimeoutMs = exports.disabledCompressionConfig = exports.CompressionAlgorithms = exports.defaultRuntimeHeaderData = exports.InactiveResponseHeaderKey = exports.TombstoneResponseHeaderKey = exports.DeletedResponseHeaderKey =
|
|
7
|
+
exports.createNewSignalEnvelope = exports.ContainerRuntime = exports.loadContainerRuntime = exports.getSingleUseLegacyLogCallback = exports.makeLegacySendBatchFn = exports.getDeviceSpec = exports.agentSchedulerId = exports.isUnpackedRuntimeMessage = exports.defaultPendingOpsRetryDelayMs = exports.defaultPendingOpsWaitTimeoutMs = exports.disabledCompressionConfig = exports.CompressionAlgorithms = exports.defaultRuntimeHeaderData = exports.InactiveResponseHeaderKey = exports.TombstoneResponseHeaderKey = exports.DeletedResponseHeaderKey = void 0;
|
|
8
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
9
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
10
10
|
const internal_1 = require("@fluidframework/container-definitions/internal");
|
|
@@ -27,11 +27,13 @@ const deltaManagerProxies_js_1 = require("./deltaManagerProxies.js");
|
|
|
27
27
|
const deltaScheduler_js_1 = require("./deltaScheduler.js");
|
|
28
28
|
const index_js_2 = require("./gc/index.js");
|
|
29
29
|
const inboundBatchAggregator_js_1 = require("./inboundBatchAggregator.js");
|
|
30
|
-
const layerCompatState_js_1 = require("./layerCompatState.js");
|
|
31
30
|
const messageTypes_js_1 = require("./messageTypes.js");
|
|
32
31
|
const index_js_3 = require("./opLifecycle/index.js");
|
|
33
32
|
const packageVersion_js_1 = require("./packageVersion.js");
|
|
34
33
|
const pendingStateManager_js_1 = require("./pendingStateManager.js");
|
|
34
|
+
const runCounter_js_1 = require("./runCounter.js");
|
|
35
|
+
const runtimeLayerCompatState_js_1 = require("./runtimeLayerCompatState.js");
|
|
36
|
+
const signalTelemetryProcessing_js_1 = require("./signalTelemetryProcessing.js");
|
|
35
37
|
const index_js_4 = require("./summary/index.js");
|
|
36
38
|
const throttler_js_1 = require("./throttler.js");
|
|
37
39
|
/**
|
|
@@ -53,33 +55,9 @@ function getUnknownMessageTypeError(unknownContainerRuntimeMessageType, codePath
|
|
|
53
55
|
},
|
|
54
56
|
});
|
|
55
57
|
}
|
|
56
|
-
function isSummariesDisabled(config) {
|
|
57
|
-
return config.state === "disabled";
|
|
58
|
-
}
|
|
59
|
-
exports.isSummariesDisabled = isSummariesDisabled;
|
|
60
|
-
/**
|
|
61
|
-
* @legacy
|
|
62
|
-
* @alpha
|
|
63
|
-
*/
|
|
64
|
-
exports.DefaultSummaryConfiguration = {
|
|
65
|
-
state: "enabled",
|
|
66
|
-
minIdleTime: 0,
|
|
67
|
-
maxIdleTime: 30 * 1000, // 30 secs.
|
|
68
|
-
maxTime: 60 * 1000, // 1 min.
|
|
69
|
-
maxOps: 100, // Summarize if 100 weighted ops received since last snapshot.
|
|
70
|
-
minOpsForLastSummaryAttempt: 10,
|
|
71
|
-
maxAckWaitTime: 3 * 60 * 1000, // 3 mins.
|
|
72
|
-
maxOpsSinceLastSummary: 7000,
|
|
73
|
-
initialSummarizerDelayMs: 5 * 1000, // 5 secs.
|
|
74
|
-
nonRuntimeOpWeight: 0.1,
|
|
75
|
-
runtimeOpWeight: 1,
|
|
76
|
-
nonRuntimeHeuristicThreshold: 20,
|
|
77
|
-
};
|
|
78
58
|
/**
|
|
79
59
|
* Error responses when requesting a deleted object will have this header set to true
|
|
80
|
-
* @
|
|
81
|
-
* @alpha
|
|
82
|
-
* @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
|
|
60
|
+
* @internal
|
|
83
61
|
*/
|
|
84
62
|
exports.DeletedResponseHeaderKey = "wasDeleted";
|
|
85
63
|
/**
|
|
@@ -198,55 +176,13 @@ const makeLegacySendBatchFn = (submitFn, deltaManager) => (batch) => {
|
|
|
198
176
|
return clientSequenceNumber;
|
|
199
177
|
};
|
|
200
178
|
exports.makeLegacySendBatchFn = makeLegacySendBatchFn;
|
|
201
|
-
const summarizerRequestUrl = "_summarizer";
|
|
202
|
-
/**
|
|
203
|
-
* Create and retrieve the summmarizer
|
|
204
|
-
*/
|
|
205
|
-
async function createSummarizer(loader, url) {
|
|
206
|
-
const request = {
|
|
207
|
-
headers: {
|
|
208
|
-
[internal_1.LoaderHeader.cache]: false,
|
|
209
|
-
[internal_1.LoaderHeader.clientDetails]: {
|
|
210
|
-
capabilities: { interactive: false },
|
|
211
|
-
type: index_js_4.summarizerClientType,
|
|
212
|
-
},
|
|
213
|
-
[internal_3.DriverHeader.summarizingClient]: true,
|
|
214
|
-
[internal_1.LoaderHeader.reconnect]: false,
|
|
215
|
-
},
|
|
216
|
-
url,
|
|
217
|
-
};
|
|
218
|
-
const resolvedContainer = await loader.resolve(request);
|
|
219
|
-
let fluidObject;
|
|
220
|
-
// Older containers may not have the "getEntryPoint" API
|
|
221
|
-
// ! This check will need to stay until LTS of loader moves past 2.0.0-internal.7.0.0
|
|
222
|
-
if (resolvedContainer.getEntryPoint === undefined) {
|
|
223
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-explicit-any
|
|
224
|
-
const response = (await resolvedContainer.request({
|
|
225
|
-
url: `/${summarizerRequestUrl}`,
|
|
226
|
-
}));
|
|
227
|
-
if (response.status !== 200 || response.mimeType !== "fluid/object") {
|
|
228
|
-
throw (0, internal_6.responseToException)(response, request);
|
|
229
|
-
}
|
|
230
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
231
|
-
fluidObject = response.value;
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
fluidObject = await resolvedContainer.getEntryPoint();
|
|
235
|
-
}
|
|
236
|
-
if (fluidObject?.ISummarizer === undefined) {
|
|
237
|
-
throw new internal_7.UsageError("Fluid object does not implement ISummarizer");
|
|
238
|
-
}
|
|
239
|
-
return fluidObject.ISummarizer;
|
|
240
|
-
}
|
|
241
179
|
/**
|
|
242
180
|
* Extract last message from the snapshot metadata.
|
|
243
181
|
* Uses legacy property if not using explicit schema control, otherwise uses the new property.
|
|
244
182
|
* This allows new runtime to make documents not openable for old runtimes, one explicit document schema control is enabled.
|
|
245
183
|
* Please see addMetadataToSummary() as well
|
|
246
184
|
*/
|
|
247
|
-
function lastMessageFromMetadata(
|
|
248
|
-
// eslint-disable-next-line import/no-deprecated
|
|
249
|
-
metadata) {
|
|
185
|
+
function lastMessageFromMetadata(metadata) {
|
|
250
186
|
return metadata?.documentSchema?.runtime?.explicitSchemaControl
|
|
251
187
|
? metadata?.lastMessage
|
|
252
188
|
: metadata?.message;
|
|
@@ -280,7 +216,6 @@ async function loadContainerRuntime(params) {
|
|
|
280
216
|
}
|
|
281
217
|
exports.loadContainerRuntime = loadContainerRuntime;
|
|
282
218
|
const defaultMaxConsecutiveReconnects = 7;
|
|
283
|
-
const defaultTelemetrySignalSampleCount = 100;
|
|
284
219
|
/**
|
|
285
220
|
* Represents the runtime of the container. Contains helper functions/state of the container.
|
|
286
221
|
* It will define the store level mappings.
|
|
@@ -336,15 +271,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
336
271
|
const [chunks, recentBatchInfo, metadata, electedSummarizerData, aliases, serializedIdCompressor,] = await Promise.all([
|
|
337
272
|
tryFetchBlob(index_js_4.chunksBlobName),
|
|
338
273
|
tryFetchBlob(index_js_4.recentBatchInfoBlobName),
|
|
339
|
-
// eslint-disable-next-line import/no-deprecated
|
|
340
274
|
tryFetchBlob(index_js_4.metadataBlobName),
|
|
341
|
-
// eslint-disable-next-line import/no-deprecated
|
|
342
275
|
tryFetchBlob(index_js_4.electedSummarizerBlobName),
|
|
343
276
|
tryFetchBlob(index_js_4.aliasBlobName),
|
|
344
277
|
tryFetchBlob(index_js_4.idCompressorBlobName),
|
|
345
278
|
]);
|
|
346
279
|
// read snapshot blobs needed for BlobManager to load
|
|
347
|
-
const
|
|
280
|
+
const blobManagerLoadInfo = await (0, index_js_1.loadBlobManagerLoadInfo)(context);
|
|
348
281
|
const messageAtLastSummary = lastMessageFromMetadata(metadata);
|
|
349
282
|
// Verify summary runtime sequence number matches protocol sequence number.
|
|
350
283
|
const runtimeSequenceNumber = messageAtLastSummary?.sequenceNumber;
|
|
@@ -448,7 +381,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
448
381
|
};
|
|
449
382
|
const compressionLz4 = compressionOptions.minimumBatchSizeInBytes !== Number.POSITIVE_INFINITY &&
|
|
450
383
|
compressionOptions.compressionAlgorithm === "lz4";
|
|
451
|
-
// eslint-disable-next-line import/no-deprecated
|
|
452
384
|
const documentSchemaController = new index_js_4.DocumentsSchemaController(existing, protocolSequenceNumber, metadata?.documentSchema, {
|
|
453
385
|
explicitSchemaControl,
|
|
454
386
|
compressionLz4,
|
|
@@ -476,7 +408,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
476
408
|
enableGroupedBatching,
|
|
477
409
|
explicitSchemaControl,
|
|
478
410
|
};
|
|
479
|
-
const runtime = new containerRuntimeCtor(context, registry, metadata, electedSummarizerData, chunks ?? [], aliases ?? [], internalRuntimeOptions, containerScope, logger, existing,
|
|
411
|
+
const runtime = new containerRuntimeCtor(context, registry, metadata, electedSummarizerData, chunks ?? [], aliases ?? [], internalRuntimeOptions, containerScope, logger, existing, blobManagerLoadInfo, context.storage, createIdCompressorFn, documentSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler, undefined, // summaryConfiguration
|
|
480
412
|
recentBatchInfo);
|
|
481
413
|
runtime.blobManager.stashedBlobsUploadP.then(() => {
|
|
482
414
|
// make sure we didn't reconnect before the promise resolved
|
|
@@ -560,18 +492,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
560
492
|
* Invokes the given callback and expects that no ops are submitted
|
|
561
493
|
* until execution finishes. If an op is submitted, an error will be raised.
|
|
562
494
|
*
|
|
563
|
-
* Can be disabled by feature gate `Fluid.ContainerRuntime.DisableOpReentryCheck`
|
|
564
|
-
*
|
|
565
495
|
* @param callback - the callback to be invoked
|
|
566
496
|
*/
|
|
567
497
|
ensureNoDataModelChanges(callback) {
|
|
568
|
-
this.
|
|
569
|
-
try {
|
|
570
|
-
return callback();
|
|
571
|
-
}
|
|
572
|
-
finally {
|
|
573
|
-
this.ensureNoDataModelChangesCalls--;
|
|
574
|
-
}
|
|
498
|
+
return this.dataModelChangeRunner.run(callback);
|
|
575
499
|
}
|
|
576
500
|
get connected() {
|
|
577
501
|
return this._connected;
|
|
@@ -601,27 +525,23 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
601
525
|
get gcThrowOnTombstoneUsage() {
|
|
602
526
|
return false;
|
|
603
527
|
}
|
|
528
|
+
/**
|
|
529
|
+
* The compatibility details of the Runtime layer that is exposed to the Loader layer
|
|
530
|
+
* for validating Loader-Runtime compatibility.
|
|
531
|
+
*/
|
|
604
532
|
get ILayerCompatDetails() {
|
|
605
|
-
return
|
|
533
|
+
return runtimeLayerCompatState_js_1.runtimeCompatDetailsForLoader;
|
|
606
534
|
}
|
|
607
535
|
/***/
|
|
608
|
-
constructor(context, registry,
|
|
609
|
-
// eslint-disable-next-line import/no-deprecated
|
|
610
|
-
metadata,
|
|
611
|
-
// eslint-disable-next-line import/no-deprecated
|
|
612
|
-
electedSummarizerData, chunks, dataStoreAliasMap, baseRuntimeOptions, containerScope,
|
|
536
|
+
constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope,
|
|
613
537
|
// Create a custom ITelemetryBaseLogger to output telemetry events.
|
|
614
|
-
baseLogger, existing,
|
|
615
|
-
// eslint-disable-next-line import/no-deprecated
|
|
616
|
-
blobManagerSnapshot, _storage, createIdCompressor,
|
|
617
|
-
// eslint-disable-next-line import/no-deprecated
|
|
618
|
-
documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler,
|
|
538
|
+
baseLogger, existing, blobManagerLoadInfo, _storage, createIdCompressor, documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler,
|
|
619
539
|
// eslint-disable-next-line unicorn/no-object-as-default-parameter
|
|
620
540
|
summaryConfiguration = {
|
|
621
541
|
// the defaults
|
|
622
|
-
...
|
|
542
|
+
...index_js_4.DefaultSummaryConfiguration,
|
|
623
543
|
// the runtime configuration overrides
|
|
624
|
-
...
|
|
544
|
+
...runtimeOptions.summaryOptions?.summaryConfigOverrides,
|
|
625
545
|
}, recentBatchInfo) {
|
|
626
546
|
super();
|
|
627
547
|
this.registry = registry;
|
|
@@ -636,23 +556,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
636
556
|
// We accumulate Id compressor Ops while Id compressor is not loaded yet (only for "delayed" mode)
|
|
637
557
|
// Once it loads, it will process all such ops and we will stop accumulating further ops - ops will be processes as they come in.
|
|
638
558
|
this.pendingIdCompressorOps = [];
|
|
639
|
-
this.
|
|
559
|
+
this.batchRunner = new runCounter_js_1.RunCounter();
|
|
640
560
|
this.flushTaskExists = false;
|
|
641
561
|
this.consecutiveReconnects = 0;
|
|
642
|
-
this.
|
|
562
|
+
this.dataModelChangeRunner = new runCounter_js_1.RunCounter();
|
|
643
563
|
this._disposed = false;
|
|
644
564
|
this.emitDirtyDocumentEvent = true;
|
|
645
|
-
this.
|
|
646
|
-
totalSignalsSentInLatencyWindow: 0,
|
|
647
|
-
signalsLost: 0,
|
|
648
|
-
signalsOutOfOrder: 0,
|
|
649
|
-
signalsSentSinceLastLatencyMeasurement: 0,
|
|
650
|
-
broadcastSignalSequenceNumber: 0,
|
|
651
|
-
signalTimestamp: 0,
|
|
652
|
-
roundTripSignalSequenceNumber: undefined,
|
|
653
|
-
trackingSignalSequenceNumber: undefined,
|
|
654
|
-
minimumTrackingSignalSequenceNumber: undefined,
|
|
655
|
-
};
|
|
565
|
+
this.signalTelemetryManager = new signalTelemetryProcessing_js_1.SignalTelemetryManager();
|
|
656
566
|
/**
|
|
657
567
|
* It a cache for holding mapping for loading groupIds with its snapshot from the service. Add expiry policy of 1 minute.
|
|
658
568
|
* Starting with 1 min and based on recorded usage we can tweak it later on.
|
|
@@ -664,13 +574,9 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
664
574
|
const { options, clientDetails, connected, baseSnapshot, submitFn, submitBatchFn, submitSummaryFn, submitSignalFn, disposeFn, closeFn, deltaManager, quorum, audience, loader, pendingLocalState, supportedFeatures, snapshotWithContents, } = context;
|
|
665
575
|
// In old loaders without dispose functionality, closeFn is equivalent but will also switch container to readonly mode
|
|
666
576
|
this.disposeFn = disposeFn ?? closeFn;
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
const runtimeOptions = {
|
|
671
|
-
flushMode: defaultFlushMode,
|
|
672
|
-
...baseRuntimeOptions,
|
|
673
|
-
};
|
|
577
|
+
// Validate that the Loader is compatible with this Runtime.
|
|
578
|
+
const maybeloaderCompatDetailsForRuntime = context;
|
|
579
|
+
(0, runtimeLayerCompatState_js_1.validateLoaderCompatibility)(maybeloaderCompatDetailsForRuntime.ILayerCompatDetails, this.disposeFn);
|
|
674
580
|
this.mc = (0, internal_7.createChildMonitoringContext)({
|
|
675
581
|
logger: this.baseLogger,
|
|
676
582
|
namespace: "ContainerRuntime",
|
|
@@ -718,6 +624,22 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
718
624
|
// customer should observe dirty state on the runtime (the owner of dirty state) directly, rather than on the IContainer.
|
|
719
625
|
this.on("dirty", () => context.updateDirtyContainerState(true));
|
|
720
626
|
this.on("saved", () => context.updateDirtyContainerState(false));
|
|
627
|
+
// Telemetry for when the container is attached and subsequently saved for the first time.
|
|
628
|
+
// These events are useful for investigating the validity of container "saved" eventing upon attach.
|
|
629
|
+
// See this.setAttachState() and this.updateDocumentDirtyState() for more details on "attached" and "saved" events.
|
|
630
|
+
this.once("attached", () => {
|
|
631
|
+
this.mc.logger.sendTelemetryEvent({
|
|
632
|
+
eventName: "Attached",
|
|
633
|
+
details: {
|
|
634
|
+
dirtyContainer: this.dirtyContainer,
|
|
635
|
+
hasPendingMessages: this.hasPendingMessages(),
|
|
636
|
+
},
|
|
637
|
+
});
|
|
638
|
+
});
|
|
639
|
+
this.once("saved", () => this.mc.logger.sendTelemetryEvent({
|
|
640
|
+
eventName: "Saved",
|
|
641
|
+
details: { attachState: this.attachState },
|
|
642
|
+
}));
|
|
721
643
|
// In cases of summarizer, we want to dispose instead since consumer doesn't interact with this container
|
|
722
644
|
this.closeFn = isSummarizerClient ? this.disposeFn : closeFn;
|
|
723
645
|
let loadSummaryNumber;
|
|
@@ -782,10 +704,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
782
704
|
this._deltaManager = outerDeltaManager;
|
|
783
705
|
this.handleContext = new containerHandleContext_js_1.ContainerFluidHandleContext("", this);
|
|
784
706
|
if (summaryConfiguration.state === "enabled") {
|
|
785
|
-
|
|
707
|
+
(0, index_js_4.validateSummaryHeuristicConfiguration)(summaryConfiguration);
|
|
786
708
|
}
|
|
787
|
-
this.summariesDisabled = isSummariesDisabled(summaryConfiguration);
|
|
788
|
-
const { maxOpsSinceLastSummary = 0, initialSummarizerDelayMs = 0 } = isSummariesDisabled(summaryConfiguration)
|
|
709
|
+
this.summariesDisabled = (0, index_js_4.isSummariesDisabled)(summaryConfiguration);
|
|
710
|
+
const { maxOpsSinceLastSummary = 0, initialSummarizerDelayMs = 0 } = (0, index_js_4.isSummariesDisabled)(summaryConfiguration)
|
|
789
711
|
? {}
|
|
790
712
|
: {
|
|
791
713
|
...summaryConfiguration,
|
|
@@ -799,7 +721,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
799
721
|
this.mc.config.getNumber(maxConsecutiveReconnectsKey) ?? defaultMaxConsecutiveReconnects;
|
|
800
722
|
// If the context has ILayerCompatDetails, it supports referenceSequenceNumbers since that features
|
|
801
723
|
// predates ILayerCompatDetails.
|
|
802
|
-
const referenceSequenceNumbersSupported =
|
|
724
|
+
const referenceSequenceNumbersSupported = maybeloaderCompatDetailsForRuntime.ILayerCompatDetails === undefined
|
|
803
725
|
? supportedFeatures?.get("referenceSequenceNumbers") === true
|
|
804
726
|
: true;
|
|
805
727
|
if (runtimeOptions.flushMode === internal_5.FlushModeExperimental.Async &&
|
|
@@ -880,9 +802,14 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
880
802
|
// what is the interface of passing signals, we need the
|
|
881
803
|
// downstream stores to wrap the signal.
|
|
882
804
|
parentContext.submitSignal = (type, content, targetClientId) => {
|
|
805
|
+
// Future: Can the `content` argument type be IEnvelope?
|
|
806
|
+
// verifyNotClosed is called in FluidDataStoreContext, which is *the* expected caller.
|
|
883
807
|
const envelope1 = content;
|
|
884
|
-
const envelope2 =
|
|
885
|
-
|
|
808
|
+
const envelope2 = createNewSignalEnvelope(envelope1.address, type, envelope1.contents);
|
|
809
|
+
if (targetClientId === undefined) {
|
|
810
|
+
this.signalTelemetryManager.applyTrackingToBroadcastSignalEnvelope(envelope2);
|
|
811
|
+
}
|
|
812
|
+
this.submitSignalFn(envelope2, targetClientId);
|
|
886
813
|
};
|
|
887
814
|
let snapshot = (0, channelCollection_js_1.getSummaryForDatastores)(baseSnapshot, metadata);
|
|
888
815
|
if (snapshot !== undefined && snapshotWithContents !== undefined) {
|
|
@@ -897,8 +824,8 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
897
824
|
}), (path) => this.garbageCollector.isNodeDeleted(path), new Map(dataStoreAliasMap), async (runtime) => provideEntryPoint);
|
|
898
825
|
this.blobManager = new index_js_1.BlobManager({
|
|
899
826
|
routeContext: this.handleContext,
|
|
900
|
-
|
|
901
|
-
|
|
827
|
+
blobManagerLoadInfo,
|
|
828
|
+
storage: this.storage,
|
|
902
829
|
sendBlobAttachOp: (localId, blobId) => {
|
|
903
830
|
if (!this.disposed) {
|
|
904
831
|
this.submit({ type: messageTypes_js_1.ContainerMessageType.BlobAttach, contents: undefined }, undefined, {
|
|
@@ -918,8 +845,9 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
918
845
|
});
|
|
919
846
|
this.deltaScheduler = new deltaScheduler_js_1.DeltaScheduler(this.innerDeltaManager, this, (0, internal_7.createChildLogger)({ logger: this.baseLogger, namespace: "DeltaScheduler" }));
|
|
920
847
|
this.inboundBatchAggregator = new inboundBatchAggregator_js_1.InboundBatchAggregator(this.innerDeltaManager, () => this.clientId, (0, internal_7.createChildLogger)({ logger: this.baseLogger, namespace: "InboundBatchAggregator" }));
|
|
921
|
-
const disablePartialFlush = this.mc.config.getBoolean("Fluid.ContainerRuntime.DisablePartialFlush");
|
|
922
848
|
const legacySendBatchFn = (0, exports.makeLegacySendBatchFn)(submitFn, this.innerDeltaManager);
|
|
849
|
+
this.disableFlushBeforeProcess =
|
|
850
|
+
this.mc.config.getBoolean("Fluid.ContainerRuntime.DisableFlushBeforeProcess") === true;
|
|
923
851
|
this.outbox = new index_js_3.Outbox({
|
|
924
852
|
shouldSend: () => this.canSendOps(),
|
|
925
853
|
pendingStateManager: this.pendingStateManager,
|
|
@@ -930,16 +858,18 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
930
858
|
config: {
|
|
931
859
|
compressionOptions,
|
|
932
860
|
maxBatchSizeInBytes: runtimeOptions.maxBatchSizeInBytes,
|
|
933
|
-
|
|
861
|
+
// If we disable flush before process, we must be ready to flush partial batches
|
|
862
|
+
flushPartialBatches: this.disableFlushBeforeProcess,
|
|
934
863
|
},
|
|
935
864
|
logger: this.mc.logger,
|
|
936
865
|
groupingManager: opGroupingManager,
|
|
937
866
|
getCurrentSequenceNumbers: () => ({
|
|
867
|
+
// Note: These sequence numbers only change when DeltaManager processes an incoming op
|
|
938
868
|
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
939
869
|
clientSequenceNumber: this._processedClientSequenceNumber,
|
|
940
870
|
}),
|
|
941
871
|
reSubmit: this.reSubmit.bind(this),
|
|
942
|
-
opReentrancy: () => this.
|
|
872
|
+
opReentrancy: () => this.dataModelChangeRunner.running,
|
|
943
873
|
closeContainer: this.closeFn,
|
|
944
874
|
});
|
|
945
875
|
this._quorum = quorum;
|
|
@@ -986,10 +916,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
986
916
|
const orderedClientElectionForSummarizer = new index_js_4.OrderedClientElection(orderedClientLogger, orderedClientCollection, electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber, index_js_4.SummarizerClientElection.isClientEligible, this.mc.config.getBoolean("Fluid.ContainerRuntime.OrderedClientElection.EnablePerformanceEvents"));
|
|
987
917
|
this.summarizerClientElection = new index_js_4.SummarizerClientElection(orderedClientLogger, summaryCollection, orderedClientElectionForSummarizer, maxOpsSinceLastSummary);
|
|
988
918
|
if (isSummarizerClient) {
|
|
989
|
-
|
|
990
|
-
this._summarizer = new index_js_4.Summarizer(this /* ISummarizerRuntime */, () => summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, summaryCollection,
|
|
991
|
-
// eslint-disable-next-line import/no-deprecated
|
|
992
|
-
async (runtime) => index_js_4.RunWhileConnectedCoordinator.create(runtime,
|
|
919
|
+
this._summarizer = new index_js_4.Summarizer(this /* ISummarizerRuntime */, () => summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, summaryCollection, async (runtime) => index_js_4.RunWhileConnectedCoordinator.create(runtime,
|
|
993
920
|
// Summarization runs in summarizer client and needs access to the real (non-proxy) active
|
|
994
921
|
// information. The proxy delta manager would always return false for summarizer client.
|
|
995
922
|
() => this.innerDeltaManager.active));
|
|
@@ -1017,7 +944,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1017
944
|
summaryCollection.on("default", defaultAction);
|
|
1018
945
|
// Create the SummaryManager and mark the initial state
|
|
1019
946
|
this.summaryManager = new index_js_4.SummaryManager(this.summarizerClientElection, this, // IConnectedState
|
|
1020
|
-
summaryCollection, this.baseLogger,
|
|
947
|
+
summaryCollection, this.baseLogger, (0, index_js_4.formCreateSummarizerFn)(loader), new throttler_js_1.Throttler(60 * 1000, // 60 sec delay window
|
|
1021
948
|
30 * 1000, // 30 sec max delay
|
|
1022
949
|
// throttling function increases exponentially (0ms, 40ms, 80ms, 160ms, etc)
|
|
1023
950
|
(0, throttler_js_1.formExponentialFn)({ coefficient: 20, initialDelay: 0 })), {
|
|
@@ -1052,14 +979,14 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1052
979
|
summaryFormatVersion: metadata?.summaryFormatVersion,
|
|
1053
980
|
disableIsolatedChannels: metadata?.disableIsolatedChannels,
|
|
1054
981
|
gcVersion: metadata?.gcFeature,
|
|
1055
|
-
options: JSON.stringify(
|
|
982
|
+
options: JSON.stringify(runtimeOptions),
|
|
1056
983
|
idCompressorModeMetadata: metadata?.documentSchema?.runtime?.idCompressorMode,
|
|
1057
984
|
idCompressorMode: this.sessionSchema.idCompressorMode,
|
|
1058
985
|
sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
|
|
1059
986
|
featureGates: JSON.stringify({
|
|
1060
987
|
...featureGatesForTelemetry,
|
|
1061
|
-
disablePartialFlush,
|
|
1062
988
|
closeSummarizerDelayOverride,
|
|
989
|
+
disableFlushBeforeProcess: this.disableFlushBeforeProcess,
|
|
1063
990
|
}),
|
|
1064
991
|
telemetryDocumentId: this.telemetryDocumentId,
|
|
1065
992
|
groupedBatchingEnabled: this.groupedBatchingEnabled,
|
|
@@ -1077,7 +1004,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1077
1004
|
// saved state, i.e. all the ops marked by Loader layer sa savedOp === true.
|
|
1078
1005
|
this.skipSavedCompressorOps = pendingRuntimeState?.pendingIdCompressorState !== undefined;
|
|
1079
1006
|
}
|
|
1080
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1081
1007
|
onSchemaChange(schema) {
|
|
1082
1008
|
this.mc.logger.sendTelemetryEvent({
|
|
1083
1009
|
eventName: "SchemaChangeAccept",
|
|
@@ -1254,7 +1180,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1254
1180
|
try {
|
|
1255
1181
|
const parser = internal_6.RequestParser.create(request);
|
|
1256
1182
|
const id = parser.pathParts[0];
|
|
1257
|
-
if (id === summarizerRequestUrl && parser.pathParts.length === 1) {
|
|
1183
|
+
if (id === index_js_4.summarizerRequestUrl && parser.pathParts.length === 1) {
|
|
1258
1184
|
if (this._summarizer !== undefined) {
|
|
1259
1185
|
return {
|
|
1260
1186
|
status: 200,
|
|
@@ -1288,13 +1214,11 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1288
1214
|
}
|
|
1289
1215
|
if (id === index_js_1.blobManagerBasePath && requestParser.isLeaf(2)) {
|
|
1290
1216
|
const blob = await this.blobManager.getBlob(requestParser.pathParts[1]);
|
|
1291
|
-
return
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
}
|
|
1297
|
-
: (0, internal_6.create404Response)(request);
|
|
1217
|
+
return {
|
|
1218
|
+
status: 200,
|
|
1219
|
+
mimeType: "fluid/object",
|
|
1220
|
+
value: blob,
|
|
1221
|
+
};
|
|
1298
1222
|
}
|
|
1299
1223
|
else if (requestParser.pathParts.length > 0) {
|
|
1300
1224
|
return await this.channelCollection.request(request);
|
|
@@ -1325,7 +1249,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1325
1249
|
const documentSchema = this.documentsSchemaController.summarizeDocumentSchema(this.deltaManager.lastSequenceNumber);
|
|
1326
1250
|
// Is document schema explicit control on?
|
|
1327
1251
|
const explicitSchemaControl = documentSchema?.runtime.explicitSchemaControl;
|
|
1328
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1329
1252
|
const metadata = {
|
|
1330
1253
|
...this.createContainerMetadata,
|
|
1331
1254
|
// Increment the summary number for the next summary that will be generated.
|
|
@@ -1339,8 +1262,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1339
1262
|
// last message's sequence number.
|
|
1340
1263
|
// See also lastMessageFromMetadata()
|
|
1341
1264
|
message: explicitSchemaControl
|
|
1342
|
-
?
|
|
1343
|
-
{ sequenceNumber: -1 }
|
|
1265
|
+
? { sequenceNumber: -1 }
|
|
1344
1266
|
: message,
|
|
1345
1267
|
lastMessage: explicitSchemaControl ? message : undefined,
|
|
1346
1268
|
documentSchema,
|
|
@@ -1562,14 +1484,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1562
1484
|
if (connected) {
|
|
1563
1485
|
(0, internal_2.assert)(this.attachState === container_definitions_1.AttachState.Attached, 0x3cd /* Connection is possible only if container exists in storage */);
|
|
1564
1486
|
if (changeOfState) {
|
|
1565
|
-
this.
|
|
1566
|
-
this._signalTracking.signalsOutOfOrder = 0;
|
|
1567
|
-
this._signalTracking.signalTimestamp = 0;
|
|
1568
|
-
this._signalTracking.signalsSentSinceLastLatencyMeasurement = 0;
|
|
1569
|
-
this._signalTracking.totalSignalsSentInLatencyWindow = 0;
|
|
1570
|
-
this._signalTracking.roundTripSignalSequenceNumber = undefined;
|
|
1571
|
-
this._signalTracking.trackingSignalSequenceNumber = undefined;
|
|
1572
|
-
this._signalTracking.minimumTrackingSignalSequenceNumber = undefined;
|
|
1487
|
+
this.signalTelemetryManager.resetTracking();
|
|
1573
1488
|
}
|
|
1574
1489
|
}
|
|
1575
1490
|
// Fail while disconnected
|
|
@@ -1603,6 +1518,21 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1603
1518
|
// spread operator above ensure we make a shallow copy of message, as the processing flow will modify it.
|
|
1604
1519
|
// There might be multiple container instances receiving the same message.
|
|
1605
1520
|
this.verifyNotClosed();
|
|
1521
|
+
if (!this.disableFlushBeforeProcess) {
|
|
1522
|
+
// Reference Sequence Number may be about to change, and it must be consistent across a batch, so flush now
|
|
1523
|
+
this.outbox.flush();
|
|
1524
|
+
}
|
|
1525
|
+
this.ensureNoDataModelChanges(() => {
|
|
1526
|
+
this.processInboundMessageOrBatch(messageCopy, local);
|
|
1527
|
+
});
|
|
1528
|
+
}
|
|
1529
|
+
/**
|
|
1530
|
+
* Implementation of core logic for {@link ContainerRuntime.process}, once preconditions are established
|
|
1531
|
+
*
|
|
1532
|
+
* @param messageCopy - Shallow copy of the sequenced message. If it's a virtualized batch, we'll process
|
|
1533
|
+
* all messages in the batch here.
|
|
1534
|
+
*/
|
|
1535
|
+
processInboundMessageOrBatch(messageCopy, local) {
|
|
1606
1536
|
// Whether or not the message appears to be a runtime message from an up-to-date client.
|
|
1607
1537
|
// It may be a legacy runtime message (ie already unpacked and ContainerMessageType)
|
|
1608
1538
|
// or something different, like a system message.
|
|
@@ -1711,9 +1641,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1711
1641
|
try {
|
|
1712
1642
|
if (!runtimeBatch) {
|
|
1713
1643
|
for (const { message } of messagesWithMetadata) {
|
|
1714
|
-
this.
|
|
1715
|
-
this.observeNonRuntimeMessage(message);
|
|
1716
|
-
});
|
|
1644
|
+
this.observeNonRuntimeMessage(message);
|
|
1717
1645
|
}
|
|
1718
1646
|
return;
|
|
1719
1647
|
}
|
|
@@ -1733,29 +1661,23 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1733
1661
|
if (!groupedBatch) {
|
|
1734
1662
|
for (const { message, localOpMetadata } of messagesWithMetadata) {
|
|
1735
1663
|
updateSequenceNumbers(message);
|
|
1736
|
-
this.
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
this.emit("op", message, true /* runtimeMessage */);
|
|
1745
|
-
});
|
|
1664
|
+
this.validateAndProcessRuntimeMessages(message, [
|
|
1665
|
+
{
|
|
1666
|
+
contents: message.contents,
|
|
1667
|
+
localOpMetadata,
|
|
1668
|
+
clientSequenceNumber: message.clientSequenceNumber,
|
|
1669
|
+
},
|
|
1670
|
+
], local, savedOp);
|
|
1671
|
+
this.emit("op", message, true /* runtimeMessage */);
|
|
1746
1672
|
}
|
|
1747
1673
|
return;
|
|
1748
1674
|
}
|
|
1749
1675
|
let bunchedMessagesContent = [];
|
|
1750
1676
|
let previousMessage;
|
|
1751
1677
|
// Process the previous bunch of messages.
|
|
1752
|
-
const
|
|
1678
|
+
const processBunchedMessages = () => {
|
|
1753
1679
|
(0, internal_2.assert)(previousMessage !== undefined, 0xa67 /* previous message must exist */);
|
|
1754
|
-
this.
|
|
1755
|
-
this.validateAndProcessRuntimeMessages(
|
|
1756
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
1757
|
-
previousMessage, bunchedMessagesContent, local, savedOp);
|
|
1758
|
-
});
|
|
1680
|
+
this.validateAndProcessRuntimeMessages(previousMessage, bunchedMessagesContent, local, savedOp);
|
|
1759
1681
|
bunchedMessagesContent = [];
|
|
1760
1682
|
};
|
|
1761
1683
|
/**
|
|
@@ -1766,7 +1688,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1766
1688
|
for (const { message, localOpMetadata } of messagesWithMetadata) {
|
|
1767
1689
|
const currentMessage = updateSequenceNumbers(message);
|
|
1768
1690
|
if (previousMessage && previousMessage.type !== currentMessage.type) {
|
|
1769
|
-
|
|
1691
|
+
processBunchedMessages();
|
|
1770
1692
|
}
|
|
1771
1693
|
previousMessage = currentMessage;
|
|
1772
1694
|
bunchedMessagesContent.push({
|
|
@@ -1776,7 +1698,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1776
1698
|
});
|
|
1777
1699
|
}
|
|
1778
1700
|
// Process the last bunch of messages.
|
|
1779
|
-
|
|
1701
|
+
processBunchedMessages();
|
|
1780
1702
|
// Send the "op" events for the messages now that the ops have been processed.
|
|
1781
1703
|
for (const { message } of messagesWithMetadata) {
|
|
1782
1704
|
this.emit("op", message, true /* runtimeMessage */);
|
|
@@ -1868,9 +1790,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1868
1790
|
break;
|
|
1869
1791
|
}
|
|
1870
1792
|
case messageTypes_js_1.ContainerMessageType.DocumentSchemaChange: {
|
|
1871
|
-
this.documentsSchemaController.processDocumentSchemaMessages(
|
|
1872
|
-
// eslint-disable-next-line import/no-deprecated
|
|
1873
|
-
contents, local, message.sequenceNumber);
|
|
1793
|
+
this.documentsSchemaController.processDocumentSchemaMessages(contents, local, message.sequenceNumber);
|
|
1874
1794
|
break;
|
|
1875
1795
|
}
|
|
1876
1796
|
default: {
|
|
@@ -1900,90 +1820,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1900
1820
|
}
|
|
1901
1821
|
}
|
|
1902
1822
|
}
|
|
1903
|
-
/**
|
|
1904
|
-
* Emits the Signal event and update the perf signal data.
|
|
1905
|
-
*/
|
|
1906
|
-
sendSignalTelemetryEvent() {
|
|
1907
|
-
const duration = Date.now() - this._signalTracking.signalTimestamp;
|
|
1908
|
-
this.mc.logger.sendPerformanceEvent({
|
|
1909
|
-
eventName: "SignalLatency",
|
|
1910
|
-
details: {
|
|
1911
|
-
duration, // Roundtrip duration of the tracked signal in milliseconds.
|
|
1912
|
-
sent: this._signalTracking.totalSignalsSentInLatencyWindow, // Signals sent since the last logged SignalLatency event.
|
|
1913
|
-
lost: this._signalTracking.signalsLost, // Signals lost since the last logged SignalLatency event.
|
|
1914
|
-
outOfOrder: this._signalTracking.signalsOutOfOrder, // Out of order signals since the last logged SignalLatency event.
|
|
1915
|
-
reconnectCount: this.consecutiveReconnects, // Container reconnect count.
|
|
1916
|
-
},
|
|
1917
|
-
});
|
|
1918
|
-
this._signalTracking.signalsLost = 0;
|
|
1919
|
-
this._signalTracking.signalsOutOfOrder = 0;
|
|
1920
|
-
this._signalTracking.signalTimestamp = 0;
|
|
1921
|
-
this._signalTracking.totalSignalsSentInLatencyWindow = 0;
|
|
1922
|
-
}
|
|
1923
|
-
/**
|
|
1924
|
-
* Updates signal telemetry including emitting telemetry events.
|
|
1925
|
-
*/
|
|
1926
|
-
processSignalForTelemetry(envelope) {
|
|
1927
|
-
const { clientBroadcastSignalSequenceNumber, contents: envelopeContents, address: envelopeAddress, } = envelope;
|
|
1928
|
-
if (clientBroadcastSignalSequenceNumber === undefined) {
|
|
1929
|
-
return;
|
|
1930
|
-
}
|
|
1931
|
-
if (this._signalTracking.trackingSignalSequenceNumber === undefined ||
|
|
1932
|
-
this._signalTracking.minimumTrackingSignalSequenceNumber === undefined) {
|
|
1933
|
-
return;
|
|
1934
|
-
}
|
|
1935
|
-
if (clientBroadcastSignalSequenceNumber >= this._signalTracking.trackingSignalSequenceNumber) {
|
|
1936
|
-
// Calculate the number of signals lost and log the event.
|
|
1937
|
-
const signalsLost = clientBroadcastSignalSequenceNumber -
|
|
1938
|
-
this._signalTracking.trackingSignalSequenceNumber;
|
|
1939
|
-
if (signalsLost > 0) {
|
|
1940
|
-
this._signalTracking.signalsLost += signalsLost;
|
|
1941
|
-
this.mc.logger.sendErrorEvent({
|
|
1942
|
-
eventName: "SignalLost",
|
|
1943
|
-
details: {
|
|
1944
|
-
signalsLost, // Number of lost signals detected.
|
|
1945
|
-
expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
|
|
1946
|
-
clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
|
|
1947
|
-
},
|
|
1948
|
-
});
|
|
1949
|
-
}
|
|
1950
|
-
// Update the tracking signal sequence number to the next expected signal in the sequence.
|
|
1951
|
-
this._signalTracking.trackingSignalSequenceNumber =
|
|
1952
|
-
clientBroadcastSignalSequenceNumber + 1;
|
|
1953
|
-
}
|
|
1954
|
-
else if (
|
|
1955
|
-
// Check if this is a signal in range of interest.
|
|
1956
|
-
clientBroadcastSignalSequenceNumber >=
|
|
1957
|
-
this._signalTracking.minimumTrackingSignalSequenceNumber) {
|
|
1958
|
-
this._signalTracking.signalsOutOfOrder++;
|
|
1959
|
-
const details = {
|
|
1960
|
-
expectedSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
|
|
1961
|
-
clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
|
|
1962
|
-
};
|
|
1963
|
-
// Only log `contents.type` when address is for container to avoid
|
|
1964
|
-
// chance that contents type is customer data.
|
|
1965
|
-
if (envelopeAddress === undefined) {
|
|
1966
|
-
details.contentsType = envelopeContents.type; // Type of signal that was received out of order.
|
|
1967
|
-
}
|
|
1968
|
-
this.mc.logger.sendTelemetryEvent({
|
|
1969
|
-
eventName: "SignalOutOfOrder",
|
|
1970
|
-
details,
|
|
1971
|
-
});
|
|
1972
|
-
}
|
|
1973
|
-
if (this._signalTracking.roundTripSignalSequenceNumber !== undefined &&
|
|
1974
|
-
clientBroadcastSignalSequenceNumber >= this._signalTracking.roundTripSignalSequenceNumber) {
|
|
1975
|
-
if (clientBroadcastSignalSequenceNumber ===
|
|
1976
|
-
this._signalTracking.roundTripSignalSequenceNumber) {
|
|
1977
|
-
// Latency tracked signal has been received.
|
|
1978
|
-
// We now log the roundtrip duration of the tracked signal.
|
|
1979
|
-
// This telemetry event also logs metrics for broadcast signals
|
|
1980
|
-
// sent, lost, and out of order.
|
|
1981
|
-
// These metrics are reset after logging the telemetry event.
|
|
1982
|
-
this.sendSignalTelemetryEvent();
|
|
1983
|
-
}
|
|
1984
|
-
this._signalTracking.roundTripSignalSequenceNumber = undefined;
|
|
1985
|
-
}
|
|
1986
|
-
}
|
|
1987
1823
|
processSignal(message, local) {
|
|
1988
1824
|
const envelope = message.content;
|
|
1989
1825
|
const transformed = {
|
|
@@ -1994,7 +1830,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1994
1830
|
};
|
|
1995
1831
|
// Only collect signal telemetry for broadcast messages sent by the current client.
|
|
1996
1832
|
if (message.clientId === this.clientId) {
|
|
1997
|
-
this.
|
|
1833
|
+
this.signalTelemetryManager.trackReceivedSignal(envelope, this.mc.logger, this.consecutiveReconnects);
|
|
1998
1834
|
}
|
|
1999
1835
|
if (envelope.address === undefined) {
|
|
2000
1836
|
// No address indicates a container signal message.
|
|
@@ -2018,7 +1854,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2018
1854
|
* with the given Batch ID, which must be preserved
|
|
2019
1855
|
*/
|
|
2020
1856
|
flush(resubmittingBatchId) {
|
|
2021
|
-
(0, internal_2.assert)(this.
|
|
1857
|
+
(0, internal_2.assert)(!this.batchRunner.running, 0x24c /* "Cannot call `flush()` while manually accumulating a batch (e.g. under orderSequentially) */);
|
|
2022
1858
|
this.outbox.flush(resubmittingBatchId);
|
|
2023
1859
|
(0, internal_2.assert)(this.outbox.isEmpty, 0x3cf /* reentrancy */);
|
|
2024
1860
|
}
|
|
@@ -2027,43 +1863,45 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2027
1863
|
*/
|
|
2028
1864
|
orderSequentially(callback) {
|
|
2029
1865
|
let checkpoint;
|
|
2030
|
-
|
|
1866
|
+
const checkpointDirtyState = this.dirtyContainer;
|
|
2031
1867
|
if (this.mc.config.getBoolean("Fluid.ContainerRuntime.EnableRollback")) {
|
|
2032
1868
|
// Note: we are not touching any batches other than mainBatch here, for two reasons:
|
|
2033
1869
|
// 1. It would not help, as other batches are flushed independently from main batch.
|
|
2034
1870
|
// 2. There is no way to undo process of data store creation, blob creation, ID compressor ops, or other things tracked by other batches.
|
|
2035
1871
|
checkpoint = this.outbox.getBatchCheckpoints().mainBatch;
|
|
2036
1872
|
}
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
1873
|
+
const result = this.batchRunner.run(() => {
|
|
1874
|
+
try {
|
|
1875
|
+
return callback();
|
|
1876
|
+
}
|
|
1877
|
+
catch (error) {
|
|
1878
|
+
if (checkpoint) {
|
|
1879
|
+
// This will throw and close the container if rollback fails
|
|
1880
|
+
try {
|
|
1881
|
+
checkpoint.rollback((message) => this.rollback(message.contents, message.localOpMetadata));
|
|
1882
|
+
// reset the dirty state after rollback to what it was before to keep it consistent
|
|
1883
|
+
if (this.dirtyContainer !== checkpointDirtyState) {
|
|
1884
|
+
this.updateDocumentDirtyState(checkpointDirtyState);
|
|
1885
|
+
}
|
|
1886
|
+
}
|
|
1887
|
+
catch (error_) {
|
|
1888
|
+
const error2 = (0, internal_7.wrapError)(error_, (message) => {
|
|
1889
|
+
return internal_7.DataProcessingError.create(`RollbackError: ${message}`, "checkpointRollback", undefined);
|
|
1890
|
+
});
|
|
1891
|
+
this.closeFn(error2);
|
|
1892
|
+
throw error2;
|
|
1893
|
+
}
|
|
2046
1894
|
}
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
});
|
|
2051
|
-
this.closeFn(error2);
|
|
2052
|
-
throw error2;
|
|
1895
|
+
else {
|
|
1896
|
+
this.closeFn((0, internal_7.wrapError)(error, (errorMessage) => new internal_7.GenericError(`orderSequentially callback exception: ${errorMessage}`, error, {
|
|
1897
|
+
orderSequentiallyCalls: this.batchRunner.runs,
|
|
1898
|
+
})));
|
|
2053
1899
|
}
|
|
1900
|
+
throw error; // throw the original error for the consumer of the runtime
|
|
2054
1901
|
}
|
|
2055
|
-
|
|
2056
|
-
this.closeFn((0, internal_7.wrapError)(error, (errorMessage) => new internal_7.GenericError(`orderSequentially callback exception: ${errorMessage}`, error, {
|
|
2057
|
-
orderSequentiallyCalls: this._orderSequentiallyCalls,
|
|
2058
|
-
})));
|
|
2059
|
-
}
|
|
2060
|
-
throw error; // throw the original error for the consumer of the runtime
|
|
2061
|
-
}
|
|
2062
|
-
finally {
|
|
2063
|
-
this._orderSequentiallyCalls--;
|
|
2064
|
-
}
|
|
1902
|
+
});
|
|
2065
1903
|
// We don't flush on TurnBased since we expect all messages in the same JS turn to be part of the same batch
|
|
2066
|
-
if (this.flushMode !== internal_5.FlushMode.TurnBased && this.
|
|
1904
|
+
if (this.flushMode !== internal_5.FlushMode.TurnBased && !this.batchRunner.running) {
|
|
2067
1905
|
this.flush();
|
|
2068
1906
|
}
|
|
2069
1907
|
return result;
|
|
@@ -2118,7 +1956,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2118
1956
|
* Typically ops are batched and later flushed together, but in some cases we want to flush immediately.
|
|
2119
1957
|
*/
|
|
2120
1958
|
currentlyBatching() {
|
|
2121
|
-
return this.flushMode !== internal_5.FlushMode.Immediate || this.
|
|
1959
|
+
return this.flushMode !== internal_5.FlushMode.Immediate || this.batchRunner.running;
|
|
2122
1960
|
}
|
|
2123
1961
|
getQuorum() {
|
|
2124
1962
|
return this._quorum;
|
|
@@ -2162,43 +2000,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2162
2000
|
}
|
|
2163
2001
|
return true;
|
|
2164
2002
|
}
|
|
2165
|
-
createNewSignalEnvelope(address, type, content) {
|
|
2166
|
-
const newEnvelope = {
|
|
2167
|
-
address,
|
|
2168
|
-
contents: { type, content },
|
|
2169
|
-
};
|
|
2170
|
-
return newEnvelope;
|
|
2171
|
-
}
|
|
2172
|
-
submitEnvelopedSignal(envelope, targetClientId) {
|
|
2173
|
-
const isBroadcastSignal = targetClientId === undefined;
|
|
2174
|
-
if (isBroadcastSignal) {
|
|
2175
|
-
const clientBroadcastSignalSequenceNumber = ++this._signalTracking
|
|
2176
|
-
.broadcastSignalSequenceNumber;
|
|
2177
|
-
// Stamp with the broadcast signal sequence number.
|
|
2178
|
-
envelope.clientBroadcastSignalSequenceNumber = clientBroadcastSignalSequenceNumber;
|
|
2179
|
-
this._signalTracking.signalsSentSinceLastLatencyMeasurement++;
|
|
2180
|
-
if (this._signalTracking.minimumTrackingSignalSequenceNumber === undefined ||
|
|
2181
|
-
this._signalTracking.trackingSignalSequenceNumber === undefined) {
|
|
2182
|
-
// Signal monitoring window is undefined
|
|
2183
|
-
// Initialize tracking to expect the next signal sent by the connected client.
|
|
2184
|
-
this._signalTracking.minimumTrackingSignalSequenceNumber =
|
|
2185
|
-
clientBroadcastSignalSequenceNumber;
|
|
2186
|
-
this._signalTracking.trackingSignalSequenceNumber =
|
|
2187
|
-
clientBroadcastSignalSequenceNumber;
|
|
2188
|
-
}
|
|
2189
|
-
// We should not track the round trip of a new signal in the case we are already tracking one.
|
|
2190
|
-
if (clientBroadcastSignalSequenceNumber % defaultTelemetrySignalSampleCount === 1 &&
|
|
2191
|
-
this._signalTracking.roundTripSignalSequenceNumber === undefined) {
|
|
2192
|
-
this._signalTracking.signalTimestamp = Date.now();
|
|
2193
|
-
this._signalTracking.roundTripSignalSequenceNumber =
|
|
2194
|
-
clientBroadcastSignalSequenceNumber;
|
|
2195
|
-
this._signalTracking.totalSignalsSentInLatencyWindow +=
|
|
2196
|
-
this._signalTracking.signalsSentSinceLastLatencyMeasurement;
|
|
2197
|
-
this._signalTracking.signalsSentSinceLastLatencyMeasurement = 0;
|
|
2198
|
-
}
|
|
2199
|
-
}
|
|
2200
|
-
this.submitSignalFn(envelope, targetClientId);
|
|
2201
|
-
}
|
|
2202
2003
|
/**
|
|
2203
2004
|
* Submits the signal to be sent to other clients.
|
|
2204
2005
|
* @param type - Type of the signal.
|
|
@@ -2213,8 +2014,11 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2213
2014
|
*/
|
|
2214
2015
|
submitSignal(type, content, targetClientId) {
|
|
2215
2016
|
this.verifyNotClosed();
|
|
2216
|
-
const envelope =
|
|
2217
|
-
|
|
2017
|
+
const envelope = createNewSignalEnvelope(undefined /* address */, type, content);
|
|
2018
|
+
if (targetClientId === undefined) {
|
|
2019
|
+
this.signalTelemetryManager.applyTrackingToBroadcastSignalEnvelope(envelope);
|
|
2020
|
+
}
|
|
2021
|
+
this.submitSignalFn(envelope, targetClientId);
|
|
2218
2022
|
}
|
|
2219
2023
|
setAttachState(attachState) {
|
|
2220
2024
|
if (attachState === container_definitions_1.AttachState.Attaching) {
|
|
@@ -2368,13 +2172,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2368
2172
|
* Returns the type of the GC node. Currently, there are nodes that belong to the root ("/"), data stores or
|
|
2369
2173
|
* blob manager.
|
|
2370
2174
|
*/
|
|
2371
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2372
2175
|
getNodeType(nodePath) {
|
|
2373
2176
|
if ((0, index_js_1.isBlobPath)(nodePath)) {
|
|
2374
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2375
2177
|
return index_js_2.GCNodeType.Blob;
|
|
2376
2178
|
}
|
|
2377
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2378
2179
|
return this.channelCollection.getGCNodeType(nodePath) ?? index_js_2.GCNodeType.Other;
|
|
2379
2180
|
}
|
|
2380
2181
|
/**
|
|
@@ -2388,13 +2189,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2388
2189
|
return ["_gcRoot"];
|
|
2389
2190
|
}
|
|
2390
2191
|
switch (this.getNodeType(nodePath)) {
|
|
2391
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2392
2192
|
case index_js_2.GCNodeType.Blob: {
|
|
2393
2193
|
return [index_js_1.blobManagerBasePath];
|
|
2394
2194
|
}
|
|
2395
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2396
2195
|
case index_js_2.GCNodeType.DataStore:
|
|
2397
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2398
2196
|
case index_js_2.GCNodeType.SubDataStore: {
|
|
2399
2197
|
return this.channelCollection.getDataStorePackagePath(nodePath);
|
|
2400
2198
|
}
|
|
@@ -2462,7 +2260,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2462
2260
|
* op processing, updating SummarizerNode state tracking, and garbage collection.
|
|
2463
2261
|
* @param options - options controlling how the summary is generated or submitted
|
|
2464
2262
|
*/
|
|
2465
|
-
// eslint-disable-next-line import/no-deprecated
|
|
2466
2263
|
async submitSummary(options) {
|
|
2467
2264
|
const { cancellationToken, fullTree = false, finalAttempt = false, summaryLogger, latestSummaryRefSeqNum, } = options;
|
|
2468
2265
|
// The summary number for this summary. This will be updated during the summary process, so get it now and
|
|
@@ -2951,7 +2748,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2951
2748
|
break;
|
|
2952
2749
|
}
|
|
2953
2750
|
default: {
|
|
2954
|
-
(0, internal_2.assert)(this.
|
|
2751
|
+
(0, internal_2.assert)(this.batchRunner.running, 0x587 /* Unreachable unless manually accumulating a batch */);
|
|
2955
2752
|
break;
|
|
2956
2753
|
}
|
|
2957
2754
|
}
|
|
@@ -2979,7 +2776,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2979
2776
|
* for correlation to detect container forking.
|
|
2980
2777
|
*/
|
|
2981
2778
|
reSubmitBatch(batch, batchId) {
|
|
2982
|
-
this.
|
|
2779
|
+
this.batchRunner.run(() => {
|
|
2983
2780
|
for (const message of batch) {
|
|
2984
2781
|
this.reSubmit(message);
|
|
2985
2782
|
}
|
|
@@ -3064,7 +2861,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
3064
2861
|
/**
|
|
3065
2862
|
* Implementation of ISummarizerInternalsProvider.refreshLatestSummaryAck
|
|
3066
2863
|
*/
|
|
3067
|
-
// eslint-disable-next-line import/no-deprecated
|
|
3068
2864
|
async refreshLatestSummaryAck(options) {
|
|
3069
2865
|
const { proposalHandle, ackHandle, summaryRefSeq, summaryLogger } = options;
|
|
3070
2866
|
// proposalHandle is always passed from RunningSummarizer.
|
|
@@ -3161,8 +2957,8 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
3161
2957
|
}
|
|
3162
2958
|
getPendingLocalState(props) {
|
|
3163
2959
|
this.verifyNotClosed();
|
|
3164
|
-
if (this.
|
|
3165
|
-
throw new internal_7.UsageError("can't get state
|
|
2960
|
+
if (this.batchRunner.running) {
|
|
2961
|
+
throw new internal_7.UsageError("can't get state while manually accumulating a batch");
|
|
3166
2962
|
}
|
|
3167
2963
|
this.imminentClosure ||= props?.notifyImminentClosure ?? false;
|
|
3168
2964
|
const getSyncState = (pendingAttachmentBlobs) => {
|
|
@@ -3223,28 +3019,17 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
3223
3019
|
return this.summaryManager.enqueueSummarize(options);
|
|
3224
3020
|
}
|
|
3225
3021
|
}
|
|
3226
|
-
/**
|
|
3227
|
-
* Forms a function that will create and retrieve a Summarizer.
|
|
3228
|
-
*/
|
|
3229
|
-
formCreateSummarizerFn(loader) {
|
|
3230
|
-
return async () => {
|
|
3231
|
-
return createSummarizer(loader, `/${summarizerRequestUrl}`);
|
|
3232
|
-
};
|
|
3233
|
-
}
|
|
3234
|
-
validateSummaryHeuristicConfiguration(configuration) {
|
|
3235
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
3236
|
-
for (const prop in configuration) {
|
|
3237
|
-
if (typeof configuration[prop] === "number" && configuration[prop] < 0) {
|
|
3238
|
-
throw new internal_7.UsageError(`Summary heuristic configuration property "${prop}" cannot be less than 0`);
|
|
3239
|
-
}
|
|
3240
|
-
}
|
|
3241
|
-
if (configuration.minIdleTime > configuration.maxIdleTime) {
|
|
3242
|
-
throw new internal_7.UsageError(`"minIdleTime" [${configuration.minIdleTime}] cannot be greater than "maxIdleTime" [${configuration.maxIdleTime}]`);
|
|
3243
|
-
}
|
|
3244
|
-
}
|
|
3245
3022
|
get groupedBatchingEnabled() {
|
|
3246
3023
|
return this.sessionSchema.opGroupingEnabled === true;
|
|
3247
3024
|
}
|
|
3248
3025
|
}
|
|
3249
3026
|
exports.ContainerRuntime = ContainerRuntime;
|
|
3027
|
+
function createNewSignalEnvelope(address, type, content) {
|
|
3028
|
+
const newEnvelope = {
|
|
3029
|
+
address,
|
|
3030
|
+
contents: { type, content },
|
|
3031
|
+
};
|
|
3032
|
+
return newEnvelope;
|
|
3033
|
+
}
|
|
3034
|
+
exports.createNewSignalEnvelope = createNewSignalEnvelope;
|
|
3250
3035
|
//# sourceMappingURL=containerRuntime.js.map
|