@fluidframework/container-runtime 2.0.0-dev-rc.2.0.0.246488 → 2.0.0-dev-rc.3.0.0.250606
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/api-report/container-runtime.api.md +78 -25
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +2 -2
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +3 -3
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +3 -3
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +5 -5
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +44 -11
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +2 -2
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +3 -3
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/container-runtime-alpha.d.ts +205 -11
- package/dist/container-runtime-beta.d.ts +16 -2
- package/dist/container-runtime-public.d.ts +16 -2
- package/dist/container-runtime-untrimmed.d.ts +205 -24
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +32 -26
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +213 -119
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +2 -2
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +4 -4
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +18 -18
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +1 -1
- 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 +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +1 -1
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.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.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/messageTypes.d.ts +11 -5
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +4 -0
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +1 -19
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +3 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +2 -3
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +15 -4
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +60 -61
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +9 -11
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +11 -3
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +48 -38
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +7 -12
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +36 -35
- 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 +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -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 +2 -2
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +178 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +345 -0
- package/dist/summary/documentSchema.js.map +1 -0
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +4 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +3 -2
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +2 -2
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +2 -2
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +2 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +2 -2
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -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 +3 -3
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +3 -3
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +1 -1
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +5 -16
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +2 -2
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +2 -2
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +2 -2
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +3 -3
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +5 -5
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +5 -5
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +46 -13
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +2 -2
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/container-runtime-alpha.d.ts +205 -11
- package/lib/container-runtime-beta.d.ts +16 -2
- package/lib/container-runtime-public.d.ts +16 -2
- package/lib/container-runtime-untrimmed.d.ts +205 -24
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +32 -26
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +175 -81
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +2 -2
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +4 -4
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +3 -3
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +3 -3
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +1 -1
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +1 -1
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.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 +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 +1 -1
- 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/messageTypes.d.ts +11 -5
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js +4 -0
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +1 -19
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +3 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +15 -4
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +60 -61
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +7 -10
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +11 -3
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +46 -37
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +7 -12
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +36 -35
- 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 +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -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 +2 -2
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +178 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +341 -0
- package/lib/summary/documentSchema.js.map +1 -0
- 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 +2 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +3 -2
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +2 -2
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +3 -3
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +2 -2
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +2 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -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 +4 -4
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +3 -3
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +5 -16
- 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 +2 -2
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +3 -3
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +2 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/test/blobManager.spec.js +3 -3
- package/lib/test/blobManager.spec.js.map +1 -1
- package/lib/test/containerRuntime.spec.js +6 -4
- package/lib/test/containerRuntime.spec.js.map +1 -1
- package/lib/test/dataStoreContext.spec.js +4 -4
- package/lib/test/dataStoreContext.spec.js.map +1 -1
- package/lib/test/dataStoreCreation.spec.js +1 -1
- package/lib/test/dataStoreCreation.spec.js.map +1 -1
- package/lib/test/dataStoreRegistry.spec.js.map +1 -1
- package/lib/test/documentSchema.spec.js +282 -0
- package/lib/test/documentSchema.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +11 -7
- package/lib/test/fuzz/fuzzUtils.js.map +1 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +9 -7
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +43 -25
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +7 -4
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -1
- package/lib/test/gc/garbageCollection.spec.js +5 -5
- package/lib/test/gc/garbageCollection.spec.js.map +1 -1
- package/lib/test/gc/gcConfigs.spec.js +2 -2
- package/lib/test/gc/gcConfigs.spec.js.map +1 -1
- package/lib/test/gc/gcHelpers.spec.js.map +1 -1
- package/lib/test/gc/gcStats.spec.js +2 -2
- package/lib/test/gc/gcStats.spec.js.map +1 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +1 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -1
- package/lib/test/gc/gcTelemetry.spec.js +3 -3
- package/lib/test/gc/gcTelemetry.spec.js.map +1 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +1 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -1
- package/lib/test/getPendingBlobs.spec.js +1 -1
- package/lib/test/getPendingBlobs.spec.js.map +1 -1
- package/lib/test/hardwareStats.spec.js +1 -1
- package/lib/test/hardwareStats.spec.js.map +1 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +95 -118
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -1
- package/lib/test/opLifecycle/batchManager.spec.js +1 -1
- package/lib/test/opLifecycle/batchManager.spec.js.map +1 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +60 -55
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +56 -41
- package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -1
- package/lib/test/opLifecycle/outbox.spec.js +118 -10
- package/lib/test/opLifecycle/outbox.spec.js.map +1 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +115 -91
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -1
- package/lib/test/pendingStateManager.spec.js +1 -1
- package/lib/test/pendingStateManager.spec.js.map +1 -1
- package/lib/test/scheduleManager.spec.js +1 -1
- package/lib/test/scheduleManager.spec.js.map +1 -1
- package/lib/test/summarizerNode.spec.js +1 -1
- package/lib/test/summarizerNode.spec.js.map +1 -1
- package/lib/test/summarizerNodeWithGc.spec.js +1 -1
- package/lib/test/summarizerNodeWithGc.spec.js.map +1 -1
- package/lib/test/summary/runningSummarizer.spec.js +4 -4
- package/lib/test/summary/runningSummarizer.spec.js.map +1 -1
- package/lib/test/summary/summarizer.spec.js.map +1 -1
- package/lib/test/summary/summarizerClientElection.spec.js +2 -2
- package/lib/test/summary/summarizerClientElection.spec.js.map +1 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +1 -1
- package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -1
- package/lib/test/summary/summaryCollection.spec.js +1 -1
- package/lib/test/summary/summaryCollection.spec.js.map +1 -1
- package/lib/test/summary/summaryManager.spec.js +3 -3
- package/lib/test/summary/summaryManager.spec.js.map +1 -1
- package/lib/test/throttler.spec.js +1 -1
- package/lib/test/throttler.spec.js.map +1 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +6 -4
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -1
- package/package.json +35 -21
- package/src/batchTracker.ts +3 -3
- package/src/blobManager.ts +15 -15
- package/src/channelCollection.ts +75 -35
- package/src/connectionTelemetry.ts +10 -10
- package/src/containerHandleContext.ts +1 -1
- package/src/containerRuntime.ts +352 -197
- package/src/dataStore.ts +2 -2
- package/src/dataStoreContext.ts +19 -19
- package/src/dataStoreContexts.ts +2 -2
- package/src/dataStoreRegistry.ts +1 -1
- package/src/deltaScheduler.ts +1 -1
- package/src/gc/garbageCollection.ts +12 -12
- package/src/gc/gcConfigs.ts +11 -11
- package/src/gc/gcDefinitions.ts +2 -2
- package/src/gc/gcHelpers.ts +2 -2
- package/src/gc/gcSummaryStateTracker.ts +4 -4
- package/src/gc/gcTelemetry.ts +6 -6
- package/src/index.ts +8 -1
- package/src/messageTypes.ts +18 -5
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/definitions.ts +1 -20
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +4 -5
- package/src/opLifecycle/opDecompressor.ts +83 -100
- package/src/opLifecycle/opGroupingManager.ts +9 -12
- package/src/opLifecycle/opSplitter.ts +73 -47
- package/src/opLifecycle/outbox.ts +13 -31
- package/src/opLifecycle/remoteMessageProcessor.ts +41 -59
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +2 -2
- package/src/scheduleManager.ts +7 -7
- package/src/summary/documentSchema.ts +553 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +6 -5
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +19 -19
- package/src/summary/summarizer.ts +14 -14
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +15 -15
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -1
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
- package/src/summary/summarizerTypes.ts +3 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +8 -19
- package/src/summary/summaryGenerator.ts +10 -10
- package/src/summary/summaryManager.ts +4 -4
package/src/containerRuntime.ts
CHANGED
|
@@ -3,53 +3,34 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { Trace, TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
6
7
|
import {
|
|
7
|
-
|
|
8
|
-
FluidObject,
|
|
9
|
-
IFluidHandle,
|
|
10
|
-
IFluidHandleContext,
|
|
11
|
-
IRequest,
|
|
12
|
-
IResponse,
|
|
13
|
-
IProvideFluidHandleContext,
|
|
14
|
-
ISignalEnvelope,
|
|
15
|
-
} from "@fluidframework/core-interfaces";
|
|
16
|
-
import {
|
|
8
|
+
AttachState,
|
|
17
9
|
IAudience,
|
|
18
10
|
IBatchMessage,
|
|
19
11
|
IContainerContext,
|
|
20
|
-
IDeltaManager,
|
|
21
|
-
IRuntime,
|
|
22
12
|
ICriticalContainerError,
|
|
23
|
-
|
|
13
|
+
IDeltaManager,
|
|
14
|
+
IGetPendingLocalStateProps,
|
|
24
15
|
ILoader,
|
|
16
|
+
IRuntime,
|
|
25
17
|
LoaderHeader,
|
|
26
|
-
IGetPendingLocalStateProps,
|
|
27
18
|
} from "@fluidframework/container-definitions";
|
|
28
19
|
import {
|
|
29
20
|
IContainerRuntime,
|
|
30
21
|
IContainerRuntimeEvents,
|
|
31
22
|
} from "@fluidframework/container-runtime-definitions";
|
|
32
|
-
import { assert, Deferred, delay, LazyPromise, PromiseCache } from "@fluidframework/core-utils";
|
|
33
|
-
import { Trace, TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
34
23
|
import {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
ITelemetryLoggerExt,
|
|
46
|
-
UsageError,
|
|
47
|
-
LoggingError,
|
|
48
|
-
createSampledLogger,
|
|
49
|
-
IEventSampler,
|
|
50
|
-
type ITelemetryGenericEventExt,
|
|
51
|
-
loggerToMonitoringContext,
|
|
52
|
-
} from "@fluidframework/telemetry-utils";
|
|
24
|
+
FluidObject,
|
|
25
|
+
IFluidHandle,
|
|
26
|
+
IFluidHandleContext,
|
|
27
|
+
IProvideFluidHandleContext,
|
|
28
|
+
IRequest,
|
|
29
|
+
IResponse,
|
|
30
|
+
ISignalEnvelope,
|
|
31
|
+
ITelemetryBaseLogger,
|
|
32
|
+
} from "@fluidframework/core-interfaces";
|
|
33
|
+
import { assert, Deferred, LazyPromise, PromiseCache, delay } from "@fluidframework/core-utils";
|
|
53
34
|
import {
|
|
54
35
|
DriverHeader,
|
|
55
36
|
FetchSource,
|
|
@@ -57,6 +38,13 @@ import {
|
|
|
57
38
|
type ISnapshot,
|
|
58
39
|
} from "@fluidframework/driver-definitions";
|
|
59
40
|
import { readAndParse } from "@fluidframework/driver-utils";
|
|
41
|
+
import type {
|
|
42
|
+
IIdCompressor,
|
|
43
|
+
IIdCompressorCore,
|
|
44
|
+
IdCreationRange,
|
|
45
|
+
SerializedIdCompressorWithNoSession,
|
|
46
|
+
SerializedIdCompressorWithOngoingSession,
|
|
47
|
+
} from "@fluidframework/id-compressor";
|
|
60
48
|
import {
|
|
61
49
|
IClientDetails,
|
|
62
50
|
IDocumentMessage,
|
|
@@ -70,134 +58,150 @@ import {
|
|
|
70
58
|
SummaryType,
|
|
71
59
|
} from "@fluidframework/protocol-definitions";
|
|
72
60
|
import {
|
|
61
|
+
CreateChildSummarizerNodeParam,
|
|
73
62
|
FlushMode,
|
|
74
63
|
FlushModeExperimental,
|
|
75
|
-
|
|
76
|
-
|
|
64
|
+
IDataStore,
|
|
65
|
+
IEnvelope,
|
|
77
66
|
IFluidDataStoreContextDetached,
|
|
78
67
|
IFluidDataStoreRegistry,
|
|
79
68
|
IGarbageCollectionData,
|
|
80
69
|
IInboundSignalMessage,
|
|
81
|
-
NamedFluidDataStoreRegistryEntries,
|
|
82
|
-
ISummaryTreeWithStats,
|
|
83
70
|
ISummarizeInternalResult,
|
|
84
|
-
|
|
71
|
+
ISummaryTreeWithStats,
|
|
72
|
+
ITelemetryContext,
|
|
73
|
+
InboundAttachMessage,
|
|
74
|
+
NamedFluidDataStoreRegistryEntries,
|
|
85
75
|
SummarizeInternalFn,
|
|
86
76
|
channelsTreeName,
|
|
87
|
-
|
|
88
|
-
ITelemetryContext,
|
|
89
|
-
IEnvelope,
|
|
77
|
+
gcTreeKey,
|
|
90
78
|
} from "@fluidframework/runtime-definitions";
|
|
91
|
-
import type {
|
|
92
|
-
SerializedIdCompressorWithNoSession,
|
|
93
|
-
IIdCompressor,
|
|
94
|
-
IIdCompressorCore,
|
|
95
|
-
SerializedIdCompressorWithOngoingSession,
|
|
96
|
-
IdCreationRange,
|
|
97
|
-
} from "@fluidframework/id-compressor";
|
|
98
79
|
import {
|
|
80
|
+
GCDataBuilder,
|
|
81
|
+
ReadAndParseBlob,
|
|
82
|
+
RequestParser,
|
|
83
|
+
TelemetryContext,
|
|
99
84
|
addBlobToSummary,
|
|
100
85
|
addSummarizeResultToSummary,
|
|
101
|
-
|
|
86
|
+
calculateStats,
|
|
102
87
|
create404Response,
|
|
103
88
|
exceptionToResponse,
|
|
104
|
-
GCDataBuilder,
|
|
105
|
-
seqFromTree,
|
|
106
|
-
calculateStats,
|
|
107
|
-
TelemetryContext,
|
|
108
|
-
ReadAndParseBlob,
|
|
109
89
|
responseToException,
|
|
90
|
+
seqFromTree,
|
|
110
91
|
} from "@fluidframework/runtime-utils";
|
|
111
|
-
import { v4 as uuid } from "uuid";
|
|
112
|
-
import { ContainerFluidHandleContext } from "./containerHandleContext.js";
|
|
113
|
-
import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
|
|
114
|
-
import { ReportOpPerfTelemetry, IPerfSignalReport } from "./connectionTelemetry.js";
|
|
115
92
|
import {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
93
|
+
DataCorruptionError,
|
|
94
|
+
DataProcessingError,
|
|
95
|
+
GenericError,
|
|
96
|
+
IEventSampler,
|
|
97
|
+
type ITelemetryGenericEventExt,
|
|
98
|
+
ITelemetryLoggerExt,
|
|
99
|
+
LoggingError,
|
|
100
|
+
MonitoringContext,
|
|
101
|
+
PerformanceEvent,
|
|
102
|
+
TaggedLoggerAdapter,
|
|
103
|
+
UsageError,
|
|
104
|
+
createChildLogger,
|
|
105
|
+
createChildMonitoringContext,
|
|
106
|
+
createSampledLogger,
|
|
107
|
+
loggerToMonitoringContext,
|
|
108
|
+
raiseConnectedEvent,
|
|
109
|
+
wrapError,
|
|
110
|
+
} from "@fluidframework/telemetry-utils";
|
|
111
|
+
import { v4 as uuid } from "uuid";
|
|
112
|
+
import { BindBatchTracker } from "./batchTracker.js";
|
|
121
113
|
import { BlobManager, IBlobManagerLoadInfo, IPendingBlobs } from "./blobManager.js";
|
|
122
114
|
import { ChannelCollection, getSummaryForDatastores, wrapContext } from "./channelCollection.js";
|
|
115
|
+
import { IPerfSignalReport, ReportOpPerfTelemetry } from "./connectionTelemetry.js";
|
|
116
|
+
import { ContainerFluidHandleContext } from "./containerHandleContext.js";
|
|
117
|
+
import { channelToDataStore } from "./dataStore.js";
|
|
118
|
+
import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
|
|
119
|
+
import { DeltaManagerSummarizerProxy } from "./deltaManagerSummarizerProxy.js";
|
|
123
120
|
import {
|
|
124
|
-
aliasBlobName,
|
|
125
|
-
blobsTreeName,
|
|
126
|
-
chunksBlobName,
|
|
127
|
-
createRootSummarizerNodeWithGC,
|
|
128
|
-
electedSummarizerBlobName,
|
|
129
|
-
extractSummaryMetadataMessage,
|
|
130
|
-
IContainerRuntimeMetadata,
|
|
131
|
-
ICreateContainerMetadata,
|
|
132
|
-
idCompressorBlobName,
|
|
133
|
-
IRootSummarizerNodeWithGC,
|
|
134
|
-
ISummaryMetadataMessage,
|
|
135
|
-
metadataBlobName,
|
|
136
|
-
Summarizer,
|
|
137
|
-
SummaryManager,
|
|
138
|
-
wrapSummaryInChannelsTree,
|
|
139
|
-
SummaryCollection,
|
|
140
|
-
ISerializedElection,
|
|
141
|
-
OrderedClientCollection,
|
|
142
|
-
OrderedClientElection,
|
|
143
|
-
SummarizerClientElection,
|
|
144
|
-
summarizerClientType,
|
|
145
|
-
SubmitSummaryResult,
|
|
146
|
-
IConnectableRuntime,
|
|
147
|
-
IGeneratedSummaryStats,
|
|
148
|
-
ISubmitSummaryOptions,
|
|
149
|
-
ISummarizerInternalsProvider,
|
|
150
|
-
ISummarizerRuntime,
|
|
151
|
-
IRefreshSummaryAckOptions,
|
|
152
|
-
RunWhileConnectedCoordinator,
|
|
153
|
-
IGenerateSummaryTreeResult,
|
|
154
|
-
RetriableSummaryError,
|
|
155
|
-
IOnDemandSummarizeOptions,
|
|
156
|
-
ISummarizeResults,
|
|
157
|
-
IEnqueueSummarizeOptions,
|
|
158
|
-
EnqueueSummarizeResult,
|
|
159
|
-
ISummarizerEvents,
|
|
160
|
-
IBaseSummarizeResult,
|
|
161
|
-
ISummarizer,
|
|
162
|
-
rootHasIsolatedChannels,
|
|
163
|
-
IdCompressorMode,
|
|
164
|
-
} from "./summary/index.js";
|
|
165
|
-
import { formExponentialFn, Throttler } from "./throttler.js";
|
|
166
|
-
import {
|
|
167
|
-
GarbageCollector,
|
|
168
121
|
GCNodeType,
|
|
169
|
-
|
|
170
|
-
IGarbageCollector,
|
|
122
|
+
GarbageCollector,
|
|
171
123
|
IGCRuntimeOptions,
|
|
172
124
|
IGCStats,
|
|
125
|
+
IGarbageCollector,
|
|
126
|
+
gcGenerationOptionName,
|
|
173
127
|
} from "./gc/index.js";
|
|
174
|
-
import {
|
|
175
|
-
|
|
176
|
-
|
|
128
|
+
import {
|
|
129
|
+
ContainerMessageType,
|
|
130
|
+
type ContainerRuntimeDocumentSchemaMessage,
|
|
131
|
+
ContainerRuntimeGCMessage,
|
|
132
|
+
type ContainerRuntimeIdAllocationMessage,
|
|
133
|
+
type InboundSequencedContainerRuntimeMessage,
|
|
134
|
+
type InboundSequencedContainerRuntimeMessageOrSystemMessage,
|
|
135
|
+
type LocalContainerRuntimeMessage,
|
|
136
|
+
type OutboundContainerRuntimeMessage,
|
|
137
|
+
type UnknownContainerRuntimeMessage,
|
|
138
|
+
} from "./messageTypes.js";
|
|
139
|
+
import { IBatchMetadata, IIdAllocationMetadata } from "./metadata.js";
|
|
177
140
|
import {
|
|
178
141
|
BatchMessage,
|
|
179
142
|
IBatch,
|
|
180
143
|
IBatchCheckpoint,
|
|
181
144
|
OpCompressor,
|
|
182
145
|
OpDecompressor,
|
|
183
|
-
|
|
146
|
+
OpGroupingManager,
|
|
184
147
|
OpSplitter,
|
|
148
|
+
Outbox,
|
|
185
149
|
RemoteMessageProcessor,
|
|
186
|
-
OpGroupingManager,
|
|
187
150
|
getLongStack,
|
|
188
151
|
} from "./opLifecycle/index.js";
|
|
189
|
-
import {
|
|
190
|
-
import { IBatchMetadata, IIdAllocationMetadata } from "./metadata.js";
|
|
152
|
+
import { pkgVersion } from "./packageVersion.js";
|
|
191
153
|
import {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
154
|
+
IPendingBatchMessage,
|
|
155
|
+
IPendingLocalState,
|
|
156
|
+
PendingStateManager,
|
|
157
|
+
} from "./pendingStateManager.js";
|
|
158
|
+
import { ScheduleManager } from "./scheduleManager.js";
|
|
159
|
+
import {
|
|
160
|
+
DocumentsSchemaController,
|
|
161
|
+
EnqueueSummarizeResult,
|
|
162
|
+
IBaseSummarizeResult,
|
|
163
|
+
IConnectableRuntime,
|
|
164
|
+
IContainerRuntimeMetadata,
|
|
165
|
+
ICreateContainerMetadata,
|
|
166
|
+
IDocumentSchemaChangeMessage,
|
|
167
|
+
type IDocumentSchemaCurrent,
|
|
168
|
+
IEnqueueSummarizeOptions,
|
|
169
|
+
IGenerateSummaryTreeResult,
|
|
170
|
+
IGeneratedSummaryStats,
|
|
171
|
+
IOnDemandSummarizeOptions,
|
|
172
|
+
IRefreshSummaryAckOptions,
|
|
173
|
+
IRootSummarizerNodeWithGC,
|
|
174
|
+
ISerializedElection,
|
|
175
|
+
ISubmitSummaryOptions,
|
|
176
|
+
ISummarizeResults,
|
|
177
|
+
ISummarizer,
|
|
178
|
+
ISummarizerEvents,
|
|
179
|
+
ISummarizerInternalsProvider,
|
|
180
|
+
ISummarizerRuntime,
|
|
181
|
+
ISummaryMetadataMessage,
|
|
182
|
+
IdCompressorMode,
|
|
183
|
+
OrderedClientCollection,
|
|
184
|
+
OrderedClientElection,
|
|
185
|
+
RetriableSummaryError,
|
|
186
|
+
RunWhileConnectedCoordinator,
|
|
187
|
+
SubmitSummaryResult,
|
|
188
|
+
Summarizer,
|
|
189
|
+
SummarizerClientElection,
|
|
190
|
+
SummaryCollection,
|
|
191
|
+
SummaryManager,
|
|
192
|
+
aliasBlobName,
|
|
193
|
+
blobsTreeName,
|
|
194
|
+
chunksBlobName,
|
|
195
|
+
createRootSummarizerNodeWithGC,
|
|
196
|
+
electedSummarizerBlobName,
|
|
197
|
+
extractSummaryMetadataMessage,
|
|
198
|
+
idCompressorBlobName,
|
|
199
|
+
metadataBlobName,
|
|
200
|
+
rootHasIsolatedChannels,
|
|
201
|
+
summarizerClientType,
|
|
202
|
+
wrapSummaryInChannelsTree,
|
|
203
|
+
} from "./summary/index.js";
|
|
204
|
+
import { Throttler, formExponentialFn } from "./throttler.js";
|
|
201
205
|
|
|
202
206
|
/**
|
|
203
207
|
* Utility to implement compat behaviors given an unknown message type
|
|
@@ -416,7 +420,7 @@ export interface IContainerRuntimeOptions {
|
|
|
416
420
|
* If specified, when in FlushMode.TurnBased, if the size of the ops between JS turns exceeds this value,
|
|
417
421
|
* an error will be thrown and the container will close.
|
|
418
422
|
*
|
|
419
|
-
* If unspecified, the limit is
|
|
423
|
+
* If unspecified, the limit is 700Kb.
|
|
420
424
|
*
|
|
421
425
|
* 'Infinity' will disable any limit.
|
|
422
426
|
*
|
|
@@ -465,6 +469,15 @@ export interface IContainerRuntimeOptions {
|
|
|
465
469
|
* @experimental Not ready for use.
|
|
466
470
|
*/
|
|
467
471
|
readonly enableGroupedBatching?: boolean;
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* When this property is set to true, it requires runtime to control is document schema properly through ops
|
|
475
|
+
* The benefit of this mode is that clients who do not understand schema will fail in predictable way, with predictable message,
|
|
476
|
+
* and will not attempt to limp along, which could cause data corruptions and crashes in random places.
|
|
477
|
+
* When this property is not set (or set to false), runtime operates in legacy mode, where new features (modifying document schema)
|
|
478
|
+
* are engaged as they become available, without giving legacy clients any chance to fail predictably.
|
|
479
|
+
*/
|
|
480
|
+
readonly explicitSchemaControl?: boolean;
|
|
468
481
|
}
|
|
469
482
|
|
|
470
483
|
/**
|
|
@@ -505,6 +518,12 @@ export enum CompressionAlgorithms {
|
|
|
505
518
|
lz4 = "lz4",
|
|
506
519
|
}
|
|
507
520
|
|
|
521
|
+
/** @alpha */
|
|
522
|
+
export const disabledCompressionConfig: ICompressionRuntimeOptions = {
|
|
523
|
+
minimumBatchSizeInBytes: Infinity,
|
|
524
|
+
compressionAlgorithm: CompressionAlgorithms.lz4,
|
|
525
|
+
};
|
|
526
|
+
|
|
508
527
|
/**
|
|
509
528
|
* @deprecated
|
|
510
529
|
* Untagged logger is unsupported going forward. There are old loaders with old ContainerContexts that only
|
|
@@ -571,26 +590,12 @@ export const defaultPendingOpsRetryDelayMs = 1000;
|
|
|
571
590
|
*/
|
|
572
591
|
const defaultCloseSummarizerDelayMs = 5000; // 5 seconds
|
|
573
592
|
|
|
574
|
-
/**
|
|
575
|
-
* @deprecated use ContainerRuntimeMessageType instead
|
|
576
|
-
* @internal
|
|
577
|
-
*/
|
|
578
|
-
export enum RuntimeMessage {
|
|
579
|
-
FluidDataStoreOp = "component",
|
|
580
|
-
Attach = "attach",
|
|
581
|
-
ChunkedOp = "chunkedOp",
|
|
582
|
-
BlobAttach = "blobAttach",
|
|
583
|
-
Rejoin = "rejoin",
|
|
584
|
-
Alias = "alias",
|
|
585
|
-
Operation = "op",
|
|
586
|
-
}
|
|
587
|
-
|
|
588
593
|
/**
|
|
589
594
|
* @deprecated please use version in driver-utils
|
|
590
595
|
* @internal
|
|
591
596
|
*/
|
|
592
597
|
export function isRuntimeMessage(message: ISequencedDocumentMessage): boolean {
|
|
593
|
-
return (Object.values(
|
|
598
|
+
return (Object.values(ContainerMessageType) as string[]).includes(message.type);
|
|
594
599
|
}
|
|
595
600
|
|
|
596
601
|
/**
|
|
@@ -697,6 +702,18 @@ async function createSummarizer(loader: ILoader, url: string): Promise<ISummariz
|
|
|
697
702
|
return fluidObject.ISummarizer;
|
|
698
703
|
}
|
|
699
704
|
|
|
705
|
+
/**
|
|
706
|
+
* Extract last message from the snapshot metadata.
|
|
707
|
+
* Uses legacy property if not using explicit schema control, otherwise uses the new property.
|
|
708
|
+
* This allows new runtime to make documents not openable for old runtimes, one explicit document schema control is enabled.
|
|
709
|
+
* Please see addMetadataToSummary() as well
|
|
710
|
+
*/
|
|
711
|
+
function lastMessageFromMetadata(metadata: IContainerRuntimeMetadata | undefined) {
|
|
712
|
+
return metadata?.documentSchema?.runtime?.explicitSchemaControl
|
|
713
|
+
? metadata?.lastMessage
|
|
714
|
+
: metadata?.message;
|
|
715
|
+
}
|
|
716
|
+
|
|
700
717
|
/**
|
|
701
718
|
* Represents the runtime of the container. Contains helper functions/state of the container.
|
|
702
719
|
* It will define the store level mappings.
|
|
@@ -743,7 +760,7 @@ export class ContainerRuntime
|
|
|
743
760
|
existing,
|
|
744
761
|
requestHandler,
|
|
745
762
|
provideEntryPoint,
|
|
746
|
-
runtimeOptions = {},
|
|
763
|
+
runtimeOptions = {} satisfies IContainerRuntimeOptions,
|
|
747
764
|
containerScope = {},
|
|
748
765
|
containerRuntimeCtor = ContainerRuntime,
|
|
749
766
|
} = params;
|
|
@@ -772,10 +789,11 @@ export class ContainerRuntime
|
|
|
772
789
|
flushMode = defaultFlushMode,
|
|
773
790
|
compressionOptions = defaultCompressionConfig,
|
|
774
791
|
maxBatchSizeInBytes = defaultMaxBatchSizeInBytes,
|
|
775
|
-
enableRuntimeIdCompressor
|
|
792
|
+
enableRuntimeIdCompressor,
|
|
776
793
|
chunkSizeInBytes = defaultChunkSizeInBytes,
|
|
777
794
|
enableOpReentryCheck = false,
|
|
778
795
|
enableGroupedBatching = false,
|
|
796
|
+
explicitSchemaControl = false,
|
|
779
797
|
} = runtimeOptions;
|
|
780
798
|
|
|
781
799
|
const registry = new FluidDataStoreRegistry(registryEntries);
|
|
@@ -816,8 +834,10 @@ export class ContainerRuntime
|
|
|
816
834
|
},
|
|
817
835
|
);
|
|
818
836
|
|
|
837
|
+
const messageAtLastSummary = lastMessageFromMetadata(metadata);
|
|
838
|
+
|
|
819
839
|
// Verify summary runtime sequence number matches protocol sequence number.
|
|
820
|
-
const runtimeSequenceNumber =
|
|
840
|
+
const runtimeSequenceNumber = messageAtLastSummary?.sequenceNumber;
|
|
821
841
|
// When we load with pending state, we reuse an old snapshot so we don't expect these numbers to match
|
|
822
842
|
if (!context.pendingLocalState && runtimeSequenceNumber !== undefined) {
|
|
823
843
|
const protocolSequenceNumber = context.deltaManager.initialSequenceNumber;
|
|
@@ -826,6 +846,13 @@ export class ContainerRuntime
|
|
|
826
846
|
loadSequenceNumberVerification !== "bypass" &&
|
|
827
847
|
runtimeSequenceNumber !== protocolSequenceNumber
|
|
828
848
|
) {
|
|
849
|
+
// Message to OCEs:
|
|
850
|
+
// You can hit this error with runtimeSequenceNumber === -1 in < 2.0 RC3 builds.
|
|
851
|
+
// This would indicate that explicit schema control is enabled in current (2.0 RC3+) builds and it
|
|
852
|
+
// results in addMetadataToSummary() creating a poison pill for older runtimes in the form of a -1 sequence number.
|
|
853
|
+
// Older runtimes do not understand new schema, and thus could corrupt document if they proceed, thus we are using
|
|
854
|
+
// this poison pill to prevent them from proceeding.
|
|
855
|
+
|
|
829
856
|
// "Load from summary, runtime metadata sequenceNumber !== initialSequenceNumber"
|
|
830
857
|
const error = new DataCorruptionError(
|
|
831
858
|
// pre-0.58 error message: SummaryMetadataMismatch
|
|
@@ -842,7 +869,7 @@ export class ContainerRuntime
|
|
|
842
869
|
}
|
|
843
870
|
|
|
844
871
|
// Enabling the IdCompressor is a one-way operation and we only want to
|
|
845
|
-
// allow new containers to turn it on
|
|
872
|
+
// allow new containers to turn it on.
|
|
846
873
|
let idCompressorMode: IdCompressorMode;
|
|
847
874
|
if (existing) {
|
|
848
875
|
// This setting has to be sticky for correctness:
|
|
@@ -851,19 +878,19 @@ export class ContainerRuntime
|
|
|
851
878
|
// 2) if it's ON, then all sessions should load compressor right away
|
|
852
879
|
// 3) Same logic applies for "delayed" mode
|
|
853
880
|
// Maybe in the future we will need to enabled (and figure how to do it safely) "delayed" -> "on" change.
|
|
854
|
-
// We could do "off" -> "on"
|
|
855
|
-
// this will allow clients to eventually to disregard "off" setting (when it's safe so) and start
|
|
881
|
+
// We could do "off" -> "on" transition too, if all clients start loading compressor (but not using it initially) and
|
|
882
|
+
// do so for a while - this will allow clients to eventually to disregard "off" setting (when it's safe so) and start
|
|
883
|
+
// using compressor in future sessions.
|
|
856
884
|
// Everyting is possible, but it needs to be designed and executed carefully, when such need arises.
|
|
857
|
-
idCompressorMode = metadata?.
|
|
885
|
+
idCompressorMode = metadata?.documentSchema?.runtime
|
|
886
|
+
?.idCompressorMode as IdCompressorMode;
|
|
858
887
|
} else {
|
|
859
|
-
|
|
860
|
-
const enabled = mc.config.getBoolean("Fluid.ContainerRuntime.IdCompressorEnabled");
|
|
861
|
-
switch (enabled) {
|
|
888
|
+
switch (mc.config.getBoolean("Fluid.ContainerRuntime.IdCompressorEnabled")) {
|
|
862
889
|
case true:
|
|
863
890
|
idCompressorMode = "on";
|
|
864
891
|
break;
|
|
865
892
|
case false:
|
|
866
|
-
idCompressorMode =
|
|
893
|
+
idCompressorMode = undefined;
|
|
867
894
|
break;
|
|
868
895
|
default:
|
|
869
896
|
idCompressorMode = enableRuntimeIdCompressor;
|
|
@@ -908,6 +935,38 @@ export class ContainerRuntime
|
|
|
908
935
|
}
|
|
909
936
|
};
|
|
910
937
|
|
|
938
|
+
const disableGroupedBatching = mc.config.getBoolean(
|
|
939
|
+
"Fluid.ContainerRuntime.DisableGroupedBatching",
|
|
940
|
+
);
|
|
941
|
+
const disableCompression = mc.config.getBoolean(
|
|
942
|
+
"Fluid.ContainerRuntime.CompressionDisabled",
|
|
943
|
+
);
|
|
944
|
+
const compressionLz4 =
|
|
945
|
+
disableCompression !== true &&
|
|
946
|
+
compressionOptions.minimumBatchSizeInBytes !== Infinity &&
|
|
947
|
+
compressionOptions.compressionAlgorithm === "lz4";
|
|
948
|
+
|
|
949
|
+
const opGroupingEnabled = disableGroupedBatching !== true && enableGroupedBatching;
|
|
950
|
+
|
|
951
|
+
const documentSchemaController = new DocumentsSchemaController(
|
|
952
|
+
existing,
|
|
953
|
+
metadata?.documentSchema,
|
|
954
|
+
{
|
|
955
|
+
explicitSchemaControl,
|
|
956
|
+
compressionLz4,
|
|
957
|
+
idCompressorMode,
|
|
958
|
+
opGroupingEnabled,
|
|
959
|
+
},
|
|
960
|
+
(schema) => {
|
|
961
|
+
runtime.onSchemaChange(schema);
|
|
962
|
+
},
|
|
963
|
+
);
|
|
964
|
+
|
|
965
|
+
const featureGatesForTelemetry: Record<string, boolean | number | undefined> = {
|
|
966
|
+
disableGroupedBatching,
|
|
967
|
+
disableCompression,
|
|
968
|
+
};
|
|
969
|
+
|
|
911
970
|
const runtime = new containerRuntimeCtor(
|
|
912
971
|
context,
|
|
913
972
|
registry,
|
|
@@ -923,9 +982,11 @@ export class ContainerRuntime
|
|
|
923
982
|
compressionOptions,
|
|
924
983
|
maxBatchSizeInBytes,
|
|
925
984
|
chunkSizeInBytes,
|
|
926
|
-
|
|
985
|
+
// Requires<> drops undefined from IdCompressorType
|
|
986
|
+
enableRuntimeIdCompressor: enableRuntimeIdCompressor as "on" | "delayed",
|
|
927
987
|
enableOpReentryCheck,
|
|
928
988
|
enableGroupedBatching,
|
|
989
|
+
explicitSchemaControl,
|
|
929
990
|
},
|
|
930
991
|
containerScope,
|
|
931
992
|
logger,
|
|
@@ -933,7 +994,8 @@ export class ContainerRuntime
|
|
|
933
994
|
blobManagerSnapshot,
|
|
934
995
|
context.storage,
|
|
935
996
|
createIdCompressorFn,
|
|
936
|
-
|
|
997
|
+
documentSchemaController,
|
|
998
|
+
featureGatesForTelemetry,
|
|
937
999
|
provideEntryPoint,
|
|
938
1000
|
requestHandler,
|
|
939
1001
|
undefined, // summaryConfiguration
|
|
@@ -983,7 +1045,7 @@ export class ContainerRuntime
|
|
|
983
1045
|
summaryOp: ISummaryContent,
|
|
984
1046
|
referenceSequenceNumber?: number,
|
|
985
1047
|
) => number;
|
|
986
|
-
private readonly submitSignalFn: (content:
|
|
1048
|
+
private readonly submitSignalFn: (content: ISignalEnvelope, targetClientId?: string) => void;
|
|
987
1049
|
public readonly disposeFn: (error?: ICriticalContainerError) => void;
|
|
988
1050
|
public readonly closeFn: (error?: ICriticalContainerError) => void;
|
|
989
1051
|
|
|
@@ -1004,6 +1066,10 @@ export class ContainerRuntime
|
|
|
1004
1066
|
return this._getAttachState();
|
|
1005
1067
|
}
|
|
1006
1068
|
|
|
1069
|
+
public get documentSchema() {
|
|
1070
|
+
return this.documentsSchemaController.sessionSchema.runtime;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1007
1073
|
private _idCompressor: (IIdCompressor & IIdCompressorCore) | undefined;
|
|
1008
1074
|
|
|
1009
1075
|
// We accumulate Id compressor Ops while Id compressor is not loaded yet (only for "delayed" mode)
|
|
@@ -1016,6 +1082,9 @@ export class ContainerRuntime
|
|
|
1016
1082
|
// In such case we have to process all ops, including those marked with saveOp === true.
|
|
1017
1083
|
private readonly skipSavedCompressorOps: boolean;
|
|
1018
1084
|
|
|
1085
|
+
public get idCompressorMode() {
|
|
1086
|
+
return this.documentSchema.idCompressorMode;
|
|
1087
|
+
}
|
|
1019
1088
|
/**
|
|
1020
1089
|
* See IContainerRuntimeBase.idCompressor() for details.
|
|
1021
1090
|
*/
|
|
@@ -1037,7 +1106,7 @@ export class ContainerRuntime
|
|
|
1037
1106
|
* True if we have ID compressor loading in-flight (async operation). Useful only for
|
|
1038
1107
|
* this.idCompressorMode === "delayed" mode
|
|
1039
1108
|
*/
|
|
1040
|
-
protected
|
|
1109
|
+
protected _loadIdCompressor: Promise<void> | undefined;
|
|
1041
1110
|
|
|
1042
1111
|
/**
|
|
1043
1112
|
* See IContainerRuntimeBase.generateDocumentUniqueId() for details.
|
|
@@ -1259,7 +1328,8 @@ export class ContainerRuntime
|
|
|
1259
1328
|
blobManagerSnapshot: IBlobManagerLoadInfo,
|
|
1260
1329
|
private readonly _storage: IDocumentStorageService,
|
|
1261
1330
|
private readonly createIdCompressor: () => Promise<IIdCompressor & IIdCompressorCore>,
|
|
1262
|
-
private readonly
|
|
1331
|
+
private readonly documentsSchemaController: DocumentsSchemaController,
|
|
1332
|
+
featureGatesForTelemetry: Record<string, boolean | number | undefined>,
|
|
1263
1333
|
provideEntryPoint: (containerRuntime: IContainerRuntime) => Promise<FluidObject>,
|
|
1264
1334
|
private readonly requestHandler?: (
|
|
1265
1335
|
request: IRequest,
|
|
@@ -1293,6 +1363,22 @@ export class ContainerRuntime
|
|
|
1293
1363
|
supportedFeatures,
|
|
1294
1364
|
} = context;
|
|
1295
1365
|
|
|
1366
|
+
this.mc = createChildMonitoringContext({
|
|
1367
|
+
logger: this.logger,
|
|
1368
|
+
namespace: "ContainerRuntime",
|
|
1369
|
+
});
|
|
1370
|
+
|
|
1371
|
+
// If we support multiple algorithms in the future, then we would need to manage it here carefully.
|
|
1372
|
+
// We can use runtimeOptions.compressionOptions.compressionAlgorithm, but only if it's in the schema list!
|
|
1373
|
+
// If it's not in the list, then we will need to either use no compression, or fallback to some other (supported by format)
|
|
1374
|
+
// compression.
|
|
1375
|
+
const compressionOptions: ICompressionRuntimeOptions = {
|
|
1376
|
+
minimumBatchSizeInBytes: this.documentSchema.compressionLz4
|
|
1377
|
+
? runtimeOptions.compressionOptions.minimumBatchSizeInBytes
|
|
1378
|
+
: Number.POSITIVE_INFINITY,
|
|
1379
|
+
compressionAlgorithm: CompressionAlgorithms.lz4,
|
|
1380
|
+
};
|
|
1381
|
+
|
|
1296
1382
|
this.innerDeltaManager = deltaManager;
|
|
1297
1383
|
this.deltaManager = new DeltaManagerSummarizerProxy(this.innerDeltaManager);
|
|
1298
1384
|
|
|
@@ -1330,11 +1416,6 @@ export class ContainerRuntime
|
|
|
1330
1416
|
// In cases of summarizer, we want to dispose instead since consumer doesn't interact with this container
|
|
1331
1417
|
this.closeFn = this.isSummarizerClient ? this.disposeFn : closeFn;
|
|
1332
1418
|
|
|
1333
|
-
this.mc = createChildMonitoringContext({
|
|
1334
|
-
logger: this.logger,
|
|
1335
|
-
namespace: "ContainerRuntime",
|
|
1336
|
-
});
|
|
1337
|
-
|
|
1338
1419
|
let loadSummaryNumber: number;
|
|
1339
1420
|
// Get the container creation metadata. For new container, we initialize these. For existing containers,
|
|
1340
1421
|
// get the values from the metadata blob.
|
|
@@ -1355,7 +1436,7 @@ export class ContainerRuntime
|
|
|
1355
1436
|
}
|
|
1356
1437
|
this.nextSummaryNumber = loadSummaryNumber + 1;
|
|
1357
1438
|
|
|
1358
|
-
this.messageAtLastSummary = metadata
|
|
1439
|
+
this.messageAtLastSummary = lastMessageFromMetadata(metadata);
|
|
1359
1440
|
|
|
1360
1441
|
// Note that we only need to pull the *initial* connected state from the context.
|
|
1361
1442
|
// Later updates come through calls to setConnectionState.
|
|
@@ -1583,17 +1664,6 @@ export class ContainerRuntime
|
|
|
1583
1664
|
this.logger,
|
|
1584
1665
|
);
|
|
1585
1666
|
|
|
1586
|
-
const disableCompression = this.mc.config.getBoolean(
|
|
1587
|
-
"Fluid.ContainerRuntime.CompressionDisabled",
|
|
1588
|
-
);
|
|
1589
|
-
const compressionOptions =
|
|
1590
|
-
disableCompression === true
|
|
1591
|
-
? {
|
|
1592
|
-
minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,
|
|
1593
|
-
compressionAlgorithm: CompressionAlgorithms.lz4,
|
|
1594
|
-
}
|
|
1595
|
-
: runtimeOptions.compressionOptions;
|
|
1596
|
-
|
|
1597
1667
|
const disablePartialFlush = this.mc.config.getBoolean(
|
|
1598
1668
|
"Fluid.ContainerRuntime.DisablePartialFlush",
|
|
1599
1669
|
);
|
|
@@ -1747,10 +1817,10 @@ export class ContainerRuntime
|
|
|
1747
1817
|
disableIsolatedChannels: metadata?.disableIsolatedChannels,
|
|
1748
1818
|
gcVersion: metadata?.gcFeature,
|
|
1749
1819
|
options: JSON.stringify(runtimeOptions),
|
|
1750
|
-
idCompressorModeMetadata: metadata?.idCompressorMode,
|
|
1820
|
+
idCompressorModeMetadata: metadata?.documentSchema?.runtime?.idCompressorMode,
|
|
1751
1821
|
idCompressorMode: this.idCompressorMode,
|
|
1752
1822
|
featureGates: JSON.stringify({
|
|
1753
|
-
|
|
1823
|
+
...featureGatesForTelemetry,
|
|
1754
1824
|
disableOpReentryCheck,
|
|
1755
1825
|
disableChunking,
|
|
1756
1826
|
disableAttachReorder: this.disableAttachReorder,
|
|
@@ -1780,6 +1850,21 @@ export class ContainerRuntime
|
|
|
1780
1850
|
this.skipSavedCompressorOps = pendingRuntimeState?.pendingIdCompressorState !== undefined;
|
|
1781
1851
|
}
|
|
1782
1852
|
|
|
1853
|
+
public onSchemaChange(schema: IDocumentSchemaCurrent) {
|
|
1854
|
+
// Most of the settings will be picked up only by new sessions (i.e. after reload).
|
|
1855
|
+
// We can make it better in the future (i.e. start to use op compression right away), but for simplicity
|
|
1856
|
+
// this is not done.
|
|
1857
|
+
// But ID compressor is special. It's possible, that in future, we will remove "stickiness" of ID compressor setting
|
|
1858
|
+
// and will allow to start using it. If that were to happen, we want to ensure that we do not break eventual consistency
|
|
1859
|
+
// promises. To do so, we need to initialize id compressor right away.
|
|
1860
|
+
// As it's implemented right now (with async initialization), this will only work for "off" -> "delayed" transitions.
|
|
1861
|
+
// Anything else is too risky, and requires ability to initialize ID compressor synchronously!
|
|
1862
|
+
if (schema.runtime.idCompressorMode !== undefined) {
|
|
1863
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
1864
|
+
this.loadIdCompressor();
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1783
1868
|
public getCreateChildSummarizerNodeFn(id: string, createParam: CreateChildSummarizerNodeParam) {
|
|
1784
1869
|
return (
|
|
1785
1870
|
summarizeInternal: SummarizeInternalFn,
|
|
@@ -2062,20 +2147,38 @@ export class ContainerRuntime
|
|
|
2062
2147
|
|
|
2063
2148
|
/** Adds the container's metadata to the given summary tree. */
|
|
2064
2149
|
private addMetadataToSummary(summaryTree: ISummaryTreeWithStats) {
|
|
2150
|
+
// The last message processed at the time of summary. If there are no new messages, use the message from the
|
|
2151
|
+
// last summary.
|
|
2152
|
+
const message =
|
|
2153
|
+
extractSummaryMetadataMessage(this.deltaManager.lastMessage) ??
|
|
2154
|
+
this.messageAtLastSummary;
|
|
2155
|
+
|
|
2156
|
+
const documentSchema = this.documentsSchemaController.summarizeDocumentSchema(
|
|
2157
|
+
this.deltaManager.lastSequenceNumber,
|
|
2158
|
+
);
|
|
2159
|
+
|
|
2160
|
+
// Is document schema explicit control on?
|
|
2161
|
+
const explitiSchemaControl = documentSchema?.runtime.explicitSchemaControl;
|
|
2162
|
+
|
|
2065
2163
|
const metadata: IContainerRuntimeMetadata = {
|
|
2066
2164
|
...this.createContainerMetadata,
|
|
2067
2165
|
// Increment the summary number for the next summary that will be generated.
|
|
2068
2166
|
summaryNumber: this.nextSummaryNumber++,
|
|
2069
2167
|
summaryFormatVersion: 1,
|
|
2070
2168
|
...this.garbageCollector.getMetadata(),
|
|
2071
|
-
// The last message processed at the time of summary. If there are no new messages, use the message from the
|
|
2072
|
-
// last summary.
|
|
2073
|
-
message:
|
|
2074
|
-
extractSummaryMetadataMessage(this.deltaManager.lastMessage) ??
|
|
2075
|
-
this.messageAtLastSummary,
|
|
2076
2169
|
telemetryDocumentId: this.telemetryDocumentId,
|
|
2077
|
-
|
|
2170
|
+
// If explicit document schema control is not on, use legacy way to supply last message (using 'message' property).
|
|
2171
|
+
// Otherwise use new 'lastMessage' property, but also put content into the 'message' property that cases old
|
|
2172
|
+
// runtimes (that preceed document schema control capabilities) to close container on load due to mismatch in
|
|
2173
|
+
// last message's sequence number.
|
|
2174
|
+
// See also lastMessageFromMetadata()
|
|
2175
|
+
message: explitiSchemaControl
|
|
2176
|
+
? ({ sequenceNumber: -1 } as any as ISummaryMetadataMessage)
|
|
2177
|
+
: message,
|
|
2178
|
+
lastMessage: explitiSchemaControl ? message : undefined,
|
|
2179
|
+
documentSchema,
|
|
2078
2180
|
};
|
|
2181
|
+
|
|
2079
2182
|
addBlobToSummary(summaryTree, metadataBlobName, JSON.stringify(metadata));
|
|
2080
2183
|
}
|
|
2081
2184
|
|
|
@@ -2211,7 +2314,12 @@ export class ContainerRuntime
|
|
|
2211
2314
|
case ContainerMessageType.Alias:
|
|
2212
2315
|
return this.channelCollection.applyStashedOp(opContents);
|
|
2213
2316
|
case ContainerMessageType.IdAllocation:
|
|
2214
|
-
assert(
|
|
2317
|
+
assert(
|
|
2318
|
+
this.idCompressorMode !== undefined,
|
|
2319
|
+
0x8f1 /* ID compressor should be in use */,
|
|
2320
|
+
);
|
|
2321
|
+
return;
|
|
2322
|
+
case ContainerMessageType.DocumentSchemaChange:
|
|
2215
2323
|
return;
|
|
2216
2324
|
case ContainerMessageType.BlobAttach:
|
|
2217
2325
|
return;
|
|
@@ -2248,10 +2356,13 @@ export class ContainerRuntime
|
|
|
2248
2356
|
}
|
|
2249
2357
|
}
|
|
2250
2358
|
|
|
2251
|
-
|
|
2252
|
-
if (
|
|
2253
|
-
this.
|
|
2254
|
-
this.
|
|
2359
|
+
private async loadIdCompressor() {
|
|
2360
|
+
if (
|
|
2361
|
+
this._idCompressor === undefined &&
|
|
2362
|
+
this.idCompressorMode !== undefined &&
|
|
2363
|
+
this._loadIdCompressor === undefined
|
|
2364
|
+
) {
|
|
2365
|
+
this._loadIdCompressor = this.createIdCompressor()
|
|
2255
2366
|
.then((compressor) => {
|
|
2256
2367
|
this._idCompressor = compressor;
|
|
2257
2368
|
for (const range of this.pendingIdCompressorOps) {
|
|
@@ -2261,8 +2372,17 @@ export class ContainerRuntime
|
|
|
2261
2372
|
})
|
|
2262
2373
|
.catch((error) => {
|
|
2263
2374
|
this.logger.sendErrorEvent({ eventName: "IdCompressorDelayedLoad" }, error);
|
|
2375
|
+
throw error;
|
|
2264
2376
|
});
|
|
2265
2377
|
}
|
|
2378
|
+
return this._loadIdCompressor;
|
|
2379
|
+
}
|
|
2380
|
+
|
|
2381
|
+
public setConnectionState(connected: boolean, clientId?: string) {
|
|
2382
|
+
if (connected && this.idCompressorMode === "delayed") {
|
|
2383
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
2384
|
+
this.loadIdCompressor();
|
|
2385
|
+
}
|
|
2266
2386
|
if (connected === false && this.delayConnectClientId !== undefined) {
|
|
2267
2387
|
this.delayConnectClientId = undefined;
|
|
2268
2388
|
this.mc.logger.sendTelemetryEvent({
|
|
@@ -2272,6 +2392,10 @@ export class ContainerRuntime
|
|
|
2272
2392
|
return;
|
|
2273
2393
|
}
|
|
2274
2394
|
|
|
2395
|
+
if (!connected) {
|
|
2396
|
+
this.documentsSchemaController.onDisconnect();
|
|
2397
|
+
}
|
|
2398
|
+
|
|
2275
2399
|
// If there are stashed blobs in the pending state, we need to delay
|
|
2276
2400
|
// propagation of the "connected" event until we have uploaded them to
|
|
2277
2401
|
// ensure we don't submit ops referencing a blob that has not been uploaded
|
|
@@ -2504,6 +2628,13 @@ export class ContainerRuntime
|
|
|
2504
2628
|
assert(false, "should not even get here");
|
|
2505
2629
|
case ContainerMessageType.Rejoin:
|
|
2506
2630
|
break;
|
|
2631
|
+
case ContainerMessageType.DocumentSchemaChange:
|
|
2632
|
+
this.documentsSchemaController.processDocumentSchemaOp(
|
|
2633
|
+
messageWithContext.message.contents,
|
|
2634
|
+
messageWithContext.local,
|
|
2635
|
+
messageWithContext.message.sequenceNumber,
|
|
2636
|
+
);
|
|
2637
|
+
break;
|
|
2507
2638
|
default: {
|
|
2508
2639
|
// If we didn't necessarily expect a runtime message type, then no worries - just return
|
|
2509
2640
|
// e.g. this case applies to system ops, or legacy ops that would have fallen into the above cases anyway.
|
|
@@ -2823,6 +2954,7 @@ export class ContainerRuntime
|
|
|
2823
2954
|
break;
|
|
2824
2955
|
}
|
|
2825
2956
|
case ContainerMessageType.IdAllocation:
|
|
2957
|
+
case ContainerMessageType.DocumentSchemaChange:
|
|
2826
2958
|
case ContainerMessageType.GC: {
|
|
2827
2959
|
return false;
|
|
2828
2960
|
}
|
|
@@ -2940,6 +3072,9 @@ export class ContainerRuntime
|
|
|
2940
3072
|
wrapSummaryInChannelsTree(summarizeResult);
|
|
2941
3073
|
const pathPartsForChildren = [channelsTreeName];
|
|
2942
3074
|
|
|
3075
|
+
// Ensure that ID compressor had a chance to load, if we are using delayed mode.
|
|
3076
|
+
await this.loadIdCompressor();
|
|
3077
|
+
|
|
2943
3078
|
this.addContainerStateToSummary(summarizeResult, fullTree, trackState, telemetryContext);
|
|
2944
3079
|
return {
|
|
2945
3080
|
...summarizeResult,
|
|
@@ -3673,9 +3808,6 @@ export class ContainerRuntime
|
|
|
3673
3808
|
const idAllocationBatchMessage: BatchMessage = {
|
|
3674
3809
|
contents: JSON.stringify(idAllocationMessage),
|
|
3675
3810
|
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
3676
|
-
metadata: undefined,
|
|
3677
|
-
localOpMetadata: undefined,
|
|
3678
|
-
type: ContainerMessageType.IdAllocation,
|
|
3679
3811
|
};
|
|
3680
3812
|
this.outbox.submitIdAllocation(idAllocationBatchMessage);
|
|
3681
3813
|
}
|
|
@@ -3685,7 +3817,7 @@ export class ContainerRuntime
|
|
|
3685
3817
|
private submit(
|
|
3686
3818
|
containerRuntimeMessage: OutboundContainerRuntimeMessage,
|
|
3687
3819
|
localOpMetadata: unknown = undefined,
|
|
3688
|
-
metadata:
|
|
3820
|
+
metadata?: { localId: string; blobId?: string },
|
|
3689
3821
|
): void {
|
|
3690
3822
|
this.verifyNotClosed();
|
|
3691
3823
|
this.verifyCanSubmitOps();
|
|
@@ -3696,6 +3828,12 @@ export class ContainerRuntime
|
|
|
3696
3828
|
0x132 /* "sending ops in detached container" */,
|
|
3697
3829
|
);
|
|
3698
3830
|
|
|
3831
|
+
assert(
|
|
3832
|
+
metadata === undefined ||
|
|
3833
|
+
containerRuntimeMessage.type === ContainerMessageType.BlobAttach,
|
|
3834
|
+
"metadata",
|
|
3835
|
+
);
|
|
3836
|
+
|
|
3699
3837
|
const serializedContent = JSON.stringify(containerRuntimeMessage);
|
|
3700
3838
|
|
|
3701
3839
|
// Note that the real (non-proxy) delta manager is used here to get the readonly info. This is because
|
|
@@ -3710,7 +3848,6 @@ export class ContainerRuntime
|
|
|
3710
3848
|
const type = containerRuntimeMessage.type;
|
|
3711
3849
|
const message: BatchMessage = {
|
|
3712
3850
|
contents: serializedContent,
|
|
3713
|
-
type,
|
|
3714
3851
|
metadata,
|
|
3715
3852
|
localOpMetadata,
|
|
3716
3853
|
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
@@ -3726,6 +3863,22 @@ export class ContainerRuntime
|
|
|
3726
3863
|
} else {
|
|
3727
3864
|
this.submitIdAllocationOpIfNeeded();
|
|
3728
3865
|
|
|
3866
|
+
// Allow document schema controller to send a message if it needs to propose change in document schema.
|
|
3867
|
+
// If it needs to send a message, it will call provided callback with payload of such message and rely
|
|
3868
|
+
// on this callback to do actual sending.
|
|
3869
|
+
this.documentsSchemaController.onMessageSent(
|
|
3870
|
+
(contents: IDocumentSchemaChangeMessage) => {
|
|
3871
|
+
const msg: ContainerRuntimeDocumentSchemaMessage = {
|
|
3872
|
+
type: ContainerMessageType.DocumentSchemaChange,
|
|
3873
|
+
contents,
|
|
3874
|
+
};
|
|
3875
|
+
this.outbox.submit({
|
|
3876
|
+
contents: JSON.stringify(msg),
|
|
3877
|
+
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
3878
|
+
});
|
|
3879
|
+
},
|
|
3880
|
+
);
|
|
3881
|
+
|
|
3729
3882
|
// If this is attach message for new data store, and we are in a batch, send this op out of order
|
|
3730
3883
|
// Is it safe:
|
|
3731
3884
|
// Yes, this should be safe reordering. Newly created data stores are not visible through API surface.
|
|
@@ -3926,6 +4079,11 @@ export class ContainerRuntime
|
|
|
3926
4079
|
case ContainerMessageType.GC:
|
|
3927
4080
|
this.submit(message);
|
|
3928
4081
|
break;
|
|
4082
|
+
case ContainerMessageType.DocumentSchemaChange:
|
|
4083
|
+
// There is no need to resend this message. Document schema controller will properly resend it again (if needed)
|
|
4084
|
+
// on a first occasion (any ops sent after reconnect). There is a good chance, though, that it will not want to
|
|
4085
|
+
// send any ops, as some other client already changed schema.
|
|
4086
|
+
break;
|
|
3929
4087
|
default: {
|
|
3930
4088
|
// This case should be very rare - it would imply an op was stashed from a
|
|
3931
4089
|
// future version of runtime code and now is being applied on an older version.
|
|
@@ -4215,9 +4373,6 @@ export class ContainerRuntime
|
|
|
4215
4373
|
}
|
|
4216
4374
|
|
|
4217
4375
|
private get groupedBatchingEnabled(): boolean {
|
|
4218
|
-
|
|
4219
|
-
"Fluid.ContainerRuntime.DisableGroupedBatching",
|
|
4220
|
-
);
|
|
4221
|
-
return killSwitch !== true && this.runtimeOptions.enableGroupedBatching;
|
|
4376
|
+
return this.documentSchema.opGroupingEnabled === true;
|
|
4222
4377
|
}
|
|
4223
4378
|
}
|