@fluidframework/container-runtime 2.0.0-rc.4.0.5 → 2.0.0-rc.5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -0
- package/api-extractor/api-extractor-lint-bundle.json +5 -0
- package/api-extractor/api-extractor-lint-legacy.cjs.json +5 -0
- package/api-extractor/api-extractor-lint-legacy.esm.json +5 -0
- package/api-extractor/api-extractor-lint-public.cjs.json +5 -0
- package/api-extractor/api-extractor-lint-public.esm.json +5 -0
- package/api-extractor.json +1 -1
- package/api-report/{container-runtime.api.md → container-runtime.alpha.api.md} +33 -516
- package/api-report/container-runtime.beta.api.md +73 -0
- package/api-report/container-runtime.public.api.md +73 -0
- package/biome.jsonc +4 -0
- package/container-runtime.test-files.tar +0 -0
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +3 -20
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +1 -35
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +21 -12
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +113 -110
- 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 +14 -14
- 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 +17 -34
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +109 -145
- 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 +30 -44
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +26 -40
- 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.js.map +1 -1
- package/dist/deltaManagerProxies.d.ts +4 -3
- package/dist/deltaManagerProxies.d.ts.map +1 -1
- package/dist/deltaManagerProxies.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +1 -3
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +5 -5
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +29 -30
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +12 -31
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +10 -38
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +1 -5
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +2 -3
- 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 +2 -35
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +9 -62
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +2 -2
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +3 -9
- 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 +1 -3
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +1 -1
- package/dist/messageTypes.d.ts +6 -22
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -2
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +1 -1
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +11 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +13 -2
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +1 -2
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +10 -3
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +7 -0
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +4 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +13 -8
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +10 -0
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +13 -18
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +2 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.d.ts +1 -1
- package/dist/opProperties.d.ts.map +1 -1
- package/dist/opProperties.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.map +1 -1
- package/dist/pendingStateManager.js +15 -5
- 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.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +2 -3
- 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 +1 -6
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +23 -110
- 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.d.ts +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js +2 -2
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -3
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +16 -16
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -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 +2 -3
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +5 -2
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +17 -29
- 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 +11 -11
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +2 -3
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +2 -2
- 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 +27 -24
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +1 -2
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/throttler.d.ts.map +1 -1
- package/dist/throttler.js +3 -1
- package/dist/throttler.js.map +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +1 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +3 -20
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +2 -36
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +21 -12
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +114 -112
- 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 +2 -2
- 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 +17 -34
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +106 -142
- 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 +30 -44
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +29 -43
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerProxies.d.ts +4 -3
- package/lib/deltaManagerProxies.d.ts.map +1 -1
- package/lib/deltaManagerProxies.js.map +1 -1
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -3
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +5 -5
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +30 -31
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +13 -32
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +10 -38
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +0 -4
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +2 -3
- 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 +2 -35
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +4 -57
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +2 -2
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +3 -9
- 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 +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/messageTypes.d.ts +6 -22
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +2 -2
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +1 -1
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +1 -1
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +11 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +13 -2
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +1 -2
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +10 -3
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +7 -0
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +4 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +13 -8
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +10 -0
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +13 -18
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.d.ts +1 -1
- package/lib/opProperties.d.ts.map +1 -1
- package/lib/opProperties.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.map +1 -1
- package/lib/pendingStateManager.js +15 -5
- 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.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +2 -3
- 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 +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 +1 -6
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +22 -109
- 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.d.ts +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -3
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +14 -14
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -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 +2 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +5 -2
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +17 -29
- 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 +3 -3
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +2 -3
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +2 -2
- 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 +26 -23
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +1 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/throttler.d.ts.map +1 -1
- package/lib/throttler.js +3 -1
- package/lib/throttler.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +92 -28
- package/src/batchTracker.ts +5 -2
- package/src/blobManager.ts +21 -61
- package/src/channelCollection.ts +179 -186
- package/src/connectionTelemetry.ts +18 -12
- package/src/containerHandleContext.ts +2 -1
- package/src/containerRuntime.ts +166 -214
- package/src/dataStore.ts +2 -1
- package/src/dataStoreContext.ts +79 -98
- package/src/dataStoreContexts.ts +7 -2
- package/src/deltaManagerProxies.ts +15 -6
- package/src/deltaScheduler.ts +5 -4
- package/src/gc/garbageCollection.md +0 -8
- package/src/gc/garbageCollection.ts +66 -57
- package/src/gc/gcConfigs.ts +15 -37
- package/src/gc/gcDefinitions.ts +20 -39
- package/src/gc/gcHelpers.ts +8 -4
- package/src/gc/gcSummaryDefinitions.ts +1 -1
- package/src/gc/gcSummaryStateTracker.ts +11 -74
- package/src/gc/gcTelemetry.ts +4 -11
- package/src/gc/index.ts +0 -2
- package/src/index.ts +1 -2
- package/src/messageTypes.ts +8 -24
- package/src/opLifecycle/README.md +120 -160
- package/src/opLifecycle/definitions.ts +2 -2
- package/src/opLifecycle/index.ts +5 -1
- package/src/opLifecycle/opCompressor.ts +13 -2
- package/src/opLifecycle/opDecompressor.ts +3 -7
- package/src/opLifecycle/opGroupingManager.ts +12 -8
- package/src/opLifecycle/opSplitter.ts +22 -11
- package/src/opLifecycle/outbox.ts +14 -32
- package/src/opLifecycle/remoteMessageProcessor.ts +4 -1
- package/src/opProperties.ts +2 -2
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +20 -7
- package/src/scheduleManager.ts +4 -1
- package/src/summary/documentSchema.ts +4 -7
- package/src/summary/images/appTree.png +0 -0
- package/src/summary/images/protocolAndAppTree.png +0 -0
- package/src/summary/images/summaryTree.png +0 -0
- package/src/summary/index.ts +5 -2
- package/src/summary/orderedClientElection.ts +100 -22
- package/src/summary/runningSummarizer.ts +54 -124
- package/src/summary/summarizer.ts +5 -2
- package/src/summary/summarizerClientElection.ts +4 -2
- package/src/summary/summarizerNode/summarizerNode.ts +23 -30
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +9 -3
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -11
- package/src/summary/summarizerTypes.ts +32 -33
- package/src/summary/summaryCollection.ts +6 -3
- package/src/summary/summaryFormat.ts +18 -10
- package/src/summary/summaryFormats.md +160 -0
- package/src/summary/summaryGenerator.ts +47 -30
- package/src/summary/summaryManager.ts +6 -9
- package/src/throttler.ts +3 -1
- package/tsconfig.json +2 -0
- package/tsdoc.json +4 -0
package/dist/containerRuntime.js
CHANGED
|
@@ -9,9 +9,9 @@ const client_utils_1 = require("@fluid-internal/client-utils");
|
|
|
9
9
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
10
10
|
const internal_1 = require("@fluidframework/container-definitions/internal");
|
|
11
11
|
const internal_2 = require("@fluidframework/core-utils/internal");
|
|
12
|
+
const driver_definitions_1 = require("@fluidframework/driver-definitions");
|
|
12
13
|
const internal_3 = require("@fluidframework/driver-definitions/internal");
|
|
13
14
|
const internal_4 = require("@fluidframework/driver-utils/internal");
|
|
14
|
-
const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
|
|
15
15
|
const internal_5 = require("@fluidframework/runtime-definitions/internal");
|
|
16
16
|
const internal_6 = require("@fluidframework/runtime-utils/internal");
|
|
17
17
|
const internal_7 = require("@fluidframework/telemetry-utils/internal");
|
|
@@ -50,13 +50,13 @@ function compatBehaviorAllowsMessageType(_unknownContainerRuntimeMessageType, co
|
|
|
50
50
|
exports.DefaultSummaryConfiguration = {
|
|
51
51
|
state: "enabled",
|
|
52
52
|
minIdleTime: 0,
|
|
53
|
-
maxIdleTime: 30 * 1000,
|
|
54
|
-
maxTime: 60 * 1000,
|
|
55
|
-
maxOps: 100,
|
|
53
|
+
maxIdleTime: 30 * 1000, // 30 secs.
|
|
54
|
+
maxTime: 60 * 1000, // 1 min.
|
|
55
|
+
maxOps: 100, // Summarize if 100 weighted ops received since last snapshot.
|
|
56
56
|
minOpsForLastSummaryAttempt: 10,
|
|
57
|
-
maxAckWaitTime: 3 * 60 * 1000,
|
|
57
|
+
maxAckWaitTime: 3 * 60 * 1000, // 3 mins.
|
|
58
58
|
maxOpsSinceLastSummary: 7000,
|
|
59
|
-
initialSummarizerDelayMs: 5 * 1000,
|
|
59
|
+
initialSummarizerDelayMs: 5 * 1000, // 5 secs.
|
|
60
60
|
nonRuntimeOpWeight: 0.1,
|
|
61
61
|
runtimeOpWeight: 1.0,
|
|
62
62
|
nonRuntimeHeuristicThreshold: 20,
|
|
@@ -155,7 +155,7 @@ exports.getDeviceSpec = getDeviceSpec;
|
|
|
155
155
|
*/
|
|
156
156
|
const makeLegacySendBatchFn = (submitFn, deltaManager) => (batch) => {
|
|
157
157
|
for (const message of batch.content) {
|
|
158
|
-
submitFn(
|
|
158
|
+
submitFn(internal_3.MessageType.Operation,
|
|
159
159
|
// For back-compat (submitFn only works on deserialized content)
|
|
160
160
|
message.contents === undefined ? undefined : JSON.parse(message.contents), true, // batch
|
|
161
161
|
message.metadata);
|
|
@@ -532,7 +532,9 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
532
532
|
return this.garbageCollector.throwOnTombstoneUsage;
|
|
533
533
|
}
|
|
534
534
|
/***/
|
|
535
|
-
constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope,
|
|
535
|
+
constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope,
|
|
536
|
+
// Create a custom ITelemetryBaseLogger to output telemetry events.
|
|
537
|
+
baseLogger, existing, blobManagerSnapshot, _storage, createIdCompressor, documentsSchemaController, featureGatesForTelemetry, provideEntryPoint, requestHandler, summaryConfiguration = {
|
|
536
538
|
// the defaults
|
|
537
539
|
...exports.DefaultSummaryConfiguration,
|
|
538
540
|
// the runtime configuration overrides
|
|
@@ -543,7 +545,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
543
545
|
this.metadata = metadata;
|
|
544
546
|
this.runtimeOptions = runtimeOptions;
|
|
545
547
|
this.containerScope = containerScope;
|
|
546
|
-
this.
|
|
548
|
+
this.baseLogger = baseLogger;
|
|
547
549
|
this._storage = _storage;
|
|
548
550
|
this.createIdCompressor = createIdCompressor;
|
|
549
551
|
this.documentsSchemaController = documentsSchemaController;
|
|
@@ -575,6 +577,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
575
577
|
expiry: { policy: "absolute", durationMs: 60000 },
|
|
576
578
|
});
|
|
577
579
|
const { options, clientDetails, connected, baseSnapshot, submitFn, submitBatchFn, submitSummaryFn, submitSignalFn, disposeFn, closeFn, deltaManager, quorum, audience, loader, pendingLocalState, supportedFeatures, snapshotWithContents, } = context;
|
|
580
|
+
this.logger = (0, internal_7.createChildLogger)({ logger: this.baseLogger });
|
|
578
581
|
this.mc = (0, internal_7.createChildMonitoringContext)({
|
|
579
582
|
logger: this.logger,
|
|
580
583
|
namespace: "ContainerRuntime",
|
|
@@ -770,7 +773,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
770
773
|
snapshotTree: snapshot,
|
|
771
774
|
};
|
|
772
775
|
}
|
|
773
|
-
this.channelCollection = new channelCollection_js_1.ChannelCollection(snapshot, parentContext, this.mc.logger, (props) => this.garbageCollector.nodeUpdated(
|
|
776
|
+
this.channelCollection = new channelCollection_js_1.ChannelCollection(snapshot, parentContext, this.mc.logger, (props) => this.garbageCollector.nodeUpdated({
|
|
777
|
+
...props,
|
|
778
|
+
timestampMs: props.timestampMs ?? this.getCurrentReferenceTimestampMs(),
|
|
779
|
+
}), (path) => this.garbageCollector.isNodeDeleted(path), new Map(dataStoreAliasMap), async (runtime) => provideEntryPoint);
|
|
774
780
|
this.blobManager = new blobManager_js_1.BlobManager({
|
|
775
781
|
routeContext: this.handleContext,
|
|
776
782
|
snapshot: blobManagerSnapshot,
|
|
@@ -786,6 +792,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
786
792
|
blobRequested: (blobPath) => this.garbageCollector.nodeUpdated({
|
|
787
793
|
node: { type: "Blob", path: blobPath },
|
|
788
794
|
reason: "Loaded",
|
|
795
|
+
timestampMs: this.getCurrentReferenceTimestampMs(),
|
|
789
796
|
}),
|
|
790
797
|
isBlobDeleted: (blobPath) => this.garbageCollector.isNodeDeleted(blobPath),
|
|
791
798
|
runtime: this,
|
|
@@ -843,7 +850,8 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
843
850
|
});
|
|
844
851
|
}
|
|
845
852
|
const closeSummarizerDelayOverride = this.mc.config.getNumber("Fluid.ContainerRuntime.Test.CloseSummarizerDelayOverrideMs");
|
|
846
|
-
this.closeSummarizerDelayMs =
|
|
853
|
+
this.closeSummarizerDelayMs =
|
|
854
|
+
closeSummarizerDelayOverride ?? defaultCloseSummarizerDelayMs;
|
|
847
855
|
this.summaryCollection = new index_js_3.SummaryCollection(this.deltaManager, this.logger);
|
|
848
856
|
this.dirtyContainer =
|
|
849
857
|
this.attachState !== container_definitions_1.AttachState.Attached || this.hasPendingMessages();
|
|
@@ -857,7 +865,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
857
865
|
namespace: "OrderedClientElection",
|
|
858
866
|
});
|
|
859
867
|
const orderedClientCollection = new index_js_3.OrderedClientCollection(orderedClientLogger, this.innerDeltaManager, this._quorum);
|
|
860
|
-
const orderedClientElectionForSummarizer = new index_js_3.OrderedClientElection(orderedClientLogger, orderedClientCollection, electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber, index_js_3.SummarizerClientElection.isClientEligible);
|
|
868
|
+
const orderedClientElectionForSummarizer = new index_js_3.OrderedClientElection(orderedClientLogger, orderedClientCollection, electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber, index_js_3.SummarizerClientElection.isClientEligible, this.mc.config.getBoolean("Fluid.ContainerRuntime.OrderedClientElection.EnablePerformanceEvents"));
|
|
861
869
|
this.summarizerClientElection = new index_js_3.SummarizerClientElection(orderedClientLogger, this.summaryCollection, orderedClientElectionForSummarizer, this.maxOpsSinceLastSummary);
|
|
862
870
|
if (this.isSummarizerClient) {
|
|
863
871
|
this._summarizer = new index_js_3.Summarizer(this /* ISummarizerRuntime */, () => this.summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, this.summaryCollection, async (runtime) => index_js_3.RunWhileConnectedCoordinator.create(runtime,
|
|
@@ -874,7 +882,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
874
882
|
// unregister default to no log on every op after falling behind
|
|
875
883
|
// and register summary ack handler to re-register this handler
|
|
876
884
|
// after successful summary
|
|
877
|
-
this.summaryCollection.once(
|
|
885
|
+
this.summaryCollection.once(internal_3.MessageType.SummaryAck, () => {
|
|
878
886
|
this.mc.logger.sendTelemetryEvent({
|
|
879
887
|
eventName: "SummaryStatus:CaughtUp",
|
|
880
888
|
});
|
|
@@ -901,7 +909,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
901
909
|
}
|
|
902
910
|
}
|
|
903
911
|
// logging hardware telemetry
|
|
904
|
-
logger.sendTelemetryEvent({
|
|
912
|
+
this.logger.sendTelemetryEvent({
|
|
905
913
|
eventName: "DeviceSpec",
|
|
906
914
|
...getDeviceSpec(),
|
|
907
915
|
});
|
|
@@ -1064,7 +1072,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1064
1072
|
const props = {
|
|
1065
1073
|
eventName: "GroupIdSnapshotCatchup",
|
|
1066
1074
|
loadingGroupIds: sortedLoadingGroupIds.join(","),
|
|
1067
|
-
targetSequenceNumber: snapshotSeqNumber,
|
|
1075
|
+
targetSequenceNumber: snapshotSeqNumber, // This is so we reuse some columns in telemetry
|
|
1068
1076
|
sequenceNumber: this.deltaManager.lastSequenceNumber, // This is so we reuse some columns in telemetry
|
|
1069
1077
|
};
|
|
1070
1078
|
const event = internal_7.PerformanceEvent.start(this.mc.logger, {
|
|
@@ -1182,7 +1190,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1182
1190
|
this.messageAtLastSummary;
|
|
1183
1191
|
const documentSchema = this.documentsSchemaController.summarizeDocumentSchema(this.deltaManager.lastSequenceNumber);
|
|
1184
1192
|
// Is document schema explicit control on?
|
|
1185
|
-
const
|
|
1193
|
+
const explicitSchemaControl = documentSchema?.runtime.explicitSchemaControl;
|
|
1186
1194
|
const metadata = {
|
|
1187
1195
|
...this.createContainerMetadata,
|
|
1188
1196
|
// Increment the summary number for the next summary that will be generated.
|
|
@@ -1195,10 +1203,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1195
1203
|
// runtimes (that preceed document schema control capabilities) to close container on load due to mismatch in
|
|
1196
1204
|
// last message's sequence number.
|
|
1197
1205
|
// See also lastMessageFromMetadata()
|
|
1198
|
-
message:
|
|
1206
|
+
message: explicitSchemaControl
|
|
1199
1207
|
? { sequenceNumber: -1 }
|
|
1200
1208
|
: message,
|
|
1201
|
-
lastMessage:
|
|
1209
|
+
lastMessage: explicitSchemaControl ? message : undefined,
|
|
1202
1210
|
documentSchema,
|
|
1203
1211
|
};
|
|
1204
1212
|
(0, internal_6.addBlobToSummary)(summaryTree, index_js_3.metadataBlobName, JSON.stringify(metadata));
|
|
@@ -1453,7 +1461,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1453
1461
|
// Whether or not the message appears to be a runtime message from an up-to-date client.
|
|
1454
1462
|
// It may be a legacy runtime message (ie already unpacked and ContainerMessageType)
|
|
1455
1463
|
// or something different, like a system message.
|
|
1456
|
-
const modernRuntimeMessage = messageArg.type ===
|
|
1464
|
+
const modernRuntimeMessage = messageArg.type === internal_3.MessageType.Operation;
|
|
1457
1465
|
// Do shallow copy of message, as the processing flow will modify it.
|
|
1458
1466
|
// There might be multiple container instances receiving the same message.
|
|
1459
1467
|
// We do not need to make a deep copy. Each layer will just replace message.contents itself,
|
|
@@ -1541,7 +1549,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1541
1549
|
case messageTypes_js_1.ContainerMessageType.Attach:
|
|
1542
1550
|
case messageTypes_js_1.ContainerMessageType.Alias:
|
|
1543
1551
|
case messageTypes_js_1.ContainerMessageType.FluidDataStoreOp:
|
|
1544
|
-
this.channelCollection.process(messageWithContext.message, local, localOpMetadata
|
|
1552
|
+
this.channelCollection.process(messageWithContext.message, local, localOpMetadata);
|
|
1545
1553
|
break;
|
|
1546
1554
|
case messageTypes_js_1.ContainerMessageType.BlobAttach:
|
|
1547
1555
|
this.blobManager.processBlobAttachOp(messageWithContext.message, local);
|
|
@@ -1566,7 +1574,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1566
1574
|
}
|
|
1567
1575
|
break;
|
|
1568
1576
|
case messageTypes_js_1.ContainerMessageType.GC:
|
|
1569
|
-
this.garbageCollector.processMessage(messageWithContext.message, local);
|
|
1577
|
+
this.garbageCollector.processMessage(messageWithContext.message, messageWithContext.message.timestamp, local);
|
|
1570
1578
|
break;
|
|
1571
1579
|
case messageTypes_js_1.ContainerMessageType.ChunkedOp:
|
|
1572
1580
|
// From observability POV, we should not exppse the rest of the system (including "op" events on object) to these messages.
|
|
@@ -1629,8 +1637,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1629
1637
|
if (message.clientId === this.clientId && this.connected) {
|
|
1630
1638
|
// Check to see if the signal was lost.
|
|
1631
1639
|
if (this._perfSignalData.trackingSignalSequenceNumber !== undefined &&
|
|
1632
|
-
envelope.clientSignalSequenceNumber >
|
|
1633
|
-
this._perfSignalData.trackingSignalSequenceNumber) {
|
|
1640
|
+
envelope.clientSignalSequenceNumber > this._perfSignalData.trackingSignalSequenceNumber) {
|
|
1634
1641
|
this._perfSignalData.signalsLost++;
|
|
1635
1642
|
this._perfSignalData.trackingSignalSequenceNumber = undefined;
|
|
1636
1643
|
this.mc.logger.sendErrorEvent({
|
|
@@ -1750,6 +1757,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1750
1757
|
node: { type: "DataStore", path: `/${internalId}` },
|
|
1751
1758
|
reason: "Loaded",
|
|
1752
1759
|
packagePath: context.packagePath,
|
|
1760
|
+
timestampMs: this.getCurrentReferenceTimestampMs(),
|
|
1753
1761
|
});
|
|
1754
1762
|
return channel.entryPoint;
|
|
1755
1763
|
}
|
|
@@ -1917,25 +1925,16 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1917
1925
|
await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC }, telemetryContext);
|
|
1918
1926
|
}
|
|
1919
1927
|
const { stats, summary } = await this.summarizerNode.summarize(fullTree, trackState, telemetryContext);
|
|
1920
|
-
(0, internal_2.assert)(summary.type ===
|
|
1928
|
+
(0, internal_2.assert)(summary.type === driver_definitions_1.SummaryType.Tree, 0x12f /* "Container Runtime's summarize should always return a tree" */);
|
|
1921
1929
|
return { stats, summary };
|
|
1922
1930
|
}
|
|
1923
1931
|
finally {
|
|
1924
|
-
|
|
1932
|
+
summaryLogger.sendTelemetryEvent({
|
|
1925
1933
|
eventName: "SummarizeTelemetry",
|
|
1926
1934
|
details: telemetryContext.serialize(),
|
|
1927
1935
|
});
|
|
1928
1936
|
}
|
|
1929
1937
|
}
|
|
1930
|
-
/**
|
|
1931
|
-
* Before GC runs, called by the garbage collector to update any pending GC state. This is mainly used to notify
|
|
1932
|
-
* the garbage collector of references detected since the last GC run. Most references are notified immediately
|
|
1933
|
-
* but there can be some for which async operation is required (such as detecting new root data stores).
|
|
1934
|
-
* @see IGarbageCollectionRuntime.updateStateBeforeGC
|
|
1935
|
-
*/
|
|
1936
|
-
async updateStateBeforeGC() {
|
|
1937
|
-
return this.channelCollection.updateStateBeforeGC();
|
|
1938
|
-
}
|
|
1939
1938
|
async getGCDataInternal(fullGC) {
|
|
1940
1939
|
return this.channelCollection.getGCData(fullGC);
|
|
1941
1940
|
}
|
|
@@ -1984,8 +1983,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
1984
1983
|
* @param tombstonedRoutes - Data store and attachment blob routes that are tombstones in this Container.
|
|
1985
1984
|
*/
|
|
1986
1985
|
updateTombstonedRoutes(tombstonedRoutes) {
|
|
1987
|
-
const {
|
|
1988
|
-
this.blobManager.updateTombstonedRoutes(blobManagerRoutes);
|
|
1986
|
+
const { dataStoreRoutes } = this.getDataStoreAndBlobManagerRoutes(tombstonedRoutes);
|
|
1989
1987
|
this.channelCollection.updateTombstonedRoutes(dataStoreRoutes);
|
|
1990
1988
|
}
|
|
1991
1989
|
/**
|
|
@@ -2063,13 +2061,29 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2063
2061
|
return this.garbageCollector.collectGarbage(options, telemetryContext);
|
|
2064
2062
|
}
|
|
2065
2063
|
/**
|
|
2066
|
-
* Called when a new outbound
|
|
2064
|
+
* Called when a new outbound route is added to another node. This is used by garbage collection to identify
|
|
2067
2065
|
* all references added in the system.
|
|
2068
|
-
* @param
|
|
2069
|
-
* @param
|
|
2066
|
+
* @param fromPath - The absolute path of the node that added the reference.
|
|
2067
|
+
* @param toPath - The absolute path of the outbound node that is referenced.
|
|
2068
|
+
* @param messageTimestampMs - The timestamp of the message that added the reference.
|
|
2070
2069
|
*/
|
|
2071
|
-
|
|
2072
|
-
|
|
2070
|
+
addedGCOutboundRoute(fromPath, toPath, messageTimestampMs) {
|
|
2071
|
+
// This is always called when processing an op so messageTimestampMs should exist. Due to back-compat
|
|
2072
|
+
// across the data store runtime / container runtime boundary, this may be undefined and if so, get
|
|
2073
|
+
// the timestamp from the last processed message which should exist.
|
|
2074
|
+
// If a timestamp doesn't exist, log so we can learn about these cases and return.
|
|
2075
|
+
const timestampMs = messageTimestampMs ?? this.getCurrentReferenceTimestampMs();
|
|
2076
|
+
if (timestampMs === undefined) {
|
|
2077
|
+
this.mc.logger.sendTelemetryEvent({
|
|
2078
|
+
eventName: "NoTimestampInGCOutboundRoute",
|
|
2079
|
+
...(0, internal_7.tagCodeArtifacts)({
|
|
2080
|
+
id: toPath,
|
|
2081
|
+
fromId: fromPath,
|
|
2082
|
+
}),
|
|
2083
|
+
});
|
|
2084
|
+
return;
|
|
2085
|
+
}
|
|
2086
|
+
this.garbageCollector.addedOutboundReference(fromPath, toPath, timestampMs);
|
|
2073
2087
|
}
|
|
2074
2088
|
/**
|
|
2075
2089
|
* Generates the summary tree, uploads it to storage, and then submits the summarize op.
|
|
@@ -2080,7 +2094,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2080
2094
|
* @param options - options controlling how the summary is generated or submitted
|
|
2081
2095
|
*/
|
|
2082
2096
|
async submitSummary(options) {
|
|
2083
|
-
const { fullTree = false, finalAttempt = false,
|
|
2097
|
+
const { fullTree = false, finalAttempt = false, summaryLogger, latestSummaryRefSeqNum, } = options;
|
|
2084
2098
|
// The summary number for this summary. This will be updated during the summary process, so get it now and
|
|
2085
2099
|
// use it for all events logged during this summary.
|
|
2086
2100
|
const summaryNumber = this.nextSummaryNumber;
|
|
@@ -2095,13 +2109,6 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2095
2109
|
},
|
|
2096
2110
|
});
|
|
2097
2111
|
(0, internal_2.assert)(this.outbox.isEmpty, 0x3d1 /* Can't trigger summary in the middle of a batch */);
|
|
2098
|
-
// We close the summarizer and download a new snapshot and reload the container
|
|
2099
|
-
if (refreshLatestAck === true) {
|
|
2100
|
-
return this.prefetchLatestSummaryThenClose((0, internal_7.createChildLogger)({
|
|
2101
|
-
logger: summaryNumberLogger,
|
|
2102
|
-
properties: { all: { safeSummary: true } },
|
|
2103
|
-
}));
|
|
2104
|
-
}
|
|
2105
2112
|
// If the container is dirty, i.e., there are pending unacked ops, the summary will not be eventual consistent
|
|
2106
2113
|
// and it may even be incorrect. So, wait for the container to be saved with a timeout. If the container is not
|
|
2107
2114
|
// saved within the timeout, check if it should be failed or can continue.
|
|
@@ -2156,8 +2163,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2156
2163
|
* Generally the validate sequence number comes from the running summarizer and the node sequence number comes from the
|
|
2157
2164
|
* summarizer nodes.
|
|
2158
2165
|
*/
|
|
2159
|
-
if (startSummaryResult.invalidNodes > 0 ||
|
|
2160
|
-
startSummaryResult.mismatchNumbers.size > 0) {
|
|
2166
|
+
if (startSummaryResult.invalidNodes > 0 || startSummaryResult.mismatchNumbers.size > 0) {
|
|
2161
2167
|
summaryLogger.sendTelemetryEvent({
|
|
2162
2168
|
eventName: "LatestSummaryRefSeqNumMismatch",
|
|
2163
2169
|
details: {
|
|
@@ -2170,7 +2176,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2170
2176
|
stage: "base",
|
|
2171
2177
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
2172
2178
|
minimumSequenceNumber,
|
|
2173
|
-
error: new
|
|
2179
|
+
error: new index_js_3.RetriableSummaryError(`Summarizer node state inconsistent with summarizer state.`),
|
|
2174
2180
|
};
|
|
2175
2181
|
}
|
|
2176
2182
|
}
|
|
@@ -2213,17 +2219,14 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2213
2219
|
stage: "base",
|
|
2214
2220
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
2215
2221
|
minimumSequenceNumber,
|
|
2216
|
-
error: new
|
|
2222
|
+
error: new index_js_3.RetriableSummaryError(continueResult.error),
|
|
2217
2223
|
};
|
|
2218
2224
|
}
|
|
2219
2225
|
const trace = client_utils_1.Trace.start();
|
|
2220
2226
|
let summarizeResult;
|
|
2221
|
-
// If the GC state needs to be reset, we need to force a full tree summary and update the unreferenced
|
|
2222
|
-
// state of all the nodes.
|
|
2223
|
-
const forcedFullTree = this.garbageCollector.summaryStateNeedsReset;
|
|
2224
2227
|
try {
|
|
2225
2228
|
summarizeResult = await this.summarize({
|
|
2226
|
-
fullTree
|
|
2229
|
+
fullTree,
|
|
2227
2230
|
trackState: true,
|
|
2228
2231
|
summaryLogger: summaryNumberLogger,
|
|
2229
2232
|
runGC: this.garbageCollector.shouldRunGC,
|
|
@@ -2234,7 +2237,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2234
2237
|
stage: "base",
|
|
2235
2238
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
2236
2239
|
minimumSequenceNumber,
|
|
2237
|
-
error: (0, internal_7.wrapError)(error, (msg) => new
|
|
2240
|
+
error: (0, internal_7.wrapError)(error, (msg) => new index_js_3.RetriableSummaryError(msg)),
|
|
2238
2241
|
};
|
|
2239
2242
|
}
|
|
2240
2243
|
// Validate that the summary generated by summarizer nodes is correct before uploading.
|
|
@@ -2262,8 +2265,8 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2262
2265
|
// Because handles are unchanged dataStores in the current logic,
|
|
2263
2266
|
// summarized dataStore count is total dataStore count minus handle count
|
|
2264
2267
|
const dataStoreTree = summaryTree.tree[internal_5.channelsTreeName];
|
|
2265
|
-
(0, internal_2.assert)(dataStoreTree.type ===
|
|
2266
|
-
const handleCount = Object.values(dataStoreTree.tree).filter((value) => value.type ===
|
|
2268
|
+
(0, internal_2.assert)(dataStoreTree.type === driver_definitions_1.SummaryType.Tree, 0x1fc /* "summary is not a tree" */);
|
|
2269
|
+
const handleCount = Object.values(dataStoreTree.tree).filter((value) => value.type === driver_definitions_1.SummaryType.Handle).length;
|
|
2267
2270
|
const gcSummaryTreeStats = summaryTree.tree[internal_5.gcTreeKey]
|
|
2268
2271
|
? (0, internal_6.calculateStats)(summaryTree.tree[internal_5.gcTreeKey])
|
|
2269
2272
|
: undefined;
|
|
@@ -2282,14 +2285,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2282
2285
|
summaryTree,
|
|
2283
2286
|
summaryStats,
|
|
2284
2287
|
generateDuration: trace.trace().duration,
|
|
2285
|
-
forcedFullTree,
|
|
2286
2288
|
};
|
|
2287
2289
|
continueResult = checkContinue();
|
|
2288
2290
|
if (!continueResult.continue) {
|
|
2289
2291
|
return {
|
|
2290
2292
|
stage: "generate",
|
|
2291
2293
|
...generateSummaryData,
|
|
2292
|
-
error: new
|
|
2294
|
+
error: new index_js_3.RetriableSummaryError(continueResult.error),
|
|
2293
2295
|
};
|
|
2294
2296
|
}
|
|
2295
2297
|
const summaryContext = lastAck === undefined
|
|
@@ -2311,7 +2313,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2311
2313
|
return {
|
|
2312
2314
|
stage: "generate",
|
|
2313
2315
|
...generateSummaryData,
|
|
2314
|
-
error: (0, internal_7.wrapError)(error, (msg) => new
|
|
2316
|
+
error: (0, internal_7.wrapError)(error, (msg) => new index_js_3.RetriableSummaryError(msg)),
|
|
2315
2317
|
};
|
|
2316
2318
|
}
|
|
2317
2319
|
const parent = summaryContext.ackHandle;
|
|
@@ -2332,7 +2334,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2332
2334
|
return {
|
|
2333
2335
|
stage: "upload",
|
|
2334
2336
|
...uploadData,
|
|
2335
|
-
error: new
|
|
2337
|
+
error: new index_js_3.RetriableSummaryError(continueResult.error),
|
|
2336
2338
|
};
|
|
2337
2339
|
}
|
|
2338
2340
|
let clientSequenceNumber;
|
|
@@ -2343,7 +2345,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2343
2345
|
return {
|
|
2344
2346
|
stage: "upload",
|
|
2345
2347
|
...uploadData,
|
|
2346
|
-
error: (0, internal_7.wrapError)(error, (msg) => new
|
|
2348
|
+
error: (0, internal_7.wrapError)(error, (msg) => new index_js_3.RetriableSummaryError(msg)),
|
|
2347
2349
|
};
|
|
2348
2350
|
}
|
|
2349
2351
|
const submitData = {
|
|
@@ -2359,7 +2361,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2359
2361
|
return {
|
|
2360
2362
|
stage: "upload",
|
|
2361
2363
|
...uploadData,
|
|
2362
|
-
error: (0, internal_7.wrapError)(error, (msg) => new
|
|
2364
|
+
error: (0, internal_7.wrapError)(error, (msg) => new index_js_3.RetriableSummaryError(msg)),
|
|
2363
2365
|
};
|
|
2364
2366
|
}
|
|
2365
2367
|
return submitData;
|
|
@@ -2449,13 +2451,13 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2449
2451
|
this.verifyNotClosed();
|
|
2450
2452
|
return this.blobManager.createBlob(blob, signal);
|
|
2451
2453
|
}
|
|
2452
|
-
submitIdAllocationOpIfNeeded(resubmitOutstandingRanges
|
|
2454
|
+
submitIdAllocationOpIfNeeded(resubmitOutstandingRanges) {
|
|
2453
2455
|
if (this._idCompressor) {
|
|
2454
2456
|
const idRange = resubmitOutstandingRanges
|
|
2455
|
-
? this.
|
|
2457
|
+
? this._idCompressor.takeUnfinalizedCreationRange()
|
|
2456
2458
|
: this._idCompressor.takeNextCreationRange();
|
|
2457
2459
|
// Don't include the idRange if there weren't any Ids allocated
|
|
2458
|
-
if (idRange
|
|
2460
|
+
if (idRange.ids !== undefined) {
|
|
2459
2461
|
const idAllocationMessage = {
|
|
2460
2462
|
type: messageTypes_js_1.ContainerMessageType.IdAllocation,
|
|
2461
2463
|
contents: idRange,
|
|
@@ -2484,6 +2486,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2484
2486
|
});
|
|
2485
2487
|
}
|
|
2486
2488
|
const type = containerRuntimeMessage.type;
|
|
2489
|
+
(0, internal_2.assert)(type !== messageTypes_js_1.ContainerMessageType.IdAllocation, 0x9a5 /* IdAllocation should be submitted directly to outbox. */);
|
|
2487
2490
|
const message = {
|
|
2488
2491
|
contents: serializedContent,
|
|
2489
2492
|
metadata,
|
|
@@ -2491,44 +2494,35 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2491
2494
|
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
2492
2495
|
};
|
|
2493
2496
|
try {
|
|
2494
|
-
|
|
2495
|
-
//
|
|
2496
|
-
//
|
|
2497
|
-
//
|
|
2498
|
-
|
|
2499
|
-
|
|
2497
|
+
this.submitIdAllocationOpIfNeeded(false);
|
|
2498
|
+
// Allow document schema controller to send a message if it needs to propose change in document schema.
|
|
2499
|
+
// If it needs to send a message, it will call provided callback with payload of such message and rely
|
|
2500
|
+
// on this callback to do actual sending.
|
|
2501
|
+
const contents = this.documentsSchemaController.maybeSendSchemaMessage();
|
|
2502
|
+
if (contents) {
|
|
2503
|
+
this.logger.sendTelemetryEvent({
|
|
2504
|
+
eventName: "SchemaChangeProposal",
|
|
2505
|
+
refSeq: contents.refSeq,
|
|
2506
|
+
version: contents.version,
|
|
2507
|
+
newRuntimeSchema: JSON.stringify(contents.runtime),
|
|
2508
|
+
sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
|
|
2509
|
+
oldRuntimeSchema: JSON.stringify(this.metadata?.documentSchema?.runtime),
|
|
2510
|
+
});
|
|
2511
|
+
const msg = {
|
|
2512
|
+
type: messageTypes_js_1.ContainerMessageType.DocumentSchemaChange,
|
|
2513
|
+
contents,
|
|
2514
|
+
};
|
|
2515
|
+
this.outbox.submit({
|
|
2516
|
+
contents: JSON.stringify(msg),
|
|
2517
|
+
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
2518
|
+
});
|
|
2519
|
+
}
|
|
2520
|
+
if (type === messageTypes_js_1.ContainerMessageType.BlobAttach) {
|
|
2521
|
+
// BlobAttach ops must have their metadata visible and cannot be grouped (see opGroupingManager.ts)
|
|
2522
|
+
this.outbox.submitBlobAttach(message);
|
|
2500
2523
|
}
|
|
2501
2524
|
else {
|
|
2502
|
-
this.
|
|
2503
|
-
// Allow document schema controller to send a message if it needs to propose change in document schema.
|
|
2504
|
-
// If it needs to send a message, it will call provided callback with payload of such message and rely
|
|
2505
|
-
// on this callback to do actual sending.
|
|
2506
|
-
const contents = this.documentsSchemaController.maybeSendSchemaMessage();
|
|
2507
|
-
if (contents) {
|
|
2508
|
-
this.logger.sendTelemetryEvent({
|
|
2509
|
-
eventName: "SchemaChangeProposal",
|
|
2510
|
-
refSeq: contents.refSeq,
|
|
2511
|
-
version: contents.version,
|
|
2512
|
-
newRuntimeSchema: JSON.stringify(contents.runtime),
|
|
2513
|
-
sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
|
|
2514
|
-
oldRuntimeSchema: JSON.stringify(this.metadata?.documentSchema?.runtime),
|
|
2515
|
-
});
|
|
2516
|
-
const msg = {
|
|
2517
|
-
type: messageTypes_js_1.ContainerMessageType.DocumentSchemaChange,
|
|
2518
|
-
contents,
|
|
2519
|
-
};
|
|
2520
|
-
this.outbox.submit({
|
|
2521
|
-
contents: JSON.stringify(msg),
|
|
2522
|
-
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
2523
|
-
});
|
|
2524
|
-
}
|
|
2525
|
-
if (type === messageTypes_js_1.ContainerMessageType.BlobAttach) {
|
|
2526
|
-
// BlobAttach ops must have their metadata visible and cannot be grouped (see opGroupingManager.ts)
|
|
2527
|
-
this.outbox.submitBlobAttach(message);
|
|
2528
|
-
}
|
|
2529
|
-
else {
|
|
2530
|
-
this.outbox.submit(message);
|
|
2531
|
-
}
|
|
2525
|
+
this.outbox.submit(message);
|
|
2532
2526
|
}
|
|
2533
2527
|
if (!this.currentlyBatching()) {
|
|
2534
2528
|
this.flush();
|
|
@@ -2586,7 +2580,7 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2586
2580
|
// back-compat: ADO #1385: Make this call unconditional in the future
|
|
2587
2581
|
return this.submitSummaryFn !== undefined
|
|
2588
2582
|
? this.submitSummaryFn(contents, referenceSequenceNumber)
|
|
2589
|
-
: this.submitFn(
|
|
2583
|
+
: this.submitFn(internal_3.MessageType.Summarize, contents, false);
|
|
2590
2584
|
}
|
|
2591
2585
|
/**
|
|
2592
2586
|
* Throw an error if the runtime is closed. Methods that are expected to potentially
|
|
@@ -2703,51 +2697,23 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2703
2697
|
* and then close as the current main client is likely to be re-elected as the parent summarizer again.
|
|
2704
2698
|
*/
|
|
2705
2699
|
if (!result.isSummaryTracked && result.isSummaryNewer) {
|
|
2706
|
-
await this.
|
|
2700
|
+
await this.fetchLatestSnapshotAndClose(summaryLogger, {
|
|
2707
2701
|
eventName: "RefreshLatestSummaryAckFetch",
|
|
2708
2702
|
ackHandle,
|
|
2709
2703
|
targetSequenceNumber: summaryRefSeq,
|
|
2710
2704
|
}, readAndParseBlob);
|
|
2711
|
-
await this.closeStaleSummarizer();
|
|
2712
2705
|
return;
|
|
2713
2706
|
}
|
|
2714
2707
|
// Notify the garbage collector so it can update its latest summary state.
|
|
2715
2708
|
await this.garbageCollector.refreshLatestSummary(result);
|
|
2716
2709
|
}
|
|
2717
2710
|
/**
|
|
2718
|
-
* Fetches the latest snapshot from storage
|
|
2719
|
-
*
|
|
2720
|
-
*
|
|
2721
|
-
* @returns a generic summarization error
|
|
2711
|
+
* Fetches the latest snapshot from storage and closes the container. This is done in cases where
|
|
2712
|
+
* the last known snapshot is older than the latest one. This will ensure that the latest snapshot
|
|
2713
|
+
* is downloaded and we don't end up loading snapshot from cache.
|
|
2722
2714
|
*/
|
|
2723
|
-
async
|
|
2724
|
-
|
|
2725
|
-
// This is a performance optimization as the same parent is likely to be elected again, and would use its
|
|
2726
|
-
// cache to fetch the snapshot instead of the network.
|
|
2727
|
-
await this.fetchLatestSnapshotFromStorage(summaryLogger, {
|
|
2728
|
-
eventName: "RefreshLatestSummaryFromServerFetch",
|
|
2729
|
-
}, readAndParseBlob);
|
|
2730
|
-
await this.closeStaleSummarizer();
|
|
2731
|
-
return {
|
|
2732
|
-
stage: "base",
|
|
2733
|
-
error: new internal_7.LoggingError("summary state stale - Unsupported option 'refreshLatestAck'"),
|
|
2734
|
-
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
2735
|
-
minimumSequenceNumber: this.deltaManager.minimumSequenceNumber,
|
|
2736
|
-
};
|
|
2737
|
-
}
|
|
2738
|
-
async closeStaleSummarizer() {
|
|
2739
|
-
// Delay before restarting summarizer to prevent the summarizer from restarting too frequently.
|
|
2740
|
-
await (0, internal_2.delay)(this.closeSummarizerDelayMs);
|
|
2741
|
-
this._summarizer?.stop("latestSummaryStateStale");
|
|
2742
|
-
this.disposeFn();
|
|
2743
|
-
}
|
|
2744
|
-
/**
|
|
2745
|
-
* Downloads the latest snapshot from storage.
|
|
2746
|
-
* By default, it also closes the container after downloading the snapshot. However, this may be
|
|
2747
|
-
* overridden via options.
|
|
2748
|
-
*/
|
|
2749
|
-
async fetchLatestSnapshotFromStorage(logger, event, readAndParseBlob) {
|
|
2750
|
-
return internal_7.PerformanceEvent.timedExecAsync(logger, event, async (perfEvent) => {
|
|
2715
|
+
async fetchLatestSnapshotAndClose(logger, event, readAndParseBlob) {
|
|
2716
|
+
await internal_7.PerformanceEvent.timedExecAsync(logger, event, async (perfEvent) => {
|
|
2751
2717
|
const stats = {};
|
|
2752
2718
|
const trace = client_utils_1.Trace.start();
|
|
2753
2719
|
const versions = await this.storage.getVersions(null, 1, "prefetchLatestSummaryBeforeClose", internal_3.FetchSource.noCache);
|
|
@@ -2760,12 +2726,10 @@ class ContainerRuntime extends client_utils_1.TypedEventEmitter {
|
|
|
2760
2726
|
stats.snapshotRefSeq = latestSnapshotRefSeq;
|
|
2761
2727
|
stats.snapshotVersion = versions[0].id;
|
|
2762
2728
|
perfEvent.end(stats);
|
|
2763
|
-
return {
|
|
2764
|
-
snapshotTree: maybeSnapshot,
|
|
2765
|
-
versionId: versions[0].id,
|
|
2766
|
-
latestSnapshotRefSeq,
|
|
2767
|
-
};
|
|
2768
2729
|
});
|
|
2730
|
+
await (0, internal_2.delay)(this.closeSummarizerDelayMs);
|
|
2731
|
+
this._summarizer?.stop("latestSummaryStateStale");
|
|
2732
|
+
this.disposeFn();
|
|
2769
2733
|
}
|
|
2770
2734
|
getPendingLocalState(props) {
|
|
2771
2735
|
this.verifyNotClosed();
|