@fluidframework/container-runtime 2.0.0-dev-rc.1.0.0.224419 → 2.0.0-dev-rc.1.0.0.228517
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/README.md +1 -7
- package/api-extractor-esm.json +4 -0
- package/api-report/container-runtime.api.md +3 -2
- package/dist/{batchTracker.cjs → batchTracker.js} +1 -1
- package/dist/batchTracker.js.map +1 -0
- package/dist/blobManager.d.ts +8 -3
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/{blobManager.cjs → blobManager.js} +17 -6
- package/dist/blobManager.js.map +1 -0
- package/dist/{connectionTelemetry.cjs → connectionTelemetry.js} +1 -1
- package/dist/connectionTelemetry.js.map +1 -0
- package/dist/container-runtime-alpha.d.ts +17 -2
- package/dist/container-runtime-untrimmed.d.ts +17 -2
- package/dist/{containerHandleContext.cjs → containerHandleContext.js} +1 -1
- package/dist/containerHandleContext.js.map +1 -0
- package/dist/containerRuntime.d.ts +4 -0
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/{containerRuntime.cjs → containerRuntime.js} +27 -18
- package/dist/containerRuntime.js.map +1 -0
- package/dist/{dataStore.cjs → dataStore.js} +1 -1
- package/dist/dataStore.js.map +1 -0
- package/dist/dataStoreContext.d.ts +5 -2
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/{dataStoreContext.cjs → dataStoreContext.js} +13 -6
- package/dist/dataStoreContext.js.map +1 -0
- package/dist/{dataStoreContexts.cjs → dataStoreContexts.js} +1 -1
- package/dist/dataStoreContexts.js.map +1 -0
- package/dist/{dataStoreRegistry.cjs → dataStoreRegistry.js} +1 -1
- package/dist/dataStoreRegistry.js.map +1 -0
- package/dist/dataStores.d.ts +10 -3
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/{dataStores.cjs → dataStores.js} +59 -16
- package/dist/dataStores.js.map +1 -0
- package/dist/{deltaManagerProxyBase.cjs → deltaManagerProxyBase.js} +1 -1
- package/dist/deltaManagerProxyBase.js.map +1 -0
- package/dist/{deltaManagerSummarizerProxy.cjs → deltaManagerSummarizerProxy.js} +3 -3
- package/dist/deltaManagerSummarizerProxy.js.map +1 -0
- package/dist/{deltaScheduler.cjs → deltaScheduler.js} +1 -1
- package/dist/deltaScheduler.js.map +1 -0
- package/dist/{error.cjs → error.js} +1 -1
- package/dist/error.js.map +1 -0
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/{garbageCollection.cjs → garbageCollection.js} +48 -18
- package/dist/gc/garbageCollection.js.map +1 -0
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/{gcConfigs.cjs → gcConfigs.js} +29 -22
- package/dist/gc/gcConfigs.js.map +1 -0
- package/dist/gc/gcDefinitions.d.ts +29 -6
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/{gcDefinitions.cjs → gcDefinitions.js} +6 -4
- package/dist/gc/gcDefinitions.js.map +1 -0
- package/dist/gc/{gcHelpers.cjs → gcHelpers.js} +1 -1
- package/dist/gc/gcHelpers.js.map +1 -0
- package/dist/gc/{gcReferenceGraphAlgorithm.cjs → gcReferenceGraphAlgorithm.js} +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/dist/gc/{gcSummaryDefinitions.cjs → gcSummaryDefinitions.js} +1 -1
- package/dist/gc/gcSummaryDefinitions.js.map +1 -0
- package/dist/gc/{gcSummaryStateTracker.cjs → gcSummaryStateTracker.js} +2 -2
- package/dist/gc/gcSummaryStateTracker.js.map +1 -0
- package/dist/gc/gcTelemetry.d.ts +13 -6
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/{gcTelemetry.cjs → gcTelemetry.js} +20 -11
- package/dist/gc/gcTelemetry.js.map +1 -0
- package/dist/gc/{gcUnreferencedStateTracker.cjs → gcUnreferencedStateTracker.js} +2 -2
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/{index.cjs → index.js} +10 -9
- package/dist/gc/index.js.map +1 -0
- package/dist/{index.cjs → index.js} +7 -7
- package/dist/index.js.map +1 -0
- package/dist/{messageTypes.cjs → messageTypes.js} +1 -1
- package/dist/messageTypes.js.map +1 -0
- package/dist/{metadata.cjs → metadata.js} +1 -1
- package/dist/metadata.js.map +1 -0
- package/dist/opLifecycle/{batchManager.cjs → batchManager.js} +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -0
- package/dist/opLifecycle/definitions.d.ts +1 -1
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/{definitions.cjs → definitions.js} +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -0
- package/dist/opLifecycle/{index.cjs → index.js} +8 -8
- package/dist/opLifecycle/index.js.map +1 -0
- package/dist/opLifecycle/{opCompressor.cjs → opCompressor.js} +3 -3
- package/dist/opLifecycle/opCompressor.js.map +1 -0
- package/dist/opLifecycle/{opDecompressor.cjs → opDecompressor.js} +2 -2
- package/dist/opLifecycle/opDecompressor.js.map +1 -0
- package/dist/opLifecycle/{opGroupingManager.cjs → opGroupingManager.js} +1 -1
- package/dist/opLifecycle/opGroupingManager.js.map +1 -0
- package/dist/opLifecycle/{opSplitter.cjs → opSplitter.js} +3 -3
- package/dist/opLifecycle/opSplitter.js.map +1 -0
- package/dist/opLifecycle/outbox.d.ts +4 -4
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/{outbox.cjs → outbox.js} +6 -3
- package/dist/opLifecycle/{outbox.cjs.map → outbox.js.map} +1 -1
- package/dist/opLifecycle/{remoteMessageProcessor.cjs → remoteMessageProcessor.js} +2 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -0
- package/dist/{opProperties.cjs → opProperties.js} +1 -1
- package/dist/opProperties.js.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/{packageVersion.cjs → packageVersion.js} +2 -2
- package/dist/packageVersion.js.map +1 -0
- package/dist/{pendingStateManager.cjs → pendingStateManager.js} +2 -2
- package/dist/pendingStateManager.js.map +1 -0
- package/dist/{scheduleManager.cjs → scheduleManager.js} +3 -3
- package/dist/scheduleManager.js.map +1 -0
- package/dist/{storageServiceWithAttachBlobs.cjs → storageServiceWithAttachBlobs.js} +1 -1
- package/dist/storageServiceWithAttachBlobs.js.map +1 -0
- package/dist/summary/{index.cjs → index.js} +12 -12
- package/dist/summary/index.js.map +1 -0
- package/dist/summary/{orderedClientElection.cjs → orderedClientElection.js} +2 -2
- package/dist/summary/orderedClientElection.js.map +1 -0
- package/dist/summary/{runWhileConnectedCoordinator.cjs → runWhileConnectedCoordinator.js} +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/dist/summary/runningSummarizer.d.ts +5 -0
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/{runningSummarizer.cjs → runningSummarizer.js} +50 -21
- package/dist/summary/runningSummarizer.js.map +1 -0
- package/dist/summary/{summarizer.cjs → summarizer.js} +4 -4
- package/dist/summary/summarizer.js.map +1 -0
- package/dist/summary/{summarizerClientElection.cjs → summarizerClientElection.js} +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -0
- package/dist/summary/{summarizerHeuristics.cjs → summarizerHeuristics.js} +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -0
- package/dist/summary/summarizerNode/{index.cjs → index.js} +3 -3
- package/dist/summary/summarizerNode/index.js.map +1 -0
- package/dist/summary/summarizerNode/{summarizerNode.cjs → summarizerNode.js} +2 -2
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/dist/summary/summarizerNode/{summarizerNodeUtils.cjs → summarizerNodeUtils.js} +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/dist/summary/summarizerNode/{summarizerNodeWithGc.cjs → summarizerNodeWithGc.js} +4 -4
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/dist/summary/summarizerTypes.d.ts +2 -0
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/{summarizerTypes.cjs → summarizerTypes.js} +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -0
- package/dist/summary/{summaryCollection.cjs → summaryCollection.js} +1 -1
- package/dist/summary/summaryCollection.js.map +1 -0
- package/dist/summary/{summaryFormat.cjs → summaryFormat.js} +1 -1
- package/dist/summary/summaryFormat.js.map +1 -0
- package/dist/summary/{summaryGenerator.cjs → summaryGenerator.js} +1 -1
- package/dist/summary/summaryGenerator.js.map +1 -0
- package/dist/summary/{summaryManager.cjs → summaryManager.js} +2 -2
- package/dist/summary/summaryManager.js.map +1 -0
- package/dist/{throttler.cjs → throttler.js} +1 -1
- package/dist/throttler.js.map +1 -0
- package/lib/batchTracker.d.mts +1 -1
- package/lib/batchTracker.d.mts.map +1 -1
- package/lib/blobManager.d.mts +9 -4
- package/lib/blobManager.d.mts.map +1 -1
- package/lib/blobManager.mjs +15 -4
- package/lib/blobManager.mjs.map +1 -1
- package/lib/connectionTelemetry.d.mts +1 -1
- package/lib/connectionTelemetry.d.mts.map +1 -1
- package/lib/container-runtime-alpha.d.mts +17 -2
- package/lib/container-runtime-untrimmed.d.mts +17 -2
- package/lib/containerHandleContext.d.mts +1 -1
- package/lib/containerHandleContext.d.mts.map +1 -1
- package/lib/containerRuntime.d.mts +5 -1
- package/lib/containerRuntime.d.mts.map +1 -1
- package/lib/containerRuntime.mjs +10 -1
- package/lib/containerRuntime.mjs.map +1 -1
- package/lib/dataStore.d.mts +1 -1
- package/lib/dataStore.d.mts.map +1 -1
- package/lib/dataStoreContext.d.mts +6 -3
- package/lib/dataStoreContext.d.mts.map +1 -1
- package/lib/dataStoreContext.mjs +11 -4
- package/lib/dataStoreContext.mjs.map +1 -1
- package/lib/dataStoreContexts.d.mts +1 -1
- package/lib/dataStoreContexts.d.mts.map +1 -1
- package/lib/dataStoreRegistry.d.mts +1 -1
- package/lib/dataStoreRegistry.d.mts.map +1 -1
- package/lib/dataStores.d.mts +11 -4
- package/lib/dataStores.d.mts.map +1 -1
- package/lib/dataStores.mjs +51 -9
- package/lib/dataStores.mjs.map +1 -1
- package/lib/deltaManagerProxyBase.d.mts +1 -1
- package/lib/deltaManagerProxyBase.d.mts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.mts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.mts.map +1 -1
- package/lib/deltaScheduler.d.mts +1 -1
- package/lib/deltaScheduler.d.mts.map +1 -1
- package/lib/error.d.mts +1 -1
- package/lib/error.d.mts.map +1 -1
- package/lib/gc/garbageCollection.d.mts +1 -1
- package/lib/gc/garbageCollection.d.mts.map +1 -1
- package/lib/gc/garbageCollection.mjs +38 -8
- package/lib/gc/garbageCollection.mjs.map +1 -1
- package/lib/gc/gcConfigs.d.mts +1 -1
- package/lib/gc/gcConfigs.d.mts.map +1 -1
- package/lib/gc/gcConfigs.mjs +26 -19
- package/lib/gc/gcConfigs.mjs.map +1 -1
- package/lib/gc/gcDefinitions.d.mts +30 -7
- package/lib/gc/gcDefinitions.d.mts.map +1 -1
- package/lib/gc/gcDefinitions.mjs +4 -2
- package/lib/gc/gcDefinitions.mjs.map +1 -1
- package/lib/gc/gcHelpers.d.mts +1 -1
- package/lib/gc/gcHelpers.d.mts.map +1 -1
- package/lib/gc/gcReferenceGraphAlgorithm.d.mts +1 -1
- package/lib/gc/gcReferenceGraphAlgorithm.d.mts.map +1 -1
- package/lib/gc/gcSummaryDefinitions.d.mts +1 -1
- package/lib/gc/gcSummaryDefinitions.d.mts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.mts +1 -1
- package/lib/gc/gcSummaryStateTracker.d.mts.map +1 -1
- package/lib/gc/gcTelemetry.d.mts +14 -7
- package/lib/gc/gcTelemetry.d.mts.map +1 -1
- package/lib/gc/gcTelemetry.mjs +18 -9
- package/lib/gc/gcTelemetry.mjs.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.d.mts +1 -1
- package/lib/gc/gcUnreferencedStateTracker.d.mts.map +1 -1
- package/lib/gc/index.d.mts +2 -2
- package/lib/gc/index.d.mts.map +1 -1
- package/lib/gc/index.mjs +1 -1
- package/lib/gc/index.mjs.map +1 -1
- package/lib/index.d.mts +1 -1
- package/lib/index.d.mts.map +1 -1
- package/lib/messageTypes.d.mts +1 -1
- package/lib/messageTypes.d.mts.map +1 -1
- package/lib/metadata.d.mts +1 -1
- package/lib/metadata.d.mts.map +1 -1
- package/lib/opLifecycle/batchManager.d.mts +1 -1
- package/lib/opLifecycle/batchManager.d.mts.map +1 -1
- package/lib/opLifecycle/definitions.d.mts +2 -2
- package/lib/opLifecycle/definitions.d.mts.map +1 -1
- package/lib/opLifecycle/definitions.mjs.map +1 -1
- package/lib/opLifecycle/index.d.mts +1 -1
- package/lib/opLifecycle/index.d.mts.map +1 -1
- package/lib/opLifecycle/opCompressor.d.mts +1 -1
- package/lib/opLifecycle/opCompressor.d.mts.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.mts +1 -1
- package/lib/opLifecycle/opDecompressor.d.mts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.mts +1 -1
- package/lib/opLifecycle/opGroupingManager.d.mts.map +1 -1
- package/lib/opLifecycle/opSplitter.d.mts +1 -1
- package/lib/opLifecycle/opSplitter.d.mts.map +1 -1
- package/lib/opLifecycle/outbox.d.mts +5 -5
- package/lib/opLifecycle/outbox.d.mts.map +1 -1
- package/lib/opLifecycle/outbox.mjs +4 -1
- package/lib/opLifecycle/outbox.mjs.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.mts +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.mts.map +1 -1
- package/lib/opProperties.d.mts +1 -1
- package/lib/opProperties.d.mts.map +1 -1
- package/lib/packageVersion.d.mts +2 -2
- package/lib/packageVersion.d.mts.map +1 -1
- package/lib/packageVersion.mjs +1 -1
- package/lib/packageVersion.mjs.map +1 -1
- package/lib/pendingStateManager.d.mts +1 -1
- package/lib/pendingStateManager.d.mts.map +1 -1
- package/lib/scheduleManager.d.mts +1 -1
- package/lib/scheduleManager.d.mts.map +1 -1
- package/lib/storageServiceWithAttachBlobs.d.mts +1 -1
- package/lib/storageServiceWithAttachBlobs.d.mts.map +1 -1
- package/lib/summary/index.d.mts +1 -1
- package/lib/summary/index.d.mts.map +1 -1
- package/lib/summary/orderedClientElection.d.mts +1 -1
- package/lib/summary/orderedClientElection.d.mts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.mts +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.mts.map +1 -1
- package/lib/summary/runningSummarizer.d.mts +6 -1
- package/lib/summary/runningSummarizer.d.mts.map +1 -1
- package/lib/summary/runningSummarizer.mjs +46 -17
- package/lib/summary/runningSummarizer.mjs.map +1 -1
- package/lib/summary/summarizer.d.mts +1 -1
- package/lib/summary/summarizer.d.mts.map +1 -1
- package/lib/summary/summarizerClientElection.d.mts +1 -1
- package/lib/summary/summarizerClientElection.d.mts.map +1 -1
- package/lib/summary/summarizerHeuristics.d.mts +1 -1
- package/lib/summary/summarizerHeuristics.d.mts.map +1 -1
- package/lib/summary/summarizerNode/index.d.mts +1 -1
- package/lib/summary/summarizerNode/index.d.mts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.mts +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.mts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts.map +1 -1
- package/lib/summary/summarizerTypes.d.mts +3 -1
- package/lib/summary/summarizerTypes.d.mts.map +1 -1
- package/lib/summary/summarizerTypes.mjs.map +1 -1
- package/lib/summary/summaryCollection.d.mts +1 -1
- package/lib/summary/summaryCollection.d.mts.map +1 -1
- package/lib/summary/summaryFormat.d.mts +1 -1
- package/lib/summary/summaryFormat.d.mts.map +1 -1
- package/lib/summary/summaryGenerator.d.mts +1 -1
- package/lib/summary/summaryGenerator.d.mts.map +1 -1
- package/lib/summary/summaryManager.d.mts +1 -1
- package/lib/summary/summaryManager.d.mts.map +1 -1
- package/lib/throttler.d.mts +1 -1
- package/lib/throttler.d.mts.map +1 -1
- package/package.json +74 -43
- package/src/blobManager.ts +15 -4
- package/src/containerRuntime.ts +11 -0
- package/src/dataStoreContext.ts +11 -4
- package/src/dataStores.ts +61 -7
- package/src/gc/garbageCollection.ts +41 -7
- package/src/gc/gcConfigs.ts +28 -20
- package/src/gc/gcDefinitions.ts +30 -6
- package/src/gc/gcTelemetry.ts +19 -9
- package/src/gc/index.ts +3 -0
- package/src/opLifecycle/definitions.ts +1 -1
- package/src/opLifecycle/outbox.ts +5 -2
- package/src/packageVersion.ts +1 -1
- package/src/summary/runningSummarizer.ts +58 -25
- package/src/summary/summarizerTypes.ts +2 -0
- package/dist/batchTracker.cjs.map +0 -1
- package/dist/blobManager.cjs.map +0 -1
- package/dist/connectionTelemetry.cjs.map +0 -1
- package/dist/containerHandleContext.cjs.map +0 -1
- package/dist/containerRuntime.cjs.map +0 -1
- package/dist/dataStore.cjs.map +0 -1
- package/dist/dataStoreContext.cjs.map +0 -1
- package/dist/dataStoreContexts.cjs.map +0 -1
- package/dist/dataStoreRegistry.cjs.map +0 -1
- package/dist/dataStores.cjs.map +0 -1
- package/dist/deltaManagerProxyBase.cjs.map +0 -1
- package/dist/deltaManagerSummarizerProxy.cjs.map +0 -1
- package/dist/deltaScheduler.cjs.map +0 -1
- package/dist/error.cjs.map +0 -1
- package/dist/gc/garbageCollection.cjs.map +0 -1
- package/dist/gc/gcConfigs.cjs.map +0 -1
- package/dist/gc/gcDefinitions.cjs.map +0 -1
- package/dist/gc/gcHelpers.cjs.map +0 -1
- package/dist/gc/gcReferenceGraphAlgorithm.cjs.map +0 -1
- package/dist/gc/gcSummaryDefinitions.cjs.map +0 -1
- package/dist/gc/gcSummaryStateTracker.cjs.map +0 -1
- package/dist/gc/gcTelemetry.cjs.map +0 -1
- package/dist/gc/gcUnreferencedStateTracker.cjs.map +0 -1
- package/dist/gc/index.cjs.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/messageTypes.cjs.map +0 -1
- package/dist/metadata.cjs.map +0 -1
- package/dist/opLifecycle/batchManager.cjs.map +0 -1
- package/dist/opLifecycle/definitions.cjs.map +0 -1
- package/dist/opLifecycle/index.cjs.map +0 -1
- package/dist/opLifecycle/opCompressor.cjs.map +0 -1
- package/dist/opLifecycle/opDecompressor.cjs.map +0 -1
- package/dist/opLifecycle/opGroupingManager.cjs.map +0 -1
- package/dist/opLifecycle/opSplitter.cjs.map +0 -1
- package/dist/opLifecycle/remoteMessageProcessor.cjs.map +0 -1
- package/dist/opProperties.cjs.map +0 -1
- package/dist/packageVersion.cjs.map +0 -1
- package/dist/pendingStateManager.cjs.map +0 -1
- package/dist/scheduleManager.cjs.map +0 -1
- package/dist/storageServiceWithAttachBlobs.cjs.map +0 -1
- package/dist/summary/index.cjs.map +0 -1
- package/dist/summary/orderedClientElection.cjs.map +0 -1
- package/dist/summary/runWhileConnectedCoordinator.cjs.map +0 -1
- package/dist/summary/runningSummarizer.cjs.map +0 -1
- package/dist/summary/summarizer.cjs.map +0 -1
- package/dist/summary/summarizerClientElection.cjs.map +0 -1
- package/dist/summary/summarizerHeuristics.cjs.map +0 -1
- package/dist/summary/summarizerNode/index.cjs.map +0 -1
- package/dist/summary/summarizerNode/summarizerNode.cjs.map +0 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.cjs.map +0 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs.map +0 -1
- package/dist/summary/summarizerTypes.cjs.map +0 -1
- package/dist/summary/summaryCollection.cjs.map +0 -1
- package/dist/summary/summaryFormat.cjs.map +0 -1
- package/dist/summary/summaryGenerator.cjs.map +0 -1
- package/dist/summary/summaryManager.cjs.map +0 -1
- package/dist/throttler.cjs.map +0 -1
- package/tsc-multi.test.json +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataStores.js","sourceRoot":"","sources":["../src/dataStores.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryBaseLogger,\n\tIDisposable,\n\tIFluidHandle,\n\tIRequest,\n} from \"@fluidframework/core-interfaces\";\nimport { FluidObjectHandle } from \"@fluidframework/datastore\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tAliasResult,\n\tchannelsTreeName,\n\tCreateChildSummarizerNodeFn,\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tIAttachMessage,\n\tIEnvelope,\n\tIFluidDataStoreContextDetached,\n\tIGarbageCollectionData,\n\tIInboundSignalMessage,\n\tInboundAttachMessage,\n\tISummarizeResult,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tconvertSnapshotTreeToSummaryTree,\n\tconvertToSummaryTree,\n\tcreate404Response,\n\tcreateResponseError,\n\tGCDataBuilder,\n\tisSerializedHandle,\n\tresponseToException,\n\tSummaryTreeBuilder,\n\tunpackChildNodesUsedRoutes,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tcreateChildMonitoringContext,\n\tDataCorruptionError,\n\tDataProcessingError,\n\textractSafePropertiesFromMessage,\n\tLoggingError,\n\tMonitoringContext,\n\ttagCodeArtifacts,\n} from \"@fluidframework/telemetry-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport { assert, Lazy } from \"@fluidframework/core-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport { DataStoreContexts } from \"./dataStoreContexts\";\nimport { ContainerRuntime, defaultRuntimeHeaderData, RuntimeHeaderData } from \"./containerRuntime\";\nimport {\n\tFluidDataStoreContext,\n\tRemoteFluidDataStoreContext,\n\tLocalFluidDataStoreContext,\n\tcreateAttributesBlob,\n\tLocalDetachedFluidDataStoreContext,\n} from \"./dataStoreContext\";\nimport { StorageServiceWithAttachBlobs } from \"./storageServiceWithAttachBlobs\";\nimport { IDataStoreAliasMessage, isDataStoreAliasMessage } from \"./dataStore\";\nimport { GCNodeType, detectOutboundRoutesViaDDSKey, disableDatastoreSweepKey } from \"./gc\";\nimport { IContainerRuntimeMetadata, nonDataStorePaths, rootHasIsolatedChannels } from \"./summary\";\n\ntype PendingAliasResolve = (success: boolean) => void;\n\n/**\n * This class encapsulates data store handling. Currently it is only used by the container runtime,\n * but eventually could be hosted on any channel once we formalize the channel api boundary.\n */\nexport class DataStores implements IDisposable {\n\t// Stores tracked by the Domain\n\tprivate readonly pendingAttach = new Map<string, IAttachMessage>();\n\t// 0.24 back-compat attachingBeforeSummary\n\tpublic readonly attachOpFiredForDataStore = new Set<string>();\n\n\tprivate readonly mc: MonitoringContext;\n\n\tprivate readonly disposeOnce = new Lazy<void>(() => this.contexts.dispose());\n\n\tpublic readonly containerLoadStats: {\n\t\t// number of dataStores during loadContainer\n\t\treadonly containerLoadDataStoreCount: number;\n\t\t// number of unreferenced dataStores during loadContainer\n\t\treadonly referencedDataStoreCount: number;\n\t};\n\n\t// Stores the ids of new data stores between two GC runs. This is used to notify the garbage collector of new\n\t// root data stores that are added.\n\tprivate dataStoresSinceLastGC: string[] = [];\n\t// The handle to the container runtime. This is used mainly for GC purposes to represent outbound reference from\n\t// the container runtime to other nodes.\n\tprivate readonly containerRuntimeHandle: IFluidHandle;\n\tprivate readonly pendingAliasMap: Map<string, Promise<AliasResult>> = new Map<\n\t\tstring,\n\t\tPromise<AliasResult>\n\t>();\n\n\tconstructor(\n\t\tprivate readonly baseSnapshot: ISnapshotTree | undefined,\n\t\tprivate readonly runtime: ContainerRuntime,\n\t\tprivate readonly submitAttachFn: (attachContent: IAttachMessage) => void,\n\t\tprivate readonly getCreateChildSummarizerNodeFn: (\n\t\t\tid: string,\n\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t) => CreateChildSummarizerNodeFn,\n\t\tprivate readonly deleteChildSummarizerNodeFn: (id: string) => void,\n\t\tbaseLogger: ITelemetryBaseLogger,\n\t\tprivate readonly gcNodeUpdated: (\n\t\t\tnodePath: string,\n\t\t\ttimestampMs: number,\n\t\t\tpackagePath?: readonly string[],\n\t\t) => void,\n\t\tprivate readonly isDataStoreDeleted: (nodePath: string) => boolean,\n\t\tprivate readonly aliasMap: Map<string, string>,\n\t\tprivate readonly contexts: DataStoreContexts = new DataStoreContexts(baseLogger),\n\t) {\n\t\tthis.mc = createChildMonitoringContext({ logger: baseLogger });\n\t\tthis.containerRuntimeHandle = new FluidObjectHandle(\n\t\t\tthis.runtime,\n\t\t\t\"/\",\n\t\t\tthis.runtime.IFluidHandleContext,\n\t\t);\n\n\t\t// Extract stores stored inside the snapshot\n\t\tconst fluidDataStores = new Map<string, ISnapshotTree>();\n\t\tif (baseSnapshot) {\n\t\t\tfor (const [key, value] of Object.entries(baseSnapshot.trees)) {\n\t\t\t\tfluidDataStores.set(key, value);\n\t\t\t}\n\t\t}\n\n\t\tlet unreferencedDataStoreCount = 0;\n\t\t// Create a context for each of them\n\t\tfor (const [key, value] of fluidDataStores) {\n\t\t\tlet dataStoreContext: FluidDataStoreContext;\n\n\t\t\t// counting number of unreferenced data stores\n\t\t\tif (value.unreferenced) {\n\t\t\t\tunreferencedDataStoreCount++;\n\t\t\t}\n\t\t\t// If we have a detached container, then create local data store contexts.\n\t\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\t\tdataStoreContext = new RemoteFluidDataStoreContext({\n\t\t\t\t\tid: key,\n\t\t\t\t\tsnapshotTree: value,\n\t\t\t\t\truntime: this.runtime,\n\t\t\t\t\tstorage: this.runtime.storage,\n\t\t\t\t\tscope: this.runtime.scope,\n\t\t\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {\n\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (typeof value !== \"object\") {\n\t\t\t\t\tthrow new LoggingError(\"Snapshot should be there to load from!!\");\n\t\t\t\t}\n\t\t\t\tconst snapshotTree = value;\n\t\t\t\tdataStoreContext = new LocalFluidDataStoreContext({\n\t\t\t\t\tid: key,\n\t\t\t\t\tpkg: undefined,\n\t\t\t\t\truntime: this.runtime,\n\t\t\t\t\tstorage: this.runtime.storage,\n\t\t\t\t\tscope: this.runtime.scope,\n\t\t\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {\n\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t}),\n\t\t\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(key),\n\t\t\t\t\tsnapshotTree,\n\t\t\t\t\tisRootDataStore: undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.contexts.addBoundOrRemoted(dataStoreContext);\n\t\t}\n\t\tthis.containerLoadStats = {\n\t\t\tcontainerLoadDataStoreCount: fluidDataStores.size,\n\t\t\treferencedDataStoreCount: fluidDataStores.size - unreferencedDataStoreCount,\n\t\t};\n\t}\n\n\tpublic get aliases(): ReadonlyMap<string, string> {\n\t\treturn this.aliasMap;\n\t}\n\n\tpublic get pendingAliases(): Map<string, Promise<AliasResult>> {\n\t\treturn this.pendingAliasMap;\n\t}\n\n\tpublic async waitIfPendingAlias(maybeAlias: string): Promise<AliasResult> {\n\t\tconst pendingAliasPromise = this.pendingAliases.get(maybeAlias);\n\t\treturn pendingAliasPromise ?? \"Success\";\n\t}\n\n\tpublic processAttachMessage(message: ISequencedDocumentMessage, local: boolean) {\n\t\tconst attachMessage = message.contents as InboundAttachMessage;\n\n\t\tthis.dataStoresSinceLastGC.push(attachMessage.id);\n\n\t\t// The local object has already been attached\n\t\tif (local) {\n\t\t\tassert(\n\t\t\t\tthis.pendingAttach.has(attachMessage.id),\n\t\t\t\t0x15e /* \"Local object does not have matching attach message id\" */,\n\t\t\t);\n\t\t\tthis.contexts.get(attachMessage.id)?.emit(\"attached\");\n\t\t\tthis.pendingAttach.delete(attachMessage.id);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a non-local operation then go and create the object, otherwise mark it as officially attached.\n\t\tif (this.alreadyProcessed(attachMessage.id)) {\n\t\t\t// TODO: dataStoreId may require a different tag from PackageData #7488\n\t\t\tconst error = new DataCorruptionError(\n\t\t\t\t// pre-0.58 error message: duplicateDataStoreCreatedWithExistingId\n\t\t\t\t\"Duplicate DataStore created with existing id\",\n\t\t\t\t{\n\t\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t\t\t...tagCodeArtifacts({ dataStoreId: attachMessage.id }),\n\t\t\t\t},\n\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst flatAttachBlobs = new Map<string, ArrayBufferLike>();\n\t\tlet snapshotTree: ISnapshotTree | undefined;\n\t\tif (attachMessage.snapshot) {\n\t\t\tsnapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatAttachBlobs);\n\t\t}\n\n\t\t// Include the type of attach message which is the pkg of the store to be\n\t\t// used by RemoteFluidDataStoreContext in case it is not in the snapshot.\n\t\tconst pkg = [attachMessage.type];\n\t\tconst remoteFluidDataStoreContext = new RemoteFluidDataStoreContext({\n\t\t\tid: attachMessage.id,\n\t\t\tsnapshotTree,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: new StorageServiceWithAttachBlobs(this.runtime.storage, flatAttachBlobs),\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(attachMessage.id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.FromAttach,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\tsnapshot: attachMessage.snapshot ?? {\n\t\t\t\t\tentries: [createAttributesBlob(pkg, true /* isRootDataStore */)],\n\t\t\t\t},\n\t\t\t}),\n\t\t\tpkg,\n\t\t});\n\n\t\tthis.contexts.addBoundOrRemoted(remoteFluidDataStoreContext);\n\t}\n\n\tpublic processAliasMessage(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocalOpMetadata: unknown,\n\t\tlocal: boolean,\n\t): void {\n\t\tconst aliasMessage = message.contents as IDataStoreAliasMessage;\n\t\tif (!isDataStoreAliasMessage(aliasMessage)) {\n\t\t\tthrow new DataCorruptionError(\"malformedDataStoreAliasMessage\", {\n\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t});\n\t\t}\n\n\t\tconst resolve = localOpMetadata as PendingAliasResolve;\n\t\tconst aliasResult = this.processAliasMessageCore(aliasMessage);\n\t\tif (local) {\n\t\t\tresolve(aliasResult);\n\t\t}\n\t}\n\n\tpublic processAliasMessageCore(aliasMessage: IDataStoreAliasMessage): boolean {\n\t\tif (this.alreadyProcessed(aliasMessage.alias)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst context = this.contexts.get(aliasMessage.internalId);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted a signal.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\taliasMessage.internalId,\n\t\t\t\tcontext,\n\t\t\t\t\"Changed\",\n\t\t\t\t\"processAliasMessageCore\",\n\t\t\t)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (context === undefined) {\n\t\t\tthis.mc.logger.sendErrorEvent({\n\t\t\t\teventName: \"AliasFluidDataStoreNotFound\",\n\t\t\t\tfluidDataStoreId: aliasMessage.internalId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\tconst handle = new FluidObjectHandle(\n\t\t\tcontext,\n\t\t\taliasMessage.internalId,\n\t\t\tthis.runtime.IFluidHandleContext,\n\t\t);\n\t\tthis.runtime.addedGCOutboundReference(this.containerRuntimeHandle, handle);\n\n\t\tthis.aliasMap.set(aliasMessage.alias, context.id);\n\t\tcontext.setInMemoryRoot();\n\t\treturn true;\n\t}\n\n\tprivate alreadyProcessed(id: string): boolean {\n\t\treturn this.aliasMap.get(id) !== undefined || this.contexts.get(id) !== undefined;\n\t}\n\n\t/**\n\t * Make the data stores locally visible in the container graph by moving the data store context from unbound to\n\t * bound list. This data store can now be reached from the root.\n\t * @param id - The id of the data store context to make visible.\n\t */\n\tprivate makeDataStoreLocallyVisible(id: string): void {\n\t\tconst localContext = this.contexts.getUnbound(id);\n\t\tassert(!!localContext, 0x15f /* \"Could not find unbound context to bind\" */);\n\n\t\t/**\n\t\t * If the container is not detached, it is globally visible to all clients. This data store should also be\n\t\t * globally visible. Move it to attaching state and send an \"attach\" op for it.\n\t\t * If the container is detached, this data store will be part of the summary that makes the container attached.\n\t\t */\n\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\tlocalContext.emit(\"attaching\");\n\t\t\tconst message = localContext.generateAttachMessage();\n\n\t\t\tthis.pendingAttach.set(id, message);\n\t\t\tthis.submitAttachFn(message);\n\t\t\tthis.attachOpFiredForDataStore.add(id);\n\t\t}\n\n\t\tthis.contexts.bind(id);\n\t}\n\n\tpublic createDetachedDataStoreCore(\n\t\tpkg: Readonly<string[]>,\n\t\tisRoot: boolean,\n\t\tid = uuid(),\n\t): IFluidDataStoreContextDetached {\n\t\tassert(!id.includes(\"/\"), 0x30c /* Id cannot contain slashes */);\n\n\t\tconst context = new LocalDetachedFluidDataStoreContext({\n\t\t\tid,\n\t\t\tpkg,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: this.runtime.storage,\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t}),\n\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),\n\t\t\tsnapshotTree: undefined,\n\t\t\tisRootDataStore: isRoot,\n\t\t});\n\t\tthis.contexts.addUnbound(context);\n\t\treturn context;\n\t}\n\n\tpublic _createFluidDataStoreContext(pkg: string[], id: string, props?: any) {\n\t\tassert(!id.includes(\"/\"), 0x30d /* Id cannot contain slashes */);\n\t\tconst context = new LocalFluidDataStoreContext({\n\t\t\tid,\n\t\t\tpkg,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: this.runtime.storage,\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t}),\n\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),\n\t\t\tsnapshotTree: undefined,\n\t\t\tisRootDataStore: false,\n\t\t\tcreateProps: props,\n\t\t});\n\t\tthis.contexts.addUnbound(context);\n\t\treturn context;\n\t}\n\n\tpublic get disposed() {\n\t\treturn this.disposeOnce.evaluated;\n\t}\n\tpublic readonly dispose = () => this.disposeOnce.value;\n\n\tpublic resubmitDataStoreOp(envelope: IEnvelope, localOpMetadata: unknown) {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and throw an error. If there are local changes for a\n\t\t// deleted data store, it can otherwise lead to inconsistent state when compared to other clients.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"resubmitDataStoreOp\")\n\t\t) {\n\t\t\tthrow new DataCorruptionError(\"Context is deleted!\", {\n\t\t\t\tcallSite: \"resubmitDataStoreOp\",\n\t\t\t\t...tagCodeArtifacts({ id: envelope.address }),\n\t\t\t});\n\t\t}\n\t\tassert(!!context, 0x160 /* \"There should be a store context for the op\" */);\n\t\tcontext.reSubmit(envelope.contents, localOpMetadata);\n\t}\n\n\tpublic rollbackDataStoreOp(envelope: IEnvelope, localOpMetadata: unknown) {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and throw an error. If there are local changes for a\n\t\t// deleted data store, it can otherwise lead to inconsistent state when compared to other clients.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"rollbackDataStoreOp\")\n\t\t) {\n\t\t\tthrow new DataCorruptionError(\"Context is deleted!\", {\n\t\t\t\tcallSite: \"rollbackDataStoreOp\",\n\t\t\t\t...tagCodeArtifacts({ id: envelope.address }),\n\t\t\t});\n\t\t}\n\t\tassert(!!context, 0x2e8 /* \"There should be a store context for the op\" */);\n\t\tcontext.rollback(envelope.contents, localOpMetadata);\n\t}\n\n\tpublic async applyStashedOp(envelope: IEnvelope): Promise<unknown> {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case the data store that stashed the op is deleted.\n\t\tif (this.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"applyStashedOp\")) {\n\t\t\treturn undefined;\n\t\t}\n\t\tassert(!!context, 0x161 /* \"There should be a store context for the op\" */);\n\t\treturn context.applyStashedOp(envelope.contents);\n\t}\n\n\tpublic async applyStashedAttachOp(message: IAttachMessage) {\n\t\tthis.pendingAttach.set(message.id, message);\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tthis.processAttachMessage({ contents: message } as ISequencedDocumentMessage, false);\n\t}\n\n\tpublic processFluidDataStoreOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalMessageMetadata: unknown,\n\t\taddedOutboundReference: (fromNodePath: string, toNodePath: string) => void,\n\t) {\n\t\tconst envelope = message.contents as IEnvelope;\n\t\tconst transformed = { ...message, contents: envelope.contents };\n\t\tconst context = this.contexts.get(envelope.address);\n\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted an op.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tenvelope.address,\n\t\t\t\tcontext,\n\t\t\t\t\"Changed\",\n\t\t\t\t\"processFluidDataStoreOp\",\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tassert(!!context, 0x162 /* \"There should be a store context for the op\" */);\n\t\tcontext.process(transformed, local, localMessageMetadata);\n\n\t\t// By default, we use the new behavior of detecting outbound routes here.\n\t\t// If this setting is true, then DataStoreContext would be notifying GC instead.\n\t\tif (this.mc.config.getBoolean(detectOutboundRoutesViaDDSKey) !== true) {\n\t\t\t// Notify GC of any outbound references that were added by this op.\n\t\t\tdetectOutboundReferences(envelope, addedOutboundReference);\n\t\t}\n\n\t\t// Notify that a GC node for the data store changed. This is used to detect if a deleted data store is\n\t\t// being used.\n\t\tthis.gcNodeUpdated(\n\t\t\t`/${envelope.address}`,\n\t\t\tmessage.timestamp,\n\t\t\tcontext.isLoaded ? context.packagePath : undefined,\n\t\t);\n\t}\n\n\tpublic async getDataStore(\n\t\tid: string,\n\t\trequestHeaderData: RuntimeHeaderData,\n\t): Promise<FluidDataStoreContext> {\n\t\tconst headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tid,\n\t\t\t\tthis.contexts.get(id),\n\t\t\t\t\"Requested\",\n\t\t\t\t\"getDataStore\",\n\t\t\t\trequestHeaderData,\n\t\t\t)\n\t\t) {\n\t\t\t// The requested data store has been deleted by gc. Create a 404 response exception.\n\t\t\tconst request: IRequest = { url: id };\n\t\t\tthrow responseToException(\n\t\t\t\tcreateResponseError(404, \"DataStore was deleted\", request),\n\t\t\t\trequest,\n\t\t\t);\n\t\t}\n\n\t\tconst context = await this.contexts.getBoundOrRemoted(id, headerData.wait);\n\t\tif (context === undefined) {\n\t\t\t// The requested data store does not exits. Throw a 404 response exception.\n\t\t\tconst request: IRequest = { url: id };\n\t\t\tthrow responseToException(create404Response(request), request);\n\t\t}\n\t\treturn context;\n\t}\n\n\t/**\n\t * Returns the data store requested with the given id if available. Otherwise, returns undefined.\n\t */\n\tpublic async getDataStoreIfAvailable(\n\t\tid: string,\n\t\trequestHeaderData: RuntimeHeaderData,\n\t): Promise<FluidDataStoreContext | undefined> {\n\t\t// If the data store has been deleted, log an error and return undefined.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tid,\n\t\t\t\tthis.contexts.get(id),\n\t\t\t\t\"Requested\",\n\t\t\t\t\"getDataStoreIfAvailable\",\n\t\t\t\trequestHeaderData,\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };\n\t\tconst context = await this.contexts.getBoundOrRemoted(id, headerData.wait);\n\t\tif (context === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn context;\n\t}\n\n\t/**\n\t * Checks if the data store has been deleted by GC. If so, log an error.\n\t * @param id - The data store's id.\n\t * @param context - The data store context.\n\t * @param callSite - The function name this is called from.\n\t * @param requestHeaderData - The request header information to log if the data store is deleted.\n\t * @returns true if the data store is deleted. Otherwise, returns false.\n\t */\n\tprivate checkAndLogIfDeleted(\n\t\tid: string,\n\t\tcontext: FluidDataStoreContext | undefined,\n\t\tdeletedLogSuffix: string,\n\t\tcallSite: string,\n\t\trequestHeaderData?: RuntimeHeaderData,\n\t) {\n\t\tconst dataStoreNodePath = `/${id}`;\n\t\tif (!this.isDataStoreDeleted(dataStoreNodePath)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.mc.logger.sendErrorEvent({\n\t\t\teventName: `GC_Deleted_DataStore_${deletedLogSuffix}`,\n\t\t\t...tagCodeArtifacts({ id }),\n\t\t\tcallSite,\n\t\t\theaders: JSON.stringify(requestHeaderData),\n\t\t\texists: context !== undefined,\n\t\t});\n\t\treturn true;\n\t}\n\n\tpublic processSignal(fluidDataStoreId: string, message: IInboundSignalMessage, local: boolean) {\n\t\tconst context = this.contexts.get(fluidDataStoreId);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted a signal.\n\t\tif (this.checkAndLogIfDeleted(fluidDataStoreId, context, \"Changed\", \"processSignal\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!context) {\n\t\t\t// Attach message may not have been processed yet\n\t\t\tassert(!local, 0x163 /* \"Missing datastore for local signal\" */);\n\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"SignalFluidDataStoreNotFound\",\n\t\t\t\t...tagCodeArtifacts({\n\t\t\t\t\tfluidDataStoreId,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.processSignal(message, local);\n\t}\n\n\tpublic setConnectionState(connected: boolean, clientId?: string) {\n\t\tfor (const [fluidDataStoreId, context] of this.contexts) {\n\t\t\ttry {\n\t\t\t\tcontext.setConnectionState(connected, clientId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"SetConnectionStateError\",\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t...tagCodeArtifacts({\n\t\t\t\t\t\t\tfluidDataStoreId,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t\truntimeConnected: this.runtime.connected,\n\t\t\t\t\t\t\tconnected,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {\n\t\tconst eventName = attachState === AttachState.Attaching ? \"attaching\" : \"attached\";\n\t\tfor (const [, context] of this.contexts) {\n\t\t\t// Fire only for bounded stores.\n\t\t\tif (!this.contexts.isNotBound(context.id)) {\n\t\t\t\tcontext.emit(eventName);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic get size(): number {\n\t\treturn this.contexts.size;\n\t}\n\n\tpublic async summarize(\n\t\tfullTree: boolean,\n\t\ttrackState: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Iterate over each store and ask it to snapshot\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([_, context]) => {\n\t\t\t\t\t// Summarizer works only with clients with no local changes. A data store in attaching\n\t\t\t\t\t// state indicates an op was sent to attach a local data store, and the the attach op\n\t\t\t\t\t// had not yet round tripped back to the client.\n\t\t\t\t\tif (context.attachState === AttachState.Attaching) {\n\t\t\t\t\t\t// Formerly assert 0x588\n\t\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t\t\"Local data store detected in attaching state during summarize\",\n\t\t\t\t\t\t\t\"summarize\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\treturn context.attachState === AttachState.Attached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextSummary = await context.summarize(\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t\ttrackState,\n\t\t\t\t\t\ttelemetryContext,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryBuilder.addWithStats(contextId, contextSummary);\n\t\t\t\t}),\n\t\t);\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic createSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\t// Attaching graph of some stores can cause other stores to get bound too.\n\t\t// So keep taking summary until no new stores get bound.\n\t\tlet notBoundContextsLength: number;\n\t\tdo {\n\t\t\tconst builderTree = builder.summary.tree;\n\t\t\tnotBoundContextsLength = this.contexts.notBoundLength();\n\t\t\t// Iterate over each data store and ask it to snapshot\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(\n\t\t\t\t\t([key, _]) =>\n\t\t\t\t\t\t// Take summary of bounded data stores only, make sure we haven't summarized them already\n\t\t\t\t\t\t// and no attach op has been fired for that data store because for loader versions <= 0.24\n\t\t\t\t\t\t// we set attach state as \"attaching\" before taking createNew summary.\n\t\t\t\t\t\t!(\n\t\t\t\t\t\t\tthis.contexts.isNotBound(key) ||\n\t\t\t\t\t\t\tbuilderTree[key] ||\n\t\t\t\t\t\t\tthis.attachOpFiredForDataStore.has(key)\n\t\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\tlet dataStoreSummary: ISummarizeResult;\n\t\t\t\t\tif (value.isLoaded) {\n\t\t\t\t\t\tconst snapshot = value.generateAttachMessage().snapshot;\n\t\t\t\t\t\tdataStoreSummary = convertToSummaryTree(snapshot, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If this data store is not yet loaded, then there should be no changes in the snapshot from\n\t\t\t\t\t\t// which it was created as it is detached container. So just use the previous snapshot.\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t!!this.baseSnapshot,\n\t\t\t\t\t\t\t0x166 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdataStoreSummary = convertSnapshotTreeToSummaryTree(\n\t\t\t\t\t\t\tthis.baseSnapshot.trees[key],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbuilder.addWithStats(key, dataStoreSummary);\n\t\t\t\t});\n\t\t} while (notBoundContextsLength !== this.contexts.notBoundLength());\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\t/**\n\t * Before GC runs, called by the garbage collector to update any pending GC state.\n\t * The garbage collector needs to know all outbound references that are added. Since root data stores are not\n\t * explicitly marked as referenced, notify GC of new root data stores that were added since the last GC run.\n\t */\n\tpublic async updateStateBeforeGC(): Promise<void> {\n\t\tfor (const id of this.dataStoresSinceLastGC) {\n\t\t\tconst context = this.contexts.get(id);\n\t\t\tassert(context !== undefined, 0x2b6 /* Missing data store context */);\n\t\t\tif (await context.isRoot()) {\n\t\t\t\t// A root data store is basically a reference from the container runtime to the data store.\n\t\t\t\tconst handle = new FluidObjectHandle(context, id, this.runtime.IFluidHandleContext);\n\t\t\t\tthis.runtime.addedGCOutboundReference(this.containerRuntimeHandle, handle);\n\t\t\t}\n\t\t}\n\t\tthis.dataStoresSinceLastGC = [];\n\t}\n\n\t/**\n\t * Generates data used for garbage collection. It does the following:\n\t *\n\t * 1. Calls into each child data store context to get its GC data.\n\t *\n\t * 2. Prefixes the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n\t * identified as belonging to the child.\n\t *\n\t * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n\t * the GC data of this channel.\n\t *\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tpublic async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n\t\tconst builder = new GCDataBuilder();\n\t\t// Iterate over each store and get their GC data.\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([_, context]) => {\n\t\t\t\t\t// Summarizer client and hence GC works only with clients with no local changes. A data store in\n\t\t\t\t\t// attaching state indicates an op was sent to attach a local data store, and the the attach op\n\t\t\t\t\t// had not yet round tripped back to the client.\n\t\t\t\t\t// Formerly assert 0x589\n\t\t\t\t\tif (context.attachState === AttachState.Attaching) {\n\t\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t\t\"Local data store detected in attaching state while running GC\",\n\t\t\t\t\t\t\t\"getGCData\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn context.attachState === AttachState.Attached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextGCData = await context.getGCData(fullGC);\n\t\t\t\t\t// Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n\t\t\t\t\t// This also gradually builds the id of each node to be a path from the root.\n\t\t\t\t\tbuilder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n\t\t\t\t}),\n\t\t);\n\n\t\t// Get the outbound routes and add a GC node for this channel.\n\t\tbuilder.addNode(\"/\", await this.getOutboundRoutes());\n\t\treturn builder.getGCData();\n\t}\n\n\t/**\n\t * After GC has run, called to notify this Container's data stores of routes that are used in it.\n\t * @param usedRoutes - The routes that are used in all data stores in this Container.\n\t */\n\tpublic updateUsedRoutes(usedRoutes: readonly string[]) {\n\t\t// Get a map of data store ids to routes used in it.\n\t\tconst usedDataStoreRoutes = unpackChildNodesUsedRoutes(usedRoutes);\n\n\t\t// Verify that the used routes are correct.\n\t\tfor (const [id] of usedDataStoreRoutes) {\n\t\t\tassert(\n\t\t\t\tthis.contexts.has(id),\n\t\t\t\t0x167 /* \"Used route does not belong to any known data store\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Update the used routes in each data store. Used routes is empty for unused data stores.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.updateUsedRoutes(usedDataStoreRoutes.get(contextId) ?? []);\n\t\t}\n\t}\n\n\t/**\n\t * This is called to update objects whose routes are unused. The unused objects are deleted.\n\t * @param unusedRoutes - The routes that are unused in all data stores in this Container.\n\t */\n\tpublic updateUnusedRoutes(unusedRoutes: readonly string[]) {\n\t\tfor (const route of unusedRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\t// Delete data store only if its route (/datastoreId) is in unusedRoutes. We don't want to delete a data\n\t\t\t// store based on its DDS being unused.\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst dataStoreId = pathParts[1];\n\t\t\tassert(this.contexts.has(dataStoreId), 0x2d7 /* No data store with specified id */);\n\t\t\t// Delete the contexts of unused data stores.\n\t\t\tthis.contexts.delete(dataStoreId);\n\t\t\t// Delete the summarizer node of the unused data stores.\n\t\t\tthis.deleteChildSummarizerNodeFn(dataStoreId);\n\t\t}\n\t}\n\n\t/**\n\t * Delete data stores and its objects that are sweep ready.\n\t * @param sweepReadyDataStoreRoutes - The routes of data stores and its objects that are sweep ready and should\n\t * be deleted.\n\t * @returns The routes of data stores and its objects that were deleted.\n\t */\n\tpublic deleteSweepReadyNodes(sweepReadyDataStoreRoutes: readonly string[]): readonly string[] {\n\t\t// If sweep for data stores is not enabled, return empty list indicating nothing is deleted.\n\t\tif (this.mc.config.getBoolean(disableDatastoreSweepKey) === true) {\n\t\t\treturn [];\n\t\t}\n\t\tfor (const route of sweepReadyDataStoreRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\tconst dataStoreId = pathParts[1];\n\n\t\t\t// Ignore sub-data store routes because a data store and its sub-routes are deleted together, so, we only\n\t\t\t// need to delete the data store.\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst dataStoreContext = this.contexts.get(dataStoreId);\n\t\t\tif (dataStoreContext === undefined) {\n\t\t\t\t// If the data store hasn't already been deleted, log an error because this should never happen.\n\t\t\t\t// If the data store has already been deleted, log a telemetry event. This can happen because multiple GC\n\t\t\t\t// sweep ops can contain the same data store. It would be interesting to track how often this happens.\n\t\t\t\tconst alreadyDeleted = this.isDataStoreDeleted(`/${dataStoreId}`);\n\t\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\t\teventName: \"DeletedDataStoreNotFound\",\n\t\t\t\t\tcategory: alreadyDeleted ? \"generic\" : \"error\",\n\t\t\t\t\t...tagCodeArtifacts({ id: dataStoreId }),\n\t\t\t\t\tdetails: { alreadyDeleted },\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdataStoreContext.delete();\n\n\t\t\t// Delete the contexts of sweep ready data stores.\n\t\t\tthis.contexts.delete(dataStoreId);\n\t\t\t// Delete the summarizer node of the sweep ready data stores.\n\t\t\tthis.deleteChildSummarizerNodeFn(dataStoreId);\n\t\t}\n\t\treturn Array.from(sweepReadyDataStoreRoutes);\n\t}\n\n\t/**\n\t * This is called to update objects whose routes are tombstones.\n\t *\n\t * A Tombstoned object has been unreferenced long enough that GC knows it won't be referenced again.\n\t * Tombstoned objects are eventually deleted by GC.\n\t *\n\t * @param tombstonedRoutes - The routes that are tombstones in all data stores in this Container.\n\t */\n\tpublic updateTombstonedRoutes(tombstonedRoutes: readonly string[]) {\n\t\tconst tombstonedDataStoresSet: Set<string> = new Set();\n\t\tfor (const route of tombstonedRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\t// Tombstone data store only if its route (/datastoreId) is directly in tombstoneRoutes.\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst dataStoreId = pathParts[1];\n\t\t\tassert(this.contexts.has(dataStoreId), 0x510 /* No data store with specified id */);\n\t\t\ttombstonedDataStoresSet.add(dataStoreId);\n\t\t}\n\n\t\t// Update the used routes in each data store. Used routes is empty for unused data stores.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.setTombstone(tombstonedDataStoresSet.has(contextId));\n\t\t}\n\t}\n\n\t/**\n\t * Returns the outbound routes of this channel. Only root data stores are considered referenced and their paths are\n\t * part of outbound routes.\n\t */\n\tprivate async getOutboundRoutes(): Promise<string[]> {\n\t\tconst outboundRoutes: string[] = [];\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tconst isRootDataStore = await context.isRoot();\n\t\t\tif (isRootDataStore) {\n\t\t\t\toutboundRoutes.push(`/${contextId}`);\n\t\t\t}\n\t\t}\n\t\treturn outboundRoutes;\n\t}\n\n\t/**\n\t * Called by GC to retrieve the package path of a data store node with the given path.\n\t */\n\tpublic async getDataStorePackagePath(nodePath: string): Promise<readonly string[] | undefined> {\n\t\t// If the node belongs to a data store, return its package path. For DDSes, we return the package path of the\n\t\t// data store that contains it.\n\t\tconst context = this.contexts.get(nodePath.split(\"/\")[1]);\n\t\treturn (await context?.getInitialSnapshotDetails())?.pkg;\n\t}\n\n\t/**\n\t * Called by GC to determine if a node is for a data store or for an object within a data store (for e.g. DDS).\n\t * @returns the GC node type if the node belongs to a data store or object within data store, undefined otherwise.\n\t */\n\tpublic getGCNodeType(nodePath: string): GCNodeType | undefined {\n\t\tconst pathParts = nodePath.split(\"/\");\n\t\tif (!this.contexts.has(pathParts[1])) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Data stores paths are of the format \"/dataStoreId\".\n\t\t// Sub data store paths are of the format \"/dataStoreId/subPath/...\".\n\t\tif (pathParts.length === 2) {\n\t\t\treturn GCNodeType.DataStore;\n\t\t}\n\t\treturn GCNodeType.SubDataStore;\n\t}\n}\n\nexport function getSummaryForDatastores(\n\tsnapshot: ISnapshotTree | undefined,\n\tmetadata?: IContainerRuntimeMetadata,\n): ISnapshotTree | undefined {\n\tif (!snapshot) {\n\t\treturn undefined;\n\t}\n\n\tif (rootHasIsolatedChannels(metadata)) {\n\t\tconst datastoresSnapshot = snapshot.trees[channelsTreeName];\n\t\tassert(!!datastoresSnapshot, 0x168 /* Expected tree in snapshot not found */);\n\t\treturn datastoresSnapshot;\n\t} else {\n\t\t// back-compat: strip out all non-datastore paths before giving to DataStores object.\n\t\tconst datastoresTrees: ISnapshotTree[\"trees\"] = {};\n\t\tfor (const [key, value] of Object.entries(snapshot.trees)) {\n\t\t\tif (!nonDataStorePaths.includes(key)) {\n\t\t\t\tdatastoresTrees[key] = value;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\t...snapshot,\n\t\t\ttrees: datastoresTrees,\n\t\t};\n\t}\n}\n\n/**\n * Traverse this op's contents and detect any outbound routes that were added by this op.\n */\nexport function detectOutboundReferences(\n\tenvelope: IEnvelope,\n\taddedOutboundReference: (fromNodePath: string, toNodePath: string) => void,\n): void {\n\t// These will be built up as we traverse the envelope contents\n\tconst outboundPaths: string[] = [];\n\tlet ddsAddress: string | undefined;\n\n\tfunction recursivelyFindHandles(obj: unknown) {\n\t\tif (typeof obj === \"object\" && obj !== null) {\n\t\t\tfor (const [key, value] of Object.entries(obj)) {\n\t\t\t\t// If 'value' is a serialized IFluidHandle, it represents a new outbound route.\n\t\t\t\tif (isSerializedHandle(value)) {\n\t\t\t\t\toutboundPaths.push(value.url);\n\t\t\t\t}\n\n\t\t\t\t// NOTE: This is taking a hard dependency on the fact that in our DataStore implementation,\n\t\t\t\t// the address of the DDS is stored in a property called \"address\". This is not ideal.\n\t\t\t\t// An alternative would be for the op envelope to include the absolute path (built up as it is submitted)\n\t\t\t\tif (key === \"address\" && ddsAddress === undefined) {\n\t\t\t\t\tddsAddress = value;\n\t\t\t\t}\n\n\t\t\t\trecursivelyFindHandles(value);\n\t\t\t}\n\t\t}\n\t}\n\n\trecursivelyFindHandles(envelope.contents);\n\n\t// GC node paths are all absolute paths, hence the \"\" prefix.\n\t// e.g. this will yield \"/dataStoreId/ddsId\"\n\tconst fromPath = [\"\", envelope.address, ddsAddress].join(\"/\");\n\toutboundPaths.forEach((toPath) => addedOutboundReference(fromPath, toPath));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deltaManagerProxyBase.js","sourceRoot":"","sources":["../src/deltaManagerProxyBase.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,+DAA8D;AAgB9D;;;GAGG;AACH,MAAa,qBACZ,SAAQ,6BAAmC;IAG3C,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAW,OAAO;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,IAAW,QAAQ;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;IACxC,CAAC;IAED,IAAW,qBAAqB;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC;IAChD,CAAC;IAED,IAAW,kBAAkB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;IAC7C,CAAC;IAED,IAAW,WAAW;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;IACtC,CAAC;IAED,IAAW,kBAAkB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC;IAC7C,CAAC;IAED,IAAW,qBAAqB;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC;IAChD,CAAC;IAED,IAAW,2BAA2B;QACrC,OAAO,IAAI,CAAC,YAAY,CAAC,2BAA2B,CAAC;IACtD,CAAC;IAED,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;IACxC,CAAC;IAED,IAAW,OAAO;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IAClC,CAAC;IAED,IAAW,cAAc;QACxB,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;IACzC,CAAC;IAED,IAAW,oBAAoB;QAC9B,OAAO,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC;IAC/C,CAAC;IAED,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;IACvC,CAAC;IAED,YACoB,YAAwE;QAE3F,KAAK,CAAC,YAAY,CAAC,CAAC;QAFD,iBAAY,GAAZ,YAAY,CAA4D;IAG5F,CAAC;IAEM,OAAO;QACb,KAAK,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEM,YAAY,CAAC,OAAY,EAAE,cAAuB;QACxD,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK;QACX,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;CACD;AArFD,sDAqFC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventForwarder } from \"@fluid-internal/client-utils\";\nimport {\n\tIDeltaManager,\n\tIDeltaManagerEvents,\n\tIDeltaQueue,\n\tIDeltaSender,\n\tReadOnlyInfo,\n} from \"@fluidframework/container-definitions\";\nimport {\n\tIClientConfiguration,\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n} from \"@fluidframework/protocol-definitions\";\n\n/**\n * Base class for creating proxy to the real delta manager. It implements all required methods on IDeltaManager and\n * proxy implementations can override specific methods.\n */\nexport class DeltaManagerProxyBase\n\textends EventForwarder<IDeltaManagerEvents>\n\timplements IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>\n{\n\tpublic get IDeltaSender(): IDeltaSender {\n\t\treturn this;\n\t}\n\n\tpublic get inbound(): IDeltaQueue<ISequencedDocumentMessage> {\n\t\treturn this.deltaManager.inbound;\n\t}\n\n\tpublic get outbound(): IDeltaQueue<IDocumentMessage[]> {\n\t\treturn this.deltaManager.outbound;\n\t}\n\n\tpublic get inboundSignal(): IDeltaQueue<ISignalMessage> {\n\t\treturn this.deltaManager.inboundSignal;\n\t}\n\n\tpublic get minimumSequenceNumber(): number {\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastSequenceNumber(): number {\n\t\treturn this.deltaManager.lastSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\treturn this.deltaManager.lastMessage;\n\t}\n\n\tpublic get lastKnownSeqNumber() {\n\t\treturn this.deltaManager.lastKnownSeqNumber;\n\t}\n\n\tpublic get initialSequenceNumber(): number {\n\t\treturn this.deltaManager.initialSequenceNumber;\n\t}\n\n\tpublic get hasCheckpointSequenceNumber() {\n\t\treturn this.deltaManager.hasCheckpointSequenceNumber;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.deltaManager.clientDetails;\n\t}\n\n\tpublic get version(): string {\n\t\treturn this.deltaManager.version;\n\t}\n\n\tpublic get maxMessageSize(): number {\n\t\treturn this.deltaManager.maxMessageSize;\n\t}\n\n\tpublic get serviceConfiguration(): IClientConfiguration | undefined {\n\t\treturn this.deltaManager.serviceConfiguration;\n\t}\n\n\tpublic get active(): boolean {\n\t\treturn this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper(deltaManager);\n\t}\n\n\tpublic dispose(): void {\n\t\tsuper.dispose();\n\t}\n\n\tpublic submitSignal(content: any, targetClientId?: string): void {\n\t\treturn this.deltaManager.submitSignal(content, targetClientId);\n\t}\n\n\tpublic flush(): void {\n\t\treturn this.deltaManager.flush();\n\t}\n}\n"]}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.DeltaManagerSummarizerProxy = void 0;
|
|
8
|
-
const deltaManagerProxyBase_1 = require("./deltaManagerProxyBase
|
|
9
|
-
const summary_1 = require("./summary
|
|
8
|
+
const deltaManagerProxyBase_1 = require("./deltaManagerProxyBase");
|
|
9
|
+
const summary_1 = require("./summary");
|
|
10
10
|
/**
|
|
11
11
|
* Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:
|
|
12
12
|
* - Summarizer client should be read-only to layers below the container runtime to restrict local changes.
|
|
@@ -39,4 +39,4 @@ class DeltaManagerSummarizerProxy extends deltaManagerProxyBase_1.DeltaManagerPr
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
exports.DeltaManagerSummarizerProxy = DeltaManagerSummarizerProxy;
|
|
42
|
-
//# sourceMappingURL=deltaManagerSummarizerProxy.
|
|
42
|
+
//# sourceMappingURL=deltaManagerSummarizerProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deltaManagerSummarizerProxy.js","sourceRoot":"","sources":["../src/deltaManagerSummarizerProxy.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAKH,mEAAgE;AAChE,uCAAiD;AAEjD;;;;GAIG;AACH,MAAa,2BACZ,SAAQ,6CAAqB;IAG7B,IAAW,MAAM;QAChB,0GAA0G;QAC1G,gEAAgE;QAChE,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IAC7D,CAAC;IAED,IAAW,YAAY;QACtB,+GAA+G;QAC/G,iHAAiH;QACjH,IAAI,IAAI,CAAC,kBAAkB,EAAE;YAC5B,OAAO;gBACN,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,KAAK;gBACb,WAAW,EAAE,SAAS;gBACtB,WAAW,EAAE,KAAK;aAClB,CAAC;SACF;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;IACvC,CAAC;IAID,YAAY,YAAwE;QACnF,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,kHAAkH;QAClH,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,KAAK,8BAAoB,CAAC;IACzF,CAAC;CACD;AAhCD,kEAgCC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDeltaManager, ReadOnlyInfo } from \"@fluidframework/container-definitions\";\nimport { IDocumentMessage, ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\n\nimport { DeltaManagerProxyBase } from \"./deltaManagerProxyBase\";\nimport { summarizerClientType } from \"./summary\";\n\n/**\n * Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:\n * - Summarizer client should be read-only to layers below the container runtime to restrict local changes.\n * - Summarizer client should not be active to layers below the container runtime to restrict local changes.\n */\nexport class DeltaManagerSummarizerProxy\n\textends DeltaManagerProxyBase\n\timplements IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>\n{\n\tpublic get active(): boolean {\n\t\t// Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer\n\t\t// except for the SummarizeOp which is generated by the runtime.\n\t\treturn !this.isSummarizerClient && this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\t// Summarizer clients should be read-only as far as the runtime and layers below are concerned. There shouldn't\n\t\t// be any local changes (writes) in the summarizer except for the summarize op which is generated by the runtime.\n\t\tif (this.isSummarizerClient) {\n\t\t\treturn {\n\t\t\t\treadonly: true,\n\t\t\t\tforced: false,\n\t\t\t\tpermissions: undefined,\n\t\t\t\tstorageOnly: false,\n\t\t\t};\n\t\t}\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tprivate readonly isSummarizerClient: boolean;\n\n\tconstructor(deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>) {\n\t\tsuper(deltaManager);\n\t\t// We are expecting this class to have many listeners, so we suppress noisy \"MaxListenersExceededWarning\" logging.\n\t\tsuper.setMaxListeners(0);\n\t\tthis.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deltaScheduler.js","sourceRoot":"","sources":["../src/deltaScheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryLoggerExt, formatTick } from \"@fluidframework/telemetry-utils\";\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { IDocumentMessage, ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\n\n/**\n * DeltaScheduler is responsible for the scheduling of inbound delta queue in cases where there\n * is more than one op a particular run of the queue. It does not schedule if there is just one\n * op or just one batch in the run. It does the following two things:\n *\n * 1. If the ops have been processed for more than a specific amount of time, it pauses the queue\n * and calls setTimeout to schedule a resume of the queue. This ensures that we don't block\n * the JS thread for a long time processing ops synchronously (for example, when catching up\n * ops right after boot or catching up ops / delayed realizing data stores by summarizer).\n *\n * 2. If we scheduled a particular run of the queue, it logs telemetry for the number of ops\n * processed, the time and number of turns it took to process the ops.\n */\nexport class DeltaScheduler {\n\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\t// The time for processing ops in a single turn.\n\tpublic static readonly processingTime = 50;\n\n\t// The increase in time for processing ops after each turn.\n\tprivate readonly processingTimeIncrement = 10;\n\n\tprivate processingStartTime: number | undefined;\n\tprivate currentAllowedProcessingTimeForTurn: number = DeltaScheduler.processingTime;\n\n\t// This keeps track of the number of times inbound queue has been scheduled. After a particular\n\t// count, we log telemetry for the number of ops processed, the time and number of turns it took\n\t// to process the ops.\n\tprivate schedulingCount: number = 0;\n\n\tprivate schedulingLog:\n\t\t| {\n\t\t\t\topsRemainingToProcess: number;\n\t\t\t\ttotalProcessingTime: number;\n\t\t\t\tnumberOfTurns: number;\n\t\t\t\tnumberOfBatchesProcessed: number;\n\t\t\t\tlastSequenceNumber: number;\n\t\t\t\tfirstSequenceNumber: number;\n\t\t\t\tstartTime: number;\n\t\t }\n\t\t| undefined;\n\n\tconstructor(\n\t\tdeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.deltaManager = deltaManager;\n\t\tthis.deltaManager.inbound.on(\"idle\", () => {\n\t\t\tthis.inboundQueueIdle();\n\t\t});\n\t}\n\n\tpublic batchBegin(message: ISequencedDocumentMessage) {\n\t\tif (!this.processingStartTime) {\n\t\t\tthis.processingStartTime = performance.now();\n\t\t}\n\t\tif (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {\n\t\t\t// Every 500th time we are scheduling the inbound queue, we log telemetry for the\n\t\t\t// number of ops processed, the time and number of turns it took to process the ops.\n\t\t\tthis.schedulingLog = {\n\t\t\t\topsRemainingToProcess: 0,\n\t\t\t\tnumberOfTurns: 1,\n\t\t\t\ttotalProcessingTime: 0,\n\t\t\t\tnumberOfBatchesProcessed: 0,\n\t\t\t\tfirstSequenceNumber: message.sequenceNumber,\n\t\t\t\tlastSequenceNumber: message.sequenceNumber,\n\t\t\t\tstartTime: performance.now(),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic batchEnd(message: ISequencedDocumentMessage) {\n\t\tif (this.schedulingLog) {\n\t\t\tthis.schedulingLog.numberOfBatchesProcessed++;\n\t\t\tthis.schedulingLog.lastSequenceNumber = message.sequenceNumber;\n\t\t\tthis.schedulingLog.opsRemainingToProcess = this.deltaManager.inbound.length;\n\t\t}\n\n\t\tif (this.shouldRunScheduler()) {\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst elapsedTime = currentTime - this.processingStartTime!;\n\t\t\tif (elapsedTime > this.currentAllowedProcessingTimeForTurn) {\n\t\t\t\t// We have processed ops for more than the total processing time. So, pause the\n\t\t\t\t// queue, yield the thread and schedule a resume.\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\t\tthis.deltaManager.inbound.pause();\n\n\t\t\t\t// Increase the total processing time. Keep doing this after each turn until all the ops have\n\t\t\t\t// been processed. This way we keep the responsiveness at the beginning while also making sure\n\t\t\t\t// that all the ops process fairly quickly.\n\t\t\t\tthis.currentAllowedProcessingTimeForTurn += this.processingTimeIncrement;\n\n\t\t\t\t// If we are logging the telemetry this time, update the telemetry log object.\n\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\tthis.schedulingLog.numberOfTurns++;\n\t\t\t\t\tthis.schedulingLog.totalProcessingTime += elapsedTime;\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\t\teventName: \"InboundOpsPartialProcessingTime\",\n\t\t\t\t\t\t\tduration: formatTick(elapsedTime),\n\t\t\t\t\t\t\topsProcessed:\n\t\t\t\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\topsRemainingToProcess: this.deltaManager.inbound.length,\n\t\t\t\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\t\t\t\ttimeToResume: formatTick(performance.now() - currentTime),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.deltaManager.inbound.resume();\n\t\t\t\t});\n\n\t\t\t\tthis.processingStartTime = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate inboundQueueIdle() {\n\t\tif (this.schedulingLog) {\n\t\t\t// Add the time taken for processing the final ops to the total processing time in the\n\t\t\t// telemetry log object.\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tthis.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;\n\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"InboundOpsProcessingTime\",\n\t\t\t\topsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,\n\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\topsProcessed:\n\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t1,\n\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\tduration: formatTick(currentTime - this.schedulingLog.startTime),\n\t\t\t\tschedulingCount: this.schedulingCount,\n\t\t\t});\n\n\t\t\tthis.schedulingLog = undefined;\n\t\t}\n\n\t\t// If we scheduled this batch of the inbound queue, increment the counter that tracks the\n\t\t// number of times we have done this.\n\t\tthis.schedulingCount++;\n\n\t\t// Reset the processing times.\n\t\tthis.processingStartTime = undefined;\n\t\tthis.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;\n\t}\n\n\t/**\n\t * This function tells whether we should run the scheduler.\n\t */\n\tprivate shouldRunScheduler(): boolean {\n\t\t// If there are still ops in the queue after the one we are processing now, we should\n\t\t// run the scheduler.\n\t\treturn this.deltaManager.inbound.length > 0;\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iFAA4E;AAC5E,qEAAgF;AAEhF;;GAEG;AACH,MAAa,yBAA0B,SAAQ,8BAAY;IAG1D,YACC,OAAe,EACN,QAAgB;QAEzB,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAF/B,aAAQ,GAAR,QAAQ,CAAQ;QAJjB,cAAS,GAAG,2CAAmB,CAAC,yBAAyB,CAAC;IAOnE,CAAC;CACD;AATD,8DASC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ContainerErrorTypes } from \"@fluidframework/container-definitions\";\nimport { IFluidErrorBase, LoggingError } from \"@fluidframework/telemetry-utils\";\n\n/**\n * Error indicating that a client's session has reached its time limit and is closed.\n */\nexport class ClientSessionExpiredError extends LoggingError implements IFluidErrorBase {\n\treadonly errorType = ContainerErrorTypes.clientSessionExpiredError;\n\n\tconstructor(\n\t\tmessage: string,\n\t\treadonly expiryMs: number,\n\t) {\n\t\tsuper(message, { timeoutMs: expiryMs });\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAGN,6BAA6B,EAC7B,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAIN,mBAAmB,
|
|
1
|
+
{"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,16 +9,17 @@ const core_utils_1 = require("@fluidframework/core-utils");
|
|
|
9
9
|
const runtime_definitions_1 = require("@fluidframework/runtime-definitions");
|
|
10
10
|
const runtime_utils_1 = require("@fluidframework/runtime-utils");
|
|
11
11
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
const
|
|
12
|
+
const blobManager_1 = require("../blobManager");
|
|
13
|
+
const containerRuntime_1 = require("../containerRuntime");
|
|
14
|
+
const error_1 = require("../error");
|
|
15
|
+
const messageTypes_1 = require("../messageTypes");
|
|
16
|
+
const gcConfigs_1 = require("./gcConfigs");
|
|
17
|
+
const gcDefinitions_1 = require("./gcDefinitions");
|
|
18
|
+
const gcHelpers_1 = require("./gcHelpers");
|
|
19
|
+
const gcReferenceGraphAlgorithm_1 = require("./gcReferenceGraphAlgorithm");
|
|
20
|
+
const gcSummaryStateTracker_1 = require("./gcSummaryStateTracker");
|
|
21
|
+
const gcUnreferencedStateTracker_1 = require("./gcUnreferencedStateTracker");
|
|
22
|
+
const gcTelemetry_1 = require("./gcTelemetry");
|
|
22
23
|
/**
|
|
23
24
|
* The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains
|
|
24
25
|
* its state across summaries.
|
|
@@ -150,7 +151,7 @@ class GarbageCollector {
|
|
|
150
151
|
*/
|
|
151
152
|
this.initializeGCStateFromBaseSnapshotP = new core_utils_1.LazyPromise(async () => {
|
|
152
153
|
const currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();
|
|
153
|
-
(0, core_utils_1.assert)(currentReferenceTimestampMs !== undefined,
|
|
154
|
+
(0, core_utils_1.assert)(currentReferenceTimestampMs !== undefined, 0x8a4 /* Trying to initialize GC state without current timestamp */);
|
|
154
155
|
/**
|
|
155
156
|
* The base snapshot data will not be present if the container is loaded from:
|
|
156
157
|
* 1. The first summary created by the detached container.
|
|
@@ -167,7 +168,7 @@ class GarbageCollector {
|
|
|
167
168
|
const gcNodes = {};
|
|
168
169
|
for (const [nodeId, nodeData] of Object.entries(baseSnapshotData.gcState.gcNodes)) {
|
|
169
170
|
if (nodeData.unreferencedTimestampMs !== undefined) {
|
|
170
|
-
this.unreferencedNodesState.set(nodeId, new gcUnreferencedStateTracker_1.UnreferencedStateTracker(nodeData.unreferencedTimestampMs, this.configs.inactiveTimeoutMs, currentReferenceTimestampMs, this.configs.
|
|
171
|
+
this.unreferencedNodesState.set(nodeId, new gcUnreferencedStateTracker_1.UnreferencedStateTracker(nodeData.unreferencedTimestampMs, this.configs.inactiveTimeoutMs, currentReferenceTimestampMs, this.configs.tombstoneTimeoutMs, this.configs.sweepGracePeriodMs));
|
|
171
172
|
}
|
|
172
173
|
gcNodes[nodeId] = Array.from(nodeData.outboundRoutes);
|
|
173
174
|
}
|
|
@@ -271,6 +272,7 @@ class GarbageCollector {
|
|
|
271
272
|
this.mc.logger.sendErrorEvent({
|
|
272
273
|
eventName: "GCInitializationOrUpdateFailed",
|
|
273
274
|
gcConfigs: JSON.stringify(this.configs),
|
|
275
|
+
clientId,
|
|
274
276
|
}, error);
|
|
275
277
|
});
|
|
276
278
|
}
|
|
@@ -329,8 +331,11 @@ class GarbageCollector {
|
|
|
329
331
|
const gcStats = await this.runGC(fullGC, currentReferenceTimestampMs, logger);
|
|
330
332
|
event.end({
|
|
331
333
|
...gcStats,
|
|
332
|
-
|
|
333
|
-
|
|
334
|
+
details: {
|
|
335
|
+
timestamp: currentReferenceTimestampMs,
|
|
336
|
+
sweep: this.configs.shouldRunSweep,
|
|
337
|
+
tombstone: this.configs.throwOnTombstoneLoad,
|
|
338
|
+
},
|
|
334
339
|
});
|
|
335
340
|
/** Post-GC steps */
|
|
336
341
|
// Log pending unreferenced events such as a node being used after inactive. This is done after GC runs and
|
|
@@ -411,7 +416,7 @@ class GarbageCollector {
|
|
|
411
416
|
for (const nodeId of gcResult.deletedNodeIds) {
|
|
412
417
|
const nodeStateTracker = this.unreferencedNodesState.get(nodeId);
|
|
413
418
|
if (nodeStateTracker === undefined) {
|
|
414
|
-
this.unreferencedNodesState.set(nodeId, new gcUnreferencedStateTracker_1.UnreferencedStateTracker(currentReferenceTimestampMs, this.configs.inactiveTimeoutMs, currentReferenceTimestampMs, this.configs.
|
|
419
|
+
this.unreferencedNodesState.set(nodeId, new gcUnreferencedStateTracker_1.UnreferencedStateTracker(currentReferenceTimestampMs, this.configs.inactiveTimeoutMs, currentReferenceTimestampMs, this.configs.tombstoneTimeoutMs, this.configs.sweepGracePeriodMs));
|
|
415
420
|
}
|
|
416
421
|
else {
|
|
417
422
|
// If a node was already unreferenced, update its tracking information. Since the current reference time
|
|
@@ -594,7 +599,7 @@ class GarbageCollector {
|
|
|
594
599
|
gcFeatureMatrix: this.configs.persistedGcFeatureMatrix,
|
|
595
600
|
sessionExpiryTimeoutMs: this.configs.sessionExpiryTimeoutMs,
|
|
596
601
|
sweepEnabled: false,
|
|
597
|
-
|
|
602
|
+
tombstoneTimeoutMs: this.configs.tombstoneTimeoutMs,
|
|
598
603
|
};
|
|
599
604
|
}
|
|
600
605
|
/**
|
|
@@ -724,6 +729,16 @@ class GarbageCollector {
|
|
|
724
729
|
if (!this.configs.shouldRunGC) {
|
|
725
730
|
return;
|
|
726
731
|
}
|
|
732
|
+
if (!toNodePath.startsWith("/")) {
|
|
733
|
+
// A long time ago we stored handles with relatives paths. We don't expect to see these cases though
|
|
734
|
+
// because GC was enabled only after we made the switch to always using absolute paths.
|
|
735
|
+
this.mc.logger.sendErrorEvent({
|
|
736
|
+
eventName: "InvalidRelativeOutboundRoute",
|
|
737
|
+
...(0, telemetry_utils_1.tagCodeArtifacts)({ fromId: fromNodePath, id: toNodePath }),
|
|
738
|
+
});
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
741
|
+
(0, core_utils_1.assert)(fromNodePath.startsWith("/"), 0x8a5 /* fromNodePath must be an absolute path */);
|
|
727
742
|
const outboundRoutes = this.newReferencesSinceLastRun.get(fromNodePath) ?? [];
|
|
728
743
|
outboundRoutes.push(toNodePath);
|
|
729
744
|
this.newReferencesSinceLastRun.set(fromNodePath, outboundRoutes);
|
|
@@ -823,9 +838,24 @@ class GarbageCollector {
|
|
|
823
838
|
deletedDataStoreCount: 0,
|
|
824
839
|
deletedAttachmentBlobCount: 0,
|
|
825
840
|
};
|
|
841
|
+
// The runtime can't reliably identify the type of deleted nodes. So, get the type here. This should
|
|
842
|
+
// be good enough because the only types that participate in GC today are data stores, DDSes and blobs.
|
|
843
|
+
const getDeletedNodeType = (nodeId) => {
|
|
844
|
+
const pathParts = nodeId.split("/");
|
|
845
|
+
if (pathParts[1] === blobManager_1.BlobManager.basePath) {
|
|
846
|
+
return gcDefinitions_1.GCNodeType.Blob;
|
|
847
|
+
}
|
|
848
|
+
if (pathParts.length === 2) {
|
|
849
|
+
return gcDefinitions_1.GCNodeType.DataStore;
|
|
850
|
+
}
|
|
851
|
+
if (pathParts.length === 3) {
|
|
852
|
+
return gcDefinitions_1.GCNodeType.SubDataStore;
|
|
853
|
+
}
|
|
854
|
+
return gcDefinitions_1.GCNodeType.Other;
|
|
855
|
+
};
|
|
826
856
|
for (const nodeId of deletedNodes) {
|
|
827
857
|
sweepPhaseStats.deletedNodeCount++;
|
|
828
|
-
const nodeType =
|
|
858
|
+
const nodeType = getDeletedNodeType(nodeId);
|
|
829
859
|
if (nodeType === gcDefinitions_1.GCNodeType.DataStore) {
|
|
830
860
|
sweepPhaseStats.deletedDataStoreCount++;
|
|
831
861
|
}
|
|
@@ -858,4 +888,4 @@ class GarbageCollector {
|
|
|
858
888
|
}
|
|
859
889
|
}
|
|
860
890
|
exports.GarbageCollector = GarbageCollector;
|
|
861
|
-
//# sourceMappingURL=garbageCollection.
|
|
891
|
+
//# sourceMappingURL=garbageCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"garbageCollection.js","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, LazyPromise, Timer } from \"@fluidframework/core-utils\";\nimport { IRequest } from \"@fluidframework/core-interfaces\";\nimport {\n\tgcTreeKey,\n\tIGarbageCollectionData,\n\tIGarbageCollectionDetailsBase,\n\tISummarizeResult,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport { createResponseError, responseToException } from \"@fluidframework/runtime-utils\";\nimport {\n\tcreateChildLogger,\n\tcreateChildMonitoringContext,\n\tDataProcessingError,\n\tITelemetryLoggerExt,\n\tMonitoringContext,\n\tPerformanceEvent,\n\ttagCodeArtifacts,\n} from \"@fluidframework/telemetry-utils\";\nimport { BlobManager } from \"../blobManager\";\nimport {\n\tInactiveResponseHeaderKey,\n\tRuntimeHeaderData,\n\tTombstoneResponseHeaderKey,\n} from \"../containerRuntime\";\nimport { ClientSessionExpiredError } from \"../error\";\nimport { ContainerMessageType, ContainerRuntimeGCMessage } from \"../messageTypes\";\nimport { IRefreshSummaryResult } from \"../summary\";\nimport { generateGCConfigs } from \"./gcConfigs\";\nimport {\n\tGCNodeType,\n\tIGarbageCollector,\n\tIGarbageCollectorCreateParams,\n\tIGarbageCollectionRuntime,\n\tIGCResult,\n\tIGCStats,\n\tUnreferencedState,\n\tIGCMetadata,\n\tIGarbageCollectorConfigs,\n\tIMarkPhaseStats,\n\tISweepPhaseStats,\n\tGarbageCollectionMessage,\n\tGarbageCollectionMessageType,\n} from \"./gcDefinitions\";\nimport {\n\tcloneGCData,\n\tcompatBehaviorAllowsGCMessageType,\n\tconcatGarbageCollectionData,\n\tgetGCDataFromSnapshot,\n} from \"./gcHelpers\";\nimport { runGarbageCollection } from \"./gcReferenceGraphAlgorithm\";\nimport { IGarbageCollectionSnapshotData, IGarbageCollectionState } from \"./gcSummaryDefinitions\";\nimport { GCSummaryStateTracker } from \"./gcSummaryStateTracker\";\nimport { UnreferencedStateTracker } from \"./gcUnreferencedStateTracker\";\nimport { GCTelemetryTracker } from \"./gcTelemetry\";\n\n/**\n * The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains\n * its state across summaries.\n *\n * Node - represented as nodeId, it's a node on the GC graph\n *\n * Outbound Route - a path from one node to another node, think `nodeA` -\\> `nodeB`\n *\n * Graph - all nodes with their respective routes\n *\n * ```\n *\t\t\t GC Graph\n *\n *\t\t\t Node\n *\t\tNodeId = \"datastore1\"\n *\t\t /\t\t\t \\\\\n *\tOutboundRoute OutboundRoute\n *\t\t /\t\t\t\t \\\\\n *\t Node\t\t\t Node\n * NodeId = \"dds1\"\t NodeId = \"dds2\"\n * ```\n */\nexport class GarbageCollector implements IGarbageCollector {\n\tpublic static create(createParams: IGarbageCollectorCreateParams): IGarbageCollector {\n\t\treturn new GarbageCollector(createParams);\n\t}\n\n\tprivate readonly mc: MonitoringContext;\n\n\tprivate readonly configs: IGarbageCollectorConfigs;\n\n\tpublic get shouldRunGC(): boolean {\n\t\treturn this.configs.shouldRunGC;\n\t}\n\n\t// Keeps track of the GC state from the last run.\n\tprivate gcDataFromLastRun: IGarbageCollectionData | undefined;\n\t// Keeps a list of references (edges in the GC graph) between GC runs. Each entry has a node id and a list of\n\t// outbound routes from that node.\n\tprivate readonly newReferencesSinceLastRun: Map<string, string[]> = new Map();\n\t// A list of nodes that have been tombstoned.\n\tprivate tombstones: string[] = [];\n\t// A list of nodes that have been deleted during sweep phase.\n\tprivate deletedNodes: Set<string> = new Set();\n\n\t// Promise when resolved returns the GC data data in the base snapshot.\n\tprivate readonly baseSnapshotDataP: Promise<IGarbageCollectionSnapshotData | undefined>;\n\t// Promise when resolved initializes the GC state from the data in the base snapshot.\n\tprivate readonly initializeGCStateFromBaseSnapshotP: Promise<void>;\n\t// The GC details generated from the base snapshot.\n\tprivate readonly baseGCDetailsP: Promise<IGarbageCollectionDetailsBase>;\n\t// Map of node ids to their unreferenced state tracker.\n\tprivate readonly unreferencedNodesState: Map<string, UnreferencedStateTracker> = new Map();\n\t// The Timer responsible for closing the container when the session has expired\n\tprivate sessionExpiryTimer: Timer | undefined;\n\n\t// The number of times GC has successfully completed on this instance of GarbageCollector.\n\tprivate completedRuns = 0;\n\n\tprivate readonly runtime: IGarbageCollectionRuntime;\n\tprivate readonly isSummarizerClient: boolean;\n\n\tprivate readonly summaryStateTracker: GCSummaryStateTracker;\n\tprivate readonly telemetryTracker: GCTelemetryTracker;\n\n\t/** If false, loading or using a Tombstoned object should merely log, not fail */\n\tpublic get tombstoneEnforcementAllowed(): boolean {\n\t\treturn this.configs.sweepEnabled;\n\t}\n\t/** If true, throw an error when a tombstone data store is retrieved */\n\tpublic get throwOnTombstoneLoad(): boolean {\n\t\treturn this.configs.throwOnTombstoneLoad;\n\t}\n\t/** If true, throw an error when a tombstone data store is used */\n\tpublic get throwOnTombstoneUsage(): boolean {\n\t\treturn this.configs.throwOnTombstoneUsage;\n\t}\n\n\t/** For a given node path, returns the node's package path. */\n\tprivate readonly getNodePackagePath: (\n\t\tnodePath: string,\n\t) => Promise<readonly string[] | undefined>;\n\t/** Returns the timestamp of the last summary generated for this container. */\n\tprivate readonly getLastSummaryTimestampMs: () => number | undefined;\n\n\tprivate readonly submitMessage: (message: ContainerRuntimeGCMessage) => void;\n\n\tpublic get summaryStateNeedsReset(): boolean {\n\t\treturn this.summaryStateTracker.doesSummaryStateNeedReset;\n\t}\n\n\t/** Returns the count of data stores whose GC state updated since the last summary. */\n\tpublic get updatedDSCountSinceLastSummary(): number {\n\t\treturn this.summaryStateTracker.updatedDSCountSinceLastSummary;\n\t}\n\n\tprotected constructor(createParams: IGarbageCollectorCreateParams) {\n\t\tthis.runtime = createParams.runtime;\n\t\tthis.isSummarizerClient = createParams.isSummarizerClient;\n\t\tthis.getNodePackagePath = createParams.getNodePackagePath;\n\t\tthis.getLastSummaryTimestampMs = createParams.getLastSummaryTimestampMs;\n\t\tthis.submitMessage = createParams.submitMessage;\n\n\t\tconst baseSnapshot = createParams.baseSnapshot;\n\t\tconst readAndParseBlob = createParams.readAndParseBlob;\n\n\t\tthis.mc = createChildMonitoringContext({\n\t\t\tlogger: createParams.baseLogger,\n\t\t\tnamespace: \"GarbageCollector\",\n\t\t\tproperties: {\n\t\t\t\tall: { completedGCRuns: () => this.completedRuns },\n\t\t\t},\n\t\t});\n\n\t\tthis.configs = generateGCConfigs(this.mc, createParams);\n\n\t\t// If session expiry is enabled, we need to close the container when the session expiry timeout expires.\n\t\tif (this.configs.sessionExpiryTimeoutMs !== undefined) {\n\t\t\t// If Test Override config is set, override Session Expiry timeout.\n\t\t\tconst overrideSessionExpiryTimeoutMs = this.mc.config.getNumber(\n\t\t\t\t\"Fluid.GarbageCollection.TestOverride.SessionExpiryMs\",\n\t\t\t);\n\t\t\tconst timeoutMs = overrideSessionExpiryTimeoutMs ?? this.configs.sessionExpiryTimeoutMs;\n\n\t\t\tthis.sessionExpiryTimer = new Timer(timeoutMs, () => {\n\t\t\t\tthis.runtime.closeFn(\n\t\t\t\t\tnew ClientSessionExpiredError(`Client session expired.`, timeoutMs),\n\t\t\t\t);\n\t\t\t});\n\t\t\tthis.sessionExpiryTimer.start();\n\t\t}\n\n\t\tthis.summaryStateTracker = new GCSummaryStateTracker(\n\t\t\tthis.configs,\n\t\t\tbaseSnapshot?.trees[gcTreeKey] !== undefined /* wasGCRunInBaseSnapshot */,\n\t\t);\n\n\t\tthis.telemetryTracker = new GCTelemetryTracker(\n\t\t\tthis.mc,\n\t\t\tthis.configs,\n\t\t\tthis.isSummarizerClient,\n\t\t\tcreateParams.createContainerMetadata,\n\t\t\t(nodeId: string) => this.runtime.getNodeType(nodeId),\n\t\t\t(nodeId: string) => this.unreferencedNodesState.get(nodeId),\n\t\t\tthis.getNodePackagePath,\n\t\t);\n\n\t\t// Get the GC data from the base snapshot. Use LazyPromise because we only want to do this once since it\n\t\t// it involves fetching blobs from storage which is expensive.\n\t\tthis.baseSnapshotDataP = new LazyPromise<IGarbageCollectionSnapshotData | undefined>(\n\t\t\tasync () => {\n\t\t\t\tif (baseSnapshot === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\t// For newer documents, GC data should be present in the GC tree in the root of the snapshot.\n\t\t\t\t\tconst gcSnapshotTree = baseSnapshot.trees[gcTreeKey];\n\t\t\t\t\tif (gcSnapshotTree === undefined) {\n\t\t\t\t\t\t// back-compat - Older documents get their gc data reset for simplicity as there are few of them\n\t\t\t\t\t\t// incremental gc summary will not work with older gc data as well\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst snapshotData = await getGCDataFromSnapshot(\n\t\t\t\t\t\tgcSnapshotTree,\n\t\t\t\t\t\treadAndParseBlob,\n\t\t\t\t\t);\n\n\t\t\t\t\t// If the GC version in base snapshot does not match the GC version currently in effect, the GC data\n\t\t\t\t\t// in the snapshot cannot be interpreted correctly. Set everything to undefined except for\n\t\t\t\t\t// deletedNodes because irrespective of GC versions, these nodes have been deleted and cannot be\n\t\t\t\t\t// brought back. The deletedNodes info is needed to identify when these nodes are used.\n\t\t\t\t\tif (this.configs.gcVersionInEffect !== this.configs.gcVersionInBaseSnapshot) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tgcState: undefined,\n\t\t\t\t\t\t\ttombstones: undefined,\n\t\t\t\t\t\t\tdeletedNodes: snapshotData.deletedNodes,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn snapshotData;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst dpe = DataProcessingError.wrapIfUnrecognized(\n\t\t\t\t\t\terror,\n\t\t\t\t\t\t\"FailedToInitializeGC\",\n\t\t\t\t\t);\n\t\t\t\t\tdpe.addTelemetryProperties({\n\t\t\t\t\t\tgcConfigs: JSON.stringify(this.configs),\n\t\t\t\t\t});\n\t\t\t\t\tthrow dpe;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\t/**\n\t\t * Set up the initializer which initializes the GC state from the data in base snapshot. It sets up GC data\n\t\t * from the base GC state and starts tracking the state of unreferenced nodes.\n\t\t *\n\t\t * Must only be called if there is a current reference timestamp.\n\t\t */\n\t\tthis.initializeGCStateFromBaseSnapshotP = new LazyPromise<void>(async () => {\n\t\t\tconst currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();\n\t\t\tassert(\n\t\t\t\tcurrentReferenceTimestampMs !== undefined,\n\t\t\t\t0x8a4 /* Trying to initialize GC state without current timestamp */,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * The base snapshot data will not be present if the container is loaded from:\n\t\t\t * 1. The first summary created by the detached container.\n\t\t\t * 2. A summary that was generated with GC disabled.\n\t\t\t * 3. A summary that was generated before GC even existed.\n\t\t\t */\n\t\t\tconst baseSnapshotData = await this.baseSnapshotDataP;\n\t\t\tthis.summaryStateTracker.initializeBaseState(baseSnapshotData);\n\n\t\t\tif (baseSnapshotData?.gcState === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update unreferenced state tracking as per the GC state in the snapshot data and update gcDataFromLastRun\n\t\t\t// to the GC data from the snapshot data.\n\t\t\tconst gcNodes: { [id: string]: string[] } = {};\n\t\t\tfor (const [nodeId, nodeData] of Object.entries(baseSnapshotData.gcState.gcNodes)) {\n\t\t\t\tif (nodeData.unreferencedTimestampMs !== undefined) {\n\t\t\t\t\tthis.unreferencedNodesState.set(\n\t\t\t\t\t\tnodeId,\n\t\t\t\t\t\tnew UnreferencedStateTracker(\n\t\t\t\t\t\t\tnodeData.unreferencedTimestampMs,\n\t\t\t\t\t\t\tthis.configs.inactiveTimeoutMs,\n\t\t\t\t\t\t\tcurrentReferenceTimestampMs,\n\t\t\t\t\t\t\tthis.configs.tombstoneTimeoutMs,\n\t\t\t\t\t\t\tthis.configs.sweepGracePeriodMs,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tgcNodes[nodeId] = Array.from(nodeData.outboundRoutes);\n\t\t\t}\n\t\t\tthis.gcDataFromLastRun = { gcNodes };\n\t\t});\n\n\t\t// Get the GC details from the GC state in the base summary. This is returned in getBaseGCDetails which is\n\t\t// used to initialize the GC state of all the nodes in the container.\n\t\tthis.baseGCDetailsP = new LazyPromise<IGarbageCollectionDetailsBase>(async () => {\n\t\t\tconst baseSnapshotData = await this.baseSnapshotDataP;\n\t\t\tif (baseSnapshotData?.gcState === undefined) {\n\t\t\t\treturn {};\n\t\t\t}\n\n\t\t\tconst gcNodes: { [id: string]: string[] } = {};\n\t\t\tfor (const [nodeId, nodeData] of Object.entries(baseSnapshotData.gcState.gcNodes)) {\n\t\t\t\tgcNodes[nodeId] = Array.from(nodeData.outboundRoutes);\n\t\t\t}\n\t\t\t// Run GC on the nodes in the base summary to get the routes used in each node in the container.\n\t\t\t// This is an optimization for space (vs performance) wherein we don't need to store the used routes of\n\t\t\t// each node in the summary.\n\t\t\tconst usedRoutes = runGarbageCollection(gcNodes, [\"/\"]).referencedNodeIds;\n\n\t\t\treturn { gcData: { gcNodes }, usedRoutes };\n\t\t});\n\n\t\t// Log all the GC options and the state determined by the garbage collector.\n\t\t// This is useful even for interactive clients since they track unreferenced nodes and log errors.\n\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\teventName: \"GarbageCollectorLoaded\",\n\t\t\tgcConfigs: JSON.stringify(this.configs),\n\t\t\tgcOptions: JSON.stringify(createParams.gcOptions),\n\t\t\t...createParams.createContainerMetadata,\n\t\t});\n\t}\n\n\t/**\n\t * Called during container initialization. Initializes the tombstone and deleted nodes state from the base snapshot.\n\t * Also, initializes the GC state including unreferenced nodes tracking if a current reference timestamp exists.\n\t * Note that if there is any GC state in the base snapshot, then there will definitely be a reference timestamp\n\t * to work with - The GC state would have been generated using a timestamp which is part of the snapshot.\n\t */\n\tpublic async initializeBaseState(): Promise<void> {\n\t\tconst baseSnapshotData = await this.baseSnapshotDataP;\n\t\t/**\n\t\t * The base snapshot data will not be present if the container is loaded from:\n\t\t * 1. The first summary created by the detached container.\n\t\t * 2. A summary that was generated with GC disabled.\n\t\t * 3. A summary that was generated before GC even existed.\n\t\t */\n\t\tif (baseSnapshotData === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initialize the deleted nodes from the snapshot. This is done irrespective of whether sweep is enabled or not\n\t\t// to identify deleted nodes' usage.\n\t\tif (baseSnapshotData.deletedNodes !== undefined) {\n\t\t\tthis.deletedNodes = new Set(baseSnapshotData.deletedNodes);\n\t\t}\n\n\t\t// If running in tombstone mode, initialize the tombstone state from the snapshot. Also, notify the runtime of\n\t\t// tombstone routes.\n\t\tif (this.configs.tombstoneMode && baseSnapshotData.tombstones !== undefined) {\n\t\t\t// Create a copy since we are writing from a source we don't control\n\t\t\tthis.tombstones = Array.from(baseSnapshotData.tombstones);\n\t\t\tthis.runtime.updateTombstonedRoutes(this.tombstones);\n\t\t}\n\n\t\tawait this.initializeOrUpdateGCState();\n\t}\n\n\t/**\n\t * Initialize the GC state if not already initialized. If GC state is already initialized, update the unreferenced\n\t * state tracking as per the current reference timestamp.\n\t */\n\tprivate async initializeOrUpdateGCState() {\n\t\tconst currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();\n\t\tif (currentReferenceTimestampMs === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If the GC state hasn't been initialized yet, initialize it and return.\n\t\tif (this.gcDataFromLastRun === undefined) {\n\t\t\tawait this.initializeGCStateFromBaseSnapshotP;\n\t\t\treturn;\n\t\t}\n\n\t\t// If the GC state has been initialized, update the tracking of unreferenced nodes as per the current\n\t\t// reference timestamp.\n\t\tfor (const [, nodeStateTracker] of this.unreferencedNodesState) {\n\t\t\tnodeStateTracker.updateTracking(currentReferenceTimestampMs);\n\t\t}\n\t}\n\n\t/**\n\t * Called when the connection state of the runtime changes, i.e., it connects or disconnects. GC subscribes to this\n\t * to initialize or update the unreference state tracking.\n\t * @param connected - Whether the runtime connected / disconnected.\n\t * @param clientId - The clientId of this runtime.\n\t */\n\tpublic setConnectionState(connected: boolean, clientId?: string | undefined): void {\n\t\t/**\n\t\t * When the client connects (or reconnects), attempt to initialize or update the GC state. This will keep\n\t\t * the unreferenced state tracking updated as per the reference timestamp at the time of connection.\n\t\t *\n\t\t * During GC initialization and during connections in read mode, it is possible that either no ops are\n\t\t * processed or only trailing ops are processed. This means that the GC state is not initialized or initialized\n\t\t * with an older reference timestamp. So, doing this on every connection will keep the unreferenced state\n\t\t * tracking up-to-date.\n\t\t */\n\t\tif (connected && this.configs.shouldRunGC) {\n\t\t\tthis.initializeOrUpdateGCState().catch((error) => {\n\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"GCInitializationOrUpdateFailed\",\n\t\t\t\t\t\tgcConfigs: JSON.stringify(this.configs),\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t},\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Returns a the GC details generated from the base summary. This is used to initialize the GC state of the nodes\n\t * in the container.\n\t */\n\tpublic async getBaseGCDetails(): Promise<IGarbageCollectionDetailsBase> {\n\t\treturn this.baseGCDetailsP;\n\t}\n\n\t/**\n\t * Runs garbage collection and updates the reference / used state of the nodes in the container.\n\t * @returns stats of the GC run or undefined if GC did not run.\n\t */\n\tpublic async collectGarbage(\n\t\toptions: {\n\t\t\t/** Logger to use for logging GC events */\n\t\t\tlogger?: ITelemetryLoggerExt;\n\t\t\t/** True to run GC sweep phase after the mark phase */\n\t\t\trunSweep?: boolean;\n\t\t\t/** True to generate full GC data */\n\t\t\tfullGC?: boolean;\n\t\t},\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<IGCStats | undefined> {\n\t\tconst fullGC =\n\t\t\toptions.fullGC ??\n\t\t\t(this.configs.runFullGC === true || this.summaryStateTracker.doesSummaryStateNeedReset);\n\n\t\t// Add the options that are used to run GC to the telemetry context.\n\t\ttelemetryContext?.setMultiple(\"fluid_GC\", \"Options\", {\n\t\t\tfullGC,\n\t\t\trunSweep: options.runSweep,\n\t\t});\n\n\t\tconst logger = options.logger\n\t\t\t? createChildLogger({\n\t\t\t\t\tlogger: options.logger,\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tall: { completedGCRuns: () => this.completedRuns },\n\t\t\t\t\t},\n\t\t\t })\n\t\t\t: this.mc.logger;\n\n\t\t/**\n\t\t * If there is no current reference timestamp, skip running GC. We need the current timestamp to track\n\t\t * how long objects have been unreferenced and if they should be deleted.\n\t\t *\n\t\t * Note that the only scenario where GC is called and there is no reference timestamp is when no ops have ever\n\t\t * been processed for this container and it is in read mode. In this scenario, there is no point in running GC\n\t\t * anyway because references in the container do not change without any ops, i.e., there is nothing to collect.\n\t\t */\n\t\tconst currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();\n\t\tif (currentReferenceTimestampMs === undefined) {\n\t\t\t// Log an event so we can evaluate how often we run into this scenario.\n\t\t\tlogger.sendErrorEvent({\n\t\t\t\teventName: \"CollectGarbageCalledWithoutTimestamp\",\n\t\t\t\tgcConfigs: JSON.stringify(this.configs),\n\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn PerformanceEvent.timedExecAsync(\n\t\t\tlogger,\n\t\t\t{ eventName: \"GarbageCollection\" },\n\t\t\tasync (event) => {\n\t\t\t\t/** Pre-GC steps */\n\t\t\t\t// Ensure that state has been initialized from the base snapshot data.\n\t\t\t\tawait this.initializeGCStateFromBaseSnapshotP;\n\t\t\t\t// Let the runtime update its pending state before GC runs.\n\t\t\t\tawait this.runtime.updateStateBeforeGC();\n\n\t\t\t\t/** GC step */\n\t\t\t\tconst gcStats = await this.runGC(fullGC, currentReferenceTimestampMs, logger);\n\t\t\t\tevent.end({\n\t\t\t\t\t...gcStats,\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\ttimestamp: currentReferenceTimestampMs,\n\t\t\t\t\t\tsweep: this.configs.shouldRunSweep,\n\t\t\t\t\t\ttombstone: this.configs.throwOnTombstoneLoad,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\t/** Post-GC steps */\n\t\t\t\t// Log pending unreferenced events such as a node being used after inactive. This is done after GC runs and\n\t\t\t\t// updates its state so that we don't send false positives based on intermediate state. For example, we may get\n\t\t\t\t// reference to an unreferenced node from another unreferenced node which means the node wasn't revived.\n\t\t\t\tawait this.telemetryTracker.logPendingEvents(logger);\n\t\t\t\t// Update the state of summary state tracker from this run's stats.\n\t\t\t\tthis.summaryStateTracker.updateStateFromGCRunStats(gcStats);\n\t\t\t\tthis.newReferencesSinceLastRun.clear();\n\t\t\t\tthis.completedRuns++;\n\n\t\t\t\treturn gcStats;\n\t\t\t},\n\t\t\t{ end: true, cancel: \"error\" },\n\t\t);\n\t}\n\n\t/**\n\t * Runs garbage collection. It does the following:\n\t *\n\t * 1. It generates / analyzes the runtime's reference graph.\n\t *\n\t * 2. Generates mark phase stats.\n\t *\n\t * 3. Runs Mark phase.\n\t *\n\t * 4. Runs Sweep phase.\n\t *\n\t * 5. Generates sweep phase stats.\n\t */\n\tprivate async runGC(\n\t\tfullGC: boolean,\n\t\tcurrentReferenceTimestampMs: number,\n\t\tlogger: ITelemetryLoggerExt,\n\t): Promise<IGCStats> {\n\t\t// 1. Generate / analyze the runtime's reference graph.\n\t\t// Get the reference graph (gcData) and run GC algorithm to get referenced / unreferenced nodes.\n\t\tconst gcData = await this.runtime.getGCData(fullGC);\n\t\tconst gcResult = runGarbageCollection(gcData.gcNodes, [\"/\"]);\n\t\t// Get all referenced nodes - References in this run + references between the previous and current runs.\n\t\tconst allReferencedNodeIds =\n\t\t\tthis.findAllNodesReferencedBetweenGCs(gcData, this.gcDataFromLastRun, logger) ??\n\t\t\tgcResult.referencedNodeIds;\n\n\t\t// 2. Get the mark phase stats based on the previous / current GC state.\n\t\t// This is done before running mark phase because we need the previous GC state before it is updated.\n\t\tconst markPhaseStats = this.getMarkPhaseStats(gcResult);\n\n\t\t// 3. Run the Mark phase.\n\t\t// It will mark nodes as referenced / unreferenced and return lists of tombstone-ready and sweep-ready nodes.\n\t\tconst { tombstoneReadyNodeIds, sweepReadyNodeIds } = this.runMarkPhase(\n\t\t\tgcResult,\n\t\t\tallReferencedNodeIds,\n\t\t\tcurrentReferenceTimestampMs,\n\t\t);\n\n\t\t// 4. Run the Sweep phase.\n\t\t// It will tombstone any tombstone-ready nodes, and initiate the deletion of sweep-ready nodes by sending a\n\t\t// sweep op. All clients, including this one, will delete these nodes once it processes the op.\n\t\tthis.runSweepPhase(gcResult, tombstoneReadyNodeIds, sweepReadyNodeIds);\n\n\t\tthis.gcDataFromLastRun = cloneGCData(gcData);\n\n\t\t// 5. Get the sweep phase stats.\n\t\tconst sweepPhaseStats = this.getSweepPhaseStats(\n\t\t\tthis.deletedNodes,\n\t\t\tsweepReadyNodeIds,\n\t\t\tmarkPhaseStats,\n\t\t);\n\n\t\treturn { ...markPhaseStats, ...sweepPhaseStats };\n\t}\n\n\t/**\n\t * Runs the GC Mark phase. It does the following:\n\t *\n\t * 1. Marks all referenced nodes in this run by clearing tracking for them.\n\t *\n\t * 2. Marks unreferenced nodes in this run by starting tracking for them.\n\t *\n\t * 3. Calls the runtime to update nodes that were marked referenced.\n\t *\n\t * @param gcResult - The result of the GC run on the gcData.\n\t * @param allReferencedNodeIds - Nodes referenced in this GC run + referenced between previous and current GC run.\n\t * @param currentReferenceTimestampMs - The timestamp to be used for unreferenced nodes' timestamp.\n\t * @returns The sets of tombstone-ready and sweep-ready nodes, i.e., nodes that ready to be tombstoned or deleted.\n\t */\n\tprivate runMarkPhase(\n\t\tgcResult: IGCResult,\n\t\tallReferencedNodeIds: string[],\n\t\tcurrentReferenceTimestampMs: number,\n\t): { tombstoneReadyNodeIds: Set<string>; sweepReadyNodeIds: Set<string> } {\n\t\t// 1. Marks all referenced nodes by clearing their unreferenced tracker, if any.\n\t\tfor (const nodeId of allReferencedNodeIds) {\n\t\t\tconst nodeStateTracker = this.unreferencedNodesState.get(nodeId);\n\t\t\tif (nodeStateTracker !== undefined) {\n\t\t\t\t// Stop tracking so as to clear out any running timers.\n\t\t\t\tnodeStateTracker.stopTracking();\n\t\t\t\t// Delete the node as we don't need to track it any more.\n\t\t\t\tthis.unreferencedNodesState.delete(nodeId);\n\t\t\t}\n\t\t}\n\n\t\t// 2. Mark unreferenced nodes in this run by starting unreferenced tracking for them.\n\t\tconst tombstoneReadyNodeIds: Set<string> = new Set();\n\t\tconst sweepReadyNodeIds: Set<string> = new Set();\n\t\tfor (const nodeId of gcResult.deletedNodeIds) {\n\t\t\tconst nodeStateTracker = this.unreferencedNodesState.get(nodeId);\n\t\t\tif (nodeStateTracker === undefined) {\n\t\t\t\tthis.unreferencedNodesState.set(\n\t\t\t\t\tnodeId,\n\t\t\t\t\tnew UnreferencedStateTracker(\n\t\t\t\t\t\tcurrentReferenceTimestampMs,\n\t\t\t\t\t\tthis.configs.inactiveTimeoutMs,\n\t\t\t\t\t\tcurrentReferenceTimestampMs,\n\t\t\t\t\t\tthis.configs.tombstoneTimeoutMs,\n\t\t\t\t\t\tthis.configs.sweepGracePeriodMs,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// If a node was already unreferenced, update its tracking information. Since the current reference time\n\t\t\t\t// is from the ops seen, this will ensure that we keep updating unreferenced state as time moves forward.\n\t\t\t\tnodeStateTracker.updateTracking(currentReferenceTimestampMs);\n\n\t\t\t\t// If a node is tombstone or sweep-ready, store it so it can be returned.\n\t\t\t\tif (nodeStateTracker.state === UnreferencedState.TombstoneReady) {\n\t\t\t\t\ttombstoneReadyNodeIds.add(nodeId);\n\t\t\t\t}\n\t\t\t\tif (nodeStateTracker.state === UnreferencedState.SweepReady) {\n\t\t\t\t\tsweepReadyNodeIds.add(nodeId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// 3. Call the runtime to update referenced nodes in this run.\n\t\tthis.runtime.updateUsedRoutes(gcResult.referencedNodeIds);\n\n\t\treturn { tombstoneReadyNodeIds, sweepReadyNodeIds };\n\t}\n\n\t/**\n\t * Runs the GC Sweep phase. It does the following:\n\t *\n\t * 1. Marks tombstone-ready nodes as tombstones.\n\t *\n\t * 2. Sends a sweep op to delete nodes that are sweep-ready. Once the op is ack'd, these nodes will be deleted.\n\t *\n\t * @param gcResult - The result of the GC run on the gcData.\n\t * @param tombstoneReadyNodes - List of nodes that are tombstone-ready.\n\t * @param sweepReadyNodes - List of nodes that are sweep-ready.\n\t */\n\tprivate runSweepPhase(\n\t\tgcResult: IGCResult,\n\t\ttombstoneReadyNodes: Set<string>,\n\t\tsweepReadyNodes: Set<string>,\n\t) {\n\t\t/**\n\t\t * Under \"Test Mode\", unreferenced nodes are immediately deleted without waiting for them to be sweep-ready.\n\t\t *\n\t\t * Otherwise, depending on how long it's been since the node was unreferenced, it will either be\n\t\t * marked as Tombstone, or deleted by Sweep.\n\t\t */\n\n\t\tif (this.configs.testMode) {\n\t\t\t// If we are running in GC test mode, unreferenced nodes (gcResult.deletedNodeIds) are deleted.\n\t\t\tthis.runtime.updateUnusedRoutes(gcResult.deletedNodeIds);\n\t\t\treturn;\n\t\t}\n\n\t\t// If sweep is disabled, we'll tombstone both tombstone-ready and sweep-ready nodes.\n\t\t// This is important because a container may never load during a node's Sweep Grace Period,\n\t\t// so that node would directly become sweep-ready skipping over tombstone-ready state,\n\t\t// but should be Tombstoned since Sweep is disabled.\n\t\tconst { nodesToTombstone, nodesToDelete } = this.configs.shouldRunSweep\n\t\t\t? {\n\t\t\t\t\tnodesToTombstone: [...tombstoneReadyNodes],\n\t\t\t\t\tnodesToDelete: [...sweepReadyNodes],\n\t\t\t }\n\t\t\t: {\n\t\t\t\t\tnodesToTombstone: [...tombstoneReadyNodes, ...sweepReadyNodes],\n\t\t\t\t\tnodesToDelete: [],\n\t\t\t };\n\n\t\tif (this.configs.tombstoneMode) {\n\t\t\tthis.tombstones = nodesToTombstone;\n\t\t\t// If we are running in GC tombstone mode, update tombstoned routes.\n\t\t\tthis.runtime.updateTombstonedRoutes(this.tombstones);\n\t\t}\n\n\t\tif (this.configs.shouldRunSweep && nodesToDelete.length > 0) {\n\t\t\t// Do not send DDS node ids in the GC op. This is an optimization to reduce its size. Since GC applies to\n\t\t\t// to data store only, all its DDSes are deleted along with it. The DDS ids will be retrieved from the\n\t\t\t// local state when processing the op.\n\t\t\tconst sweepReadyDSAndBlobs = nodesToDelete.filter((nodeId) => {\n\t\t\t\tconst nodeType = this.runtime.getNodeType(nodeId);\n\t\t\t\treturn nodeType === GCNodeType.DataStore || nodeType === GCNodeType.Blob;\n\t\t\t});\n\t\t\tconst contents: GarbageCollectionMessage = {\n\t\t\t\ttype: GarbageCollectionMessageType.Sweep,\n\t\t\t\tdeletedNodeIds: sweepReadyDSAndBlobs,\n\t\t\t};\n\n\t\t\t// Its fine for older clients to ignore this op because it doesn't have any functional impact. This op\n\t\t\t// is an optimization to ensure that all clients are in sync when it comes to deleted nodes to prevent their\n\t\t\t// accidental usage. The clients will sync without the delete op too but it may take longer.\n\t\t\tconst containerGCMessage: ContainerRuntimeGCMessage = {\n\t\t\t\ttype: ContainerMessageType.GC,\n\t\t\t\tcontents,\n\t\t\t\tcompatDetails: { behavior: \"Ignore\" },\n\t\t\t};\n\t\t\tthis.submitMessage(containerGCMessage);\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Since GC runs periodically, the GC data that is generated only tells us the state of the world at that point in\n\t * time. There can be nodes that were referenced in between two runs and their unreferenced state needs to be\n\t * updated. For example, in the following scenarios not updating the unreferenced timestamp can lead to deletion of\n\t * these objects while there can be in-memory referenced to it:\n\t * 1. A node transitions from `unreferenced -> referenced -> unreferenced` between two runs. When the reference is\n\t * added, the object may have been accessed and in-memory reference to it added.\n\t * 2. A reference is added from one unreferenced node to one or more unreferenced nodes. Even though the node[s] were\n\t * unreferenced, they could have been accessed and in-memory reference to them added.\n\t *\n\t * This function identifies nodes that were referenced since the last run.\n\t * If these nodes are currently unreferenced, they will be assigned new unreferenced state by the current run.\n\t *\n\t * @returns A list of all nodes referenced from the last local summary until now.\n\t */\n\tprivate findAllNodesReferencedBetweenGCs(\n\t\tcurrentGCData: IGarbageCollectionData,\n\t\tpreviousGCData: IGarbageCollectionData | undefined,\n\t\tlogger: ITelemetryLoggerExt,\n\t): string[] | undefined {\n\t\t// If we haven't run GC before there is nothing to do.\n\t\t// No previousGCData, means nothing is unreferenced, and there are no reference state trackers to clear\n\t\tif (previousGCData === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t/**\n\t\t * If there are references that were not explicitly notified to GC, log an error because this should never happen.\n\t\t * If it does, this may result in the unreferenced timestamps of these nodes not updated when they were referenced.\n\t\t */\n\t\tthis.telemetryTracker.logIfMissingExplicitReferences(\n\t\t\tcurrentGCData,\n\t\t\tpreviousGCData,\n\t\t\tthis.newReferencesSinceLastRun,\n\t\t\tlogger,\n\t\t);\n\n\t\t// No references were added since the last run so we don't have to update reference states of any unreferenced\n\t\t// nodes. There is no in between state at this point.\n\t\tif (this.newReferencesSinceLastRun.size === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t/**\n\t\t * Generate a super set of the GC data that contains the nodes and edges from last run, plus any new node and\n\t\t * edges that have been added since then. To do this, combine the GC data from the last run and the current\n\t\t * run, and then add the references since last run.\n\t\t *\n\t\t * Note on why we need to combine the data from previous run, current run and all references in between -\n\t\t * 1. We need data from last run because some of its references may have been deleted since then. If those\n\t\t * references added new outbound references before they were deleted, we need to detect them.\n\t\t *\n\t\t * 2. We need new outbound references since last run because some of them may have been deleted later. If those\n\t\t * references added new outbound references before they were deleted, we need to detect them.\n\t\t *\n\t\t * 3. We need data from the current run because currently we may not detect when DDSes are referenced:\n\t\t * - We don't require DDSes handles to be stored in a referenced DDS.\n\t\t * - A new data store may have \"root\" DDSes already created and we don't detect them today.\n\t\t */\n\t\tconst gcDataSuperSet = concatGarbageCollectionData(previousGCData, currentGCData);\n\t\tconst newOutboundRoutesSinceLastRun: string[] = [];\n\t\tthis.newReferencesSinceLastRun.forEach((outboundRoutes: string[], sourceNodeId: string) => {\n\t\t\tif (gcDataSuperSet.gcNodes[sourceNodeId] === undefined) {\n\t\t\t\tgcDataSuperSet.gcNodes[sourceNodeId] = outboundRoutes;\n\t\t\t} else {\n\t\t\t\tgcDataSuperSet.gcNodes[sourceNodeId].push(...outboundRoutes);\n\t\t\t}\n\t\t\tnewOutboundRoutesSinceLastRun.push(...outboundRoutes);\n\t\t});\n\n\t\t/**\n\t\t * Run GC on the above reference graph starting with root and all new outbound routes. This will generate a\n\t\t * list of all nodes that could have been referenced since the last run. If any of these nodes are unreferenced,\n\t\t * unreferenced, stop tracking them and remove from unreferenced list.\n\t\t * Note that some of these nodes may be unreferenced now and if so, the current run will mark them as\n\t\t * unreferenced and add unreferenced state.\n\t\t */\n\t\tconst gcResult = runGarbageCollection(gcDataSuperSet.gcNodes, [\n\t\t\t\"/\",\n\t\t\t...newOutboundRoutesSinceLastRun,\n\t\t]);\n\t\treturn gcResult.referencedNodeIds;\n\t}\n\n\t/**\n\t * Summarizes the GC data and returns it as a summary tree.\n\t * We current write the entire GC state in a single blob. This can be modified later to write multiple\n\t * blobs. All the blob keys should start with `gcBlobPrefix`.\n\t */\n\tpublic summarize(\n\t\tfullTree: boolean,\n\t\ttrackState: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): ISummarizeResult | undefined {\n\t\tif (!this.configs.shouldRunGC || this.gcDataFromLastRun === undefined) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst gcState: IGarbageCollectionState = { gcNodes: {} };\n\t\tfor (const [nodeId, outboundRoutes] of Object.entries(this.gcDataFromLastRun.gcNodes)) {\n\t\t\tgcState.gcNodes[nodeId] = {\n\t\t\t\toutboundRoutes,\n\t\t\t\tunreferencedTimestampMs:\n\t\t\t\t\tthis.unreferencedNodesState.get(nodeId)?.unreferencedTimestampMs,\n\t\t\t};\n\t\t}\n\n\t\treturn this.summaryStateTracker.summarize(\n\t\t\tfullTree,\n\t\t\ttrackState,\n\t\t\tgcState,\n\t\t\tthis.deletedNodes,\n\t\t\tthis.tombstones,\n\t\t);\n\t}\n\n\tpublic getMetadata(): IGCMetadata {\n\t\treturn {\n\t\t\t/**\n\t\t\t * If GC is enabled, the GC data is written using the GC version in effect and that is the gcFeature that goes\n\t\t\t * into the metadata blob. If GC is disabled, the gcFeature is 0.\n\t\t\t */\n\t\t\tgcFeature: this.configs.gcEnabled ? this.configs.gcVersionInEffect : 0,\n\t\t\tgcFeatureMatrix: this.configs.persistedGcFeatureMatrix,\n\t\t\tsessionExpiryTimeoutMs: this.configs.sessionExpiryTimeoutMs,\n\t\t\tsweepEnabled: false, // DEPRECATED - to be removed\n\t\t\ttombstoneTimeoutMs: this.configs.tombstoneTimeoutMs,\n\t\t};\n\t}\n\n\t/**\n\t * Called to refresh the latest summary state. This happens when either a pending summary is acked.\n\t */\n\tpublic async refreshLatestSummary(result: IRefreshSummaryResult): Promise<void> {\n\t\treturn this.summaryStateTracker.refreshLatestSummary(result);\n\t}\n\n\t/**\n\t * Process a GC message.\n\t * @param message - The GC message from the container runtime.\n\t * @param local - Whether it was send by this client.\n\t */\n\tpublic processMessage(message: ContainerRuntimeGCMessage, local: boolean) {\n\t\tswitch (message.contents.type) {\n\t\t\tcase \"Sweep\": {\n\t\t\t\t// Delete the nodes whose ids are present in the contents.\n\t\t\t\tthis.deleteSweepReadyNodes(message.contents.deletedNodeIds);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (\n\t\t\t\t\t!compatBehaviorAllowsGCMessageType(\n\t\t\t\t\t\tmessage.contents.type,\n\t\t\t\t\t\tmessage.compatDetails?.behavior,\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t`Garbage collection message of unknown type ${message.contents.type}`,\n\t\t\t\t\t\t\"processMessage\",\n\t\t\t\t\t);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Delete nodes that are sweep-ready. Call the runtime to delete these nodes and clear the unreferenced state\n\t * tracking for nodes that are actually deleted by the runtime.\n\t * @param sweepReadyNodeIds - The ids of nodes that are ready to be deleted.\n\t */\n\tprivate deleteSweepReadyNodes(sweepReadyNodeIds: readonly string[]) {\n\t\t// Use a set for lookup because its much faster than array or map.\n\t\tconst sweepReadyNodesSet: Set<string> = new Set(sweepReadyNodeIds);\n\n\t\t// The ids in the sweep-ready nodes do not contain DDS node ids. This is an optimization to reduce the size\n\t\t// of the GC op. Since GC applies to data store only, all its DDSes are deleted along with it. So, get the\n\t\t// DDS nodes ID from the unreferenced nodes state.\n\t\tconst allSweepReadyNodeIds = Array.from(sweepReadyNodeIds);\n\t\tfor (const [id] of this.unreferencedNodesState) {\n\t\t\t// Ignore data store nodes since they would already be in the list.\n\t\t\tconst pathParts = id.split(\"/\");\n\t\t\tif (pathParts.length <= 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the data store id part. Note that this may include blobs but that's okay since the part would just\n\t\t\t// be \"_blobs\" and it won't be found.\n\t\t\tconst dsId = `/${pathParts[1]}`;\n\t\t\tif (sweepReadyNodesSet.has(dsId)) {\n\t\t\t\tallSweepReadyNodeIds.push(id);\n\t\t\t}\n\t\t}\n\t\tconst deletedNodeIds = this.runtime.deleteSweepReadyNodes(allSweepReadyNodeIds);\n\n\t\t// Clear unreferenced state tracking for deleted nodes.\n\t\tfor (const nodeId of deletedNodeIds) {\n\t\t\tconst nodeStateTracker = this.unreferencedNodesState.get(nodeId);\n\t\t\tif (nodeStateTracker !== undefined) {\n\t\t\t\t// Stop tracking so as to clear out any running timers.\n\t\t\t\tnodeStateTracker.stopTracking();\n\t\t\t\t// Delete the node as we don't need to track it any more.\n\t\t\t\tthis.unreferencedNodesState.delete(nodeId);\n\t\t\t}\n\t\t\tthis.deletedNodes.add(nodeId);\n\t\t}\n\t}\n\n\t/**\n\t * Called when a node with the given id is updated. If the node is inactive or tombstoned, this will log an error\n\t * or throw an error if failing on incorrect usage is configured.\n\t * @param nodePath - The path of the node that changed.\n\t * @param reason - Whether the node was loaded or changed.\n\t * @param timestampMs - The timestamp when the node changed.\n\t * @param packagePath - The package path of the node. This may not be available if the node hasn't been loaded yet.\n\t * @param request - The original request for loads to preserve it in telemetry.\n\t * @param requestHeaders - If the node was loaded via request path, the headers in the request.\n\t */\n\tpublic nodeUpdated(\n\t\tnodePath: string,\n\t\treason: \"Loaded\" | \"Changed\",\n\t\ttimestampMs?: number,\n\t\tpackagePath?: readonly string[],\n\t\trequest?: IRequest,\n\t\theaderData?: RuntimeHeaderData,\n\t) {\n\t\tif (!this.configs.shouldRunGC) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isTombstoned = this.tombstones.includes(nodePath);\n\n\t\t// This will log if appropriate\n\t\tthis.telemetryTracker.nodeUsed({\n\t\t\tid: nodePath,\n\t\t\tusageType: reason,\n\t\t\tcurrentReferenceTimestampMs:\n\t\t\t\ttimestampMs ?? this.runtime.getCurrentReferenceTimestampMs(),\n\t\t\tpackagePath,\n\t\t\tcompletedGCRuns: this.completedRuns,\n\t\t\tisTombstoned,\n\t\t\tlastSummaryTime: this.getLastSummaryTimestampMs(),\n\t\t\theaders: headerData,\n\t\t});\n\n\t\tconst nodeType = this.runtime.getNodeType(nodePath);\n\n\t\t// Unless this is a Loaded event for a Blob or DataStore, we're done after telemetry tracking\n\t\tif (reason !== \"Loaded\" || ![GCNodeType.Blob, GCNodeType.DataStore].includes(nodeType)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst errorRequest: IRequest = request ?? { url: nodePath };\n\t\t// If the object is tombstoned and tombstone enforcement is configured, throw an error.\n\t\tif (isTombstoned && this.throwOnTombstoneLoad && headerData?.allowTombstone !== true) {\n\t\t\t// The requested data store is removed by gc. Create a 404 gc response exception.\n\t\t\tthrow responseToException(\n\t\t\t\tcreateResponseError(404, `${nodeType} was tombstoned`, errorRequest, {\n\t\t\t\t\t[TombstoneResponseHeaderKey]: true,\n\t\t\t\t}),\n\t\t\t\terrorRequest,\n\t\t\t);\n\t\t}\n\n\t\t// If the object is inactive and inactive enforcement is configured, throw an error.\n\t\tif (this.unreferencedNodesState.get(nodePath)?.state === \"Inactive\") {\n\t\t\tconst shouldThrowOnInactiveLoad =\n\t\t\t\t!this.isSummarizerClient &&\n\t\t\t\tthis.configs.throwOnInactiveLoad === true &&\n\t\t\t\theaderData?.allowInactive !== true;\n\t\t\tif (shouldThrowOnInactiveLoad) {\n\t\t\t\tthrow responseToException(\n\t\t\t\t\tcreateResponseError(404, `${nodeType} is inactive`, errorRequest, {\n\t\t\t\t\t\t[InactiveResponseHeaderKey]: true,\n\t\t\t\t\t}),\n\t\t\t\t\terrorRequest,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Called when an outbound reference is added to a node. This is used to identify all nodes that have been\n\t * referenced between summaries so that their unreferenced timestamp can be reset.\n\t *\n\t * @param fromNodePath - The node from which the reference is added.\n\t * @param toNodePath - The node to which the reference is added.\n\t */\n\tpublic addedOutboundReference(fromNodePath: string, toNodePath: string) {\n\t\tif (!this.configs.shouldRunGC) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!toNodePath.startsWith(\"/\")) {\n\t\t\t// A long time ago we stored handles with relatives paths. We don't expect to see these cases though\n\t\t\t// because GC was enabled only after we made the switch to always using absolute paths.\n\t\t\tthis.mc.logger.sendErrorEvent({\n\t\t\t\teventName: \"InvalidRelativeOutboundRoute\",\n\t\t\t\t...tagCodeArtifacts({ fromId: fromNodePath, id: toNodePath }),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tassert(fromNodePath.startsWith(\"/\"), 0x8a5 /* fromNodePath must be an absolute path */);\n\n\t\tconst outboundRoutes = this.newReferencesSinceLastRun.get(fromNodePath) ?? [];\n\t\toutboundRoutes.push(toNodePath);\n\t\tthis.newReferencesSinceLastRun.set(fromNodePath, outboundRoutes);\n\n\t\tthis.telemetryTracker.nodeUsed({\n\t\t\tid: toNodePath,\n\t\t\tusageType: \"Revived\",\n\t\t\tcurrentReferenceTimestampMs: this.runtime.getCurrentReferenceTimestampMs(),\n\t\t\tpackagePath: undefined,\n\t\t\tcompletedGCRuns: this.completedRuns,\n\t\t\tisTombstoned: this.tombstones.includes(toNodePath),\n\t\t\tlastSummaryTime: this.getLastSummaryTimestampMs(),\n\t\t\tfromId: fromNodePath,\n\t\t});\n\t}\n\n\t/**\n\t * Returns whether a node with the given path has been deleted or not. This can be used by the runtime to identify\n\t * cases where objects are used after they are deleted and throw / log errors accordingly.\n\t */\n\tpublic isNodeDeleted(nodePath: string): boolean {\n\t\treturn this.deletedNodes.has(nodePath);\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.sessionExpiryTimer?.clear();\n\t\tthis.sessionExpiryTimer = undefined;\n\t}\n\n\t/**\n\t * Generates the stats of a garbage collection mark phase run.\n\t * @param gcResult - The result of the current GC run.\n\t * @returns the stats of the mark phase run.\n\t */\n\tprivate getMarkPhaseStats(gcResult: IGCResult): IMarkPhaseStats {\n\t\tconst markPhaseStats: IMarkPhaseStats = {\n\t\t\tnodeCount: 0,\n\t\t\tdataStoreCount: 0,\n\t\t\tattachmentBlobCount: 0,\n\t\t\tunrefNodeCount: 0,\n\t\t\tunrefDataStoreCount: 0,\n\t\t\tunrefAttachmentBlobCount: 0,\n\t\t\tupdatedNodeCount: 0,\n\t\t\tupdatedDataStoreCount: 0,\n\t\t\tupdatedAttachmentBlobCount: 0,\n\t\t};\n\n\t\tconst updateNodeStats = (nodeId: string, referenced: boolean) => {\n\t\t\tmarkPhaseStats.nodeCount++;\n\t\t\t// If there is no previous GC data, every node's state is generated and is considered as updated.\n\t\t\t// Otherwise, find out if any node went from referenced to unreferenced or vice-versa.\n\t\t\tconst stateUpdated =\n\t\t\t\tthis.gcDataFromLastRun === undefined ||\n\t\t\t\tthis.unreferencedNodesState.has(nodeId) === referenced;\n\t\t\tif (stateUpdated) {\n\t\t\t\tmarkPhaseStats.updatedNodeCount++;\n\t\t\t}\n\t\t\tif (!referenced) {\n\t\t\t\tmarkPhaseStats.unrefNodeCount++;\n\t\t\t}\n\n\t\t\tif (this.runtime.getNodeType(nodeId) === GCNodeType.DataStore) {\n\t\t\t\tmarkPhaseStats.dataStoreCount++;\n\t\t\t\tif (stateUpdated) {\n\t\t\t\t\tmarkPhaseStats.updatedDataStoreCount++;\n\t\t\t\t}\n\t\t\t\tif (!referenced) {\n\t\t\t\t\tmarkPhaseStats.unrefDataStoreCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.runtime.getNodeType(nodeId) === GCNodeType.Blob) {\n\t\t\t\tmarkPhaseStats.attachmentBlobCount++;\n\t\t\t\tif (stateUpdated) {\n\t\t\t\t\tmarkPhaseStats.updatedAttachmentBlobCount++;\n\t\t\t\t}\n\t\t\t\tif (!referenced) {\n\t\t\t\t\tmarkPhaseStats.unrefAttachmentBlobCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfor (const nodeId of gcResult.referencedNodeIds) {\n\t\t\tupdateNodeStats(nodeId, true /* referenced */);\n\t\t}\n\n\t\tfor (const nodeId of gcResult.deletedNodeIds) {\n\t\t\tupdateNodeStats(nodeId, false /* referenced */);\n\t\t}\n\n\t\treturn markPhaseStats;\n\t}\n\n\t/**\n\t * Generates the stats of a garbage collection sweep phase run.\n\t * @param deletedNodes - The nodes that have been deleted until this run.\n\t * @param sweepReadyNodes - The nodes that are sweep-ready in this GC run.\n\t * @param markPhaseStats - The stats of the mark phase run.\n\t * @returns the stats of the sweep phase run.\n\t */\n\tprivate getSweepPhaseStats(\n\t\tdeletedNodes: Set<string>,\n\t\tsweepReadyNodes: Set<string>,\n\t\tmarkPhaseStats: IMarkPhaseStats,\n\t): ISweepPhaseStats {\n\t\t// Initialize the life time node counts to the mark phase node counts. If sweep is not enabled,\n\t\t// these will be the life time node count for this container.\n\t\tconst sweepPhaseStats: ISweepPhaseStats = {\n\t\t\tlifetimeNodeCount: markPhaseStats.nodeCount,\n\t\t\tlifetimeDataStoreCount: markPhaseStats.dataStoreCount,\n\t\t\tlifetimeAttachmentBlobCount: markPhaseStats.attachmentBlobCount,\n\t\t\tdeletedNodeCount: 0,\n\t\t\tdeletedDataStoreCount: 0,\n\t\t\tdeletedAttachmentBlobCount: 0,\n\t\t};\n\n\t\t// The runtime can't reliably identify the type of deleted nodes. So, get the type here. This should\n\t\t// be good enough because the only types that participate in GC today are data stores, DDSes and blobs.\n\t\tconst getDeletedNodeType = (nodeId: string): GCNodeType => {\n\t\t\tconst pathParts = nodeId.split(\"/\");\n\t\t\tif (pathParts[1] === BlobManager.basePath) {\n\t\t\t\treturn GCNodeType.Blob;\n\t\t\t}\n\t\t\tif (pathParts.length === 2) {\n\t\t\t\treturn GCNodeType.DataStore;\n\t\t\t}\n\t\t\tif (pathParts.length === 3) {\n\t\t\t\treturn GCNodeType.SubDataStore;\n\t\t\t}\n\t\t\treturn GCNodeType.Other;\n\t\t};\n\n\t\tfor (const nodeId of deletedNodes) {\n\t\t\tsweepPhaseStats.deletedNodeCount++;\n\t\t\tconst nodeType = getDeletedNodeType(nodeId);\n\t\t\tif (nodeType === GCNodeType.DataStore) {\n\t\t\t\tsweepPhaseStats.deletedDataStoreCount++;\n\t\t\t} else if (nodeType === GCNodeType.Blob) {\n\t\t\t\tsweepPhaseStats.deletedAttachmentBlobCount++;\n\t\t\t}\n\t\t}\n\n\t\t// If sweep is enabled, the counts from the mark phase stats do not include nodes that have been\n\t\t// deleted in previous runs. So, add the deleted node counts to life time stats.\n\t\tsweepPhaseStats.lifetimeNodeCount += sweepPhaseStats.deletedNodeCount;\n\t\tsweepPhaseStats.lifetimeDataStoreCount += sweepPhaseStats.deletedDataStoreCount;\n\t\tsweepPhaseStats.lifetimeAttachmentBlobCount += sweepPhaseStats.deletedAttachmentBlobCount;\n\n\t\tif (this.configs.shouldRunSweep) {\n\t\t\treturn sweepPhaseStats;\n\t\t}\n\n\t\t// If sweep is not enabled, the current sweep-ready node stats should be added to deleted stats since this\n\t\t// is the final state the node will be in.\n\t\t// If sweep is enabled, this will happen in the run after the GC op round trips back.\n\t\tfor (const nodeId of sweepReadyNodes) {\n\t\t\tsweepPhaseStats.deletedNodeCount++;\n\t\t\tconst nodeType = this.runtime.getNodeType(nodeId);\n\t\t\tif (nodeType === GCNodeType.DataStore) {\n\t\t\t\tsweepPhaseStats.deletedDataStoreCount++;\n\t\t\t} else if (nodeType === GCNodeType.Blob) {\n\t\t\t\tsweepPhaseStats.deletedAttachmentBlobCount++;\n\t\t\t}\n\t\t}\n\t\treturn sweepPhaseStats;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gcConfigs.d.ts","sourceRoot":"","sources":["../../src/gc/gcConfigs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,iBAAiB,EAGjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EASN,wBAAwB,EACxB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"gcConfigs.d.ts","sourceRoot":"","sources":["../../src/gc/gcConfigs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,iBAAiB,EAGjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EASN,wBAAwB,EACxB,iBAAiB,EAajB,MAAM,iBAAiB,CAAC;AAGzB;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAChC,EAAE,EAAE,iBAAiB,EACrB,YAAY,EAAE;IACb,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;CAC5B,GACC,wBAAwB,CA0J1B"}
|