@fluidframework/container-runtime 2.13.0 → 2.21.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 +71 -5
- package/CHANGELOG.md +84 -0
- package/api-report/container-runtime.legacy.alpha.api.md +38 -232
- package/dist/batchTracker.d.ts +1 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +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 +30 -13
- package/dist/blobManager/blobManager.js.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.d.ts +1 -0
- package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.js +7 -5
- 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 +85 -53
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +2 -2
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +10 -6
- 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 +87 -94
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +312 -226
- 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 +8 -4
- 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 +47 -29
- 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 +7 -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 +48 -19
- 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 +5 -2
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +218 -70
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +40 -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 +14 -7
- 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 +2 -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 +35 -17
- 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/layerCompatState.d.ts +19 -0
- package/dist/layerCompatState.d.ts.map +1 -0
- package/dist/layerCompatState.js +64 -0
- package/dist/layerCompatState.js.map +1 -0
- 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 +11 -5
- package/dist/opLifecycle/duplicateBatchDetector.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +3 -2
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +13 -19
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +6 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +16 -8
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +1 -2
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +9 -6
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +13 -10
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +16 -11
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +4 -4
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +17 -16
- 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 +3 -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 +22 -11
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +24 -15
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +7 -0
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +8 -4
- 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 +94 -31
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +28 -16
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -0
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +7 -2
- 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 +48 -19
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +10 -5
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +26 -11
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js +1 -0
- 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 +13 -5
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.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 +45 -36
- 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 +13 -5
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +15 -7
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +253 -135
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +3 -4
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +10 -8
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +28 -9
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +3 -2
- 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 +22 -9
- 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 +20 -9
- 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 +1 -2
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- 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 +30 -13
- package/lib/blobManager/blobManager.js.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.d.ts +1 -0
- package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.js +7 -5
- 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 +88 -54
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +2 -2
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +11 -7
- 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 +87 -94
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +319 -228
- 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 +8 -4
- 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 +47 -29
- 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 +7 -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 +96 -90
- 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 +51 -20
- 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 +4 -2
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +218 -70
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +40 -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 +14 -7
- 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 +2 -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 +38 -18
- 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/layerCompatState.d.ts +19 -0
- package/lib/layerCompatState.d.ts.map +1 -0
- package/lib/layerCompatState.js +60 -0
- package/lib/layerCompatState.js.map +1 -0
- 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 +11 -5
- package/lib/opLifecycle/duplicateBatchDetector.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +3 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +14 -20
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +6 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +17 -9
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +1 -2
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +10 -7
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +13 -10
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +16 -11
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +4 -4
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +17 -16
- 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 +3 -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 +22 -11
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +25 -16
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +7 -0
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +8 -4
- 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 +94 -31
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +28 -16
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -0
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +7 -2
- 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 +48 -19
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +10 -5
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +26 -11
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js +1 -0
- 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 +13 -5
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/index.d.ts.map +1 -1
- package/lib/summary/summarizerNode/index.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 +45 -36
- 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 +13 -5
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +15 -7
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +253 -135
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +3 -4
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +10 -8
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +28 -9
- 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 +9 -3
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +22 -9
- 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 +20 -9
- 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 +22 -31
- package/src/batchTracker.ts +34 -36
- package/src/blobManager/blobManager.ts +54 -33
- package/src/blobManager/blobManagerSnapSum.ts +10 -10
- package/src/channelCollection.ts +108 -82
- package/src/connectionTelemetry.ts +43 -19
- package/src/containerHandleContext.ts +2 -2
- package/src/containerRuntime.ts +492 -364
- package/src/dataStore.ts +17 -9
- package/src/dataStoreContext.ts +94 -73
- package/src/dataStoreContexts.ts +17 -12
- package/src/dataStoreRegistry.ts +1 -1
- package/src/deltaManagerProxies.ts +5 -5
- package/src/deltaScheduler.ts +24 -18
- package/src/gc/garbageCollection.ts +89 -40
- package/src/gc/gcConfigs.ts +13 -5
- package/src/gc/gcDefinitions.ts +224 -70
- package/src/gc/gcHelpers.ts +22 -11
- package/src/gc/gcReferenceGraphAlgorithm.ts +1 -1
- package/src/gc/gcSummaryDefinitions.ts +18 -6
- package/src/gc/gcSummaryStateTracker.ts +7 -3
- package/src/gc/gcTelemetry.ts +73 -30
- package/src/gc/gcUnreferencedStateTracker.ts +40 -16
- package/src/gc/index.ts +1 -0
- package/src/{scheduleManager.ts → inboundBatchAggregator.ts} +55 -122
- package/src/index.ts +0 -3
- package/src/layerCompatState.ts +75 -0
- package/src/messageTypes.ts +16 -5
- package/src/metadata.ts +12 -4
- package/src/opLifecycle/README.md +43 -34
- package/src/opLifecycle/batchManager.ts +12 -6
- package/src/opLifecycle/duplicateBatchDetector.ts +12 -6
- package/src/opLifecycle/opCompressor.ts +22 -25
- package/src/opLifecycle/opDecompressor.ts +23 -11
- package/src/opLifecycle/opGroupingManager.ts +16 -11
- package/src/opLifecycle/opSplitter.ts +24 -18
- package/src/opLifecycle/outbox.ts +35 -33
- package/src/opLifecycle/remoteMessageProcessor.ts +13 -5
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +49 -26
- package/src/summary/documentSchema.ts +41 -22
- package/src/summary/index.ts +0 -3
- package/src/summary/orderedClientElection.ts +114 -49
- package/src/summary/runWhileConnectedCoordinator.ts +12 -3
- package/src/summary/runningSummarizer.ts +79 -36
- package/src/summary/summarizer.ts +51 -25
- package/src/summary/summarizerClientElection.ts +4 -2
- package/src/summary/summarizerHeuristics.ts +23 -12
- package/src/summary/summarizerNode/index.ts +1 -0
- package/src/summary/summarizerNode/summarizerNode.ts +54 -43
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +48 -16
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +25 -15
- package/src/summary/summarizerTypes.ts +253 -139
- package/src/summary/summaryCollection.ts +41 -31
- package/src/summary/summaryFormat.ts +34 -13
- package/src/summary/summaryGenerator.ts +39 -18
- package/src/summary/summaryManager.ts +36 -24
- package/src/throttler.ts +23 -11
- package/container-runtime.test-files.tar +0 -0
- 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/dataStoreRegistry.ts
CHANGED
|
@@ -20,7 +20,7 @@ export class FluidDataStoreRegistry implements IFluidDataStoreRegistry {
|
|
|
20
20
|
FluidDataStoreRegistryEntry | Promise<FluidDataStoreRegistryEntry>
|
|
21
21
|
>;
|
|
22
22
|
|
|
23
|
-
public get IFluidDataStoreRegistry() {
|
|
23
|
+
public get IFluidDataStoreRegistry(): IFluidDataStoreRegistry {
|
|
24
24
|
return this;
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -59,11 +59,11 @@ export abstract class BaseDeltaManagerProxy
|
|
|
59
59
|
return this.deltaManager.lastSequenceNumber;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
public get lastMessage() {
|
|
62
|
+
public get lastMessage(): ISequencedDocumentMessage | undefined {
|
|
63
63
|
return this.deltaManager.lastMessage;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
public get lastKnownSeqNumber() {
|
|
66
|
+
public get lastKnownSeqNumber(): number {
|
|
67
67
|
return this.deltaManager.lastKnownSeqNumber;
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -71,7 +71,7 @@ export abstract class BaseDeltaManagerProxy
|
|
|
71
71
|
return this.deltaManager.initialSequenceNumber;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
public get hasCheckpointSequenceNumber() {
|
|
74
|
+
public get hasCheckpointSequenceNumber(): boolean {
|
|
75
75
|
return this.deltaManager.hasCheckpointSequenceNumber;
|
|
76
76
|
}
|
|
77
77
|
|
|
@@ -132,7 +132,7 @@ export abstract class BaseDeltaManagerProxy
|
|
|
132
132
|
return this.deltaManager.flush();
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
-
private readonly onPrepareSend = (messageBuffer:
|
|
135
|
+
private readonly onPrepareSend = (messageBuffer: unknown[]): void => {
|
|
136
136
|
this.emit("prepareSend", messageBuffer);
|
|
137
137
|
};
|
|
138
138
|
private readonly onSubmitOp = (message: IDocumentMessage): void => {
|
|
@@ -218,7 +218,7 @@ export class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {
|
|
|
218
218
|
return this.deltaManager.minimumSequenceNumber;
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
public get lastMessage() {
|
|
221
|
+
public get lastMessage(): ISequencedDocumentMessage | undefined {
|
|
222
222
|
if (this.deltaManager.lastMessage === undefined) {
|
|
223
223
|
return this.deltaManager.lastMessage;
|
|
224
224
|
}
|
package/src/deltaScheduler.ts
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { performanceNow, type TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
7
|
import { IDeltaManagerFull } from "@fluidframework/container-definitions/internal";
|
|
8
8
|
import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
9
|
+
import type { IContainerRuntimeBaseEvents } from "@fluidframework/runtime-definitions/internal";
|
|
9
10
|
import { ITelemetryLoggerExt, formatTick } from "@fluidframework/telemetry-utils/internal";
|
|
10
11
|
|
|
11
12
|
/**
|
|
@@ -22,7 +23,6 @@ import { ITelemetryLoggerExt, formatTick } from "@fluidframework/telemetry-utils
|
|
|
22
23
|
* processed, the time and number of turns it took to process the ops.
|
|
23
24
|
*/
|
|
24
25
|
export class DeltaScheduler {
|
|
25
|
-
private readonly deltaManager: IDeltaManagerFull;
|
|
26
26
|
// The time for processing ops in a single turn.
|
|
27
27
|
public static readonly processingTime = 50;
|
|
28
28
|
|
|
@@ -50,18 +50,24 @@ export class DeltaScheduler {
|
|
|
50
50
|
| undefined;
|
|
51
51
|
|
|
52
52
|
constructor(
|
|
53
|
-
deltaManager: IDeltaManagerFull,
|
|
53
|
+
private readonly deltaManager: IDeltaManagerFull,
|
|
54
|
+
private readonly runtimeEventsEmitter: TypedEventEmitter<IContainerRuntimeBaseEvents>,
|
|
54
55
|
private readonly logger: ITelemetryLoggerExt,
|
|
55
56
|
) {
|
|
56
|
-
this.deltaManager
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
});
|
|
57
|
+
this.deltaManager.inbound.on("idle", this.inboundQueueIdle);
|
|
58
|
+
runtimeEventsEmitter.on("batchBegin", this.batchBegin);
|
|
59
|
+
runtimeEventsEmitter.on("batchEnd", this.batchEnd);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
public
|
|
62
|
+
public dispose(): void {
|
|
63
|
+
this.deltaManager.inbound.off("idle", this.inboundQueueIdle);
|
|
64
|
+
this.runtimeEventsEmitter.off("batchBegin", this.batchBegin);
|
|
65
|
+
this.runtimeEventsEmitter.off("batchEnd", this.batchEnd);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private readonly batchBegin = (message: ISequencedDocumentMessage): void => {
|
|
63
69
|
if (!this.processingStartTime) {
|
|
64
|
-
this.processingStartTime =
|
|
70
|
+
this.processingStartTime = performanceNow();
|
|
65
71
|
}
|
|
66
72
|
if (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {
|
|
67
73
|
// Every 500th time we are scheduling the inbound queue, we log telemetry for the
|
|
@@ -73,12 +79,12 @@ export class DeltaScheduler {
|
|
|
73
79
|
numberOfBatchesProcessed: 0,
|
|
74
80
|
firstSequenceNumber: message.sequenceNumber,
|
|
75
81
|
lastSequenceNumber: message.sequenceNumber,
|
|
76
|
-
startTime:
|
|
82
|
+
startTime: performanceNow(),
|
|
77
83
|
};
|
|
78
84
|
}
|
|
79
|
-
}
|
|
85
|
+
};
|
|
80
86
|
|
|
81
|
-
|
|
87
|
+
private readonly batchEnd = (error: unknown, message: ISequencedDocumentMessage): void => {
|
|
82
88
|
if (this.schedulingLog) {
|
|
83
89
|
this.schedulingLog.numberOfBatchesProcessed++;
|
|
84
90
|
this.schedulingLog.lastSequenceNumber = message.sequenceNumber;
|
|
@@ -86,7 +92,7 @@ export class DeltaScheduler {
|
|
|
86
92
|
}
|
|
87
93
|
|
|
88
94
|
if (this.shouldRunScheduler()) {
|
|
89
|
-
const currentTime =
|
|
95
|
+
const currentTime = performanceNow();
|
|
90
96
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
91
97
|
const elapsedTime = currentTime - this.processingStartTime!;
|
|
92
98
|
if (elapsedTime > this.currentAllowedProcessingTimeForTurn) {
|
|
@@ -120,7 +126,7 @@ export class DeltaScheduler {
|
|
|
120
126
|
processingTime: formatTick(this.schedulingLog.totalProcessingTime),
|
|
121
127
|
numberOfTurns: this.schedulingLog.numberOfTurns,
|
|
122
128
|
batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
|
|
123
|
-
timeToResume: formatTick(
|
|
129
|
+
timeToResume: formatTick(performanceNow() - currentTime),
|
|
124
130
|
});
|
|
125
131
|
}
|
|
126
132
|
this.deltaManager.inbound.resume();
|
|
@@ -129,13 +135,13 @@ export class DeltaScheduler {
|
|
|
129
135
|
this.processingStartTime = undefined;
|
|
130
136
|
}
|
|
131
137
|
}
|
|
132
|
-
}
|
|
138
|
+
};
|
|
133
139
|
|
|
134
|
-
private inboundQueueIdle() {
|
|
140
|
+
private readonly inboundQueueIdle = (): void => {
|
|
135
141
|
if (this.schedulingLog) {
|
|
136
142
|
// Add the time taken for processing the final ops to the total processing time in the
|
|
137
143
|
// telemetry log object.
|
|
138
|
-
const currentTime =
|
|
144
|
+
const currentTime = performanceNow();
|
|
139
145
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
140
146
|
this.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;
|
|
141
147
|
|
|
@@ -161,7 +167,7 @@ export class DeltaScheduler {
|
|
|
161
167
|
// Reset the processing times.
|
|
162
168
|
this.processingStartTime = undefined;
|
|
163
169
|
this.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;
|
|
164
|
-
}
|
|
170
|
+
};
|
|
165
171
|
|
|
166
172
|
/**
|
|
167
173
|
* This function tells whether we should run the scheduler.
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
import { IRequest } from "@fluidframework/core-interfaces";
|
|
7
7
|
import { assert, LazyPromise, Timer } from "@fluidframework/core-utils/internal";
|
|
8
|
-
import type { ISnapshotTree } from "@fluidframework/driver-definitions/internal";
|
|
9
8
|
import {
|
|
10
9
|
IGarbageCollectionDetailsBase,
|
|
11
10
|
ISummarizeResult,
|
|
@@ -35,17 +34,22 @@ import { IRefreshSummaryResult } from "../summary/index.js";
|
|
|
35
34
|
|
|
36
35
|
import { generateGCConfigs } from "./gcConfigs.js";
|
|
37
36
|
import {
|
|
37
|
+
// eslint-disable-next-line import/no-deprecated
|
|
38
38
|
GCNodeType,
|
|
39
39
|
GarbageCollectionMessage,
|
|
40
40
|
GarbageCollectionMessageType,
|
|
41
|
+
// eslint-disable-next-line import/no-deprecated
|
|
41
42
|
IGCMetadata,
|
|
42
43
|
IGCResult,
|
|
44
|
+
// eslint-disable-next-line import/no-deprecated
|
|
43
45
|
IGCStats,
|
|
44
46
|
IGarbageCollectionRuntime,
|
|
45
47
|
IGarbageCollector,
|
|
46
48
|
IGarbageCollectorConfigs,
|
|
47
49
|
IGarbageCollectorCreateParams,
|
|
50
|
+
// eslint-disable-next-line import/no-deprecated
|
|
48
51
|
IMarkPhaseStats,
|
|
52
|
+
// eslint-disable-next-line import/no-deprecated
|
|
49
53
|
ISweepPhaseStats,
|
|
50
54
|
UnreferencedState,
|
|
51
55
|
type IGCNodeUpdatedProps,
|
|
@@ -142,16 +146,22 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
142
146
|
private readonly summaryStateTracker: GCSummaryStateTracker;
|
|
143
147
|
private readonly telemetryTracker: GCTelemetryTracker;
|
|
144
148
|
|
|
145
|
-
/**
|
|
149
|
+
/**
|
|
150
|
+
* For a given node path, returns the node's package path.
|
|
151
|
+
*/
|
|
146
152
|
private readonly getNodePackagePath: (
|
|
147
153
|
nodePath: string,
|
|
148
154
|
) => Promise<readonly string[] | undefined>;
|
|
149
|
-
/**
|
|
155
|
+
/**
|
|
156
|
+
* Returns the timestamp of the last summary generated for this container.
|
|
157
|
+
*/
|
|
150
158
|
private readonly getLastSummaryTimestampMs: () => number | undefined;
|
|
151
159
|
|
|
152
160
|
private readonly submitMessage: (message: ContainerRuntimeGCMessage) => void;
|
|
153
161
|
|
|
154
|
-
/**
|
|
162
|
+
/**
|
|
163
|
+
* Returns the count of data stores whose GC state updated since the last summary.
|
|
164
|
+
*/
|
|
155
165
|
public get updatedDSCountSinceLastSummary(): number {
|
|
156
166
|
return this.summaryStateTracker.updatedDSCountSinceLastSummary;
|
|
157
167
|
}
|
|
@@ -227,7 +237,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
227
237
|
|
|
228
238
|
try {
|
|
229
239
|
// For newer documents, GC data should be present in the GC tree in the root of the snapshot.
|
|
230
|
-
const gcSnapshotTree
|
|
240
|
+
const gcSnapshotTree = baseSnapshot.trees[gcTreeKey];
|
|
231
241
|
if (gcSnapshotTree === undefined) {
|
|
232
242
|
// back-compat - Older documents get their gc data reset for simplicity as there are few of them
|
|
233
243
|
// incremental gc summary will not work with older gc data as well
|
|
@@ -300,7 +310,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
300
310
|
),
|
|
301
311
|
);
|
|
302
312
|
}
|
|
303
|
-
gcNodes[nodeId] =
|
|
313
|
+
gcNodes[nodeId] = [...nodeData.outboundRoutes];
|
|
304
314
|
}
|
|
305
315
|
this.gcDataFromLastRun = { gcNodes };
|
|
306
316
|
});
|
|
@@ -319,7 +329,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
319
329
|
|
|
320
330
|
const gcNodes: { [id: string]: string[] } = {};
|
|
321
331
|
for (const [nodeId, nodeData] of Object.entries(baseSnapshotData.gcState.gcNodes)) {
|
|
322
|
-
gcNodes[nodeId] =
|
|
332
|
+
gcNodes[nodeId] = [...nodeData.outboundRoutes];
|
|
323
333
|
}
|
|
324
334
|
// Run GC on the nodes in the base summary to get the routes used in each node in the container.
|
|
325
335
|
// This is an optimization for space (vs performance) wherein we don't need to store the used routes of
|
|
@@ -339,9 +349,13 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
339
349
|
});
|
|
340
350
|
}
|
|
341
351
|
|
|
342
|
-
/**
|
|
352
|
+
/**
|
|
353
|
+
* API for ensuring the correct auto-recovery mitigations
|
|
354
|
+
*/
|
|
355
|
+
// TODO: consider hoisting this to an outer scope as an optimization
|
|
356
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping
|
|
343
357
|
private readonly autoRecovery = (() => {
|
|
344
|
-
// This uses a hidden state machine for forcing fullGC as part of
|
|
358
|
+
// This uses a hidden state machine for forcing fullGC as part of auto-recovery,
|
|
345
359
|
// to regenerate the GC data for each node.
|
|
346
360
|
//
|
|
347
361
|
// Once fullGC has been requested, we need to wait until GC has run and the summary has been acked before clearing the state.
|
|
@@ -403,7 +417,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
403
417
|
// Initialize the tombstone state from the snapshot. Also, notify the runtime of tombstone routes.
|
|
404
418
|
if (baseSnapshotData.tombstones !== undefined) {
|
|
405
419
|
// Create a copy since we are writing from a source we don't control
|
|
406
|
-
this.tombstones =
|
|
420
|
+
this.tombstones = [...baseSnapshotData.tombstones];
|
|
407
421
|
this.runtime.updateTombstonedRoutes(this.tombstones);
|
|
408
422
|
}
|
|
409
423
|
|
|
@@ -414,7 +428,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
414
428
|
* Initialize the GC state if not already initialized. If GC state is already initialized, update the unreferenced
|
|
415
429
|
* state tracking as per the current reference timestamp.
|
|
416
430
|
*/
|
|
417
|
-
private async initializeOrUpdateGCState() {
|
|
431
|
+
private async initializeOrUpdateGCState(): Promise<void> {
|
|
418
432
|
const currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();
|
|
419
433
|
if (currentReferenceTimestampMs === undefined) {
|
|
420
434
|
return;
|
|
@@ -428,14 +442,14 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
428
442
|
},
|
|
429
443
|
async (event) => {
|
|
430
444
|
// If the GC state hasn't been initialized yet, initialize it and return.
|
|
431
|
-
if (
|
|
432
|
-
await this.initializeGCStateFromBaseSnapshotP;
|
|
433
|
-
} else {
|
|
445
|
+
if (initialized) {
|
|
434
446
|
// If the GC state has been initialized, update the tracking of unreferenced nodes as per the current
|
|
435
447
|
// reference timestamp.
|
|
436
448
|
for (const [, nodeStateTracker] of this.unreferencedNodesState) {
|
|
437
449
|
nodeStateTracker.updateTracking(currentReferenceTimestampMs);
|
|
438
450
|
}
|
|
451
|
+
} else {
|
|
452
|
+
await this.initializeGCStateFromBaseSnapshotP;
|
|
439
453
|
}
|
|
440
454
|
event.end({
|
|
441
455
|
details: { initialized, unrefNodeCount: this.unreferencedNodesState.size },
|
|
@@ -488,14 +502,21 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
488
502
|
*/
|
|
489
503
|
public async collectGarbage(
|
|
490
504
|
options: {
|
|
491
|
-
/**
|
|
505
|
+
/**
|
|
506
|
+
* Logger to use for logging GC events
|
|
507
|
+
*/
|
|
492
508
|
logger?: ITelemetryLoggerExt;
|
|
493
|
-
/**
|
|
509
|
+
/**
|
|
510
|
+
* True to run GC sweep phase after the mark phase
|
|
511
|
+
*/
|
|
494
512
|
runSweep?: boolean;
|
|
495
|
-
/**
|
|
513
|
+
/**
|
|
514
|
+
* True to generate full GC data
|
|
515
|
+
*/
|
|
496
516
|
fullGC?: boolean;
|
|
497
517
|
},
|
|
498
518
|
telemetryContext?: ITelemetryContext,
|
|
519
|
+
// eslint-disable-next-line import/no-deprecated
|
|
499
520
|
): Promise<IGCStats | undefined> {
|
|
500
521
|
const fullGC =
|
|
501
522
|
options.fullGC ?? (this.configs.runFullGC === true || this.autoRecovery.useFullGC());
|
|
@@ -535,11 +556,15 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
535
556
|
logger,
|
|
536
557
|
{ eventName: "GarbageCollection" },
|
|
537
558
|
async (event) => {
|
|
538
|
-
|
|
559
|
+
// #region Pre-GC steps
|
|
560
|
+
|
|
539
561
|
// Ensure that state has been initialized from the base snapshot data.
|
|
540
562
|
await this.initializeGCStateFromBaseSnapshotP;
|
|
541
563
|
|
|
542
|
-
|
|
564
|
+
// #endregion
|
|
565
|
+
|
|
566
|
+
// #region GC step
|
|
567
|
+
|
|
543
568
|
const gcStats = await this.runGC(fullGC, currentReferenceTimestampMs, logger);
|
|
544
569
|
event.end({
|
|
545
570
|
...gcStats,
|
|
@@ -550,7 +575,10 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
550
575
|
},
|
|
551
576
|
});
|
|
552
577
|
|
|
553
|
-
|
|
578
|
+
// #endregion
|
|
579
|
+
|
|
580
|
+
// #region Post-GC steps
|
|
581
|
+
|
|
554
582
|
// Log pending unreferenced events such as a node being used after inactive. This is done after GC runs and
|
|
555
583
|
// updates its state so that we don't send false positives based on intermediate state. For example, we may get
|
|
556
584
|
// reference to an unreferenced node from another unreferenced node which means the node wasn't revived.
|
|
@@ -561,6 +589,8 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
561
589
|
this.newReferencesSinceLastRun.clear();
|
|
562
590
|
this.completedRuns++;
|
|
563
591
|
|
|
592
|
+
// #endregion
|
|
593
|
+
|
|
564
594
|
return gcStats;
|
|
565
595
|
},
|
|
566
596
|
{ end: true, cancel: "error" },
|
|
@@ -584,6 +614,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
584
614
|
fullGC: boolean,
|
|
585
615
|
currentReferenceTimestampMs: number,
|
|
586
616
|
logger: ITelemetryLoggerExt,
|
|
617
|
+
// eslint-disable-next-line import/no-deprecated
|
|
587
618
|
): Promise<IGCStats> {
|
|
588
619
|
// 1. Generate / analyze the runtime's reference graph.
|
|
589
620
|
// Get the reference graph (gcData) and run GC algorithm to get referenced / unreferenced nodes.
|
|
@@ -700,7 +731,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
700
731
|
gcResult: IGCResult,
|
|
701
732
|
tombstoneReadyNodes: Set<string>,
|
|
702
733
|
sweepReadyNodes: Set<string>,
|
|
703
|
-
) {
|
|
734
|
+
): void {
|
|
704
735
|
/**
|
|
705
736
|
* Under "Test Mode", unreferenced nodes are immediately deleted without waiting for them to be sweep-ready.
|
|
706
737
|
*
|
|
@@ -739,6 +770,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
739
770
|
// local state when processing the op.
|
|
740
771
|
const sweepReadyDSAndBlobs = nodesToDelete.filter((nodeId) => {
|
|
741
772
|
const nodeType = this.runtime.getNodeType(nodeId);
|
|
773
|
+
// eslint-disable-next-line import/no-deprecated
|
|
742
774
|
return nodeType === GCNodeType.DataStore || nodeType === GCNodeType.Blob;
|
|
743
775
|
});
|
|
744
776
|
const contents: GarbageCollectionMessage = {
|
|
@@ -816,16 +848,14 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
816
848
|
*/
|
|
817
849
|
const gcDataSuperSet = concatGarbageCollectionData(previousGCData, currentGCData);
|
|
818
850
|
const newOutboundRoutesSinceLastRun: string[] = [];
|
|
819
|
-
this.newReferencesSinceLastRun
|
|
820
|
-
(
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
},
|
|
828
|
-
);
|
|
851
|
+
for (const [sourceNodeId, outboundRoutes] of this.newReferencesSinceLastRun) {
|
|
852
|
+
if (gcDataSuperSet.gcNodes[sourceNodeId] === undefined) {
|
|
853
|
+
gcDataSuperSet.gcNodes[sourceNodeId] = outboundRoutes;
|
|
854
|
+
} else {
|
|
855
|
+
gcDataSuperSet.gcNodes[sourceNodeId].push(...outboundRoutes);
|
|
856
|
+
}
|
|
857
|
+
newOutboundRoutesSinceLastRun.push(...outboundRoutes);
|
|
858
|
+
}
|
|
829
859
|
|
|
830
860
|
/**
|
|
831
861
|
* Run GC on the above reference graph starting with root and all new outbound routes. This will generate a
|
|
@@ -872,6 +902,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
872
902
|
);
|
|
873
903
|
}
|
|
874
904
|
|
|
905
|
+
// eslint-disable-next-line import/no-deprecated
|
|
875
906
|
public getMetadata(): IGCMetadata {
|
|
876
907
|
return {
|
|
877
908
|
/**
|
|
@@ -904,7 +935,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
904
935
|
messageContents: GarbageCollectionMessage[],
|
|
905
936
|
messageTimestampMs: number,
|
|
906
937
|
local: boolean,
|
|
907
|
-
) {
|
|
938
|
+
): void {
|
|
908
939
|
for (const gcMessage of messageContents) {
|
|
909
940
|
const gcMessageType = gcMessage.type;
|
|
910
941
|
switch (gcMessageType) {
|
|
@@ -928,11 +959,12 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
928
959
|
this.autoRecovery.requestFullGCOnNextRun();
|
|
929
960
|
break;
|
|
930
961
|
}
|
|
931
|
-
default:
|
|
962
|
+
default: {
|
|
932
963
|
throw DataProcessingError.create(
|
|
933
964
|
`Garbage collection message of unknown type ${gcMessageType}`,
|
|
934
965
|
"processMessage",
|
|
935
966
|
);
|
|
967
|
+
}
|
|
936
968
|
}
|
|
937
969
|
}
|
|
938
970
|
}
|
|
@@ -946,14 +978,14 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
946
978
|
*
|
|
947
979
|
* @param sweepReadyNodeIds - The ids of nodes that are ready to be deleted.
|
|
948
980
|
*/
|
|
949
|
-
private deleteSweepReadyNodes(sweepReadyNodeIds: readonly string[]) {
|
|
981
|
+
private deleteSweepReadyNodes(sweepReadyNodeIds: readonly string[]): void {
|
|
950
982
|
// Use a set for lookup because its much faster than array or map.
|
|
951
983
|
const sweepReadyNodesSet: Set<string> = new Set(sweepReadyNodeIds);
|
|
952
984
|
|
|
953
985
|
// The ids in the sweep-ready nodes do not contain DDS node ids. This is an optimization to reduce the size
|
|
954
986
|
// of the GC op. Since GC applies to data store only, all its DDSes are deleted along with it. So, get the
|
|
955
987
|
// DDS nodes ID from the unreferenced nodes state.
|
|
956
|
-
const allSweepReadyNodeIds =
|
|
988
|
+
const allSweepReadyNodeIds = [...sweepReadyNodeIds];
|
|
957
989
|
for (const [id] of this.unreferencedNodesState) {
|
|
958
990
|
// Ignore data store nodes since they would already be in the list.
|
|
959
991
|
const pathParts = id.split("/");
|
|
@@ -992,7 +1024,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
992
1024
|
request,
|
|
993
1025
|
headerData,
|
|
994
1026
|
additionalProps,
|
|
995
|
-
}: IGCNodeUpdatedProps) {
|
|
1027
|
+
}: IGCNodeUpdatedProps): void {
|
|
996
1028
|
// If there is no reference timestamp to work with, no ops have been processed after creation. If so, skip
|
|
997
1029
|
// logging as nothing interesting would have happened worth logging.
|
|
998
1030
|
if (!this.shouldRunGC || timestampMs === undefined) {
|
|
@@ -1002,7 +1034,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1002
1034
|
// trackedId will be either DataStore or Blob ID (not sub-DataStore ID, since some of those are unrecognized by GC)
|
|
1003
1035
|
const trackedId = node.path;
|
|
1004
1036
|
const isTombstoned = this.tombstones.includes(trackedId);
|
|
1005
|
-
const fullPath = request
|
|
1037
|
+
const fullPath = request === undefined ? trackedId : urlToGCNodePath(request.url);
|
|
1006
1038
|
|
|
1007
1039
|
// This will log if appropriate
|
|
1008
1040
|
this.telemetryTracker.nodeUsed(trackedId, {
|
|
@@ -1033,6 +1065,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1033
1065
|
// Unless this is a Loaded event for a Blob or DataStore, we're done after telemetry tracking
|
|
1034
1066
|
const loadedBlobOrDataStore =
|
|
1035
1067
|
reason === "Loaded" &&
|
|
1068
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1036
1069
|
(nodeType === GCNodeType.Blob || nodeType === GCNodeType.DataStore);
|
|
1037
1070
|
if (!loadedBlobOrDataStore) {
|
|
1038
1071
|
return;
|
|
@@ -1063,7 +1096,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1063
1096
|
* Broadcasting this information in the op stream allows the Summarizer to reset unreferenced state
|
|
1064
1097
|
* before running GC next.
|
|
1065
1098
|
*/
|
|
1066
|
-
private triggerAutoRecovery(nodePath: string) {
|
|
1099
|
+
private triggerAutoRecovery(nodePath: string): void {
|
|
1067
1100
|
// If sweep isn't enabled, auto-recovery isn't needed since its purpose is to prevent this object from being
|
|
1068
1101
|
// deleted. It also would end up sending a GC op which can break clients running FF version 1.x.
|
|
1069
1102
|
if (!this.configs.sweepEnabled) {
|
|
@@ -1094,7 +1127,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1094
1127
|
toNodePath: string,
|
|
1095
1128
|
timestampMs: number,
|
|
1096
1129
|
autorecovery?: true,
|
|
1097
|
-
) {
|
|
1130
|
+
): void {
|
|
1098
1131
|
if (!this.shouldRunGC) {
|
|
1099
1132
|
return;
|
|
1100
1133
|
}
|
|
@@ -1160,7 +1193,9 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1160
1193
|
* @param gcResult - The result of the current GC run.
|
|
1161
1194
|
* @returns the stats of the mark phase run.
|
|
1162
1195
|
*/
|
|
1196
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1163
1197
|
private getMarkPhaseStats(gcResult: IGCResult): IMarkPhaseStats {
|
|
1198
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1164
1199
|
const markPhaseStats: IMarkPhaseStats = {
|
|
1165
1200
|
nodeCount: 0,
|
|
1166
1201
|
dataStoreCount: 0,
|
|
@@ -1173,7 +1208,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1173
1208
|
updatedAttachmentBlobCount: 0,
|
|
1174
1209
|
};
|
|
1175
1210
|
|
|
1176
|
-
const updateNodeStats = (nodeId: string, isReferenced: boolean) => {
|
|
1211
|
+
const updateNodeStats = (nodeId: string, isReferenced: boolean): void => {
|
|
1177
1212
|
markPhaseStats.nodeCount++;
|
|
1178
1213
|
// If there is no previous GC data, every node's state is generated and is considered as updated.
|
|
1179
1214
|
// Otherwise, find out if any node went from referenced to unreferenced or vice-versa.
|
|
@@ -1187,6 +1222,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1187
1222
|
markPhaseStats.unrefNodeCount++;
|
|
1188
1223
|
}
|
|
1189
1224
|
|
|
1225
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1190
1226
|
if (this.runtime.getNodeType(nodeId) === GCNodeType.DataStore) {
|
|
1191
1227
|
markPhaseStats.dataStoreCount++;
|
|
1192
1228
|
if (stateUpdated) {
|
|
@@ -1196,6 +1232,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1196
1232
|
markPhaseStats.unrefDataStoreCount++;
|
|
1197
1233
|
}
|
|
1198
1234
|
}
|
|
1235
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1199
1236
|
if (this.runtime.getNodeType(nodeId) === GCNodeType.Blob) {
|
|
1200
1237
|
markPhaseStats.attachmentBlobCount++;
|
|
1201
1238
|
if (stateUpdated) {
|
|
@@ -1229,10 +1266,13 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1229
1266
|
private getSweepPhaseStats(
|
|
1230
1267
|
deletedNodes: Set<string>,
|
|
1231
1268
|
sweepReadyNodes: Set<string>,
|
|
1269
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1232
1270
|
markPhaseStats: IMarkPhaseStats,
|
|
1271
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1233
1272
|
): ISweepPhaseStats {
|
|
1234
1273
|
// Initialize the life time node counts to the mark phase node counts. If sweep is not enabled,
|
|
1235
1274
|
// these will be the life time node count for this container.
|
|
1275
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1236
1276
|
const sweepPhaseStats: ISweepPhaseStats = {
|
|
1237
1277
|
lifetimeNodeCount: markPhaseStats.nodeCount,
|
|
1238
1278
|
lifetimeDataStoreCount: markPhaseStats.dataStoreCount,
|
|
@@ -1244,25 +1284,32 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1244
1284
|
|
|
1245
1285
|
// The runtime can't reliably identify the type of deleted nodes. So, get the type here. This should
|
|
1246
1286
|
// be good enough because the only types that participate in GC today are data stores, DDSes and blobs.
|
|
1287
|
+
// eslint-disable-next-line import/no-deprecated, unicorn/consistent-function-scoping
|
|
1247
1288
|
const getDeletedNodeType = (nodeId: string): GCNodeType => {
|
|
1248
1289
|
const pathParts = nodeId.split("/");
|
|
1249
1290
|
if (pathParts[1] === blobManagerBasePath) {
|
|
1291
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1250
1292
|
return GCNodeType.Blob;
|
|
1251
1293
|
}
|
|
1252
1294
|
if (pathParts.length === 2) {
|
|
1295
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1253
1296
|
return GCNodeType.DataStore;
|
|
1254
1297
|
}
|
|
1255
1298
|
if (pathParts.length === 3) {
|
|
1299
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1256
1300
|
return GCNodeType.SubDataStore;
|
|
1257
1301
|
}
|
|
1302
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1258
1303
|
return GCNodeType.Other;
|
|
1259
1304
|
};
|
|
1260
1305
|
|
|
1261
1306
|
for (const nodeId of deletedNodes) {
|
|
1262
1307
|
sweepPhaseStats.deletedNodeCount++;
|
|
1263
1308
|
const nodeType = getDeletedNodeType(nodeId);
|
|
1309
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1264
1310
|
if (nodeType === GCNodeType.DataStore) {
|
|
1265
1311
|
sweepPhaseStats.deletedDataStoreCount++;
|
|
1312
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1266
1313
|
} else if (nodeType === GCNodeType.Blob) {
|
|
1267
1314
|
sweepPhaseStats.deletedAttachmentBlobCount++;
|
|
1268
1315
|
}
|
|
@@ -1283,8 +1330,10 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1283
1330
|
for (const nodeId of sweepReadyNodes) {
|
|
1284
1331
|
sweepPhaseStats.deletedNodeCount++;
|
|
1285
1332
|
const nodeType = this.runtime.getNodeType(nodeId);
|
|
1333
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1286
1334
|
if (nodeType === GCNodeType.DataStore) {
|
|
1287
1335
|
sweepPhaseStats.deletedDataStoreCount++;
|
|
1336
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1288
1337
|
} else if (nodeType === GCNodeType.Blob) {
|
|
1289
1338
|
sweepPhaseStats.deletedAttachmentBlobCount++;
|
|
1290
1339
|
}
|
package/src/gc/gcConfigs.ts
CHANGED
|
@@ -9,10 +9,13 @@ import {
|
|
|
9
9
|
validatePrecondition,
|
|
10
10
|
} from "@fluidframework/telemetry-utils/internal";
|
|
11
11
|
|
|
12
|
+
// eslint-disable-next-line import/no-deprecated
|
|
12
13
|
import { IContainerRuntimeMetadata } from "../summary/index.js";
|
|
13
14
|
|
|
14
15
|
import {
|
|
16
|
+
// eslint-disable-next-line import/no-deprecated
|
|
15
17
|
GCFeatureMatrix,
|
|
18
|
+
// eslint-disable-next-line import/no-deprecated
|
|
16
19
|
GCVersion,
|
|
17
20
|
IGCMetadata_Deprecated,
|
|
18
21
|
IGCRuntimeOptions,
|
|
@@ -42,6 +45,7 @@ export function generateGCConfigs(
|
|
|
42
45
|
mc: MonitoringContext,
|
|
43
46
|
createParams: {
|
|
44
47
|
gcOptions: IGCRuntimeOptions;
|
|
48
|
+
// eslint-disable-next-line import/no-deprecated
|
|
45
49
|
metadata: IContainerRuntimeMetadata | undefined;
|
|
46
50
|
existing: boolean;
|
|
47
51
|
isSummarizerClient: boolean;
|
|
@@ -50,7 +54,9 @@ export function generateGCConfigs(
|
|
|
50
54
|
let gcAllowed: boolean = true;
|
|
51
55
|
let sessionExpiryTimeoutMs: number | undefined;
|
|
52
56
|
let tombstoneTimeoutMs: number | undefined;
|
|
57
|
+
// eslint-disable-next-line import/no-deprecated
|
|
53
58
|
let persistedGcFeatureMatrix: GCFeatureMatrix | undefined;
|
|
59
|
+
// eslint-disable-next-line import/no-deprecated
|
|
54
60
|
let gcVersionInBaseSnapshot: GCVersion | undefined;
|
|
55
61
|
|
|
56
62
|
/**
|
|
@@ -87,7 +93,7 @@ export function generateGCConfigs(
|
|
|
87
93
|
tombstoneTimeoutMs =
|
|
88
94
|
testOverrideTombstoneTimeoutMs ?? computeTombstoneTimeout(sessionExpiryTimeoutMs);
|
|
89
95
|
|
|
90
|
-
const gcGeneration = createParams.gcOptions
|
|
96
|
+
const gcGeneration = createParams.gcOptions[gcGenerationOptionName] as number;
|
|
91
97
|
if (gcGeneration !== undefined) {
|
|
92
98
|
persistedGcFeatureMatrix = { gcGeneration };
|
|
93
99
|
}
|
|
@@ -98,7 +104,9 @@ export function generateGCConfigs(
|
|
|
98
104
|
// Note that if no generation option is provided, Sweep is allowed for any document.
|
|
99
105
|
const sweepAllowed = shouldAllowGcSweep(
|
|
100
106
|
persistedGcFeatureMatrix ?? {} /* featureMatrix */,
|
|
101
|
-
createParams.gcOptions[gcGenerationOptionName]
|
|
107
|
+
createParams.gcOptions[gcGenerationOptionName] as
|
|
108
|
+
| number
|
|
109
|
+
| undefined /* currentGeneration */,
|
|
102
110
|
);
|
|
103
111
|
|
|
104
112
|
/**
|
|
@@ -116,9 +124,9 @@ export function generateGCConfigs(
|
|
|
116
124
|
: sweepAllowed && createParams.gcOptions.enableGCSweep === true;
|
|
117
125
|
|
|
118
126
|
// Override inactive timeout if test config or gc options to override it is set.
|
|
119
|
-
const inactiveTimeoutMs =
|
|
127
|
+
const inactiveTimeoutMs: number =
|
|
120
128
|
mc.config.getNumber("Fluid.GarbageCollection.TestOverride.InactiveTimeoutMs") ??
|
|
121
|
-
createParams.gcOptions.inactiveTimeoutMs ??
|
|
129
|
+
(createParams.gcOptions.inactiveTimeoutMs as number) ??
|
|
122
130
|
defaultInactiveTimeoutMs;
|
|
123
131
|
|
|
124
132
|
// Inactive timeout must be greater than tombstone timeout since a node goes from active -> inactive -> sweep ready.
|
|
@@ -169,7 +177,7 @@ export function generateGCConfigs(
|
|
|
169
177
|
*
|
|
170
178
|
* If there is no Session Expiry timeout, GC can never guarantee an object won't be revived, so return undefined.
|
|
171
179
|
*/
|
|
172
|
-
function computeTombstoneTimeout(
|
|
180
|
+
export function computeTombstoneTimeout(
|
|
173
181
|
sessionExpiryTimeoutMs: number | undefined,
|
|
174
182
|
): number | undefined {
|
|
175
183
|
const bufferMs = oneDayMs;
|