@fluidframework/container-runtime 2.0.0-dev-rc.1.0.0.228517 → 2.0.0-dev-rc.2.0.0.245554
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.js → .eslintrc.cjs} +5 -5
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +54 -0
- package/README.md +46 -1
- package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
- package/api-extractor-lint.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/container-runtime.api.md +435 -33
- package/dist/batchTracker.d.ts +1 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +0 -5
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +0 -12
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +225 -0
- package/dist/channelCollection.d.ts.map +1 -0
- package/dist/{dataStores.js → channelCollection.js} +449 -143
- package/dist/channelCollection.js.map +1 -0
- package/dist/connectionTelemetry.d.ts +11 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +42 -4
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/container-runtime-alpha.d.ts +138 -49
- package/dist/container-runtime-beta.d.ts +75 -9
- package/dist/container-runtime-public.d.ts +75 -9
- package/dist/container-runtime-untrimmed.d.ts +717 -49
- 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 +84 -64
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +550 -427
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +2 -3
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +12 -11
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +118 -38
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +249 -161
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +2 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +1 -0
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +29 -4
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +91 -5
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +29 -7
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +179 -98
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +2 -2
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +30 -23
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +40 -15
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +11 -4
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +2 -2
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +12 -5
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +18 -6
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +7 -7
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +20 -20
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts +6 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +22 -11
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +8 -8
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +40 -38
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +11 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -40
- package/dist/index.js.map +1 -1
- package/dist/messageTypes.d.ts +4 -4
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +2 -2
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -2
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +8 -8
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +18 -18
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +4 -4
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +3 -3
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +1 -10
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +5 -5
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +7 -7
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +20 -12
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -4
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +2 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/package.json +3 -0
- 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 +2 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +18 -10
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +1 -2
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +5 -5
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +12 -12
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +43 -43
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.js +8 -8
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +11 -10
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +114 -81
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +4 -4
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +6 -6
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +3 -3
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts +3 -3
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.js +4 -4
- package/dist/summary/summarizerNode/index.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +17 -7
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +45 -57
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +10 -19
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +1 -21
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +5 -6
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +16 -16
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +10 -21
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +15 -2
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +6 -5
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +10 -1
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +5 -6
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +4 -5
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/{batchTracker.d.mts → batchTracker.d.ts} +2 -3
- package/lib/batchTracker.d.ts.map +1 -0
- package/lib/{batchTracker.mjs → batchTracker.js} +1 -1
- package/lib/batchTracker.js.map +1 -0
- package/lib/{blobManager.d.mts → blobManager.d.ts} +1 -6
- package/lib/blobManager.d.ts.map +1 -0
- package/lib/{blobManager.mjs → blobManager.js} +1 -13
- package/lib/blobManager.js.map +1 -0
- package/lib/channelCollection.d.ts +225 -0
- package/lib/channelCollection.d.ts.map +1 -0
- package/lib/{dataStores.mjs → channelCollection.js} +436 -133
- package/lib/channelCollection.js.map +1 -0
- package/lib/{connectionTelemetry.d.mts → connectionTelemetry.d.ts} +12 -2
- package/lib/connectionTelemetry.d.ts.map +1 -0
- package/lib/{connectionTelemetry.mjs → connectionTelemetry.js} +43 -5
- package/lib/connectionTelemetry.js.map +1 -0
- package/lib/{container-runtime-alpha.d.mts → container-runtime-alpha.d.ts} +138 -49
- package/lib/{container-runtime-beta.d.mts → container-runtime-beta.d.ts} +75 -9
- package/lib/{container-runtime-public.d.mts → container-runtime-public.d.ts} +75 -9
- package/lib/{container-runtime-untrimmed.d.mts → container-runtime-untrimmed.d.ts} +717 -49
- package/lib/{containerHandleContext.d.mts → containerHandleContext.d.ts} +2 -2
- package/lib/containerHandleContext.d.ts.map +1 -0
- package/lib/{containerHandleContext.mjs → containerHandleContext.js} +1 -1
- package/lib/containerHandleContext.js.map +1 -0
- package/lib/{containerRuntime.d.mts → containerRuntime.d.ts} +89 -65
- package/lib/containerRuntime.d.ts.map +1 -0
- package/lib/{containerRuntime.mjs → containerRuntime.js} +469 -348
- package/lib/containerRuntime.js.map +1 -0
- package/lib/{dataStore.d.mts → dataStore.d.ts} +3 -4
- package/lib/dataStore.d.ts.map +1 -0
- package/lib/{dataStore.mjs → dataStore.js} +13 -12
- package/lib/dataStore.js.map +1 -0
- package/lib/{dataStoreContext.d.mts → dataStoreContext.d.ts} +119 -39
- package/lib/dataStoreContext.d.ts.map +1 -0
- package/lib/{dataStoreContext.mjs → dataStoreContext.js} +241 -153
- package/lib/dataStoreContext.js.map +1 -0
- package/lib/{dataStoreContexts.d.mts → dataStoreContexts.d.ts} +3 -2
- package/lib/dataStoreContexts.d.ts.map +1 -0
- package/lib/{dataStoreContexts.mjs → dataStoreContexts.js} +2 -1
- package/lib/dataStoreContexts.js.map +1 -0
- package/lib/{dataStoreRegistry.d.mts → dataStoreRegistry.d.ts} +1 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -0
- package/lib/{dataStoreRegistry.mjs → dataStoreRegistry.js} +5 -1
- package/lib/dataStoreRegistry.js.map +1 -0
- package/{dist/deltaManagerProxyBase.d.ts → lib/deltaManagerSummarizerProxy.d.ts} +16 -7
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -0
- package/lib/deltaManagerSummarizerProxy.js +124 -0
- package/lib/deltaManagerSummarizerProxy.js.map +1 -0
- package/lib/{deltaScheduler.d.mts → deltaScheduler.d.ts} +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -0
- package/lib/{deltaScheduler.mjs → deltaScheduler.js} +1 -1
- package/lib/deltaScheduler.js.map +1 -0
- package/lib/{error.d.mts → error.d.ts} +1 -1
- package/lib/error.d.ts.map +1 -0
- package/lib/{error.mjs → error.js} +1 -1
- package/lib/error.js.map +1 -0
- package/lib/gc/{garbageCollection.d.mts → garbageCollection.d.ts} +30 -8
- package/lib/gc/garbageCollection.d.ts.map +1 -0
- package/lib/gc/{garbageCollection.mjs → garbageCollection.js} +149 -68
- package/lib/gc/garbageCollection.js.map +1 -0
- package/lib/gc/{gcConfigs.d.mts → gcConfigs.d.ts} +3 -3
- package/lib/gc/gcConfigs.d.ts.map +1 -0
- package/lib/gc/{gcConfigs.mjs → gcConfigs.js} +14 -7
- package/lib/gc/gcConfigs.js.map +1 -0
- package/lib/gc/{gcDefinitions.d.mts → gcDefinitions.d.ts} +41 -16
- package/lib/gc/gcDefinitions.d.ts.map +1 -0
- package/lib/gc/{gcDefinitions.mjs → gcDefinitions.js} +11 -4
- package/lib/gc/gcDefinitions.js.map +1 -0
- package/lib/gc/{gcHelpers.d.mts → gcHelpers.d.ts} +3 -3
- package/lib/gc/{gcHelpers.d.mts.map → gcHelpers.d.ts.map} +1 -1
- package/lib/gc/{gcHelpers.mjs → gcHelpers.js} +1 -1
- package/lib/gc/gcHelpers.js.map +1 -0
- package/lib/gc/{gcReferenceGraphAlgorithm.d.mts → gcReferenceGraphAlgorithm.d.ts} +2 -2
- package/lib/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
- package/lib/gc/{gcReferenceGraphAlgorithm.mjs → gcReferenceGraphAlgorithm.js} +1 -1
- package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/lib/gc/{gcSummaryDefinitions.d.mts → gcSummaryDefinitions.d.ts} +1 -1
- package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -0
- package/lib/gc/{gcSummaryDefinitions.mjs → gcSummaryDefinitions.js} +1 -1
- package/lib/gc/gcSummaryDefinitions.js.map +1 -0
- package/lib/gc/{gcSummaryStateTracker.d.mts → gcSummaryStateTracker.d.ts} +13 -6
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/lib/gc/{gcSummaryStateTracker.mjs → gcSummaryStateTracker.js} +17 -5
- package/lib/gc/gcSummaryStateTracker.js.map +1 -0
- package/lib/gc/{gcTelemetry.d.mts → gcTelemetry.d.ts} +8 -8
- package/lib/gc/gcTelemetry.d.ts.map +1 -0
- package/lib/gc/{gcTelemetry.mjs → gcTelemetry.js} +5 -5
- package/lib/gc/gcTelemetry.js.map +1 -0
- package/lib/gc/{gcUnreferencedStateTracker.d.mts → gcUnreferencedStateTracker.d.ts} +7 -2
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/lib/gc/{gcUnreferencedStateTracker.mjs → gcUnreferencedStateTracker.js} +12 -2
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/lib/gc/index.d.ts +13 -0
- package/lib/gc/index.d.ts.map +1 -0
- package/lib/gc/{index.mjs → index.js} +8 -8
- package/lib/gc/index.js.map +1 -0
- package/lib/{index.d.mts → index.d.ts} +12 -21
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +15 -0
- package/lib/index.js.map +1 -0
- package/lib/{messageTypes.d.mts → messageTypes.d.ts} +5 -5
- package/lib/messageTypes.d.ts.map +1 -0
- package/lib/{messageTypes.mjs → messageTypes.js} +1 -1
- package/lib/messageTypes.js.map +1 -0
- package/lib/{metadata.d.mts → metadata.d.ts} +1 -1
- package/lib/metadata.d.ts.map +1 -0
- package/lib/{metadata.mjs → metadata.js} +1 -1
- package/lib/metadata.js.map +1 -0
- package/lib/opLifecycle/{batchManager.d.mts → batchManager.d.ts} +3 -3
- package/lib/opLifecycle/batchManager.d.ts.map +1 -0
- package/lib/opLifecycle/{batchManager.mjs → batchManager.js} +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -0
- package/lib/opLifecycle/{definitions.d.mts → definitions.d.ts} +3 -3
- package/lib/opLifecycle/definitions.d.ts.map +1 -0
- package/lib/opLifecycle/{definitions.mjs → definitions.js} +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -0
- package/lib/opLifecycle/index.d.ts +13 -0
- package/lib/opLifecycle/index.d.ts.map +1 -0
- package/lib/opLifecycle/index.js +12 -0
- package/lib/opLifecycle/index.js.map +1 -0
- package/lib/opLifecycle/{opCompressor.d.mts → opCompressor.d.ts} +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -0
- package/lib/opLifecycle/{opCompressor.mjs → opCompressor.js} +3 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -0
- package/lib/opLifecycle/{opDecompressor.d.mts → opDecompressor.d.ts} +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -0
- package/lib/opLifecycle/{opDecompressor.mjs → opDecompressor.js} +2 -2
- package/lib/opLifecycle/opDecompressor.js.map +1 -0
- package/lib/opLifecycle/{opGroupingManager.d.mts → opGroupingManager.d.ts} +2 -2
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/lib/opLifecycle/{opGroupingManager.mjs → opGroupingManager.js} +2 -11
- package/lib/opLifecycle/opGroupingManager.js.map +1 -0
- package/lib/opLifecycle/{opSplitter.d.mts → opSplitter.d.ts} +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -0
- package/lib/opLifecycle/{opSplitter.mjs → opSplitter.js} +3 -3
- package/lib/opLifecycle/opSplitter.js.map +1 -0
- package/lib/opLifecycle/{outbox.d.mts → outbox.d.ts} +8 -8
- package/lib/opLifecycle/outbox.d.ts.map +1 -0
- package/lib/opLifecycle/{outbox.mjs → outbox.js} +12 -4
- package/lib/opLifecycle/outbox.js.map +1 -0
- package/lib/opLifecycle/{remoteMessageProcessor.d.mts → remoteMessageProcessor.d.ts} +5 -5
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -0
- package/lib/opLifecycle/{remoteMessageProcessor.mjs → remoteMessageProcessor.js} +2 -2
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -0
- package/lib/{opProperties.d.mts → opProperties.d.ts} +1 -1
- package/lib/opProperties.d.ts.map +1 -0
- package/lib/{opProperties.mjs → opProperties.js} +1 -1
- package/lib/opProperties.js.map +1 -0
- package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
- package/lib/packageVersion.js.map +1 -0
- package/lib/{pendingStateManager.d.mts → pendingStateManager.d.ts} +3 -2
- package/lib/pendingStateManager.d.ts.map +1 -0
- package/lib/{pendingStateManager.mjs → pendingStateManager.js} +18 -10
- package/lib/pendingStateManager.js.map +1 -0
- package/lib/{scheduleManager.d.mts → scheduleManager.d.ts} +6 -3
- package/lib/scheduleManager.d.ts.map +1 -0
- package/lib/{scheduleManager.mjs → scheduleManager.js} +3 -3
- package/lib/scheduleManager.js.map +1 -0
- package/lib/{storageServiceWithAttachBlobs.d.mts → storageServiceWithAttachBlobs.d.ts} +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -0
- package/lib/{storageServiceWithAttachBlobs.mjs → storageServiceWithAttachBlobs.js} +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -0
- package/lib/summary/{index.d.mts → index.d.ts} +13 -13
- package/lib/summary/index.d.ts.map +1 -0
- package/lib/summary/{index.mjs → index.js} +12 -12
- package/lib/summary/index.js.map +1 -0
- package/lib/summary/{orderedClientElection.d.mts → orderedClientElection.d.ts} +5 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -0
- package/lib/summary/{orderedClientElection.mjs → orderedClientElection.js} +2 -2
- package/lib/summary/orderedClientElection.js.map +1 -0
- package/lib/summary/{runWhileConnectedCoordinator.d.mts → runWhileConnectedCoordinator.d.ts} +2 -2
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/lib/summary/{runWhileConnectedCoordinator.mjs → runWhileConnectedCoordinator.js} +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/lib/summary/{runningSummarizer.d.mts → runningSummarizer.d.ts} +12 -11
- package/lib/summary/runningSummarizer.d.ts.map +1 -0
- package/lib/summary/{runningSummarizer.mjs → runningSummarizer.js} +108 -75
- package/lib/summary/runningSummarizer.js.map +1 -0
- package/lib/summary/{summarizer.d.mts → summarizer.d.ts} +5 -5
- package/lib/summary/summarizer.d.ts.map +1 -0
- package/lib/summary/{summarizer.mjs → summarizer.js} +4 -4
- package/lib/summary/summarizer.js.map +1 -0
- package/lib/summary/{summarizerClientElection.d.mts → summarizerClientElection.d.ts} +3 -3
- package/lib/summary/summarizerClientElection.d.ts.map +1 -0
- package/lib/summary/{summarizerClientElection.mjs → summarizerClientElection.js} +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -0
- package/lib/summary/{summarizerHeuristics.d.mts → summarizerHeuristics.d.ts} +4 -4
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
- package/lib/summary/{summarizerHeuristics.mjs → summarizerHeuristics.js} +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -0
- package/lib/summary/summarizerNode/{index.d.mts → index.d.ts} +4 -4
- package/lib/summary/summarizerNode/index.d.ts.map +1 -0
- package/lib/summary/summarizerNode/index.js +7 -0
- package/lib/summary/summarizerNode/index.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNode.d.mts → summarizerNode.d.ts} +18 -8
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNode.mjs → summarizerNode.js} +41 -53
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeUtils.d.mts → summarizerNodeUtils.d.ts} +11 -20
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeUtils.mjs → summarizerNodeUtils.js} +1 -20
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeWithGc.d.mts → summarizerNodeWithGc.d.ts} +6 -7
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeWithGc.mjs → summarizerNodeWithGc.js} +12 -12
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/lib/summary/{summarizerTypes.d.mts → summarizerTypes.d.ts} +11 -22
- package/lib/summary/summarizerTypes.d.ts.map +1 -0
- package/lib/summary/{summarizerTypes.mjs → summarizerTypes.js} +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -0
- package/lib/summary/{summaryCollection.d.mts → summaryCollection.d.ts} +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -0
- package/lib/summary/{summaryCollection.mjs → summaryCollection.js} +1 -1
- package/lib/summary/summaryCollection.js.map +1 -0
- package/lib/summary/{summaryFormat.d.mts → summaryFormat.d.ts} +16 -3
- package/lib/summary/summaryFormat.d.ts.map +1 -0
- package/lib/summary/{summaryFormat.mjs → summaryFormat.js} +1 -1
- package/lib/summary/summaryFormat.js.map +1 -0
- package/lib/summary/{summaryGenerator.d.mts → summaryGenerator.d.ts} +7 -6
- package/lib/summary/summaryGenerator.d.ts.map +1 -0
- package/lib/summary/{summaryGenerator.mjs → summaryGenerator.js} +11 -2
- package/lib/summary/summaryGenerator.js.map +1 -0
- package/lib/summary/{summaryManager.d.mts → summaryManager.d.ts} +6 -7
- package/lib/summary/summaryManager.d.ts.map +1 -0
- package/lib/summary/{summaryManager.mjs → summaryManager.js} +4 -5
- package/lib/summary/summaryManager.js.map +1 -0
- package/lib/test/batchTracker.spec.js +88 -0
- package/lib/test/batchTracker.spec.js.map +1 -0
- package/lib/test/blobManager.spec.js +835 -0
- package/lib/test/blobManager.spec.js.map +1 -0
- package/lib/test/channelCollection.spec.js +138 -0
- package/lib/test/channelCollection.spec.js.map +1 -0
- package/lib/test/containerRuntime.spec.js +1748 -0
- package/lib/test/containerRuntime.spec.js.map +1 -0
- package/lib/test/dataStoreContext.spec.js +771 -0
- package/lib/test/dataStoreContext.spec.js.map +1 -0
- package/lib/test/dataStoreCreation.spec.js +303 -0
- package/lib/test/dataStoreCreation.spec.js.map +1 -0
- package/lib/test/dataStoreRegistry.spec.js +26 -0
- package/lib/test/dataStoreRegistry.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +66 -0
- package/lib/test/fuzz/fuzzUtils.js.map +1 -0
- package/lib/test/fuzz/summarizer.fuzz.spec.js +31 -0
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -0
- package/lib/test/fuzz/summarizerFuzzMocks.js +162 -0
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -0
- package/lib/test/fuzz/summarizerFuzzSuite.js +106 -0
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -0
- package/lib/test/gc/garbageCollection.spec.js +1464 -0
- package/lib/test/gc/garbageCollection.spec.js.map +1 -0
- package/lib/test/gc/gcConfigs.spec.js +689 -0
- package/lib/test/gc/gcConfigs.spec.js.map +1 -0
- package/lib/test/gc/gcHelpers.spec.js +110 -0
- package/lib/test/gc/gcHelpers.spec.js.map +1 -0
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +68 -0
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +1 -0
- package/lib/test/gc/gcStats.spec.js +390 -0
- package/lib/test/gc/gcStats.spec.js.map +1 -0
- package/lib/test/gc/gcSummaryStateTracker.spec.js +228 -0
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -0
- package/lib/test/gc/gcTelemetry.spec.js +530 -0
- package/lib/test/gc/gcTelemetry.spec.js.map +1 -0
- package/lib/test/gc/gcUnitTestHelpers.js +29 -0
- package/lib/test/gc/gcUnitTestHelpers.js.map +1 -0
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +192 -0
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -0
- package/lib/test/getPendingBlobs.spec.js +193 -0
- package/lib/test/getPendingBlobs.spec.js.map +1 -0
- package/lib/test/hardwareStats.spec.js +93 -0
- package/lib/test/hardwareStats.spec.js.map +1 -0
- package/lib/test/index.js +6 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +225 -0
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -0
- package/lib/test/opLifecycle/batchManager.spec.js +189 -0
- package/lib/test/opLifecycle/batchManager.spec.js.map +1 -0
- package/lib/test/opLifecycle/opCompressor.spec.js +74 -0
- package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -0
- package/lib/test/opLifecycle/opDecompressor.spec.js +218 -0
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -0
- package/lib/test/opLifecycle/opSplitter.spec.js +272 -0
- package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -0
- package/lib/test/opLifecycle/outbox.spec.js +675 -0
- package/lib/test/opLifecycle/outbox.spec.js.map +1 -0
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +196 -0
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -0
- package/lib/test/pendingStateManager.spec.js +329 -0
- package/lib/test/pendingStateManager.spec.js.map +1 -0
- package/lib/test/scheduleManager.spec.js +270 -0
- package/lib/test/scheduleManager.spec.js.map +1 -0
- package/lib/test/summarizerNode.spec.js +326 -0
- package/lib/test/summarizerNode.spec.js.map +1 -0
- package/lib/test/summarizerNodeWithGc.spec.js +318 -0
- package/lib/test/summarizerNodeWithGc.spec.js.map +1 -0
- package/lib/test/summary/orderedClientElection.spec.js +535 -0
- package/lib/test/summary/orderedClientElection.spec.js.map +1 -0
- package/lib/test/summary/runningSummarizer.spec.js +1349 -0
- package/lib/test/summary/runningSummarizer.spec.js.map +1 -0
- package/lib/test/summary/summarizer.spec.js +29 -0
- package/lib/test/summary/summarizer.spec.js.map +1 -0
- package/lib/test/summary/summarizerClientElection.spec.js +436 -0
- package/lib/test/summary/summarizerClientElection.spec.js.map +1 -0
- package/lib/test/summary/summarizerHeuristics.spec.js +289 -0
- package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -0
- package/lib/test/summary/summaryCollection.spec.js +200 -0
- package/lib/test/summary/summaryCollection.spec.js.map +1 -0
- package/lib/test/summary/summaryManager.spec.js +430 -0
- package/lib/test/summary/summaryManager.spec.js.map +1 -0
- package/lib/test/summary/testQuorumClients.js +34 -0
- package/lib/test/summary/testQuorumClients.js.map +1 -0
- package/lib/test/throttler.spec.js +175 -0
- package/lib/test/throttler.spec.js.map +1 -0
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +180 -0
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -0
- package/lib/{throttler.d.mts → throttler.d.ts} +1 -1
- package/lib/throttler.d.ts.map +1 -0
- package/lib/{throttler.mjs → throttler.js} +1 -1
- package/lib/throttler.js.map +1 -0
- package/package.json +106 -87
- package/src/batchTracker.ts +1 -1
- package/src/blobManager.ts +1 -15
- package/src/{dataStores.ts → channelCollection.ts} +622 -170
- package/src/connectionTelemetry.ts +42 -3
- package/src/containerHandleContext.ts +1 -1
- package/src/containerRuntime.ts +683 -483
- package/src/dataStore.ts +16 -15
- package/src/dataStoreContext.ts +378 -216
- package/src/dataStoreContexts.ts +2 -1
- package/src/deltaManagerSummarizerProxy.ts +132 -7
- package/src/gc/garbageCollection.ts +167 -71
- package/src/gc/gcConfigs.ts +17 -7
- package/src/gc/gcDefinitions.ts +42 -16
- package/src/gc/gcHelpers.ts +2 -2
- package/src/gc/gcReferenceGraphAlgorithm.ts +1 -1
- package/src/gc/gcSummaryStateTracker.ts +19 -7
- package/src/gc/gcTelemetry.ts +10 -9
- package/src/gc/gcUnreferencedStateTracker.ts +12 -1
- package/src/gc/index.ts +11 -9
- package/src/index.ts +29 -26
- package/src/messageTypes.ts +4 -4
- package/src/opLifecycle/README.md +2 -4
- package/src/opLifecycle/batchManager.ts +2 -2
- package/src/opLifecycle/definitions.ts +2 -2
- package/src/opLifecycle/index.ts +8 -8
- package/src/opLifecycle/opCompressor.ts +3 -3
- package/src/opLifecycle/opDecompressor.ts +3 -3
- package/src/opLifecycle/opGroupingManager.ts +3 -12
- package/src/opLifecycle/opSplitter.ts +3 -3
- package/src/opLifecycle/outbox.ts +29 -9
- package/src/opLifecycle/remoteMessageProcessor.ts +4 -4
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +19 -13
- package/src/scheduleManager.ts +4 -4
- package/src/summary/index.ts +13 -12
- package/src/summary/orderedClientElection.ts +1 -1
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +141 -93
- package/src/summary/summarizer.ts +7 -7
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +3 -3
- package/src/summary/summarizerNode/index.ts +6 -3
- package/src/summary/summarizerNode/summarizerNode.ts +54 -69
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +16 -34
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -17
- package/src/summary/summarizerTypes.ts +12 -24
- package/src/summary/summaryFormat.ts +16 -2
- package/src/summary/summaryGenerator.ts +16 -4
- package/src/summary/summaryManager.ts +6 -7
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -5
- package/dist/dataStores.d.ts +0 -149
- package/dist/dataStores.d.ts.map +0 -1
- package/dist/dataStores.js.map +0 -1
- package/dist/deltaManagerProxyBase.d.ts.map +0 -1
- package/dist/deltaManagerProxyBase.js +0 -77
- package/dist/deltaManagerProxyBase.js.map +0 -1
- package/lib/batchTracker.d.mts.map +0 -1
- package/lib/batchTracker.mjs.map +0 -1
- package/lib/blobManager.d.mts.map +0 -1
- package/lib/blobManager.mjs.map +0 -1
- package/lib/connectionTelemetry.d.mts.map +0 -1
- package/lib/connectionTelemetry.mjs.map +0 -1
- package/lib/containerHandleContext.d.mts.map +0 -1
- package/lib/containerHandleContext.mjs.map +0 -1
- package/lib/containerRuntime.d.mts.map +0 -1
- package/lib/containerRuntime.mjs.map +0 -1
- package/lib/dataStore.d.mts.map +0 -1
- package/lib/dataStore.mjs.map +0 -1
- package/lib/dataStoreContext.d.mts.map +0 -1
- package/lib/dataStoreContext.mjs.map +0 -1
- package/lib/dataStoreContexts.d.mts.map +0 -1
- package/lib/dataStoreContexts.mjs.map +0 -1
- package/lib/dataStoreRegistry.d.mts.map +0 -1
- package/lib/dataStoreRegistry.mjs.map +0 -1
- package/lib/dataStores.d.mts +0 -149
- package/lib/dataStores.d.mts.map +0 -1
- package/lib/dataStores.mjs.map +0 -1
- package/lib/deltaManagerProxyBase.d.mts +0 -35
- package/lib/deltaManagerProxyBase.d.mts.map +0 -1
- package/lib/deltaManagerProxyBase.mjs +0 -73
- package/lib/deltaManagerProxyBase.mjs.map +0 -1
- package/lib/deltaManagerSummarizerProxy.d.mts +0 -19
- package/lib/deltaManagerSummarizerProxy.d.mts.map +0 -1
- package/lib/deltaManagerSummarizerProxy.mjs +0 -38
- package/lib/deltaManagerSummarizerProxy.mjs.map +0 -1
- package/lib/deltaScheduler.d.mts.map +0 -1
- package/lib/deltaScheduler.mjs.map +0 -1
- package/lib/error.d.mts.map +0 -1
- package/lib/error.mjs.map +0 -1
- package/lib/gc/garbageCollection.d.mts.map +0 -1
- package/lib/gc/garbageCollection.mjs.map +0 -1
- package/lib/gc/gcConfigs.d.mts.map +0 -1
- package/lib/gc/gcConfigs.mjs.map +0 -1
- package/lib/gc/gcDefinitions.d.mts.map +0 -1
- package/lib/gc/gcDefinitions.mjs.map +0 -1
- package/lib/gc/gcHelpers.mjs.map +0 -1
- package/lib/gc/gcReferenceGraphAlgorithm.d.mts.map +0 -1
- package/lib/gc/gcReferenceGraphAlgorithm.mjs.map +0 -1
- package/lib/gc/gcSummaryDefinitions.d.mts.map +0 -1
- package/lib/gc/gcSummaryDefinitions.mjs.map +0 -1
- package/lib/gc/gcSummaryStateTracker.d.mts.map +0 -1
- package/lib/gc/gcSummaryStateTracker.mjs.map +0 -1
- package/lib/gc/gcTelemetry.d.mts.map +0 -1
- package/lib/gc/gcTelemetry.mjs.map +0 -1
- package/lib/gc/gcUnreferencedStateTracker.d.mts.map +0 -1
- package/lib/gc/gcUnreferencedStateTracker.mjs.map +0 -1
- package/lib/gc/index.d.mts +0 -13
- package/lib/gc/index.d.mts.map +0 -1
- package/lib/gc/index.mjs.map +0 -1
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs +0 -24
- package/lib/index.mjs.map +0 -1
- package/lib/messageTypes.d.mts.map +0 -1
- package/lib/messageTypes.mjs.map +0 -1
- package/lib/metadata.d.mts.map +0 -1
- package/lib/metadata.mjs.map +0 -1
- package/lib/opLifecycle/batchManager.d.mts.map +0 -1
- package/lib/opLifecycle/batchManager.mjs.map +0 -1
- package/lib/opLifecycle/definitions.d.mts.map +0 -1
- package/lib/opLifecycle/definitions.mjs.map +0 -1
- package/lib/opLifecycle/index.d.mts +0 -13
- package/lib/opLifecycle/index.d.mts.map +0 -1
- package/lib/opLifecycle/index.mjs +0 -12
- package/lib/opLifecycle/index.mjs.map +0 -1
- package/lib/opLifecycle/opCompressor.d.mts.map +0 -1
- package/lib/opLifecycle/opCompressor.mjs.map +0 -1
- package/lib/opLifecycle/opDecompressor.d.mts.map +0 -1
- package/lib/opLifecycle/opDecompressor.mjs.map +0 -1
- package/lib/opLifecycle/opGroupingManager.d.mts.map +0 -1
- package/lib/opLifecycle/opGroupingManager.mjs.map +0 -1
- package/lib/opLifecycle/opSplitter.d.mts.map +0 -1
- package/lib/opLifecycle/opSplitter.mjs.map +0 -1
- package/lib/opLifecycle/outbox.d.mts.map +0 -1
- package/lib/opLifecycle/outbox.mjs.map +0 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.mts.map +0 -1
- package/lib/opLifecycle/remoteMessageProcessor.mjs.map +0 -1
- package/lib/opProperties.d.mts.map +0 -1
- package/lib/opProperties.mjs.map +0 -1
- package/lib/packageVersion.d.mts.map +0 -1
- package/lib/packageVersion.mjs.map +0 -1
- package/lib/pendingStateManager.d.mts.map +0 -1
- package/lib/pendingStateManager.mjs.map +0 -1
- package/lib/scheduleManager.d.mts.map +0 -1
- package/lib/scheduleManager.mjs.map +0 -1
- package/lib/storageServiceWithAttachBlobs.d.mts.map +0 -1
- package/lib/storageServiceWithAttachBlobs.mjs.map +0 -1
- package/lib/summary/index.d.mts.map +0 -1
- package/lib/summary/index.mjs.map +0 -1
- package/lib/summary/orderedClientElection.d.mts.map +0 -1
- package/lib/summary/orderedClientElection.mjs.map +0 -1
- package/lib/summary/runWhileConnectedCoordinator.d.mts.map +0 -1
- package/lib/summary/runWhileConnectedCoordinator.mjs.map +0 -1
- package/lib/summary/runningSummarizer.d.mts.map +0 -1
- package/lib/summary/runningSummarizer.mjs.map +0 -1
- package/lib/summary/summarizer.d.mts.map +0 -1
- package/lib/summary/summarizer.mjs.map +0 -1
- package/lib/summary/summarizerClientElection.d.mts.map +0 -1
- package/lib/summary/summarizerClientElection.mjs.map +0 -1
- package/lib/summary/summarizerHeuristics.d.mts.map +0 -1
- package/lib/summary/summarizerHeuristics.mjs.map +0 -1
- package/lib/summary/summarizerNode/index.d.mts.map +0 -1
- package/lib/summary/summarizerNode/index.mjs +0 -7
- package/lib/summary/summarizerNode/index.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNode.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNode.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs.map +0 -1
- package/lib/summary/summarizerTypes.d.mts.map +0 -1
- package/lib/summary/summarizerTypes.mjs.map +0 -1
- package/lib/summary/summaryCollection.d.mts.map +0 -1
- package/lib/summary/summaryCollection.mjs.map +0 -1
- package/lib/summary/summaryFormat.d.mts.map +0 -1
- package/lib/summary/summaryFormat.mjs.map +0 -1
- package/lib/summary/summaryGenerator.d.mts.map +0 -1
- package/lib/summary/summaryGenerator.mjs.map +0 -1
- package/lib/summary/summaryManager.d.mts.map +0 -1
- package/lib/summary/summaryManager.mjs.map +0 -1
- package/lib/throttler.d.mts.map +0 -1
- package/lib/throttler.mjs.map +0 -1
- package/src/deltaManagerProxyBase.ts +0 -111
package/src/dataStoreContexts.ts
CHANGED
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
import { assert, Deferred, Lazy } from "@fluidframework/core-utils";
|
|
7
7
|
import { IDisposable, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
8
8
|
import { createChildLogger, ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
9
|
-
import { FluidDataStoreContext, LocalFluidDataStoreContext } from "./dataStoreContext";
|
|
9
|
+
import { FluidDataStoreContext, LocalFluidDataStoreContext } from "./dataStoreContext.js";
|
|
10
10
|
|
|
11
|
+
/** @internal */
|
|
11
12
|
export class DataStoreContexts implements Iterable<[string, FluidDataStoreContext]>, IDisposable {
|
|
12
13
|
private readonly notBoundContexts = new Set<string>();
|
|
13
14
|
|
|
@@ -3,11 +3,26 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
|
+
import type {
|
|
8
|
+
IConnectionDetails,
|
|
9
|
+
IDeltaManager,
|
|
10
|
+
IDeltaManagerEvents,
|
|
11
|
+
IDeltaQueue,
|
|
12
|
+
IDeltaSender,
|
|
13
|
+
ReadOnlyInfo,
|
|
14
|
+
} from "@fluidframework/container-definitions";
|
|
15
|
+
import type { IErrorBase } from "@fluidframework/core-interfaces";
|
|
16
|
+
import type { IAnyDriverError } from "@fluidframework/driver-definitions";
|
|
17
|
+
import {
|
|
18
|
+
IClientConfiguration,
|
|
19
|
+
IClientDetails,
|
|
20
|
+
IDocumentMessage,
|
|
21
|
+
ISequencedDocumentMessage,
|
|
22
|
+
ISignalMessage,
|
|
23
|
+
} from "@fluidframework/protocol-definitions";
|
|
8
24
|
|
|
9
|
-
import {
|
|
10
|
-
import { summarizerClientType } from "./summary";
|
|
25
|
+
import { summarizerClientType } from "./summary/index.js";
|
|
11
26
|
|
|
12
27
|
/**
|
|
13
28
|
* Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:
|
|
@@ -15,9 +30,65 @@ import { summarizerClientType } from "./summary";
|
|
|
15
30
|
* - Summarizer client should not be active to layers below the container runtime to restrict local changes.
|
|
16
31
|
*/
|
|
17
32
|
export class DeltaManagerSummarizerProxy
|
|
18
|
-
extends
|
|
33
|
+
extends TypedEventEmitter<IDeltaManagerEvents>
|
|
19
34
|
implements IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>
|
|
20
35
|
{
|
|
36
|
+
public get IDeltaSender(): IDeltaSender {
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public get inbound(): IDeltaQueue<ISequencedDocumentMessage> {
|
|
41
|
+
return this.deltaManager.inbound;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public get outbound(): IDeltaQueue<IDocumentMessage[]> {
|
|
45
|
+
return this.deltaManager.outbound;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public get inboundSignal(): IDeltaQueue<ISignalMessage> {
|
|
49
|
+
return this.deltaManager.inboundSignal;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public get minimumSequenceNumber(): number {
|
|
53
|
+
return this.deltaManager.minimumSequenceNumber;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public get lastSequenceNumber(): number {
|
|
57
|
+
return this.deltaManager.lastSequenceNumber;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public get lastMessage() {
|
|
61
|
+
return this.deltaManager.lastMessage;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public get lastKnownSeqNumber() {
|
|
65
|
+
return this.deltaManager.lastKnownSeqNumber;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public get initialSequenceNumber(): number {
|
|
69
|
+
return this.deltaManager.initialSequenceNumber;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public get hasCheckpointSequenceNumber() {
|
|
73
|
+
return this.deltaManager.hasCheckpointSequenceNumber;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public get clientDetails(): IClientDetails {
|
|
77
|
+
return this.deltaManager.clientDetails;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
public get version(): string {
|
|
81
|
+
return this.deltaManager.version;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public get maxMessageSize(): number {
|
|
85
|
+
return this.deltaManager.maxMessageSize;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public get serviceConfiguration(): IClientConfiguration | undefined {
|
|
89
|
+
return this.deltaManager.serviceConfiguration;
|
|
90
|
+
}
|
|
91
|
+
|
|
21
92
|
public get active(): boolean {
|
|
22
93
|
// Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer
|
|
23
94
|
// except for the SummarizeOp which is generated by the runtime.
|
|
@@ -40,10 +111,64 @@ export class DeltaManagerSummarizerProxy
|
|
|
40
111
|
|
|
41
112
|
private readonly isSummarizerClient: boolean;
|
|
42
113
|
|
|
43
|
-
constructor(
|
|
44
|
-
|
|
114
|
+
constructor(
|
|
115
|
+
private readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,
|
|
116
|
+
) {
|
|
117
|
+
super();
|
|
118
|
+
|
|
45
119
|
// We are expecting this class to have many listeners, so we suppress noisy "MaxListenersExceededWarning" logging.
|
|
46
120
|
super.setMaxListeners(0);
|
|
47
121
|
this.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;
|
|
122
|
+
|
|
123
|
+
this.deltaManager.on("prepareSend", this.onPrepareSend);
|
|
124
|
+
this.deltaManager.on("submitOp", this.onSubmitOp);
|
|
125
|
+
this.deltaManager.on("op", this.onOp);
|
|
126
|
+
this.deltaManager.on("pong", this.onPong);
|
|
127
|
+
this.deltaManager.on("connect", this.onConnect);
|
|
128
|
+
this.deltaManager.on("disconnect", this.onDisconnect);
|
|
129
|
+
this.deltaManager.on("readonly", this.onReadonly);
|
|
48
130
|
}
|
|
131
|
+
|
|
132
|
+
public dispose(): void {
|
|
133
|
+
this.deltaManager.off("prepareSend", this.onPrepareSend);
|
|
134
|
+
this.deltaManager.off("submitOp", this.onSubmitOp);
|
|
135
|
+
this.deltaManager.off("op", this.onOp);
|
|
136
|
+
this.deltaManager.off("pong", this.onPong);
|
|
137
|
+
this.deltaManager.off("connect", this.onConnect);
|
|
138
|
+
this.deltaManager.off("disconnect", this.onDisconnect);
|
|
139
|
+
this.deltaManager.off("readonly", this.onReadonly);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public submitSignal(content: any, targetClientId?: string): void {
|
|
143
|
+
return this.deltaManager.submitSignal(content, targetClientId);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public flush(): void {
|
|
147
|
+
return this.deltaManager.flush();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private readonly onPrepareSend = (messageBuffer: any[]): void => {
|
|
151
|
+
this.emit("prepareSend", messageBuffer);
|
|
152
|
+
};
|
|
153
|
+
private readonly onSubmitOp = (message: IDocumentMessage): void => {
|
|
154
|
+
this.emit("submitOp", message);
|
|
155
|
+
};
|
|
156
|
+
private readonly onOp = (message: ISequencedDocumentMessage, processingTime: number): void => {
|
|
157
|
+
this.emit("op", message, processingTime);
|
|
158
|
+
};
|
|
159
|
+
private readonly onPong = (latency: number): void => {
|
|
160
|
+
this.emit("pong", latency);
|
|
161
|
+
};
|
|
162
|
+
private readonly onConnect = (details: IConnectionDetails, opsBehind?: number): void => {
|
|
163
|
+
this.emit("connect", details, opsBehind);
|
|
164
|
+
};
|
|
165
|
+
private readonly onDisconnect = (reason: string, error?: IAnyDriverError): void => {
|
|
166
|
+
this.emit("disconnect", reason, error);
|
|
167
|
+
};
|
|
168
|
+
private readonly onReadonly = (
|
|
169
|
+
readonly: boolean,
|
|
170
|
+
readonlyConnectionReason?: { reason: string; error?: IErrorBase },
|
|
171
|
+
): void => {
|
|
172
|
+
this.emit("readonly", readonly, readonlyConnectionReason);
|
|
173
|
+
};
|
|
49
174
|
}
|
|
@@ -22,16 +22,16 @@ import {
|
|
|
22
22
|
PerformanceEvent,
|
|
23
23
|
tagCodeArtifacts,
|
|
24
24
|
} from "@fluidframework/telemetry-utils";
|
|
25
|
-
import { BlobManager } from "../blobManager";
|
|
25
|
+
import { BlobManager } from "../blobManager.js";
|
|
26
26
|
import {
|
|
27
27
|
InactiveResponseHeaderKey,
|
|
28
28
|
RuntimeHeaderData,
|
|
29
29
|
TombstoneResponseHeaderKey,
|
|
30
|
-
} from "../containerRuntime";
|
|
31
|
-
import { ClientSessionExpiredError } from "../error";
|
|
32
|
-
import { ContainerMessageType, ContainerRuntimeGCMessage } from "../messageTypes";
|
|
33
|
-
import { IRefreshSummaryResult } from "../summary";
|
|
34
|
-
import { generateGCConfigs } from "./gcConfigs";
|
|
30
|
+
} from "../containerRuntime.js";
|
|
31
|
+
import { ClientSessionExpiredError } from "../error.js";
|
|
32
|
+
import { ContainerMessageType, ContainerRuntimeGCMessage } from "../messageTypes.js";
|
|
33
|
+
import { IRefreshSummaryResult } from "../summary/index.js";
|
|
34
|
+
import { generateGCConfigs } from "./gcConfigs.js";
|
|
35
35
|
import {
|
|
36
36
|
GCNodeType,
|
|
37
37
|
IGarbageCollector,
|
|
@@ -46,18 +46,22 @@ import {
|
|
|
46
46
|
ISweepPhaseStats,
|
|
47
47
|
GarbageCollectionMessage,
|
|
48
48
|
GarbageCollectionMessageType,
|
|
49
|
-
|
|
49
|
+
disableAutoRecoveryKey,
|
|
50
|
+
} from "./gcDefinitions.js";
|
|
50
51
|
import {
|
|
51
52
|
cloneGCData,
|
|
52
53
|
compatBehaviorAllowsGCMessageType,
|
|
53
54
|
concatGarbageCollectionData,
|
|
54
55
|
getGCDataFromSnapshot,
|
|
55
|
-
} from "./gcHelpers";
|
|
56
|
-
import { runGarbageCollection } from "./gcReferenceGraphAlgorithm";
|
|
57
|
-
import { IGarbageCollectionSnapshotData, IGarbageCollectionState } from "./gcSummaryDefinitions";
|
|
58
|
-
import { GCSummaryStateTracker } from "./gcSummaryStateTracker";
|
|
59
|
-
import {
|
|
60
|
-
|
|
56
|
+
} from "./gcHelpers.js";
|
|
57
|
+
import { runGarbageCollection } from "./gcReferenceGraphAlgorithm.js";
|
|
58
|
+
import { IGarbageCollectionSnapshotData, IGarbageCollectionState } from "./gcSummaryDefinitions.js";
|
|
59
|
+
import { GCSummaryStateTracker } from "./gcSummaryStateTracker.js";
|
|
60
|
+
import {
|
|
61
|
+
UnreferencedStateTracker,
|
|
62
|
+
UnreferencedStateTrackerMap,
|
|
63
|
+
} from "./gcUnreferencedStateTracker.js";
|
|
64
|
+
import { GCTelemetryTracker } from "./gcTelemetry.js";
|
|
61
65
|
|
|
62
66
|
/**
|
|
63
67
|
* The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains
|
|
@@ -94,6 +98,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
94
98
|
return this.configs.shouldRunGC;
|
|
95
99
|
}
|
|
96
100
|
|
|
101
|
+
public readonly sessionExpiryTimerStarted: number | undefined;
|
|
97
102
|
// Keeps track of the GC state from the last run.
|
|
98
103
|
private gcDataFromLastRun: IGarbageCollectionData | undefined;
|
|
99
104
|
// Keeps a list of references (edges in the GC graph) between GC runs. Each entry has a node id and a list of
|
|
@@ -110,8 +115,15 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
110
115
|
private readonly initializeGCStateFromBaseSnapshotP: Promise<void>;
|
|
111
116
|
// The GC details generated from the base snapshot.
|
|
112
117
|
private readonly baseGCDetailsP: Promise<IGarbageCollectionDetailsBase>;
|
|
113
|
-
|
|
114
|
-
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Map of node ids to their unreferenced state tracker
|
|
121
|
+
* NOTE: The set of keys in this map is considered as the set of unreferenced nodes
|
|
122
|
+
* as of the last GC run. So in between runs, nothing should be added or removed.
|
|
123
|
+
*/
|
|
124
|
+
private readonly unreferencedNodesState: UnreferencedStateTrackerMap =
|
|
125
|
+
new UnreferencedStateTrackerMap();
|
|
126
|
+
|
|
115
127
|
// The Timer responsible for closing the container when the session has expired
|
|
116
128
|
private sessionExpiryTimer: Timer | undefined;
|
|
117
129
|
|
|
@@ -164,6 +176,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
164
176
|
|
|
165
177
|
const baseSnapshot = createParams.baseSnapshot;
|
|
166
178
|
const readAndParseBlob = createParams.readAndParseBlob;
|
|
179
|
+
const pendingSessionExpiryTimerStarted = createParams.sessionExpiryTimerStarted;
|
|
167
180
|
|
|
168
181
|
this.mc = createChildMonitoringContext({
|
|
169
182
|
logger: createParams.baseLogger,
|
|
@@ -181,14 +194,26 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
181
194
|
const overrideSessionExpiryTimeoutMs = this.mc.config.getNumber(
|
|
182
195
|
"Fluid.GarbageCollection.TestOverride.SessionExpiryMs",
|
|
183
196
|
);
|
|
184
|
-
|
|
197
|
+
let timeoutMs = this.configs.sessionExpiryTimeoutMs;
|
|
185
198
|
|
|
199
|
+
if (pendingSessionExpiryTimerStarted) {
|
|
200
|
+
// NOTE: This assumes the client clock hasn't been tampered with since the original session
|
|
201
|
+
const timeLapsedSincePendingTimer = Date.now() - pendingSessionExpiryTimerStarted;
|
|
202
|
+
timeoutMs -= timeLapsedSincePendingTimer;
|
|
203
|
+
}
|
|
204
|
+
timeoutMs = overrideSessionExpiryTimeoutMs ?? timeoutMs;
|
|
205
|
+
if (timeoutMs <= 0) {
|
|
206
|
+
this.runtime.closeFn(
|
|
207
|
+
new ClientSessionExpiredError(`Client session expired.`, timeoutMs),
|
|
208
|
+
);
|
|
209
|
+
}
|
|
186
210
|
this.sessionExpiryTimer = new Timer(timeoutMs, () => {
|
|
187
211
|
this.runtime.closeFn(
|
|
188
212
|
new ClientSessionExpiredError(`Client session expired.`, timeoutMs),
|
|
189
213
|
);
|
|
190
214
|
});
|
|
191
215
|
this.sessionExpiryTimer.start();
|
|
216
|
+
this.sessionExpiryTimerStarted = Date.now();
|
|
192
217
|
}
|
|
193
218
|
|
|
194
219
|
this.summaryStateTracker = new GCSummaryStateTracker(
|
|
@@ -443,7 +468,9 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
443
468
|
): Promise<IGCStats | undefined> {
|
|
444
469
|
const fullGC =
|
|
445
470
|
options.fullGC ??
|
|
446
|
-
(this.configs.runFullGC === true ||
|
|
471
|
+
(this.configs.runFullGC === true ||
|
|
472
|
+
this.summaryStateTracker.autoRecovery.fullGCRequested() ||
|
|
473
|
+
this.summaryStateTracker.doesSummaryStateNeedReset);
|
|
447
474
|
|
|
448
475
|
// Add the options that are used to run GC to the telemetry context.
|
|
449
476
|
telemetryContext?.setMultiple("fluid_GC", "Options", {
|
|
@@ -555,8 +582,9 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
555
582
|
);
|
|
556
583
|
|
|
557
584
|
// 4. Run the Sweep phase.
|
|
558
|
-
// It will
|
|
559
|
-
//
|
|
585
|
+
// It will initiate the deletion (sending the GC Sweep op) of any sweep-ready nodes that are
|
|
586
|
+
// allowed to be deleted per config, and tombstone the rest along with the tombstone-ready nodes.
|
|
587
|
+
// Note that no nodes will be deleted until the GC Sweep op is processed.
|
|
560
588
|
this.runSweepPhase(gcResult, tombstoneReadyNodeIds, sweepReadyNodeIds);
|
|
561
589
|
|
|
562
590
|
this.gcDataFromLastRun = cloneGCData(gcData);
|
|
@@ -592,16 +620,10 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
592
620
|
): { tombstoneReadyNodeIds: Set<string>; sweepReadyNodeIds: Set<string> } {
|
|
593
621
|
// 1. Marks all referenced nodes by clearing their unreferenced tracker, if any.
|
|
594
622
|
for (const nodeId of allReferencedNodeIds) {
|
|
595
|
-
|
|
596
|
-
if (nodeStateTracker !== undefined) {
|
|
597
|
-
// Stop tracking so as to clear out any running timers.
|
|
598
|
-
nodeStateTracker.stopTracking();
|
|
599
|
-
// Delete the node as we don't need to track it any more.
|
|
600
|
-
this.unreferencedNodesState.delete(nodeId);
|
|
601
|
-
}
|
|
623
|
+
this.unreferencedNodesState.delete(nodeId);
|
|
602
624
|
}
|
|
603
625
|
|
|
604
|
-
// 2. Mark unreferenced nodes in this run by starting unreferenced tracking for them.
|
|
626
|
+
// 2. Mark unreferenced nodes in this run by starting or updating unreferenced tracking for them.
|
|
605
627
|
const tombstoneReadyNodeIds: Set<string> = new Set();
|
|
606
628
|
const sweepReadyNodeIds: Set<string> = new Set();
|
|
607
629
|
for (const nodeId of gcResult.deletedNodeIds) {
|
|
@@ -662,24 +684,39 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
662
684
|
*/
|
|
663
685
|
|
|
664
686
|
if (this.configs.testMode) {
|
|
665
|
-
// If we are running in GC test mode, unreferenced nodes (gcResult.deletedNodeIds) are deleted.
|
|
666
|
-
this.runtime.
|
|
687
|
+
// If we are running in GC test mode, unreferenced nodes (gcResult.deletedNodeIds) are deleted immediately.
|
|
688
|
+
this.runtime.deleteSweepReadyNodes(gcResult.deletedNodeIds);
|
|
667
689
|
return;
|
|
668
690
|
}
|
|
669
691
|
|
|
670
|
-
//
|
|
692
|
+
// We'll build up the lists of nodes to be either Tombstoned or Deleted
|
|
693
|
+
// based on the configuration and the nodes' current state.
|
|
694
|
+
// We must Tombstone any sweep-ready node that Sweep won't run for.
|
|
671
695
|
// This is important because a container may never load during a node's Sweep Grace Period,
|
|
672
696
|
// so that node would directly become sweep-ready skipping over tombstone-ready state,
|
|
673
697
|
// but should be Tombstoned since Sweep is disabled.
|
|
674
|
-
const { nodesToTombstone, nodesToDelete } =
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
:
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
698
|
+
const { nodesToTombstone, nodesToDelete } = {
|
|
699
|
+
nodesToTombstone: [...tombstoneReadyNodes],
|
|
700
|
+
nodesToDelete: [] as string[],
|
|
701
|
+
};
|
|
702
|
+
switch (this.configs.shouldRunSweep) {
|
|
703
|
+
case "YES":
|
|
704
|
+
nodesToDelete.push(...sweepReadyNodes);
|
|
705
|
+
break;
|
|
706
|
+
case "ONLY_BLOBS":
|
|
707
|
+
sweepReadyNodes.forEach((nodeId) => {
|
|
708
|
+
const nodeType = this.runtime.getNodeType(nodeId);
|
|
709
|
+
if (nodeType === GCNodeType.Blob) {
|
|
710
|
+
nodesToDelete.push(nodeId);
|
|
711
|
+
} else {
|
|
712
|
+
nodesToTombstone.push(nodeId);
|
|
713
|
+
}
|
|
714
|
+
});
|
|
715
|
+
break;
|
|
716
|
+
default: // case "NO":
|
|
717
|
+
nodesToTombstone.push(...sweepReadyNodes);
|
|
718
|
+
break;
|
|
719
|
+
}
|
|
683
720
|
|
|
684
721
|
if (this.configs.tombstoneMode) {
|
|
685
722
|
this.tombstones = nodesToTombstone;
|
|
@@ -687,7 +724,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
687
724
|
this.runtime.updateTombstonedRoutes(this.tombstones);
|
|
688
725
|
}
|
|
689
726
|
|
|
690
|
-
if (
|
|
727
|
+
if (nodesToDelete.length > 0) {
|
|
691
728
|
// Do not send DDS node ids in the GC op. This is an optimization to reduce its size. Since GC applies to
|
|
692
729
|
// to data store only, all its DDSes are deleted along with it. The DDS ids will be retrieved from the
|
|
693
730
|
// local state when processing the op.
|
|
@@ -821,8 +858,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
821
858
|
}
|
|
822
859
|
|
|
823
860
|
return this.summaryStateTracker.summarize(
|
|
824
|
-
fullTree,
|
|
825
|
-
trackState,
|
|
861
|
+
trackState && !fullTree,
|
|
826
862
|
gcState,
|
|
827
863
|
this.deletedNodes,
|
|
828
864
|
this.tombstones,
|
|
@@ -856,21 +892,37 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
856
892
|
* @param local - Whether it was send by this client.
|
|
857
893
|
*/
|
|
858
894
|
public processMessage(message: ContainerRuntimeGCMessage, local: boolean) {
|
|
859
|
-
|
|
860
|
-
|
|
895
|
+
const gcMessageType = message.contents.type;
|
|
896
|
+
switch (gcMessageType) {
|
|
897
|
+
case GarbageCollectionMessageType.Sweep: {
|
|
861
898
|
// Delete the nodes whose ids are present in the contents.
|
|
862
899
|
this.deleteSweepReadyNodes(message.contents.deletedNodeIds);
|
|
863
900
|
break;
|
|
864
901
|
}
|
|
902
|
+
case GarbageCollectionMessageType.TombstoneLoaded: {
|
|
903
|
+
if (this.mc.config.getBoolean(disableAutoRecoveryKey) === true) {
|
|
904
|
+
break;
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
// Mark the node as referenced to ensure it isn't Swept
|
|
908
|
+
const tombstonedNodePath = message.contents.nodePath;
|
|
909
|
+
this.addedOutboundReference("/", tombstonedNodePath, true /* autorecovery */);
|
|
910
|
+
|
|
911
|
+
// In case the cause of the TombstoneLoaded event is incorrect GC Data (i.e. the object is actually reachable),
|
|
912
|
+
// do fullGC on the next run to get a chance to repair (in the likely case the bug is not deterministic)
|
|
913
|
+
this.summaryStateTracker.autoRecovery.requestFullGCOnNextRun();
|
|
914
|
+
|
|
915
|
+
break;
|
|
916
|
+
}
|
|
865
917
|
default: {
|
|
866
918
|
if (
|
|
867
919
|
!compatBehaviorAllowsGCMessageType(
|
|
868
|
-
|
|
920
|
+
gcMessageType,
|
|
869
921
|
message.compatDetails?.behavior,
|
|
870
922
|
)
|
|
871
923
|
) {
|
|
872
924
|
const error = DataProcessingError.create(
|
|
873
|
-
`Garbage collection message of unknown type ${
|
|
925
|
+
`Garbage collection message of unknown type ${gcMessageType}`,
|
|
874
926
|
"processMessage",
|
|
875
927
|
);
|
|
876
928
|
throw error;
|
|
@@ -883,6 +935,10 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
883
935
|
/**
|
|
884
936
|
* Delete nodes that are sweep-ready. Call the runtime to delete these nodes and clear the unreferenced state
|
|
885
937
|
* tracking for nodes that are actually deleted by the runtime.
|
|
938
|
+
*
|
|
939
|
+
* Note that this doesn't check any configuration around whether Sweep is enabled.
|
|
940
|
+
* That happens before the op is submitted, and from that point, any client should execute the delete.
|
|
941
|
+
*
|
|
886
942
|
* @param sweepReadyNodeIds - The ids of nodes that are ready to be deleted.
|
|
887
943
|
*/
|
|
888
944
|
private deleteSweepReadyNodes(sweepReadyNodeIds: readonly string[]) {
|
|
@@ -911,13 +967,9 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
911
967
|
|
|
912
968
|
// Clear unreferenced state tracking for deleted nodes.
|
|
913
969
|
for (const nodeId of deletedNodeIds) {
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
nodeStateTracker.stopTracking();
|
|
918
|
-
// Delete the node as we don't need to track it any more.
|
|
919
|
-
this.unreferencedNodesState.delete(nodeId);
|
|
920
|
-
}
|
|
970
|
+
// Usually we avoid modifying the set of unreferencedNodesState keys in between GC runs,
|
|
971
|
+
// but this is ok since this node won't exist at all in the next GC run.
|
|
972
|
+
this.unreferencedNodesState.delete(nodeId);
|
|
921
973
|
this.deletedNodes.add(nodeId);
|
|
922
974
|
}
|
|
923
975
|
}
|
|
@@ -959,6 +1011,15 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
959
1011
|
headers: headerData,
|
|
960
1012
|
});
|
|
961
1013
|
|
|
1014
|
+
// Any time we log a Tombstone Loaded error (via Telemetry Tracker),
|
|
1015
|
+
// we want to also trigger autorecovery to avoid the object being deleted
|
|
1016
|
+
// Note: We don't need to trigger on "Changed" because any change will cause the object
|
|
1017
|
+
// to be loaded by the Summarizer, and auto-recovery will be triggered then.
|
|
1018
|
+
if (isTombstoned && reason === "Loaded") {
|
|
1019
|
+
// Note that when a DataStore and its DDS are all loaded, each will trigger AutoRecovery for itself.
|
|
1020
|
+
this.triggerAutoRecovery(nodePath);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
962
1023
|
const nodeType = this.runtime.getNodeType(nodePath);
|
|
963
1024
|
|
|
964
1025
|
// Unless this is a Loaded event for a Blob or DataStore, we're done after telemetry tracking
|
|
@@ -967,7 +1028,6 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
967
1028
|
}
|
|
968
1029
|
|
|
969
1030
|
const errorRequest: IRequest = request ?? { url: nodePath };
|
|
970
|
-
// If the object is tombstoned and tombstone enforcement is configured, throw an error.
|
|
971
1031
|
if (isTombstoned && this.throwOnTombstoneLoad && headerData?.allowTombstone !== true) {
|
|
972
1032
|
// The requested data store is removed by gc. Create a 404 gc response exception.
|
|
973
1033
|
throw responseToException(
|
|
@@ -995,14 +1055,42 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
995
1055
|
}
|
|
996
1056
|
}
|
|
997
1057
|
|
|
1058
|
+
/**
|
|
1059
|
+
* The given node should have its unreferenced state reset in the next GC,
|
|
1060
|
+
* even if the true GC graph shows it is unreferenced. This will
|
|
1061
|
+
* prevent it from being deleted by Sweep (after the Grace Period).
|
|
1062
|
+
*
|
|
1063
|
+
* Submit a GC op indicating that the Tombstone with the given path has been loaded.
|
|
1064
|
+
* Broadcasting this information in the op stream allows the Summarizer to reset unreferenced state
|
|
1065
|
+
* before runnint GC next.
|
|
1066
|
+
*/
|
|
1067
|
+
private triggerAutoRecovery(nodePath: string) {
|
|
1068
|
+
if (this.mc.config.getBoolean(disableAutoRecoveryKey) === true) {
|
|
1069
|
+
return;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
// Use compat behavior "Ignore" since this is an optimization to opportunistically protect
|
|
1073
|
+
// objects from deletion, so it's fine for older clients to ignore this op.
|
|
1074
|
+
const containerGCMessage: ContainerRuntimeGCMessage = {
|
|
1075
|
+
type: ContainerMessageType.GC,
|
|
1076
|
+
contents: {
|
|
1077
|
+
type: GarbageCollectionMessageType.TombstoneLoaded,
|
|
1078
|
+
nodePath,
|
|
1079
|
+
},
|
|
1080
|
+
compatDetails: { behavior: "Ignore" },
|
|
1081
|
+
};
|
|
1082
|
+
this.submitMessage(containerGCMessage);
|
|
1083
|
+
}
|
|
1084
|
+
|
|
998
1085
|
/**
|
|
999
1086
|
* Called when an outbound reference is added to a node. This is used to identify all nodes that have been
|
|
1000
1087
|
* referenced between summaries so that their unreferenced timestamp can be reset.
|
|
1001
1088
|
*
|
|
1002
1089
|
* @param fromNodePath - The node from which the reference is added.
|
|
1003
1090
|
* @param toNodePath - The node to which the reference is added.
|
|
1091
|
+
* @param autorecovery - This reference is added artificially, for autorecovery. Used for logging.
|
|
1004
1092
|
*/
|
|
1005
|
-
public addedOutboundReference(fromNodePath: string, toNodePath: string) {
|
|
1093
|
+
public addedOutboundReference(fromNodePath: string, toNodePath: string, autorecovery?: true) {
|
|
1006
1094
|
if (!this.configs.shouldRunGC) {
|
|
1007
1095
|
return;
|
|
1008
1096
|
}
|
|
@@ -1032,7 +1120,14 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1032
1120
|
isTombstoned: this.tombstones.includes(toNodePath),
|
|
1033
1121
|
lastSummaryTime: this.getLastSummaryTimestampMs(),
|
|
1034
1122
|
fromId: fromNodePath,
|
|
1123
|
+
autorecovery,
|
|
1035
1124
|
});
|
|
1125
|
+
|
|
1126
|
+
// This node is referenced - Clear its unreferenced state
|
|
1127
|
+
// But don't delete the node id from the map yet.
|
|
1128
|
+
// When generating GC stats, the set of nodes in here is used as the baseline for
|
|
1129
|
+
// what was unreferenced in the last GC run.
|
|
1130
|
+
this.unreferencedNodesState.get(toNodePath)?.stopTracking();
|
|
1036
1131
|
}
|
|
1037
1132
|
|
|
1038
1133
|
/**
|
|
@@ -1066,17 +1161,17 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1066
1161
|
updatedAttachmentBlobCount: 0,
|
|
1067
1162
|
};
|
|
1068
1163
|
|
|
1069
|
-
const updateNodeStats = (nodeId: string,
|
|
1164
|
+
const updateNodeStats = (nodeId: string, isReferenced: boolean) => {
|
|
1070
1165
|
markPhaseStats.nodeCount++;
|
|
1071
1166
|
// If there is no previous GC data, every node's state is generated and is considered as updated.
|
|
1072
1167
|
// Otherwise, find out if any node went from referenced to unreferenced or vice-versa.
|
|
1168
|
+
const wasNotReferenced = this.unreferencedNodesState.has(nodeId);
|
|
1073
1169
|
const stateUpdated =
|
|
1074
|
-
this.gcDataFromLastRun === undefined ||
|
|
1075
|
-
this.unreferencedNodesState.has(nodeId) === referenced;
|
|
1170
|
+
this.gcDataFromLastRun === undefined || wasNotReferenced === isReferenced;
|
|
1076
1171
|
if (stateUpdated) {
|
|
1077
1172
|
markPhaseStats.updatedNodeCount++;
|
|
1078
1173
|
}
|
|
1079
|
-
if (!
|
|
1174
|
+
if (!isReferenced) {
|
|
1080
1175
|
markPhaseStats.unrefNodeCount++;
|
|
1081
1176
|
}
|
|
1082
1177
|
|
|
@@ -1085,7 +1180,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1085
1180
|
if (stateUpdated) {
|
|
1086
1181
|
markPhaseStats.updatedDataStoreCount++;
|
|
1087
1182
|
}
|
|
1088
|
-
if (!
|
|
1183
|
+
if (!isReferenced) {
|
|
1089
1184
|
markPhaseStats.unrefDataStoreCount++;
|
|
1090
1185
|
}
|
|
1091
1186
|
}
|
|
@@ -1094,7 +1189,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1094
1189
|
if (stateUpdated) {
|
|
1095
1190
|
markPhaseStats.updatedAttachmentBlobCount++;
|
|
1096
1191
|
}
|
|
1097
|
-
if (!
|
|
1192
|
+
if (!isReferenced) {
|
|
1098
1193
|
markPhaseStats.unrefAttachmentBlobCount++;
|
|
1099
1194
|
}
|
|
1100
1195
|
}
|
|
@@ -1113,8 +1208,9 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1113
1208
|
|
|
1114
1209
|
/**
|
|
1115
1210
|
* Generates the stats of a garbage collection sweep phase run.
|
|
1116
|
-
* @param deletedNodes - The nodes that have been deleted
|
|
1117
|
-
* @param sweepReadyNodes - The nodes that are sweep-ready in this GC run.
|
|
1211
|
+
* @param deletedNodes - The nodes that have already been deleted even before this run.
|
|
1212
|
+
* @param sweepReadyNodes - The nodes that are sweep-ready in this GC run. These will be deleted but are not deleted yet,
|
|
1213
|
+
* due to either sweep not being enabled or the Sweep Op needing to roundtrip before the delete is executed.
|
|
1118
1214
|
* @param markPhaseStats - The stats of the mark phase run.
|
|
1119
1215
|
* @returns the stats of the sweep phase run.
|
|
1120
1216
|
*/
|
|
@@ -1160,19 +1256,18 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1160
1256
|
}
|
|
1161
1257
|
}
|
|
1162
1258
|
|
|
1163
|
-
//
|
|
1259
|
+
// The counts from the mark phase stats do not include nodes that were
|
|
1164
1260
|
// deleted in previous runs. So, add the deleted node counts to life time stats.
|
|
1165
1261
|
sweepPhaseStats.lifetimeNodeCount += sweepPhaseStats.deletedNodeCount;
|
|
1166
1262
|
sweepPhaseStats.lifetimeDataStoreCount += sweepPhaseStats.deletedDataStoreCount;
|
|
1167
1263
|
sweepPhaseStats.lifetimeAttachmentBlobCount += sweepPhaseStats.deletedAttachmentBlobCount;
|
|
1168
1264
|
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
// If sweep is not enabled,
|
|
1174
|
-
//
|
|
1175
|
-
// If sweep is enabled, this will happen in the run after the GC op round trips back.
|
|
1265
|
+
// These stats are used to estimate the impact of GC in terms of how much garbage is/will be cleaned up.
|
|
1266
|
+
// So we include the current sweep-ready node stats since these nodes will be deleted eventually.
|
|
1267
|
+
// - If sweep is enabled, this will happen in the run after the GC op round trips back
|
|
1268
|
+
// (they'll be in deletedNodes that time).
|
|
1269
|
+
// - If sweep is not enabled, we still want to include these nodes since they
|
|
1270
|
+
// _will be_ deleted once it is enabled.
|
|
1176
1271
|
for (const nodeId of sweepReadyNodes) {
|
|
1177
1272
|
sweepPhaseStats.deletedNodeCount++;
|
|
1178
1273
|
const nodeType = this.runtime.getNodeType(nodeId);
|
|
@@ -1182,6 +1277,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1182
1277
|
sweepPhaseStats.deletedAttachmentBlobCount++;
|
|
1183
1278
|
}
|
|
1184
1279
|
}
|
|
1280
|
+
|
|
1185
1281
|
return sweepPhaseStats;
|
|
1186
1282
|
}
|
|
1187
1283
|
}
|