@fluidframework/container-runtime 2.13.0 → 2.20.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/.eslintrc.cjs +36 -0
- package/CHANGELOG.md +46 -0
- package/api-report/container-runtime.legacy.alpha.api.md +9 -203
- 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/blobManager.d.ts +5 -1
- package/dist/blobManager/blobManager.d.ts.map +1 -1
- package/dist/blobManager/blobManager.js +16 -2
- package/dist/blobManager/blobManager.js.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.js.map +1 -1
- package/dist/channelCollection.d.ts +23 -12
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +22 -12
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +6 -2
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +74 -65
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +53 -37
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +7 -3
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +2 -1
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +41 -25
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +31 -18
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +6 -2
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +6 -2
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +1 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerProxies.d.ts +1 -17
- package/dist/deltaManagerProxies.d.ts.map +1 -1
- package/dist/deltaManagerProxies.js.map +1 -1
- package/dist/deltaScheduler.d.ts +9 -6
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +95 -89
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +21 -7
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +12 -5
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +11 -0
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +3 -2
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +210 -70
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +39 -13
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +6 -2
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +6 -2
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/dist/gc/gcSummaryDefinitions.d.ts +18 -6
- package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -1
- package/dist/gc/gcSummaryDefinitions.js.map +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 +33 -11
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +6 -2
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts +42 -13
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +27 -9
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +1 -0
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +3 -1
- package/dist/gc/index.js.map +1 -1
- package/dist/inboundBatchAggregator.d.ts +34 -0
- package/dist/inboundBatchAggregator.d.ts.map +1 -0
- package/dist/inboundBatchAggregator.js +185 -0
- package/dist/inboundBatchAggregator.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +0 -4
- package/dist/messageTypes.d.ts +14 -5
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/metadata.d.ts +12 -4
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +6 -2
- package/dist/metadata.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +9 -3
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +3 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/duplicateBatchDetector.d.ts +9 -3
- package/dist/opLifecycle/duplicateBatchDetector.d.ts.map +1 -1
- package/dist/opLifecycle/duplicateBatchDetector.js +9 -3
- package/dist/opLifecycle/duplicateBatchDetector.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +3 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +12 -7
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +0 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +5 -4
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +2 -0
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +6 -1
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +9 -3
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/package.json +2 -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 +19 -7
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +13 -5
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +2 -0
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/index.d.ts +1 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +93 -31
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +15 -5
- package/dist/summary/orderedClientElection.js.map +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 +17 -6
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +12 -4
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +9 -5
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +9 -3
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +6 -2
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js +12 -4
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +24 -8
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +15 -5
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +48 -16
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +12 -4
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +12 -4
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +246 -135
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +1 -2
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +24 -8
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +9 -3
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +3 -1
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +8 -4
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +12 -4
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/throttler.d.ts +26 -10
- package/dist/throttler.d.ts.map +1 -1
- package/dist/throttler.js +12 -4
- package/dist/throttler.js.map +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager/blobManager.d.ts +5 -1
- package/lib/blobManager/blobManager.d.ts.map +1 -1
- package/lib/blobManager/blobManager.js +16 -2
- package/lib/blobManager/blobManager.js.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.js.map +1 -1
- package/lib/channelCollection.d.ts +23 -12
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +22 -12
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +6 -2
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +74 -65
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +53 -37
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +7 -3
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +2 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +41 -25
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +31 -18
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +6 -2
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +6 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +1 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerProxies.d.ts +1 -17
- package/lib/deltaManagerProxies.d.ts.map +1 -1
- package/lib/deltaManagerProxies.js.map +1 -1
- package/lib/deltaScheduler.d.ts +9 -6
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +95 -89
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +21 -7
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +12 -5
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +11 -0
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +2 -2
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +210 -70
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +39 -13
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +6 -2
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +6 -2
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/lib/gc/gcSummaryDefinitions.d.ts +18 -6
- package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -1
- package/lib/gc/gcSummaryDefinitions.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +33 -11
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +6 -2
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.d.ts +42 -13
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +27 -9
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +1 -0
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -0
- package/lib/gc/index.js.map +1 -1
- package/lib/inboundBatchAggregator.d.ts +34 -0
- package/lib/inboundBatchAggregator.d.ts.map +1 -0
- package/lib/inboundBatchAggregator.js +181 -0
- package/lib/inboundBatchAggregator.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +0 -4
- package/lib/messageTypes.d.ts +14 -5
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/metadata.d.ts +12 -4
- package/lib/metadata.d.ts.map +1 -1
- package/lib/metadata.js +6 -2
- package/lib/metadata.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +9 -3
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +3 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/duplicateBatchDetector.d.ts +9 -3
- package/lib/opLifecycle/duplicateBatchDetector.d.ts.map +1 -1
- package/lib/opLifecycle/duplicateBatchDetector.js +9 -3
- package/lib/opLifecycle/duplicateBatchDetector.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +1 -1
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +3 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +13 -8
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +0 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +6 -5
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +2 -0
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +6 -1
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +9 -3
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +19 -7
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +13 -5
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +2 -0
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/index.d.ts +1 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +93 -31
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +15 -5
- package/lib/summary/orderedClientElection.js.map +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 +17 -6
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +12 -4
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +9 -5
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +9 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +6 -2
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js +12 -4
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +24 -8
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +15 -5
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +48 -16
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +3 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +12 -4
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +12 -4
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +246 -135
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +1 -2
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +24 -8
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +9 -3
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +3 -1
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +8 -4
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +12 -4
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/throttler.d.ts +26 -10
- package/lib/throttler.d.ts.map +1 -1
- package/lib/throttler.js +12 -4
- package/lib/throttler.js.map +1 -1
- package/package.json +43 -30
- package/src/batchTracker.ts +31 -33
- package/src/blobManager/blobManager.ts +38 -19
- package/src/blobManager/blobManagerSnapSum.ts +2 -2
- package/src/channelCollection.ts +45 -38
- package/src/connectionTelemetry.ts +31 -13
- package/src/containerHandleContext.ts +2 -2
- package/src/containerRuntime.ts +199 -142
- package/src/dataStore.ts +11 -6
- package/src/dataStoreContext.ts +80 -59
- package/src/dataStoreContexts.ts +16 -12
- package/src/dataStoreRegistry.ts +1 -1
- package/src/deltaManagerProxies.ts +5 -5
- package/src/deltaScheduler.ts +19 -13
- package/src/gc/garbageCollection.ts +42 -20
- package/src/gc/gcConfigs.ts +4 -4
- package/src/gc/gcDefinitions.ts +212 -70
- package/src/gc/gcHelpers.ts +13 -7
- package/src/gc/gcReferenceGraphAlgorithm.ts +1 -1
- package/src/gc/gcSummaryDefinitions.ts +18 -6
- package/src/gc/gcSummaryStateTracker.ts +4 -2
- package/src/gc/gcTelemetry.ts +47 -19
- package/src/gc/gcUnreferencedStateTracker.ts +40 -16
- package/src/gc/index.ts +1 -0
- package/src/{scheduleManager.ts → inboundBatchAggregator.ts} +53 -120
- package/src/index.ts +0 -3
- package/src/messageTypes.ts +14 -5
- package/src/metadata.ts +12 -4
- package/src/opLifecycle/batchManager.ts +12 -6
- package/src/opLifecycle/duplicateBatchDetector.ts +10 -4
- package/src/opLifecycle/opCompressor.ts +8 -4
- package/src/opLifecycle/opDecompressor.ts +19 -10
- package/src/opLifecycle/opGroupingManager.ts +12 -8
- package/src/opLifecycle/opSplitter.ts +10 -7
- package/src/opLifecycle/outbox.ts +22 -13
- package/src/opLifecycle/remoteMessageProcessor.ts +10 -4
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +34 -16
- package/src/summary/documentSchema.ts +30 -18
- package/src/summary/index.ts +0 -3
- package/src/summary/orderedClientElection.ts +100 -38
- package/src/summary/runWhileConnectedCoordinator.ts +6 -3
- package/src/summary/runningSummarizer.ts +38 -19
- package/src/summary/summarizer.ts +29 -16
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +22 -11
- package/src/summary/summarizerNode/summarizerNode.ts +22 -12
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +48 -16
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +21 -11
- package/src/summary/summarizerTypes.ts +246 -139
- package/src/summary/summaryCollection.ts +22 -23
- package/src/summary/summaryFormat.ts +24 -8
- package/src/summary/summaryGenerator.ts +14 -8
- package/src/summary/summaryManager.ts +28 -18
- package/src/throttler.ts +23 -11
- package/dist/scheduleManager.d.ts +0 -28
- package/dist/scheduleManager.d.ts.map +0 -1
- package/dist/scheduleManager.js +0 -233
- package/dist/scheduleManager.js.map +0 -1
- package/lib/scheduleManager.d.ts +0 -28
- package/lib/scheduleManager.d.ts.map +0 -1
- package/lib/scheduleManager.js +0 -229
- package/lib/scheduleManager.js.map +0 -1
package/src/gc/gcTelemetry.ts
CHANGED
|
@@ -26,7 +26,9 @@ import { UnreferencedStateTracker } from "./gcUnreferencedStateTracker.js";
|
|
|
26
26
|
|
|
27
27
|
type NodeUsageType = "Changed" | "Loaded" | "Revived" | "Realized";
|
|
28
28
|
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Properties that are common to IUnreferencedEventProps and INodeUsageProps
|
|
31
|
+
*/
|
|
30
32
|
interface ICommonProps {
|
|
31
33
|
usageType: NodeUsageType;
|
|
32
34
|
completedGCRuns: number;
|
|
@@ -36,12 +38,18 @@ interface ICommonProps {
|
|
|
36
38
|
additionalProps?: ITelemetryPropertiesExt;
|
|
37
39
|
}
|
|
38
40
|
|
|
39
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* The event that is logged when unreferenced node is used after a certain time.
|
|
43
|
+
*/
|
|
40
44
|
interface IUnreferencedEventProps extends ICreateContainerMetadata, ICommonProps {
|
|
41
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* The id that GC uses to track the node. May or may not match id
|
|
47
|
+
*/
|
|
42
48
|
trackedId: string;
|
|
43
49
|
state: UnreferencedState;
|
|
44
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* The full path (in GC Path format) to the node in question
|
|
52
|
+
*/
|
|
45
53
|
id: Tagged<string>;
|
|
46
54
|
fromId?: Tagged<string>;
|
|
47
55
|
type: GCNodeType;
|
|
@@ -54,21 +62,37 @@ interface IUnreferencedEventProps extends ICreateContainerMetadata, ICommonProps
|
|
|
54
62
|
timeout?: number;
|
|
55
63
|
}
|
|
56
64
|
|
|
57
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* Properties passed to nodeUsed function when a node is used.
|
|
67
|
+
*/
|
|
58
68
|
interface INodeUsageProps extends ICommonProps {
|
|
59
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* The full path (in GC Path format) to the node in question
|
|
71
|
+
*/
|
|
60
72
|
id: string;
|
|
61
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* Latest timestamp received from the server, as a baseline for computing GC state/age
|
|
75
|
+
*/
|
|
62
76
|
currentReferenceTimestampMs: number;
|
|
63
|
-
/**
|
|
77
|
+
/**
|
|
78
|
+
* The package path of the node. This may not be available if the node hasn't been loaded yet
|
|
79
|
+
*/
|
|
64
80
|
packagePath: readonly string[] | undefined;
|
|
65
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* In case of Revived - what node added the reference?
|
|
83
|
+
*/
|
|
66
84
|
fromId?: string;
|
|
67
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* In case of Revived - was it revived due to autorecovery?
|
|
87
|
+
*/
|
|
68
88
|
autorecovery?: true;
|
|
69
|
-
/**
|
|
89
|
+
/**
|
|
90
|
+
* URL (including query string) if this usage came from a request
|
|
91
|
+
*/
|
|
70
92
|
requestUrl?: string;
|
|
71
|
-
/**
|
|
93
|
+
/**
|
|
94
|
+
* Original request headers if this usage came from a request or handle.get
|
|
95
|
+
*/
|
|
72
96
|
requestHeaders?: string;
|
|
73
97
|
}
|
|
74
98
|
|
|
@@ -110,9 +134,13 @@ export class GCTelemetryTracker {
|
|
|
110
134
|
) {}
|
|
111
135
|
|
|
112
136
|
/**
|
|
113
|
-
* Returns whether an event should be logged for a node that isn't active anymore.
|
|
114
|
-
*
|
|
137
|
+
* Returns whether an event should be logged for a node that isn't active anymore.
|
|
138
|
+
*
|
|
139
|
+
* @remarks
|
|
140
|
+
* This does not apply to tombstoned nodes for which an event is always logged. Some scenarios where we won't log:
|
|
141
|
+
*
|
|
115
142
|
* 1. When a DDS is changed. The corresponding data store's event will be logged instead.
|
|
143
|
+
*
|
|
116
144
|
* 2. An event is logged only once per container instance per event per node.
|
|
117
145
|
*/
|
|
118
146
|
private shouldLogNonActiveEvent(
|
|
@@ -120,7 +148,7 @@ export class GCTelemetryTracker {
|
|
|
120
148
|
usageType: NodeUsageType,
|
|
121
149
|
nodeStateTracker: UnreferencedStateTracker,
|
|
122
150
|
uniqueEventId: string,
|
|
123
|
-
) {
|
|
151
|
+
): boolean {
|
|
124
152
|
if (nodeStateTracker.state === UnreferencedState.Active) {
|
|
125
153
|
return false;
|
|
126
154
|
}
|
|
@@ -160,7 +188,7 @@ export class GCTelemetryTracker {
|
|
|
160
188
|
isTombstoned,
|
|
161
189
|
...otherNodeUsageProps
|
|
162
190
|
}: INodeUsageProps,
|
|
163
|
-
) {
|
|
191
|
+
): void {
|
|
164
192
|
// Note: For SubDataStore Load usage, trackedId will be the DataStore's id, not the full path in question.
|
|
165
193
|
// This is necessary because the SubDataStore path may be unrecognized by GC (if suited for a custom request handler)
|
|
166
194
|
const nodeStateTracker = this.getNodeStateTracker(trackedId);
|
|
@@ -265,7 +293,7 @@ export class GCTelemetryTracker {
|
|
|
265
293
|
nodeType: GCNodeType,
|
|
266
294
|
usageType: NodeUsageType,
|
|
267
295
|
packagePath?: readonly string[],
|
|
268
|
-
) {
|
|
296
|
+
): void {
|
|
269
297
|
// This will log the following events:
|
|
270
298
|
// GC_Tombstone_DataStore_Requested, GC_Tombstone_DataStore_Changed, GC_Tombstone_DataStore_Revived
|
|
271
299
|
// GC_Tombstone_SubDataStore_Requested, GC_Tombstone_SubDataStore_Changed, GC_Tombstone_SubDataStore_Revived
|
|
@@ -312,7 +340,7 @@ export class GCTelemetryTracker {
|
|
|
312
340
|
previousGCData: IGarbageCollectionData,
|
|
313
341
|
explicitReferences: Map<string, string[]>,
|
|
314
342
|
logger: ITelemetryLoggerExt,
|
|
315
|
-
) {
|
|
343
|
+
): void {
|
|
316
344
|
for (const [nodeId, currentOutboundRoutes] of Object.entries(currentGCData.gcNodes)) {
|
|
317
345
|
const previousRoutes = previousGCData.gcNodes[nodeId] ?? [];
|
|
318
346
|
const explicitRoutes = explicitReferences.get(nodeId) ?? [];
|
|
@@ -356,7 +384,7 @@ export class GCTelemetryTracker {
|
|
|
356
384
|
* Log events that are pending in pendingEventsQueue. This is called after GC runs in the summarizer client
|
|
357
385
|
* so that the state of an unreferenced node is updated.
|
|
358
386
|
*/
|
|
359
|
-
public async logPendingEvents(logger: ITelemetryLoggerExt) {
|
|
387
|
+
public async logPendingEvents(logger: ITelemetryLoggerExt): Promise<void> {
|
|
360
388
|
// Events sent come only from the summarizer client. In between summaries, events are pushed to a queue and at
|
|
361
389
|
// summary time they are then logged.
|
|
362
390
|
// Events generated:
|
|
@@ -8,7 +8,9 @@ import { validatePrecondition } from "@fluidframework/telemetry-utils/internal";
|
|
|
8
8
|
|
|
9
9
|
import { UnreferencedState } from "./gcDefinitions.js";
|
|
10
10
|
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* A wrapper around common-utils Timer that requires the timeout when calling start/restart
|
|
13
|
+
*/
|
|
12
14
|
class TimerWithNoDefaultTimeout extends Timer {
|
|
13
15
|
constructor(private readonly callback: () => void) {
|
|
14
16
|
// The default timeout/handlers will never be used since start/restart pass overrides below
|
|
@@ -17,7 +19,7 @@ class TimerWithNoDefaultTimeout extends Timer {
|
|
|
17
19
|
});
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
start(timeoutMs: number) {
|
|
22
|
+
start(timeoutMs: number): void {
|
|
21
23
|
super.start(timeoutMs, this.callback);
|
|
22
24
|
}
|
|
23
25
|
|
|
@@ -26,9 +28,13 @@ class TimerWithNoDefaultTimeout extends Timer {
|
|
|
26
28
|
}
|
|
27
29
|
}
|
|
28
30
|
|
|
29
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* The collection of UnreferencedStateTrackers for all unreferenced nodes. Ensures stopTracking is called when deleting
|
|
33
|
+
*/
|
|
30
34
|
export class UnreferencedStateTrackerMap extends Map<string, UnreferencedStateTracker> {
|
|
31
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Delete the given key, and stop tracking if that node was actually unreferenced
|
|
37
|
+
*/
|
|
32
38
|
delete(key: string): boolean {
|
|
33
39
|
// Stop tracking so as to clear out any running timers.
|
|
34
40
|
this.get(key)?.stopTracking();
|
|
@@ -47,22 +53,36 @@ export class UnreferencedStateTracker {
|
|
|
47
53
|
return this._state;
|
|
48
54
|
}
|
|
49
55
|
|
|
50
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* Timer to indicate when an unreferenced object is considered Inactive
|
|
58
|
+
*/
|
|
51
59
|
private readonly inactiveTimer: TimerWithNoDefaultTimeout;
|
|
52
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* Timer to indicate when an unreferenced object is Tombstone-Ready
|
|
62
|
+
*/
|
|
53
63
|
private readonly tombstoneTimer: TimerWithNoDefaultTimeout;
|
|
54
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* Timer to indicate when an unreferenced object is Sweep-Ready
|
|
66
|
+
*/
|
|
55
67
|
private readonly sweepTimer: TimerWithNoDefaultTimeout;
|
|
56
68
|
|
|
57
69
|
constructor(
|
|
58
70
|
public readonly unreferencedTimestampMs: number,
|
|
59
|
-
/**
|
|
71
|
+
/**
|
|
72
|
+
* The time after which node transitions to Inactive state.
|
|
73
|
+
*/
|
|
60
74
|
private readonly inactiveTimeoutMs: number,
|
|
61
|
-
/**
|
|
75
|
+
/**
|
|
76
|
+
* The current reference timestamp used to track how long this node has been unreferenced for.
|
|
77
|
+
*/
|
|
62
78
|
currentReferenceTimestampMs: number,
|
|
63
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* The time after which node transitions to TombstoneReady state; undefined if session expiry is disabled.
|
|
81
|
+
*/
|
|
64
82
|
private readonly tombstoneTimeoutMs: number | undefined,
|
|
65
|
-
/**
|
|
83
|
+
/**
|
|
84
|
+
* The delay from TombstoneReady to SweepReady (only applies if tombstoneTimeoutMs is defined)
|
|
85
|
+
*/
|
|
66
86
|
private readonly sweepGracePeriodMs: number,
|
|
67
87
|
) {
|
|
68
88
|
validatePrecondition(
|
|
@@ -106,8 +126,10 @@ export class UnreferencedStateTracker {
|
|
|
106
126
|
this.updateTracking(currentReferenceTimestampMs);
|
|
107
127
|
}
|
|
108
128
|
|
|
109
|
-
|
|
110
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Updates the unreferenced state based on the provided timestamp.
|
|
131
|
+
*/
|
|
132
|
+
public updateTracking(currentReferenceTimestampMs: number): void {
|
|
111
133
|
const unreferencedDurationMs = currentReferenceTimestampMs - this.unreferencedTimestampMs;
|
|
112
134
|
|
|
113
135
|
// Below we will set the appropriate timer (or none). Any running timers are superceded by the new currentReferenceTimestampMs
|
|
@@ -151,14 +173,16 @@ export class UnreferencedStateTracker {
|
|
|
151
173
|
this.inactiveTimer.restart(this.inactiveTimeoutMs - unreferencedDurationMs);
|
|
152
174
|
}
|
|
153
175
|
|
|
154
|
-
private clearTimers() {
|
|
176
|
+
private clearTimers(): void {
|
|
155
177
|
this.inactiveTimer.clear();
|
|
156
178
|
this.tombstoneTimer.clear();
|
|
157
179
|
this.sweepTimer.clear();
|
|
158
180
|
}
|
|
159
181
|
|
|
160
|
-
/**
|
|
161
|
-
|
|
182
|
+
/**
|
|
183
|
+
* Stop tracking this node. Reset the unreferenced timers and state, if any.
|
|
184
|
+
*/
|
|
185
|
+
public stopTracking(): void {
|
|
162
186
|
this.clearTimers();
|
|
163
187
|
this._state = UnreferencedState.Active;
|
|
164
188
|
}
|
package/src/gc/index.ts
CHANGED
|
@@ -3,24 +3,18 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { EventEmitter } from "@fluid-internal/client-utils";
|
|
7
6
|
import { performance } from "@fluid-internal/client-utils";
|
|
8
7
|
import { IDeltaManagerFull } from "@fluidframework/container-definitions/internal";
|
|
9
8
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
10
|
-
import {
|
|
11
|
-
IDocumentMessage,
|
|
12
|
-
ISequencedDocumentMessage,
|
|
13
|
-
} from "@fluidframework/driver-definitions/internal";
|
|
9
|
+
import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
14
10
|
import { isRuntimeMessage } from "@fluidframework/driver-utils/internal";
|
|
15
11
|
import {
|
|
16
12
|
ITelemetryLoggerExt,
|
|
17
13
|
DataCorruptionError,
|
|
18
14
|
DataProcessingError,
|
|
19
|
-
createChildLogger,
|
|
20
15
|
extractSafePropertiesFromMessage,
|
|
21
16
|
} from "@fluidframework/telemetry-utils/internal";
|
|
22
17
|
|
|
23
|
-
import { DeltaScheduler } from "./deltaScheduler.js";
|
|
24
18
|
import { IBatchMetadata } from "./metadata.js";
|
|
25
19
|
import { pkgVersion } from "./packageVersion.js";
|
|
26
20
|
|
|
@@ -31,46 +25,10 @@ type IRuntimeMessageMetadata =
|
|
|
31
25
|
};
|
|
32
26
|
|
|
33
27
|
/**
|
|
34
|
-
* This class
|
|
35
|
-
*
|
|
36
|
-
* 1. It tracks batches as we process ops and raises "batchBegin" and "batchEnd" events.
|
|
37
|
-
* As part of it, it validates batch correctness (i.e. no system ops in the middle of batch)
|
|
38
|
-
*
|
|
39
|
-
* 2. It creates instance of ScheduleManagerCore that ensures we never start processing ops from batch
|
|
40
|
-
* unless all ops of the batch are in.
|
|
41
|
-
*/
|
|
42
|
-
export class ScheduleManager {
|
|
43
|
-
private readonly deltaScheduler: DeltaScheduler;
|
|
44
|
-
|
|
45
|
-
constructor(
|
|
46
|
-
private readonly deltaManager: IDeltaManagerFull,
|
|
47
|
-
private readonly emitter: EventEmitter,
|
|
48
|
-
readonly getClientId: () => string | undefined,
|
|
49
|
-
private readonly logger: ITelemetryLoggerExt,
|
|
50
|
-
) {
|
|
51
|
-
this.deltaScheduler = new DeltaScheduler(
|
|
52
|
-
this.deltaManager,
|
|
53
|
-
createChildLogger({ logger: this.logger, namespace: "DeltaScheduler" }),
|
|
54
|
-
);
|
|
55
|
-
void new ScheduleManagerCore(deltaManager, getClientId, logger);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
public batchBegin(message: ISequencedDocumentMessage) {
|
|
59
|
-
this.emitter.emit("batchBegin", message);
|
|
60
|
-
this.deltaScheduler.batchBegin(message);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
public batchEnd(error: any | undefined, message: ISequencedDocumentMessage) {
|
|
64
|
-
this.emitter.emit("batchEnd", error, message);
|
|
65
|
-
this.deltaScheduler.batchEnd(message);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* This class controls pausing and resuming of inbound queue to ensure that we never
|
|
71
|
-
* start processing ops in a batch IF we do not have all ops in the batch.
|
|
28
|
+
* This class ensures that we aggregate a complete batch of incoming ops before processing them. It basically ensures
|
|
29
|
+
* that we never start processing ops in a batch IF we do not have all ops in the batch.
|
|
72
30
|
*/
|
|
73
|
-
class
|
|
31
|
+
export class InboundBatchAggregator {
|
|
74
32
|
private pauseSequenceNumber: number | undefined;
|
|
75
33
|
private currentBatchClientId: string | undefined;
|
|
76
34
|
private localPaused = false;
|
|
@@ -82,38 +40,8 @@ class ScheduleManagerCore {
|
|
|
82
40
|
private readonly getClientId: () => string | undefined,
|
|
83
41
|
private readonly logger: ITelemetryLoggerExt,
|
|
84
42
|
) {
|
|
85
|
-
// Listen for delta manager sends and add batch metadata to messages
|
|
86
|
-
this.deltaManager.on("prepareSend", (messages: IDocumentMessage[]) => {
|
|
87
|
-
if (messages.length === 0) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// First message will have the batch flag set to true if doing a batched send
|
|
92
|
-
const firstMessageMetadata = messages[0].metadata as IRuntimeMessageMetadata;
|
|
93
|
-
if (!firstMessageMetadata?.batch) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// If the batch contains only a single op, clear the batch flag.
|
|
98
|
-
if (messages.length === 1) {
|
|
99
|
-
delete firstMessageMetadata.batch;
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Set the batch flag to false on the last message to indicate the end of the send batch
|
|
104
|
-
const lastMessage = messages[messages.length - 1];
|
|
105
|
-
// TODO: It's not clear if this shallow clone is required, as opposed to just setting "batch" to false.
|
|
106
|
-
|
|
107
|
-
lastMessage.metadata = { ...(lastMessage.metadata as any), batch: false };
|
|
108
|
-
});
|
|
109
|
-
|
|
110
43
|
// Listen for updates and peek at the inbound
|
|
111
|
-
this.deltaManager.inbound.on("push",
|
|
112
|
-
this.trackPending(message);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
// Start with baseline - empty inbound queue.
|
|
116
|
-
assert(!this.localPaused, 0x293 /* "initial state" */);
|
|
44
|
+
this.deltaManager.inbound.on("push", this.trackPending);
|
|
117
45
|
|
|
118
46
|
const allPending = this.deltaManager.inbound.toArray();
|
|
119
47
|
for (const pending of allPending) {
|
|
@@ -121,16 +49,21 @@ class ScheduleManagerCore {
|
|
|
121
49
|
}
|
|
122
50
|
|
|
123
51
|
// We are intentionally directly listening to the "op" to inspect system ops as well.
|
|
124
|
-
// If we do not observe system ops, we are likely to hit
|
|
52
|
+
// If we do not observe system ops, we are likely to hit an error when system ops
|
|
125
53
|
// precedes start of incomplete batch.
|
|
126
|
-
this.deltaManager.on("op",
|
|
54
|
+
this.deltaManager.on("op", this.afterOpProcessing);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public dispose(): void {
|
|
58
|
+
this.deltaManager.off("op", this.afterOpProcessing);
|
|
59
|
+
this.deltaManager.inbound.off("push", this.trackPending);
|
|
127
60
|
}
|
|
128
61
|
|
|
129
62
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
63
|
+
* Callback for DeltaManager's "op" event, for us to make decision if op processing should
|
|
64
|
+
* be paused or not after that.
|
|
132
65
|
*/
|
|
133
|
-
|
|
66
|
+
private readonly afterOpProcessing = (message: ISequencedDocumentMessage): void => {
|
|
134
67
|
assert(
|
|
135
68
|
!this.localPaused,
|
|
136
69
|
0x294 /* "can't have op processing paused if we are processing an op" */,
|
|
@@ -157,7 +90,7 @@ class ScheduleManagerCore {
|
|
|
157
90
|
throw DataProcessingError.create(
|
|
158
91
|
// Former assert 0x296
|
|
159
92
|
"Incomplete batch",
|
|
160
|
-
"
|
|
93
|
+
"InboundBatchAggregator",
|
|
161
94
|
message,
|
|
162
95
|
{
|
|
163
96
|
type: message.type,
|
|
@@ -174,47 +107,12 @@ class ScheduleManagerCore {
|
|
|
174
107
|
this.pauseQueue();
|
|
175
108
|
}
|
|
176
109
|
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
private pauseQueue() {
|
|
180
|
-
assert(!this.localPaused, 0x297 /* "always called from resumed state" */);
|
|
181
|
-
this.localPaused = true;
|
|
182
|
-
this.timePaused = performance.now();
|
|
183
|
-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
184
|
-
this.deltaManager.inbound.pause();
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
private resumeQueue(startBatch: number, messageEndBatch: ISequencedDocumentMessage) {
|
|
188
|
-
const endBatch = messageEndBatch.sequenceNumber;
|
|
189
|
-
const duration = this.localPaused ? performance.now() - this.timePaused : undefined;
|
|
190
|
-
|
|
191
|
-
this.batchCount++;
|
|
192
|
-
if (this.batchCount % 1000 === 1) {
|
|
193
|
-
this.logger.sendTelemetryEvent({
|
|
194
|
-
eventName: "BatchStats",
|
|
195
|
-
sequenceNumber: endBatch,
|
|
196
|
-
length: endBatch - startBatch + 1,
|
|
197
|
-
msnDistance: endBatch - messageEndBatch.minimumSequenceNumber,
|
|
198
|
-
duration,
|
|
199
|
-
batchCount: this.batchCount,
|
|
200
|
-
interrupted: this.localPaused,
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Return early if no change in value
|
|
205
|
-
if (!this.localPaused) {
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
this.localPaused = false;
|
|
210
|
-
|
|
211
|
-
this.deltaManager.inbound.resume();
|
|
212
|
-
}
|
|
110
|
+
};
|
|
213
111
|
|
|
214
112
|
/**
|
|
215
113
|
* Called for each incoming op (i.e. inbound "push" notification)
|
|
216
114
|
*/
|
|
217
|
-
private trackPending(message: ISequencedDocumentMessage) {
|
|
115
|
+
private readonly trackPending = (message: ISequencedDocumentMessage): void => {
|
|
218
116
|
assert(
|
|
219
117
|
this.deltaManager.inbound.length !== 0,
|
|
220
118
|
0x298 /* "we have something in the queue that generates this event" */,
|
|
@@ -324,5 +222,40 @@ class ScheduleManagerCore {
|
|
|
324
222
|
// Continuation of current batch. Do nothing
|
|
325
223
|
assert(this.currentBatchClientId !== undefined, 0x2a1 /* "logic error" */);
|
|
326
224
|
}
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
private pauseQueue(): void {
|
|
228
|
+
assert(!this.localPaused, 0x297 /* "always called from resumed state" */);
|
|
229
|
+
this.localPaused = true;
|
|
230
|
+
this.timePaused = performance.now();
|
|
231
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
232
|
+
this.deltaManager.inbound.pause();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
private resumeQueue(startBatch: number, messageEndBatch: ISequencedDocumentMessage): void {
|
|
236
|
+
const endBatch = messageEndBatch.sequenceNumber;
|
|
237
|
+
const duration = this.localPaused ? performance.now() - this.timePaused : undefined;
|
|
238
|
+
|
|
239
|
+
this.batchCount++;
|
|
240
|
+
if (this.batchCount % 1000 === 1) {
|
|
241
|
+
this.logger.sendTelemetryEvent({
|
|
242
|
+
eventName: "BatchStats",
|
|
243
|
+
sequenceNumber: endBatch,
|
|
244
|
+
length: endBatch - startBatch + 1,
|
|
245
|
+
msnDistance: endBatch - messageEndBatch.minimumSequenceNumber,
|
|
246
|
+
duration,
|
|
247
|
+
batchCount: this.batchCount,
|
|
248
|
+
interrupted: this.localPaused,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Return early if no change in value
|
|
253
|
+
if (!this.localPaused) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
this.localPaused = false;
|
|
258
|
+
|
|
259
|
+
this.deltaManager.inbound.resume();
|
|
327
260
|
}
|
|
328
261
|
}
|
package/src/index.ts
CHANGED
|
@@ -55,7 +55,6 @@ export {
|
|
|
55
55
|
ISummaryCancellationToken,
|
|
56
56
|
neverCancelledSummaryToken,
|
|
57
57
|
Summarizer,
|
|
58
|
-
SummarizerStopReason,
|
|
59
58
|
SummaryCollection,
|
|
60
59
|
EnqueueSummarizeResult,
|
|
61
60
|
IAckSummaryResult,
|
|
@@ -75,7 +74,6 @@ export {
|
|
|
75
74
|
ISubmitSummaryOptions,
|
|
76
75
|
ISerializedElection,
|
|
77
76
|
ISummarizeOptions,
|
|
78
|
-
ISummarizerEvents,
|
|
79
77
|
ISummarizerInternalsProvider,
|
|
80
78
|
ISummarizerRuntime,
|
|
81
79
|
ISummarizingWarning,
|
|
@@ -95,7 +93,6 @@ export {
|
|
|
95
93
|
SubmitSummaryFailureData,
|
|
96
94
|
SummaryStage,
|
|
97
95
|
IRetriableFailureError,
|
|
98
|
-
ISummarizeEventProps,
|
|
99
96
|
IdCompressorMode,
|
|
100
97
|
IDocumentSchema,
|
|
101
98
|
DocumentSchemaValueType,
|
package/src/messageTypes.ts
CHANGED
|
@@ -66,9 +66,13 @@ export enum ContainerMessageType {
|
|
|
66
66
|
* This way stringified values can be compared.
|
|
67
67
|
*/
|
|
68
68
|
interface TypedContainerRuntimeMessage<TType extends ContainerMessageType, TContents> {
|
|
69
|
-
/**
|
|
69
|
+
/**
|
|
70
|
+
* Type of the op, within the ContainerRuntime's domain
|
|
71
|
+
*/
|
|
70
72
|
type: TType;
|
|
71
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* Domain-specific contents, interpreted according to the type
|
|
75
|
+
*/
|
|
72
76
|
contents: TContents;
|
|
73
77
|
}
|
|
74
78
|
|
|
@@ -118,13 +122,16 @@ export type ContainerRuntimeDocumentSchemaMessage = TypedContainerRuntimeMessage
|
|
|
118
122
|
* @internal
|
|
119
123
|
*/
|
|
120
124
|
export interface UnknownContainerRuntimeMessage {
|
|
121
|
-
/**
|
|
125
|
+
/**
|
|
126
|
+
* Invalid type of the op, within the ContainerRuntime's domain. This value should never exist at runtime.
|
|
122
127
|
* This is useful for type narrowing but should never be used as an actual message type at runtime.
|
|
123
128
|
* Actual value will not be "__unknown...", but the type `Exclude<string, ContainerMessageType>` is not supported.
|
|
124
129
|
*/
|
|
125
130
|
type: "__unknown_container_message_type__never_use_as_value__";
|
|
126
131
|
|
|
127
|
-
/**
|
|
132
|
+
/**
|
|
133
|
+
* Domain-specific contents, but not decipherable by an unknown op.
|
|
134
|
+
*/
|
|
128
135
|
contents: unknown;
|
|
129
136
|
}
|
|
130
137
|
|
|
@@ -160,7 +167,9 @@ export type LocalContainerRuntimeMessage =
|
|
|
160
167
|
| UnknownContainerRuntimeMessage
|
|
161
168
|
| ContainerRuntimeDocumentSchemaMessage;
|
|
162
169
|
|
|
163
|
-
/**
|
|
170
|
+
/**
|
|
171
|
+
* A {@link TypedContainerRuntimeMessage} that is being sent to the server from the container runtime.
|
|
172
|
+
*/
|
|
164
173
|
export type OutboundContainerRuntimeMessage =
|
|
165
174
|
| ContainerRuntimeDataStoreOpMessage
|
|
166
175
|
| OutboundContainerRuntimeAttachMessage
|
package/src/metadata.ts
CHANGED
|
@@ -5,12 +5,16 @@
|
|
|
5
5
|
|
|
6
6
|
import type { BatchId } from "./opLifecycle/index.js";
|
|
7
7
|
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Syntactic sugar for casting
|
|
10
|
+
*/
|
|
9
11
|
export function asBatchMetadata(metadata: unknown): Partial<IBatchMetadata> | undefined {
|
|
10
12
|
return metadata as Partial<IBatchMetadata> | undefined;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Syntactic sugar for casting
|
|
17
|
+
*/
|
|
14
18
|
export function asEmptyBatchLocalOpMetadata(
|
|
15
19
|
localOpMetadata: unknown,
|
|
16
20
|
): IEmptyBatchMetadata | undefined {
|
|
@@ -28,9 +32,13 @@ export interface IEmptyBatchMetadata {
|
|
|
28
32
|
* Properties put on the op metadata object for batch tracking
|
|
29
33
|
*/
|
|
30
34
|
export interface IBatchMetadata {
|
|
31
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Set on first/last messages of a multi-message batch, to true/false respectively
|
|
37
|
+
*/
|
|
32
38
|
batch?: boolean;
|
|
33
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Maybe set on first message of a batch, to the batchId generated when resubmitting (set/fixed on first resubmit)
|
|
41
|
+
*/
|
|
34
42
|
batchId?: BatchId;
|
|
35
43
|
}
|
|
36
44
|
|
|
@@ -21,7 +21,9 @@ export interface IBatchManagerOptions {
|
|
|
21
21
|
*/
|
|
22
22
|
readonly canRebase: boolean;
|
|
23
23
|
|
|
24
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* If true, don't compare batchID of incoming batches to this. e.g. ID Allocation Batch IDs should be ignored
|
|
26
|
+
*/
|
|
25
27
|
readonly ignoreBatchId?: boolean;
|
|
26
28
|
}
|
|
27
29
|
|
|
@@ -30,10 +32,14 @@ export interface BatchSequenceNumbers {
|
|
|
30
32
|
clientSequenceNumber?: number;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Type alias for the batchId stored in batch metadata
|
|
37
|
+
*/
|
|
34
38
|
export type BatchId = string;
|
|
35
39
|
|
|
36
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* Compose original client ID and client sequence number into BatchId to stamp on the message during reconnect
|
|
42
|
+
*/
|
|
37
43
|
export function generateBatchId(originalClientId: string, batchStartCsn: number): BatchId {
|
|
38
44
|
return `${originalClientId}_[${batchStartCsn}]`;
|
|
39
45
|
}
|
|
@@ -76,10 +82,10 @@ export class BatchManager {
|
|
|
76
82
|
private batchContentSize = 0;
|
|
77
83
|
private hasReentrantOps = false;
|
|
78
84
|
|
|
79
|
-
public get length() {
|
|
85
|
+
public get length(): number {
|
|
80
86
|
return this.pendingBatch.length;
|
|
81
87
|
}
|
|
82
|
-
public get contentSizeInBytes() {
|
|
88
|
+
public get contentSizeInBytes(): number {
|
|
83
89
|
return this.batchContentSize;
|
|
84
90
|
}
|
|
85
91
|
|
|
@@ -133,7 +139,7 @@ export class BatchManager {
|
|
|
133
139
|
return true;
|
|
134
140
|
}
|
|
135
141
|
|
|
136
|
-
public get empty() {
|
|
142
|
+
public get empty(): boolean {
|
|
137
143
|
return this.pendingBatch.length === 0;
|
|
138
144
|
}
|
|
139
145
|
|