@fluidframework/container-runtime 2.0.0-dev-rc.4.0.0.261659 → 2.0.0-dev-rc.5.0.0.265721
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 +46 -0
- package/api-report/container-runtime.api.md +60 -29
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +9 -9
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +3 -5
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +8 -6
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +22 -11
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts +2 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +14 -24
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +125 -140
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +13 -10
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +21 -8
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/{deltaManagerSummarizerProxy.d.ts → deltaManagerProxies.d.ts} +28 -3
- package/dist/deltaManagerProxies.d.ts.map +1 -0
- package/dist/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +38 -2
- package/dist/deltaManagerProxies.js.map +1 -0
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +1 -2
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +1 -1
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +14 -19
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +4 -22
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +3 -3
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +1 -2
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/dist/gc/gcSummaryDefinitions.d.ts +1 -1
- package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -1
- package/dist/gc/gcSummaryDefinitions.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +2 -2
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +2 -2
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +6 -1
- package/dist/messageTypes.d.ts +5 -2
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +4 -0
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +1 -0
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +7 -20
- package/dist/opLifecycle/outbox.js.map +1 -1
- 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 +6 -0
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +10 -1
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.js +2 -2
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/index.d.ts +2 -2
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +4 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +35 -13
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +0 -5
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +28 -113
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +1 -1
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +4 -1
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +1 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -2
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +16 -28
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +1 -1
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +2 -2
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +26 -6
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +7 -8
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +30 -25
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.js +5 -5
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/throttler.js.map +1 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +9 -9
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +4 -6
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +8 -6
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +23 -12
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts +2 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +14 -24
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +125 -140
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +13 -10
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +23 -10
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/{deltaManagerSummarizerProxy.d.ts → deltaManagerProxies.d.ts} +28 -3
- package/lib/deltaManagerProxies.d.ts.map +1 -0
- package/lib/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +36 -1
- package/lib/deltaManagerProxies.js.map +1 -0
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +1 -2
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +1 -1
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +15 -20
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +4 -22
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +2 -2
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +1 -2
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/lib/gc/gcSummaryDefinitions.d.ts +1 -1
- package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -1
- package/lib/gc/gcSummaryDefinitions.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +2 -2
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +1 -1
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- package/lib/gc/index.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +6 -1
- package/lib/messageTypes.d.ts +5 -2
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +4 -0
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +1 -0
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +7 -20
- package/lib/opLifecycle/outbox.js.map +1 -1
- 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 +6 -0
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +10 -1
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.js +2 -2
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/index.d.ts +2 -2
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +4 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +35 -13
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +0 -5
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +21 -106
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +1 -1
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +4 -1
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +1 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -2
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +16 -28
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +2 -2
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +26 -6
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +7 -8
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +24 -19
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.js +1 -1
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/throttler.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +65 -26
- package/src/blobManager.ts +14 -13
- package/src/channelCollection.ts +34 -20
- package/src/connectionTelemetry.ts +1 -1
- package/src/containerHandleContext.ts +2 -1
- package/src/containerRuntime.ts +161 -170
- package/src/dataStore.ts +3 -2
- package/src/dataStoreContext.ts +62 -23
- package/src/{deltaManagerSummarizerProxy.ts → deltaManagerProxies.ts} +55 -3
- package/src/deltaScheduler.ts +1 -1
- package/src/gc/garbageCollection.md +0 -8
- package/src/gc/garbageCollection.ts +2 -1
- package/src/gc/gcConfigs.ts +12 -19
- package/src/gc/gcDefinitions.ts +5 -23
- package/src/gc/gcHelpers.ts +1 -1
- package/src/gc/gcSummaryDefinitions.ts +1 -1
- package/src/gc/gcSummaryStateTracker.ts +1 -1
- package/src/gc/gcTelemetry.ts +1 -1
- package/src/gc/index.ts +1 -1
- package/src/index.ts +6 -1
- package/src/messageTypes.ts +4 -2
- package/src/opLifecycle/batchManager.ts +5 -0
- package/src/opLifecycle/outbox.ts +7 -30
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +11 -1
- package/src/scheduleManager.ts +1 -1
- package/src/summary/documentSchema.ts +1 -1
- package/src/summary/index.ts +5 -1
- package/src/summary/orderedClientElection.ts +83 -12
- package/src/summary/runningSummarizer.ts +30 -114
- package/src/summary/summarizer.ts +5 -2
- package/src/summary/summarizerNode/summarizerNode.ts +0 -2
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +1 -3
- package/src/summary/summarizerTypes.ts +22 -29
- package/src/summary/summaryCollection.ts +1 -1
- package/src/summary/summaryFormat.ts +35 -6
- package/src/summary/summaryGenerator.ts +50 -27
- package/src/summary/summaryManager.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +0 -1
- package/dist/deltaManagerSummarizerProxy.js.map +0 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +0 -1
- package/lib/deltaManagerSummarizerProxy.js.map +0 -1
package/src/containerRuntime.ts
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
IAudience,
|
|
10
10
|
ISelf,
|
|
11
11
|
ICriticalContainerError,
|
|
12
|
-
|
|
12
|
+
type IAudienceEvents,
|
|
13
13
|
} from "@fluidframework/container-definitions";
|
|
14
14
|
import {
|
|
15
15
|
IBatchMessage,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
ILoader,
|
|
19
19
|
IRuntime,
|
|
20
20
|
LoaderHeader,
|
|
21
|
-
|
|
21
|
+
IDeltaManager,
|
|
22
22
|
} from "@fluidframework/container-definitions/internal";
|
|
23
23
|
import {
|
|
24
24
|
IContainerRuntime,
|
|
@@ -27,12 +27,15 @@ import {
|
|
|
27
27
|
import {
|
|
28
28
|
FluidObject,
|
|
29
29
|
IFluidHandle,
|
|
30
|
-
IFluidHandleContext,
|
|
31
|
-
IProvideFluidHandleContext,
|
|
32
30
|
IRequest,
|
|
33
31
|
IResponse,
|
|
34
32
|
ITelemetryBaseLogger,
|
|
35
33
|
} from "@fluidframework/core-interfaces";
|
|
34
|
+
import {
|
|
35
|
+
IFluidHandleContext,
|
|
36
|
+
type IFluidHandleInternal,
|
|
37
|
+
IProvideFluidHandleContext,
|
|
38
|
+
} from "@fluidframework/core-interfaces/internal";
|
|
36
39
|
import { ISignalEnvelope } from "@fluidframework/core-interfaces/internal";
|
|
37
40
|
import {
|
|
38
41
|
assert,
|
|
@@ -67,13 +70,11 @@ import {
|
|
|
67
70
|
MessageType,
|
|
68
71
|
SummaryType,
|
|
69
72
|
} from "@fluidframework/protocol-definitions";
|
|
73
|
+
import { IInboundSignalMessage } from "@fluidframework/runtime-definitions";
|
|
70
74
|
import {
|
|
71
|
-
IGarbageCollectionData,
|
|
72
|
-
IInboundSignalMessage,
|
|
73
75
|
ISummaryTreeWithStats,
|
|
74
76
|
ITelemetryContext,
|
|
75
|
-
|
|
76
|
-
import {
|
|
77
|
+
IGarbageCollectionData,
|
|
77
78
|
CreateChildSummarizerNodeParam,
|
|
78
79
|
FlushMode,
|
|
79
80
|
FlushModeExperimental,
|
|
@@ -130,7 +131,7 @@ import { IPerfSignalReport, ReportOpPerfTelemetry } from "./connectionTelemetry.
|
|
|
130
131
|
import { ContainerFluidHandleContext } from "./containerHandleContext.js";
|
|
131
132
|
import { channelToDataStore } from "./dataStore.js";
|
|
132
133
|
import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
|
|
133
|
-
import { DeltaManagerSummarizerProxy } from "./
|
|
134
|
+
import { DeltaManagerPendingOpsProxy, DeltaManagerSummarizerProxy } from "./deltaManagerProxies.js";
|
|
134
135
|
import {
|
|
135
136
|
GCNodeType,
|
|
136
137
|
GarbageCollector,
|
|
@@ -465,10 +466,7 @@ export interface IContainerRuntimeOptions {
|
|
|
465
466
|
* message to be sent to the service.
|
|
466
467
|
* The grouping an ungrouping of such messages is handled by the "OpGroupingManager".
|
|
467
468
|
*
|
|
468
|
-
* By default, the feature is
|
|
469
|
-
* flag can be used to disable it at runtime.
|
|
470
|
-
*
|
|
471
|
-
* @experimental Not ready for use.
|
|
469
|
+
* By default, the feature is enabled.
|
|
472
470
|
*/
|
|
473
471
|
readonly enableGroupedBatching?: boolean;
|
|
474
472
|
|
|
@@ -801,7 +799,7 @@ export class ContainerRuntime
|
|
|
801
799
|
maxBatchSizeInBytes = defaultMaxBatchSizeInBytes,
|
|
802
800
|
enableRuntimeIdCompressor,
|
|
803
801
|
chunkSizeInBytes = defaultChunkSizeInBytes,
|
|
804
|
-
enableGroupedBatching =
|
|
802
|
+
enableGroupedBatching = true,
|
|
805
803
|
explicitSchemaControl = false,
|
|
806
804
|
} = runtimeOptions;
|
|
807
805
|
|
|
@@ -962,9 +960,6 @@ export class ContainerRuntime
|
|
|
962
960
|
}
|
|
963
961
|
};
|
|
964
962
|
|
|
965
|
-
const disableGroupedBatching = mc.config.getBoolean(
|
|
966
|
-
"Fluid.ContainerRuntime.DisableGroupedBatching",
|
|
967
|
-
);
|
|
968
963
|
const disableCompression = mc.config.getBoolean(
|
|
969
964
|
"Fluid.ContainerRuntime.CompressionDisabled",
|
|
970
965
|
);
|
|
@@ -973,8 +968,6 @@ export class ContainerRuntime
|
|
|
973
968
|
compressionOptions.minimumBatchSizeInBytes !== Infinity &&
|
|
974
969
|
compressionOptions.compressionAlgorithm === "lz4";
|
|
975
970
|
|
|
976
|
-
const opGroupingEnabled = disableGroupedBatching !== true && enableGroupedBatching;
|
|
977
|
-
|
|
978
971
|
const documentSchemaController = new DocumentsSchemaController(
|
|
979
972
|
existing,
|
|
980
973
|
protocolSequenceNumber,
|
|
@@ -983,7 +976,7 @@ export class ContainerRuntime
|
|
|
983
976
|
explicitSchemaControl,
|
|
984
977
|
compressionLz4,
|
|
985
978
|
idCompressorMode,
|
|
986
|
-
opGroupingEnabled,
|
|
979
|
+
opGroupingEnabled: enableGroupedBatching,
|
|
987
980
|
disallowedVersions: [],
|
|
988
981
|
},
|
|
989
982
|
(schema) => {
|
|
@@ -992,7 +985,6 @@ export class ContainerRuntime
|
|
|
992
985
|
);
|
|
993
986
|
|
|
994
987
|
const featureGatesForTelemetry: Record<string, boolean | number | undefined> = {
|
|
995
|
-
disableGroupedBatching,
|
|
996
988
|
disableCompression,
|
|
997
989
|
};
|
|
998
990
|
|
|
@@ -1196,6 +1188,8 @@ export class ContainerRuntime
|
|
|
1196
1188
|
|
|
1197
1189
|
private readonly summarizerNode: IRootSummarizerNodeWithGC;
|
|
1198
1190
|
|
|
1191
|
+
private readonly logger: ITelemetryLoggerExt;
|
|
1192
|
+
|
|
1199
1193
|
private readonly maxConsecutiveReconnects: number;
|
|
1200
1194
|
private readonly defaultMaxConsecutiveReconnects = 7;
|
|
1201
1195
|
|
|
@@ -1356,7 +1350,8 @@ export class ContainerRuntime
|
|
|
1356
1350
|
dataStoreAliasMap: [string, string][],
|
|
1357
1351
|
private readonly runtimeOptions: Readonly<Required<IContainerRuntimeOptions>>,
|
|
1358
1352
|
private readonly containerScope: FluidObject,
|
|
1359
|
-
|
|
1353
|
+
// Create a custom ITelemetryBaseLogger to output telemetry events.
|
|
1354
|
+
public readonly baseLogger: ITelemetryBaseLogger,
|
|
1360
1355
|
existing: boolean,
|
|
1361
1356
|
blobManagerSnapshot: IBlobManagerLoadInfo,
|
|
1362
1357
|
private readonly _storage: IDocumentStorageService,
|
|
@@ -1394,8 +1389,10 @@ export class ContainerRuntime
|
|
|
1394
1389
|
loader,
|
|
1395
1390
|
pendingLocalState,
|
|
1396
1391
|
supportedFeatures,
|
|
1392
|
+
snapshotWithContents,
|
|
1397
1393
|
} = context;
|
|
1398
1394
|
|
|
1395
|
+
this.logger = createChildLogger({ logger: this.baseLogger });
|
|
1399
1396
|
this.mc = createChildMonitoringContext({
|
|
1400
1397
|
logger: this.logger,
|
|
1401
1398
|
namespace: "ContainerRuntime",
|
|
@@ -1413,7 +1410,6 @@ export class ContainerRuntime
|
|
|
1413
1410
|
};
|
|
1414
1411
|
|
|
1415
1412
|
this.innerDeltaManager = deltaManager;
|
|
1416
|
-
this.deltaManager = new DeltaManagerSummarizerProxy(this.innerDeltaManager);
|
|
1417
1413
|
|
|
1418
1414
|
// Here we could wrap/intercept on these functions to block/modify outgoing messages if needed.
|
|
1419
1415
|
// This makes ContainerRuntime the final gatekeeper for outgoing messages.
|
|
@@ -1518,6 +1514,44 @@ export class ContainerRuntime
|
|
|
1518
1514
|
opGroupingManager,
|
|
1519
1515
|
);
|
|
1520
1516
|
|
|
1517
|
+
const pendingRuntimeState = pendingLocalState as IPendingRuntimeState | undefined;
|
|
1518
|
+
this.pendingStateManager = new PendingStateManager(
|
|
1519
|
+
{
|
|
1520
|
+
applyStashedOp: this.applyStashedOp.bind(this),
|
|
1521
|
+
clientId: () => this.clientId,
|
|
1522
|
+
close: this.closeFn,
|
|
1523
|
+
connected: () => this.connected,
|
|
1524
|
+
reSubmit: (message: IPendingBatchMessage) => {
|
|
1525
|
+
this.reSubmit(message);
|
|
1526
|
+
this.flush();
|
|
1527
|
+
},
|
|
1528
|
+
reSubmitBatch: this.reSubmitBatch.bind(this),
|
|
1529
|
+
isActiveConnection: () => this.innerDeltaManager.active,
|
|
1530
|
+
isAttached: () => this.attachState !== AttachState.Detached,
|
|
1531
|
+
},
|
|
1532
|
+
pendingRuntimeState?.pending,
|
|
1533
|
+
this.logger,
|
|
1534
|
+
);
|
|
1535
|
+
|
|
1536
|
+
let outerDeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;
|
|
1537
|
+
const useDeltaManagerOpsProxy =
|
|
1538
|
+
this.mc.config.getBoolean("Fluid.ContainerRuntime.DeltaManagerOpsProxy") !== false;
|
|
1539
|
+
// The summarizerDeltaManager Proxy is used to lie to the summarizer to convince it is in the right state as a summarizer client.
|
|
1540
|
+
const summarizerDeltaManagerProxy = new DeltaManagerSummarizerProxy(this.innerDeltaManager);
|
|
1541
|
+
outerDeltaManager = summarizerDeltaManagerProxy;
|
|
1542
|
+
|
|
1543
|
+
// The DeltaManagerPendingOpsProxy is used to control the minimum sequence number
|
|
1544
|
+
// It allows us to lie to the layers below so that they can maintain enough local state for rebasing ops.
|
|
1545
|
+
if (useDeltaManagerOpsProxy) {
|
|
1546
|
+
const pendingOpsDeltaManagerProxy = new DeltaManagerPendingOpsProxy(
|
|
1547
|
+
summarizerDeltaManagerProxy,
|
|
1548
|
+
this.pendingStateManager,
|
|
1549
|
+
);
|
|
1550
|
+
outerDeltaManager = pendingOpsDeltaManagerProxy;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
this.deltaManager = outerDeltaManager;
|
|
1554
|
+
|
|
1521
1555
|
this.handleContext = new ContainerFluidHandleContext("", this);
|
|
1522
1556
|
|
|
1523
1557
|
if (this.summaryConfiguration.state === "enabled") {
|
|
@@ -1543,8 +1577,6 @@ export class ContainerRuntime
|
|
|
1543
1577
|
this._flushMode = runtimeOptions.flushMode;
|
|
1544
1578
|
}
|
|
1545
1579
|
|
|
1546
|
-
const pendingRuntimeState = pendingLocalState as IPendingRuntimeState | undefined;
|
|
1547
|
-
|
|
1548
1580
|
if (context.attachState === AttachState.Attached) {
|
|
1549
1581
|
const maxSnapshotCacheDurationMs = this._storage?.policies?.maximumCacheDurationMs;
|
|
1550
1582
|
if (
|
|
@@ -1616,8 +1648,19 @@ export class ContainerRuntime
|
|
|
1616
1648
|
return this.submitSignalFn(envelope2, targetClientId);
|
|
1617
1649
|
};
|
|
1618
1650
|
|
|
1651
|
+
let snapshot: ISnapshot | ISnapshotTree | undefined = getSummaryForDatastores(
|
|
1652
|
+
baseSnapshot,
|
|
1653
|
+
metadata,
|
|
1654
|
+
);
|
|
1655
|
+
if (snapshot !== undefined && snapshotWithContents !== undefined) {
|
|
1656
|
+
snapshot = {
|
|
1657
|
+
...snapshotWithContents,
|
|
1658
|
+
snapshotTree: snapshot,
|
|
1659
|
+
};
|
|
1660
|
+
}
|
|
1661
|
+
|
|
1619
1662
|
this.channelCollection = new ChannelCollection(
|
|
1620
|
-
|
|
1663
|
+
snapshot,
|
|
1621
1664
|
parentContext,
|
|
1622
1665
|
this.mc.logger,
|
|
1623
1666
|
(props) => this.garbageCollector.nodeUpdated(props),
|
|
@@ -1660,24 +1703,6 @@ export class ContainerRuntime
|
|
|
1660
1703
|
createChildLogger({ logger: this.logger, namespace: "ScheduleManager" }),
|
|
1661
1704
|
);
|
|
1662
1705
|
|
|
1663
|
-
this.pendingStateManager = new PendingStateManager(
|
|
1664
|
-
{
|
|
1665
|
-
applyStashedOp: this.applyStashedOp.bind(this),
|
|
1666
|
-
clientId: () => this.clientId,
|
|
1667
|
-
close: this.closeFn,
|
|
1668
|
-
connected: () => this.connected,
|
|
1669
|
-
reSubmit: (message: IPendingBatchMessage) => {
|
|
1670
|
-
this.reSubmit(message);
|
|
1671
|
-
this.flush();
|
|
1672
|
-
},
|
|
1673
|
-
reSubmitBatch: this.reSubmitBatch.bind(this),
|
|
1674
|
-
isActiveConnection: () => this.innerDeltaManager.active,
|
|
1675
|
-
isAttached: () => this.attachState !== AttachState.Detached,
|
|
1676
|
-
},
|
|
1677
|
-
pendingRuntimeState?.pending,
|
|
1678
|
-
this.logger,
|
|
1679
|
-
);
|
|
1680
|
-
|
|
1681
1706
|
const disablePartialFlush = this.mc.config.getBoolean(
|
|
1682
1707
|
"Fluid.ContainerRuntime.DisablePartialFlush",
|
|
1683
1708
|
);
|
|
@@ -1729,7 +1754,7 @@ export class ContainerRuntime
|
|
|
1729
1754
|
let oldClientId = this.clientId;
|
|
1730
1755
|
this.on("connected", () => {
|
|
1731
1756
|
const clientId = this.clientId;
|
|
1732
|
-
assert(clientId !== undefined,
|
|
1757
|
+
assert(clientId !== undefined, 0x975 /* can't be undefined */);
|
|
1733
1758
|
(audience as unknown as TypedEventEmitter<IAudienceEvents>).emit(
|
|
1734
1759
|
"selfChanged",
|
|
1735
1760
|
{ clientId: oldClientId },
|
|
@@ -1766,6 +1791,9 @@ export class ContainerRuntime
|
|
|
1766
1791
|
orderedClientCollection,
|
|
1767
1792
|
electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber,
|
|
1768
1793
|
SummarizerClientElection.isClientEligible,
|
|
1794
|
+
this.mc.config.getBoolean(
|
|
1795
|
+
"Fluid.ContainerRuntime.OrderedClientElection.EnablePerformanceEvents",
|
|
1796
|
+
),
|
|
1769
1797
|
);
|
|
1770
1798
|
|
|
1771
1799
|
this.summarizerClientElection = new SummarizerClientElection(
|
|
@@ -1838,7 +1866,7 @@ export class ContainerRuntime
|
|
|
1838
1866
|
}
|
|
1839
1867
|
|
|
1840
1868
|
// logging hardware telemetry
|
|
1841
|
-
logger.sendTelemetryEvent({
|
|
1869
|
+
this.logger.sendTelemetryEvent({
|
|
1842
1870
|
eventName: "DeviceSpec",
|
|
1843
1871
|
...getDeviceSpec(),
|
|
1844
1872
|
});
|
|
@@ -2321,6 +2349,7 @@ export class ContainerRuntime
|
|
|
2321
2349
|
let newState: boolean;
|
|
2322
2350
|
|
|
2323
2351
|
try {
|
|
2352
|
+
this.submitIdAllocationOpIfNeeded(true);
|
|
2324
2353
|
// replay the ops
|
|
2325
2354
|
this.pendingStateManager.replayPendingStates();
|
|
2326
2355
|
} finally {
|
|
@@ -2373,8 +2402,6 @@ export class ContainerRuntime
|
|
|
2373
2402
|
return;
|
|
2374
2403
|
case ContainerMessageType.BlobAttach:
|
|
2375
2404
|
return;
|
|
2376
|
-
case ContainerMessageType.ChunkedOp:
|
|
2377
|
-
throw new Error("chunkedOp not expected here");
|
|
2378
2405
|
case ContainerMessageType.Rejoin:
|
|
2379
2406
|
throw new Error("rejoin not expected here");
|
|
2380
2407
|
case ContainerMessageType.GC:
|
|
@@ -2387,7 +2414,7 @@ export class ContainerRuntime
|
|
|
2387
2414
|
const compatBehavior = opContents.compatDetails?.behavior;
|
|
2388
2415
|
if (!compatBehaviorAllowsMessageType(opContents.type, compatBehavior)) {
|
|
2389
2416
|
const error = DataProcessingError.create(
|
|
2390
|
-
"Stashed runtime message of
|
|
2417
|
+
"Stashed runtime message of unexpected type",
|
|
2391
2418
|
"applyStashedOp",
|
|
2392
2419
|
undefined /* sequencedMessage */,
|
|
2393
2420
|
{
|
|
@@ -2420,7 +2447,7 @@ export class ContainerRuntime
|
|
|
2420
2447
|
for (const range of ops) {
|
|
2421
2448
|
compressor.finalizeCreationRange(range);
|
|
2422
2449
|
}
|
|
2423
|
-
assert(this.pendingIdCompressorOps.length === 0,
|
|
2450
|
+
assert(this.pendingIdCompressorOps.length === 0, 0x976 /* No new ops added */);
|
|
2424
2451
|
this._idCompressor = compressor;
|
|
2425
2452
|
})
|
|
2426
2453
|
.catch((error) => {
|
|
@@ -2434,8 +2461,11 @@ export class ContainerRuntime
|
|
|
2434
2461
|
public setConnectionState(connected: boolean, clientId?: string) {
|
|
2435
2462
|
// Validate we have consistent state
|
|
2436
2463
|
const currentClientId = this._audience.getSelf()?.clientId;
|
|
2437
|
-
assert(clientId === currentClientId,
|
|
2438
|
-
assert(
|
|
2464
|
+
assert(clientId === currentClientId, 0x977 /* input clientId does not match Audience */);
|
|
2465
|
+
assert(
|
|
2466
|
+
this.clientId === currentClientId,
|
|
2467
|
+
0x978 /* this.clientId does not match Audience */,
|
|
2468
|
+
);
|
|
2439
2469
|
|
|
2440
2470
|
if (connected && this.idCompressorMode === "delayed") {
|
|
2441
2471
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
@@ -2582,6 +2612,17 @@ export class ContainerRuntime
|
|
|
2582
2612
|
*/
|
|
2583
2613
|
private processCore(messageWithContext: MessageWithContext) {
|
|
2584
2614
|
const { message, local } = messageWithContext;
|
|
2615
|
+
|
|
2616
|
+
// Intercept to reduce minimum sequence number to the delta manager's minimum sequence number.
|
|
2617
|
+
// Sequence numbers are not guaranteed to follow any sort of order. Re-entrancy is one of those situations
|
|
2618
|
+
if (
|
|
2619
|
+
this.deltaManager.minimumSequenceNumber <
|
|
2620
|
+
messageWithContext.message.minimumSequenceNumber
|
|
2621
|
+
) {
|
|
2622
|
+
messageWithContext.message.minimumSequenceNumber =
|
|
2623
|
+
this.deltaManager.minimumSequenceNumber;
|
|
2624
|
+
}
|
|
2625
|
+
|
|
2585
2626
|
// Surround the actual processing of the operation with messages to the schedule manager indicating
|
|
2586
2627
|
// the beginning and end. This allows it to emit appropriate events and/or pause the processing of new
|
|
2587
2628
|
// messages once a batch has been fully processed.
|
|
@@ -2672,7 +2713,7 @@ export class ContainerRuntime
|
|
|
2672
2713
|
} else {
|
|
2673
2714
|
assert(
|
|
2674
2715
|
this.pendingIdCompressorOps.length === 0,
|
|
2675
|
-
|
|
2716
|
+
0x979 /* there should be no pending ops! */,
|
|
2676
2717
|
);
|
|
2677
2718
|
this._idCompressor.finalizeCreationRange(range);
|
|
2678
2719
|
}
|
|
@@ -3204,7 +3245,7 @@ export class ContainerRuntime
|
|
|
3204
3245
|
|
|
3205
3246
|
return { stats, summary };
|
|
3206
3247
|
} finally {
|
|
3207
|
-
|
|
3248
|
+
summaryLogger.sendTelemetryEvent({
|
|
3208
3249
|
eventName: "SummarizeTelemetry",
|
|
3209
3250
|
details: telemetryContext.serialize(),
|
|
3210
3251
|
});
|
|
@@ -3401,7 +3442,6 @@ export class ContainerRuntime
|
|
|
3401
3442
|
const {
|
|
3402
3443
|
fullTree = false,
|
|
3403
3444
|
finalAttempt = false,
|
|
3404
|
-
refreshLatestAck,
|
|
3405
3445
|
summaryLogger,
|
|
3406
3446
|
latestSummaryRefSeqNum,
|
|
3407
3447
|
} = options;
|
|
@@ -3421,16 +3461,6 @@ export class ContainerRuntime
|
|
|
3421
3461
|
|
|
3422
3462
|
assert(this.outbox.isEmpty, 0x3d1 /* Can't trigger summary in the middle of a batch */);
|
|
3423
3463
|
|
|
3424
|
-
// We close the summarizer and download a new snapshot and reload the container
|
|
3425
|
-
if (refreshLatestAck === true) {
|
|
3426
|
-
return this.prefetchLatestSummaryThenClose(
|
|
3427
|
-
createChildLogger({
|
|
3428
|
-
logger: summaryNumberLogger,
|
|
3429
|
-
properties: { all: { safeSummary: true } },
|
|
3430
|
-
}),
|
|
3431
|
-
);
|
|
3432
|
-
}
|
|
3433
|
-
|
|
3434
3464
|
// If the container is dirty, i.e., there are pending unacked ops, the summary will not be eventual consistent
|
|
3435
3465
|
// and it may even be incorrect. So, wait for the container to be saved with a timeout. If the container is not
|
|
3436
3466
|
// saved within the timeout, check if it should be failed or can continue.
|
|
@@ -3526,7 +3556,7 @@ export class ContainerRuntime
|
|
|
3526
3556
|
stage: "base",
|
|
3527
3557
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
3528
3558
|
minimumSequenceNumber,
|
|
3529
|
-
error: new
|
|
3559
|
+
error: new RetriableSummaryError(
|
|
3530
3560
|
`Summarizer node state inconsistent with summarizer state.`,
|
|
3531
3561
|
),
|
|
3532
3562
|
};
|
|
@@ -3578,7 +3608,7 @@ export class ContainerRuntime
|
|
|
3578
3608
|
stage: "base",
|
|
3579
3609
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
3580
3610
|
minimumSequenceNumber,
|
|
3581
|
-
error: new
|
|
3611
|
+
error: new RetriableSummaryError(continueResult.error),
|
|
3582
3612
|
};
|
|
3583
3613
|
}
|
|
3584
3614
|
|
|
@@ -3599,7 +3629,7 @@ export class ContainerRuntime
|
|
|
3599
3629
|
stage: "base",
|
|
3600
3630
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
3601
3631
|
minimumSequenceNumber,
|
|
3602
|
-
error: wrapError(error, (msg) => new
|
|
3632
|
+
error: wrapError(error, (msg) => new RetriableSummaryError(msg)),
|
|
3603
3633
|
};
|
|
3604
3634
|
}
|
|
3605
3635
|
|
|
@@ -3674,7 +3704,7 @@ export class ContainerRuntime
|
|
|
3674
3704
|
return {
|
|
3675
3705
|
stage: "generate",
|
|
3676
3706
|
...generateSummaryData,
|
|
3677
|
-
error: new
|
|
3707
|
+
error: new RetriableSummaryError(continueResult.error),
|
|
3678
3708
|
};
|
|
3679
3709
|
}
|
|
3680
3710
|
|
|
@@ -3701,7 +3731,7 @@ export class ContainerRuntime
|
|
|
3701
3731
|
return {
|
|
3702
3732
|
stage: "generate",
|
|
3703
3733
|
...generateSummaryData,
|
|
3704
|
-
error: wrapError(error, (msg) => new
|
|
3734
|
+
error: wrapError(error, (msg) => new RetriableSummaryError(msg)),
|
|
3705
3735
|
};
|
|
3706
3736
|
}
|
|
3707
3737
|
|
|
@@ -3724,7 +3754,7 @@ export class ContainerRuntime
|
|
|
3724
3754
|
return {
|
|
3725
3755
|
stage: "upload",
|
|
3726
3756
|
...uploadData,
|
|
3727
|
-
error: new
|
|
3757
|
+
error: new RetriableSummaryError(continueResult.error),
|
|
3728
3758
|
};
|
|
3729
3759
|
}
|
|
3730
3760
|
|
|
@@ -3735,7 +3765,7 @@ export class ContainerRuntime
|
|
|
3735
3765
|
return {
|
|
3736
3766
|
stage: "upload",
|
|
3737
3767
|
...uploadData,
|
|
3738
|
-
error: wrapError(error, (msg) => new
|
|
3768
|
+
error: wrapError(error, (msg) => new RetriableSummaryError(msg)),
|
|
3739
3769
|
};
|
|
3740
3770
|
}
|
|
3741
3771
|
|
|
@@ -3752,7 +3782,7 @@ export class ContainerRuntime
|
|
|
3752
3782
|
return {
|
|
3753
3783
|
stage: "upload",
|
|
3754
3784
|
...uploadData,
|
|
3755
|
-
error: wrapError(error, (msg) => new
|
|
3785
|
+
error: wrapError(error, (msg) => new RetriableSummaryError(msg)),
|
|
3756
3786
|
};
|
|
3757
3787
|
}
|
|
3758
3788
|
return submitData;
|
|
@@ -3880,16 +3910,18 @@ export class ContainerRuntime
|
|
|
3880
3910
|
public async uploadBlob(
|
|
3881
3911
|
blob: ArrayBufferLike,
|
|
3882
3912
|
signal?: AbortSignal,
|
|
3883
|
-
): Promise<
|
|
3913
|
+
): Promise<IFluidHandleInternal<ArrayBufferLike>> {
|
|
3884
3914
|
this.verifyNotClosed();
|
|
3885
3915
|
return this.blobManager.createBlob(blob, signal);
|
|
3886
3916
|
}
|
|
3887
3917
|
|
|
3888
|
-
private submitIdAllocationOpIfNeeded(): void {
|
|
3918
|
+
private submitIdAllocationOpIfNeeded(resubmitOutstandingRanges: boolean): void {
|
|
3889
3919
|
if (this._idCompressor) {
|
|
3890
|
-
const idRange =
|
|
3920
|
+
const idRange = resubmitOutstandingRanges
|
|
3921
|
+
? this._idCompressor.takeUnfinalizedCreationRange()
|
|
3922
|
+
: this._idCompressor.takeNextCreationRange();
|
|
3891
3923
|
// Don't include the idRange if there weren't any Ids allocated
|
|
3892
|
-
if (idRange
|
|
3924
|
+
if (idRange.ids !== undefined) {
|
|
3893
3925
|
const idAllocationMessage: ContainerRuntimeIdAllocationMessage = {
|
|
3894
3926
|
type: ContainerMessageType.IdAllocation,
|
|
3895
3927
|
contents: idRange,
|
|
@@ -3934,6 +3966,10 @@ export class ContainerRuntime
|
|
|
3934
3966
|
}
|
|
3935
3967
|
|
|
3936
3968
|
const type = containerRuntimeMessage.type;
|
|
3969
|
+
assert(
|
|
3970
|
+
type !== ContainerMessageType.IdAllocation,
|
|
3971
|
+
"IdAllocation should be submitted directly to outbox.",
|
|
3972
|
+
);
|
|
3937
3973
|
const message: BatchMessage = {
|
|
3938
3974
|
contents: serializedContent,
|
|
3939
3975
|
metadata,
|
|
@@ -3942,44 +3978,36 @@ export class ContainerRuntime
|
|
|
3942
3978
|
};
|
|
3943
3979
|
|
|
3944
3980
|
try {
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
//
|
|
3948
|
-
//
|
|
3949
|
-
|
|
3950
|
-
|
|
3951
|
-
|
|
3952
|
-
this.
|
|
3953
|
-
|
|
3954
|
-
|
|
3955
|
-
|
|
3956
|
-
|
|
3957
|
-
|
|
3958
|
-
|
|
3959
|
-
|
|
3960
|
-
|
|
3961
|
-
|
|
3962
|
-
|
|
3963
|
-
|
|
3964
|
-
|
|
3965
|
-
|
|
3966
|
-
|
|
3967
|
-
|
|
3968
|
-
|
|
3969
|
-
contents,
|
|
3970
|
-
};
|
|
3971
|
-
this.outbox.submit({
|
|
3972
|
-
contents: JSON.stringify(msg),
|
|
3973
|
-
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
3974
|
-
});
|
|
3975
|
-
}
|
|
3981
|
+
this.submitIdAllocationOpIfNeeded(false);
|
|
3982
|
+
|
|
3983
|
+
// Allow document schema controller to send a message if it needs to propose change in document schema.
|
|
3984
|
+
// If it needs to send a message, it will call provided callback with payload of such message and rely
|
|
3985
|
+
// on this callback to do actual sending.
|
|
3986
|
+
const contents = this.documentsSchemaController.maybeSendSchemaMessage();
|
|
3987
|
+
if (contents) {
|
|
3988
|
+
this.logger.sendTelemetryEvent({
|
|
3989
|
+
eventName: "SchemaChangeProposal",
|
|
3990
|
+
refSeq: contents.refSeq,
|
|
3991
|
+
version: contents.version,
|
|
3992
|
+
newRuntimeSchema: JSON.stringify(contents.runtime),
|
|
3993
|
+
sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
|
|
3994
|
+
oldRuntimeSchema: JSON.stringify(this.metadata?.documentSchema?.runtime),
|
|
3995
|
+
});
|
|
3996
|
+
const msg: ContainerRuntimeDocumentSchemaMessage = {
|
|
3997
|
+
type: ContainerMessageType.DocumentSchemaChange,
|
|
3998
|
+
contents,
|
|
3999
|
+
};
|
|
4000
|
+
this.outbox.submit({
|
|
4001
|
+
contents: JSON.stringify(msg),
|
|
4002
|
+
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
4003
|
+
});
|
|
4004
|
+
}
|
|
3976
4005
|
|
|
3977
|
-
|
|
3978
|
-
|
|
3979
|
-
|
|
3980
|
-
|
|
3981
|
-
|
|
3982
|
-
}
|
|
4006
|
+
if (type === ContainerMessageType.BlobAttach) {
|
|
4007
|
+
// BlobAttach ops must have their metadata visible and cannot be grouped (see opGroupingManager.ts)
|
|
4008
|
+
this.outbox.submitBlobAttach(message);
|
|
4009
|
+
} else {
|
|
4010
|
+
this.outbox.submit(message);
|
|
3983
4011
|
}
|
|
3984
4012
|
|
|
3985
4013
|
if (!this.currentlyBatching()) {
|
|
@@ -4103,11 +4131,15 @@ export class ContainerRuntime
|
|
|
4103
4131
|
this.channelCollection.reSubmit(message.type, message.contents, localOpMetadata);
|
|
4104
4132
|
break;
|
|
4105
4133
|
case ContainerMessageType.IdAllocation: {
|
|
4106
|
-
|
|
4134
|
+
// Allocation ops are never resubmitted/rebased. This is because they require special handling to
|
|
4135
|
+
// avoid being submitted out of order. For example, if the pending state manager contained
|
|
4136
|
+
// [idOp1, dataOp1, idOp2, dataOp2] and the resubmission of dataOp1 generated idOp3, that would be
|
|
4137
|
+
// placed into the outbox in the same batch as idOp1, but before idOp2 is resubmitted.
|
|
4138
|
+
// To avoid this, allocation ops are simply never resubmitted. Prior to invoking the pending state
|
|
4139
|
+
// manager to replay pending ops, the runtime will always submit a new allocation range that includes
|
|
4140
|
+
// all pending IDs. The resubmitted allocation ops are then ignored here.
|
|
4107
4141
|
break;
|
|
4108
4142
|
}
|
|
4109
|
-
case ContainerMessageType.ChunkedOp:
|
|
4110
|
-
throw new Error(`chunkedOp not expected here`);
|
|
4111
4143
|
case ContainerMessageType.BlobAttach:
|
|
4112
4144
|
this.blobManager.reSubmit(opMetadata);
|
|
4113
4145
|
break;
|
|
@@ -4134,7 +4166,7 @@ export class ContainerRuntime
|
|
|
4134
4166
|
});
|
|
4135
4167
|
} else {
|
|
4136
4168
|
const error = DataProcessingError.create(
|
|
4137
|
-
"Resubmitting runtime message of
|
|
4169
|
+
"Resubmitting runtime message of unexpected type",
|
|
4138
4170
|
"reSubmitCore",
|
|
4139
4171
|
undefined /* sequencedMessage */,
|
|
4140
4172
|
{
|
|
@@ -4184,7 +4216,7 @@ export class ContainerRuntime
|
|
|
4184
4216
|
* and then close as the current main client is likely to be re-elected as the parent summarizer again.
|
|
4185
4217
|
*/
|
|
4186
4218
|
if (!result.isSummaryTracked && result.isSummaryNewer) {
|
|
4187
|
-
await this.
|
|
4219
|
+
await this.fetchLatestSnapshotAndClose(
|
|
4188
4220
|
summaryLogger,
|
|
4189
4221
|
{
|
|
4190
4222
|
eventName: "RefreshLatestSummaryAckFetch",
|
|
@@ -4193,8 +4225,6 @@ export class ContainerRuntime
|
|
|
4193
4225
|
},
|
|
4194
4226
|
readAndParseBlob,
|
|
4195
4227
|
);
|
|
4196
|
-
|
|
4197
|
-
await this.closeStaleSummarizer();
|
|
4198
4228
|
return;
|
|
4199
4229
|
}
|
|
4200
4230
|
|
|
@@ -4203,54 +4233,16 @@ export class ContainerRuntime
|
|
|
4203
4233
|
}
|
|
4204
4234
|
|
|
4205
4235
|
/**
|
|
4206
|
-
* Fetches the latest snapshot from storage
|
|
4207
|
-
*
|
|
4208
|
-
*
|
|
4209
|
-
* @returns a generic summarization error
|
|
4236
|
+
* Fetches the latest snapshot from storage and closes the container. This is done in cases where
|
|
4237
|
+
* the last known snapshot is older than the latest one. This will ensure that the latest snapshot
|
|
4238
|
+
* is downloaded and we don't end up loading snapshot from cache.
|
|
4210
4239
|
*/
|
|
4211
|
-
private async
|
|
4212
|
-
summaryLogger: ITelemetryLoggerExt,
|
|
4213
|
-
): Promise<IBaseSummarizeResult> {
|
|
4214
|
-
const readAndParseBlob = async <T>(id: string) => readAndParse<T>(this.storage, id);
|
|
4215
|
-
|
|
4216
|
-
// This is a performance optimization as the same parent is likely to be elected again, and would use its
|
|
4217
|
-
// cache to fetch the snapshot instead of the network.
|
|
4218
|
-
await this.fetchLatestSnapshotFromStorage(
|
|
4219
|
-
summaryLogger,
|
|
4220
|
-
{
|
|
4221
|
-
eventName: "RefreshLatestSummaryFromServerFetch",
|
|
4222
|
-
},
|
|
4223
|
-
readAndParseBlob,
|
|
4224
|
-
);
|
|
4225
|
-
|
|
4226
|
-
await this.closeStaleSummarizer();
|
|
4227
|
-
|
|
4228
|
-
return {
|
|
4229
|
-
stage: "base",
|
|
4230
|
-
error: new LoggingError("summary state stale - Unsupported option 'refreshLatestAck'"),
|
|
4231
|
-
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
4232
|
-
minimumSequenceNumber: this.deltaManager.minimumSequenceNumber,
|
|
4233
|
-
};
|
|
4234
|
-
}
|
|
4235
|
-
|
|
4236
|
-
private async closeStaleSummarizer(): Promise<void> {
|
|
4237
|
-
// Delay before restarting summarizer to prevent the summarizer from restarting too frequently.
|
|
4238
|
-
await delay(this.closeSummarizerDelayMs);
|
|
4239
|
-
this._summarizer?.stop("latestSummaryStateStale");
|
|
4240
|
-
this.disposeFn();
|
|
4241
|
-
}
|
|
4242
|
-
|
|
4243
|
-
/**
|
|
4244
|
-
* Downloads the latest snapshot from storage.
|
|
4245
|
-
* By default, it also closes the container after downloading the snapshot. However, this may be
|
|
4246
|
-
* overridden via options.
|
|
4247
|
-
*/
|
|
4248
|
-
private async fetchLatestSnapshotFromStorage(
|
|
4240
|
+
private async fetchLatestSnapshotAndClose(
|
|
4249
4241
|
logger: ITelemetryLoggerExt,
|
|
4250
4242
|
event: ITelemetryGenericEventExt,
|
|
4251
4243
|
readAndParseBlob: ReadAndParseBlob,
|
|
4252
|
-
)
|
|
4253
|
-
|
|
4244
|
+
) {
|
|
4245
|
+
await PerformanceEvent.timedExecAsync(
|
|
4254
4246
|
logger,
|
|
4255
4247
|
event,
|
|
4256
4248
|
async (perfEvent: {
|
|
@@ -4289,13 +4281,12 @@ export class ContainerRuntime
|
|
|
4289
4281
|
stats.snapshotVersion = versions[0].id;
|
|
4290
4282
|
|
|
4291
4283
|
perfEvent.end(stats);
|
|
4292
|
-
return {
|
|
4293
|
-
snapshotTree: maybeSnapshot,
|
|
4294
|
-
versionId: versions[0].id,
|
|
4295
|
-
latestSnapshotRefSeq,
|
|
4296
|
-
};
|
|
4297
4284
|
},
|
|
4298
4285
|
);
|
|
4286
|
+
|
|
4287
|
+
await delay(this.closeSummarizerDelayMs);
|
|
4288
|
+
this._summarizer?.stop("latestSummaryStateStale");
|
|
4289
|
+
this.disposeFn();
|
|
4299
4290
|
}
|
|
4300
4291
|
|
|
4301
4292
|
public getPendingLocalState(props?: IGetPendingLocalStateProps): unknown {
|