@fluidframework/container-runtime 2.0.0-rc.1.0.3 → 2.0.0-rc.2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{.eslintrc.js → .eslintrc.cjs} +5 -5
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +54 -0
- package/README.md +45 -0
- package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
- package/api-extractor-lint.json +1 -1
- package/api-extractor.json +1 -1
- package/api-report/container-runtime.api.md +68 -30
- package/dist/batchTracker.d.ts +1 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +223 -0
- package/dist/channelCollection.d.ts.map +1 -0
- package/dist/{dataStores.js → channelCollection.js} +399 -83
- package/dist/channelCollection.js.map +1 -0
- package/dist/connectionTelemetry.d.ts +11 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +42 -4
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/container-runtime-alpha.d.ts +98 -40
- package/dist/container-runtime-beta.d.ts +27 -9
- package/dist/container-runtime-public.d.ts +27 -9
- package/dist/container-runtime-untrimmed.d.ts +123 -40
- package/dist/containerHandleContext.d.ts +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +79 -55
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +541 -411
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +2 -3
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +12 -11
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +71 -30
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +182 -141
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +29 -4
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +91 -5
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +22 -5
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +134 -75
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +2 -2
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +21 -21
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +29 -6
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +5 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +2 -2
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +12 -5
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +18 -6
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +7 -7
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +20 -20
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts +6 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +22 -11
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +8 -8
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +40 -38
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +8 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -40
- package/dist/index.js.map +1 -1
- package/dist/messageTypes.d.ts +4 -4
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +2 -2
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -2
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +8 -8
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +18 -18
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +4 -4
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +3 -3
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +1 -10
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +5 -5
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +7 -7
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +20 -12
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -4
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +2 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +2 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +18 -10
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +1 -2
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +5 -5
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +12 -12
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +43 -43
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.js +8 -8
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +11 -10
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +114 -81
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +4 -4
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +6 -6
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +3 -3
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts +3 -3
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.js +4 -4
- package/dist/summary/summarizerNode/index.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +17 -7
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +45 -57
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +10 -19
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +1 -21
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +5 -6
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +16 -16
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +10 -21
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +15 -2
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +6 -5
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +10 -1
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +5 -6
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +4 -5
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/{batchTracker.d.mts → batchTracker.d.ts} +2 -3
- package/lib/batchTracker.d.ts.map +1 -0
- package/lib/{batchTracker.mjs → batchTracker.js} +1 -1
- package/lib/batchTracker.js.map +1 -0
- package/lib/{blobManager.d.mts → blobManager.d.ts} +1 -1
- package/lib/blobManager.d.ts.map +1 -0
- package/lib/{blobManager.mjs → blobManager.js} +1 -1
- package/lib/blobManager.js.map +1 -0
- package/lib/channelCollection.d.ts +223 -0
- package/lib/channelCollection.d.ts.map +1 -0
- package/lib/{dataStores.mjs → channelCollection.js} +384 -71
- package/lib/channelCollection.js.map +1 -0
- package/lib/{connectionTelemetry.d.mts → connectionTelemetry.d.ts} +12 -2
- package/lib/connectionTelemetry.d.ts.map +1 -0
- package/lib/{connectionTelemetry.mjs → connectionTelemetry.js} +43 -5
- package/lib/connectionTelemetry.js.map +1 -0
- package/lib/{container-runtime-alpha.d.mts → container-runtime-alpha.d.ts} +98 -40
- package/lib/{container-runtime-public.d.mts → container-runtime-beta.d.ts} +27 -9
- package/lib/{container-runtime-beta.d.mts → container-runtime-public.d.ts} +27 -9
- package/lib/{container-runtime-untrimmed.d.mts → container-runtime-untrimmed.d.ts} +123 -40
- package/lib/{containerHandleContext.d.mts → containerHandleContext.d.ts} +2 -2
- package/lib/containerHandleContext.d.ts.map +1 -0
- package/lib/{containerHandleContext.mjs → containerHandleContext.js} +1 -1
- package/lib/containerHandleContext.js.map +1 -0
- package/lib/{containerRuntime.d.mts → containerRuntime.d.ts} +84 -56
- package/lib/containerRuntime.d.ts.map +1 -0
- package/lib/{containerRuntime.mjs → containerRuntime.js} +460 -332
- package/lib/containerRuntime.js.map +1 -0
- package/lib/{dataStore.d.mts → dataStore.d.ts} +3 -4
- package/lib/dataStore.d.ts.map +1 -0
- package/lib/{dataStore.mjs → dataStore.js} +13 -12
- package/lib/dataStore.js.map +1 -0
- package/lib/{dataStoreContext.d.mts → dataStoreContext.d.ts} +72 -31
- package/lib/dataStoreContext.d.ts.map +1 -0
- package/lib/{dataStoreContext.mjs → dataStoreContext.js} +174 -133
- package/lib/dataStoreContext.js.map +1 -0
- package/lib/{dataStoreContexts.d.mts → dataStoreContexts.d.ts} +2 -2
- package/lib/dataStoreContexts.d.ts.map +1 -0
- package/lib/{dataStoreContexts.mjs → dataStoreContexts.js} +1 -1
- package/lib/dataStoreContexts.js.map +1 -0
- package/lib/{dataStoreRegistry.d.mts → dataStoreRegistry.d.ts} +1 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -0
- package/lib/{dataStoreRegistry.mjs → dataStoreRegistry.js} +5 -1
- package/lib/dataStoreRegistry.js.map +1 -0
- package/{dist/deltaManagerProxyBase.d.ts → lib/deltaManagerSummarizerProxy.d.ts} +16 -7
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -0
- package/lib/deltaManagerSummarizerProxy.js +124 -0
- package/lib/deltaManagerSummarizerProxy.js.map +1 -0
- package/lib/{deltaScheduler.d.mts → deltaScheduler.d.ts} +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -0
- package/lib/{deltaScheduler.mjs → deltaScheduler.js} +1 -1
- package/lib/deltaScheduler.js.map +1 -0
- package/lib/{error.d.mts → error.d.ts} +1 -1
- package/lib/error.d.ts.map +1 -0
- package/lib/{error.mjs → error.js} +1 -1
- package/lib/error.js.map +1 -0
- package/lib/gc/{garbageCollection.d.mts → garbageCollection.d.ts} +23 -6
- package/lib/gc/garbageCollection.d.ts.map +1 -0
- package/lib/gc/{garbageCollection.mjs → garbageCollection.js} +103 -44
- package/lib/gc/garbageCollection.js.map +1 -0
- package/lib/gc/{gcConfigs.d.mts → gcConfigs.d.ts} +3 -3
- package/lib/gc/gcConfigs.d.ts.map +1 -0
- package/lib/gc/{gcConfigs.mjs → gcConfigs.js} +3 -3
- package/lib/gc/gcConfigs.js.map +1 -0
- package/lib/gc/{gcDefinitions.d.mts → gcDefinitions.d.ts} +30 -7
- package/lib/gc/gcDefinitions.d.ts.map +1 -0
- package/lib/gc/{gcDefinitions.mjs → gcDefinitions.js} +5 -1
- package/lib/gc/gcDefinitions.js.map +1 -0
- package/lib/gc/{gcHelpers.d.mts → gcHelpers.d.ts} +3 -3
- package/lib/gc/{gcHelpers.d.mts.map → gcHelpers.d.ts.map} +1 -1
- package/lib/gc/{gcHelpers.mjs → gcHelpers.js} +1 -1
- package/lib/gc/gcHelpers.js.map +1 -0
- package/lib/gc/{gcReferenceGraphAlgorithm.d.mts → gcReferenceGraphAlgorithm.d.ts} +2 -2
- package/lib/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
- package/lib/gc/{gcReferenceGraphAlgorithm.mjs → gcReferenceGraphAlgorithm.js} +1 -1
- package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/lib/gc/{gcSummaryDefinitions.d.mts → gcSummaryDefinitions.d.ts} +1 -1
- package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -0
- package/lib/gc/{gcSummaryDefinitions.mjs → gcSummaryDefinitions.js} +1 -1
- package/lib/gc/gcSummaryDefinitions.js.map +1 -0
- package/lib/gc/{gcSummaryStateTracker.d.mts → gcSummaryStateTracker.d.ts} +13 -6
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/lib/gc/{gcSummaryStateTracker.mjs → gcSummaryStateTracker.js} +17 -5
- package/lib/gc/gcSummaryStateTracker.js.map +1 -0
- package/lib/gc/{gcTelemetry.d.mts → gcTelemetry.d.ts} +8 -8
- package/lib/gc/gcTelemetry.d.ts.map +1 -0
- package/lib/gc/{gcTelemetry.mjs → gcTelemetry.js} +5 -5
- package/lib/gc/gcTelemetry.js.map +1 -0
- package/lib/gc/{gcUnreferencedStateTracker.d.mts → gcUnreferencedStateTracker.d.ts} +7 -2
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/lib/gc/{gcUnreferencedStateTracker.mjs → gcUnreferencedStateTracker.js} +12 -2
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/lib/gc/{index.d.mts → index.d.ts} +9 -9
- package/lib/gc/index.d.ts.map +1 -0
- package/lib/gc/{index.mjs → index.js} +8 -8
- package/lib/gc/index.js.map +1 -0
- package/lib/{index.d.mts → index.d.ts} +9 -21
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +12 -0
- package/lib/index.js.map +1 -0
- package/lib/{messageTypes.d.mts → messageTypes.d.ts} +5 -5
- package/lib/messageTypes.d.ts.map +1 -0
- package/lib/{messageTypes.mjs → messageTypes.js} +1 -1
- package/lib/messageTypes.js.map +1 -0
- package/lib/{metadata.d.mts → metadata.d.ts} +1 -1
- package/lib/metadata.d.ts.map +1 -0
- package/lib/{metadata.mjs → metadata.js} +1 -1
- package/lib/metadata.js.map +1 -0
- package/lib/opLifecycle/{batchManager.d.mts → batchManager.d.ts} +3 -3
- package/lib/opLifecycle/batchManager.d.ts.map +1 -0
- package/lib/opLifecycle/{batchManager.mjs → batchManager.js} +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -0
- package/lib/opLifecycle/{definitions.d.mts → definitions.d.ts} +3 -3
- package/lib/opLifecycle/definitions.d.ts.map +1 -0
- package/lib/opLifecycle/{definitions.mjs → definitions.js} +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -0
- package/lib/opLifecycle/index.d.ts +13 -0
- package/lib/opLifecycle/index.d.ts.map +1 -0
- package/lib/opLifecycle/index.js +12 -0
- package/lib/opLifecycle/index.js.map +1 -0
- package/lib/opLifecycle/{opCompressor.d.mts → opCompressor.d.ts} +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -0
- package/lib/opLifecycle/{opCompressor.mjs → opCompressor.js} +3 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -0
- package/lib/opLifecycle/{opDecompressor.d.mts → opDecompressor.d.ts} +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -0
- package/lib/opLifecycle/{opDecompressor.mjs → opDecompressor.js} +2 -2
- package/lib/opLifecycle/opDecompressor.js.map +1 -0
- package/lib/opLifecycle/{opGroupingManager.d.mts → opGroupingManager.d.ts} +2 -2
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/lib/opLifecycle/{opGroupingManager.mjs → opGroupingManager.js} +2 -11
- package/lib/opLifecycle/opGroupingManager.js.map +1 -0
- package/lib/opLifecycle/{opSplitter.d.mts → opSplitter.d.ts} +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -0
- package/lib/opLifecycle/{opSplitter.mjs → opSplitter.js} +3 -3
- package/lib/opLifecycle/opSplitter.js.map +1 -0
- package/lib/opLifecycle/{outbox.d.mts → outbox.d.ts} +8 -8
- package/lib/opLifecycle/outbox.d.ts.map +1 -0
- package/lib/opLifecycle/{outbox.mjs → outbox.js} +12 -4
- package/lib/opLifecycle/outbox.js.map +1 -0
- package/lib/opLifecycle/{remoteMessageProcessor.d.mts → remoteMessageProcessor.d.ts} +5 -5
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -0
- package/lib/opLifecycle/{remoteMessageProcessor.mjs → remoteMessageProcessor.js} +2 -2
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -0
- package/lib/{opProperties.d.mts → opProperties.d.ts} +1 -1
- package/lib/opProperties.d.ts.map +1 -0
- package/lib/{opProperties.mjs → opProperties.js} +1 -1
- package/lib/opProperties.js.map +1 -0
- package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
- package/lib/packageVersion.js.map +1 -0
- package/lib/{pendingStateManager.d.mts → pendingStateManager.d.ts} +3 -2
- package/lib/pendingStateManager.d.ts.map +1 -0
- package/lib/{pendingStateManager.mjs → pendingStateManager.js} +18 -10
- package/lib/pendingStateManager.js.map +1 -0
- package/lib/{scheduleManager.d.mts → scheduleManager.d.ts} +6 -3
- package/lib/scheduleManager.d.ts.map +1 -0
- package/lib/{scheduleManager.mjs → scheduleManager.js} +3 -3
- package/lib/scheduleManager.js.map +1 -0
- package/lib/{storageServiceWithAttachBlobs.d.mts → storageServiceWithAttachBlobs.d.ts} +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -0
- package/lib/{storageServiceWithAttachBlobs.mjs → storageServiceWithAttachBlobs.js} +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -0
- package/lib/summary/{index.d.mts → index.d.ts} +13 -13
- package/lib/summary/index.d.ts.map +1 -0
- package/lib/summary/{index.mjs → index.js} +12 -12
- package/lib/summary/index.js.map +1 -0
- package/lib/summary/{orderedClientElection.d.mts → orderedClientElection.d.ts} +5 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -0
- package/lib/summary/{orderedClientElection.mjs → orderedClientElection.js} +2 -2
- package/lib/summary/orderedClientElection.js.map +1 -0
- package/lib/summary/{runWhileConnectedCoordinator.d.mts → runWhileConnectedCoordinator.d.ts} +2 -2
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/lib/summary/{runWhileConnectedCoordinator.mjs → runWhileConnectedCoordinator.js} +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/lib/summary/{runningSummarizer.d.mts → runningSummarizer.d.ts} +12 -11
- package/lib/summary/runningSummarizer.d.ts.map +1 -0
- package/lib/summary/{runningSummarizer.mjs → runningSummarizer.js} +108 -75
- package/lib/summary/runningSummarizer.js.map +1 -0
- package/lib/summary/{summarizer.d.mts → summarizer.d.ts} +5 -5
- package/lib/summary/summarizer.d.ts.map +1 -0
- package/lib/summary/{summarizer.mjs → summarizer.js} +4 -4
- package/lib/summary/summarizer.js.map +1 -0
- package/lib/summary/{summarizerClientElection.d.mts → summarizerClientElection.d.ts} +3 -3
- package/lib/summary/summarizerClientElection.d.ts.map +1 -0
- package/lib/summary/{summarizerClientElection.mjs → summarizerClientElection.js} +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -0
- package/lib/summary/{summarizerHeuristics.d.mts → summarizerHeuristics.d.ts} +4 -4
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
- package/lib/summary/{summarizerHeuristics.mjs → summarizerHeuristics.js} +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -0
- package/lib/summary/summarizerNode/{index.d.mts → index.d.ts} +4 -4
- package/lib/summary/summarizerNode/index.d.ts.map +1 -0
- package/lib/summary/summarizerNode/index.js +7 -0
- package/lib/summary/summarizerNode/index.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNode.d.mts → summarizerNode.d.ts} +18 -8
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNode.mjs → summarizerNode.js} +41 -53
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeUtils.d.mts → summarizerNodeUtils.d.ts} +11 -20
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeUtils.mjs → summarizerNodeUtils.js} +1 -20
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeWithGc.d.mts → summarizerNodeWithGc.d.ts} +6 -7
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/lib/summary/summarizerNode/{summarizerNodeWithGc.mjs → summarizerNodeWithGc.js} +12 -12
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/lib/summary/{summarizerTypes.d.mts → summarizerTypes.d.ts} +11 -22
- package/lib/summary/summarizerTypes.d.ts.map +1 -0
- package/lib/summary/{summarizerTypes.mjs → summarizerTypes.js} +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -0
- package/lib/summary/{summaryCollection.d.mts → summaryCollection.d.ts} +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -0
- package/lib/summary/{summaryCollection.mjs → summaryCollection.js} +1 -1
- package/lib/summary/summaryCollection.js.map +1 -0
- package/lib/summary/{summaryFormat.d.mts → summaryFormat.d.ts} +16 -3
- package/lib/summary/summaryFormat.d.ts.map +1 -0
- package/lib/summary/{summaryFormat.mjs → summaryFormat.js} +1 -1
- package/lib/summary/summaryFormat.js.map +1 -0
- package/lib/summary/{summaryGenerator.d.mts → summaryGenerator.d.ts} +7 -6
- package/lib/summary/summaryGenerator.d.ts.map +1 -0
- package/lib/summary/{summaryGenerator.mjs → summaryGenerator.js} +11 -2
- package/lib/summary/summaryGenerator.js.map +1 -0
- package/lib/summary/{summaryManager.d.mts → summaryManager.d.ts} +6 -7
- package/lib/summary/summaryManager.d.ts.map +1 -0
- package/lib/summary/{summaryManager.mjs → summaryManager.js} +4 -5
- package/lib/summary/summaryManager.js.map +1 -0
- package/lib/test/batchTracker.spec.js +88 -0
- package/lib/test/batchTracker.spec.js.map +1 -0
- package/lib/test/blobManager.spec.js +835 -0
- package/lib/test/blobManager.spec.js.map +1 -0
- package/lib/test/channelCollection.spec.js +141 -0
- package/lib/test/channelCollection.spec.js.map +1 -0
- package/lib/test/containerRuntime.spec.js +1748 -0
- package/lib/test/containerRuntime.spec.js.map +1 -0
- package/lib/test/dataStoreContext.spec.js +801 -0
- package/lib/test/dataStoreContext.spec.js.map +1 -0
- package/lib/test/dataStoreCreation.spec.js +312 -0
- package/lib/test/dataStoreCreation.spec.js.map +1 -0
- package/lib/test/dataStoreRegistry.spec.js +26 -0
- package/lib/test/dataStoreRegistry.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +66 -0
- package/lib/test/fuzz/fuzzUtils.js.map +1 -0
- package/lib/test/fuzz/summarizer.fuzz.spec.js +31 -0
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -0
- package/lib/test/fuzz/summarizerFuzzMocks.js +162 -0
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -0
- package/lib/test/fuzz/summarizerFuzzSuite.js +106 -0
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -0
- package/lib/test/gc/garbageCollection.spec.js +1465 -0
- package/lib/test/gc/garbageCollection.spec.js.map +1 -0
- package/lib/test/gc/gcConfigs.spec.js +690 -0
- package/lib/test/gc/gcConfigs.spec.js.map +1 -0
- package/lib/test/gc/gcHelpers.spec.js +110 -0
- package/lib/test/gc/gcHelpers.spec.js.map +1 -0
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +68 -0
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +1 -0
- package/lib/test/gc/gcStats.spec.js +391 -0
- package/lib/test/gc/gcStats.spec.js.map +1 -0
- package/lib/test/gc/gcSummaryStateTracker.spec.js +228 -0
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -0
- package/lib/test/gc/gcTelemetry.spec.js +530 -0
- package/lib/test/gc/gcTelemetry.spec.js.map +1 -0
- package/lib/test/gc/gcUnitTestHelpers.js +29 -0
- package/lib/test/gc/gcUnitTestHelpers.js.map +1 -0
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +192 -0
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -0
- package/lib/test/getPendingBlobs.spec.js +193 -0
- package/lib/test/getPendingBlobs.spec.js.map +1 -0
- package/lib/test/hardwareStats.spec.js +93 -0
- package/lib/test/hardwareStats.spec.js.map +1 -0
- package/lib/test/index.js +6 -0
- package/lib/test/index.js.map +1 -0
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +225 -0
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -0
- package/lib/test/opLifecycle/batchManager.spec.js +189 -0
- package/lib/test/opLifecycle/batchManager.spec.js.map +1 -0
- package/lib/test/opLifecycle/opCompressor.spec.js +74 -0
- package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -0
- package/lib/test/opLifecycle/opDecompressor.spec.js +218 -0
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -0
- package/lib/test/opLifecycle/opSplitter.spec.js +272 -0
- package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -0
- package/lib/test/opLifecycle/outbox.spec.js +675 -0
- package/lib/test/opLifecycle/outbox.spec.js.map +1 -0
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +196 -0
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -0
- package/lib/test/pendingStateManager.spec.js +329 -0
- package/lib/test/pendingStateManager.spec.js.map +1 -0
- package/lib/test/scheduleManager.spec.js +270 -0
- package/lib/test/scheduleManager.spec.js.map +1 -0
- package/lib/test/summarizerNode.spec.js +326 -0
- package/lib/test/summarizerNode.spec.js.map +1 -0
- package/lib/test/summarizerNodeWithGc.spec.js +318 -0
- package/lib/test/summarizerNodeWithGc.spec.js.map +1 -0
- package/lib/test/summary/orderedClientElection.spec.js +535 -0
- package/lib/test/summary/orderedClientElection.spec.js.map +1 -0
- package/lib/test/summary/runningSummarizer.spec.js +1349 -0
- package/lib/test/summary/runningSummarizer.spec.js.map +1 -0
- package/lib/test/summary/summarizer.spec.js +29 -0
- package/lib/test/summary/summarizer.spec.js.map +1 -0
- package/lib/test/summary/summarizerClientElection.spec.js +436 -0
- package/lib/test/summary/summarizerClientElection.spec.js.map +1 -0
- package/lib/test/summary/summarizerHeuristics.spec.js +289 -0
- package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -0
- package/lib/test/summary/summaryCollection.spec.js +200 -0
- package/lib/test/summary/summaryCollection.spec.js.map +1 -0
- package/lib/test/summary/summaryManager.spec.js +430 -0
- package/lib/test/summary/summaryManager.spec.js.map +1 -0
- package/lib/test/summary/testQuorumClients.js +34 -0
- package/lib/test/summary/testQuorumClients.js.map +1 -0
- package/lib/test/throttler.spec.js +175 -0
- package/lib/test/throttler.spec.js.map +1 -0
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +180 -0
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -0
- package/lib/{throttler.d.mts → throttler.d.ts} +1 -1
- package/lib/throttler.d.ts.map +1 -0
- package/lib/{throttler.mjs → throttler.js} +1 -1
- package/lib/throttler.js.map +1 -0
- package/package.json +99 -88
- package/src/batchTracker.ts +1 -1
- package/src/blobManager.ts +1 -1
- package/src/{dataStores.ts → channelCollection.ts} +520 -84
- package/src/connectionTelemetry.ts +42 -3
- package/src/containerHandleContext.ts +1 -1
- package/src/containerRuntime.ts +661 -464
- package/src/dataStore.ts +13 -15
- package/src/dataStoreContext.ts +257 -184
- package/src/dataStoreContexts.ts +1 -1
- package/src/deltaManagerSummarizerProxy.ts +132 -7
- package/src/gc/garbageCollection.ts +121 -46
- package/src/gc/gcConfigs.ts +3 -3
- package/src/gc/gcDefinitions.ts +30 -7
- package/src/gc/gcHelpers.ts +2 -2
- package/src/gc/gcReferenceGraphAlgorithm.ts +1 -1
- package/src/gc/gcSummaryStateTracker.ts +19 -7
- package/src/gc/gcTelemetry.ts +10 -9
- package/src/gc/gcUnreferencedStateTracker.ts +12 -1
- package/src/gc/index.ts +10 -8
- package/src/index.ts +16 -27
- package/src/messageTypes.ts +4 -4
- package/src/opLifecycle/README.md +2 -4
- package/src/opLifecycle/batchManager.ts +2 -2
- package/src/opLifecycle/definitions.ts +2 -2
- package/src/opLifecycle/index.ts +8 -8
- package/src/opLifecycle/opCompressor.ts +3 -3
- package/src/opLifecycle/opDecompressor.ts +3 -3
- package/src/opLifecycle/opGroupingManager.ts +3 -12
- package/src/opLifecycle/opSplitter.ts +3 -3
- package/src/opLifecycle/outbox.ts +29 -9
- package/src/opLifecycle/remoteMessageProcessor.ts +4 -4
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +19 -13
- package/src/scheduleManager.ts +4 -4
- package/src/summary/index.ts +13 -12
- package/src/summary/orderedClientElection.ts +1 -1
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +141 -93
- package/src/summary/summarizer.ts +7 -7
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +3 -3
- package/src/summary/summarizerNode/index.ts +6 -3
- package/src/summary/summarizerNode/summarizerNode.ts +54 -69
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +16 -34
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -17
- package/src/summary/summarizerTypes.ts +12 -24
- package/src/summary/summaryFormat.ts +16 -2
- package/src/summary/summaryGenerator.ts +16 -4
- package/src/summary/summaryManager.ts +6 -7
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -5
- package/dist/dataStores.d.ts +0 -149
- package/dist/dataStores.d.ts.map +0 -1
- package/dist/dataStores.js.map +0 -1
- package/dist/deltaManagerProxyBase.d.ts.map +0 -1
- package/dist/deltaManagerProxyBase.js +0 -77
- package/dist/deltaManagerProxyBase.js.map +0 -1
- package/lib/batchTracker.d.mts.map +0 -1
- package/lib/batchTracker.mjs.map +0 -1
- package/lib/blobManager.d.mts.map +0 -1
- package/lib/blobManager.mjs.map +0 -1
- package/lib/connectionTelemetry.d.mts.map +0 -1
- package/lib/connectionTelemetry.mjs.map +0 -1
- package/lib/containerHandleContext.d.mts.map +0 -1
- package/lib/containerHandleContext.mjs.map +0 -1
- package/lib/containerRuntime.d.mts.map +0 -1
- package/lib/containerRuntime.mjs.map +0 -1
- package/lib/dataStore.d.mts.map +0 -1
- package/lib/dataStore.mjs.map +0 -1
- package/lib/dataStoreContext.d.mts.map +0 -1
- package/lib/dataStoreContext.mjs.map +0 -1
- package/lib/dataStoreContexts.d.mts.map +0 -1
- package/lib/dataStoreContexts.mjs.map +0 -1
- package/lib/dataStoreRegistry.d.mts.map +0 -1
- package/lib/dataStoreRegistry.mjs.map +0 -1
- package/lib/dataStores.d.mts +0 -149
- package/lib/dataStores.d.mts.map +0 -1
- package/lib/dataStores.mjs.map +0 -1
- package/lib/deltaManagerProxyBase.d.mts +0 -35
- package/lib/deltaManagerProxyBase.d.mts.map +0 -1
- package/lib/deltaManagerProxyBase.mjs +0 -73
- package/lib/deltaManagerProxyBase.mjs.map +0 -1
- package/lib/deltaManagerSummarizerProxy.d.mts +0 -19
- package/lib/deltaManagerSummarizerProxy.d.mts.map +0 -1
- package/lib/deltaManagerSummarizerProxy.mjs +0 -38
- package/lib/deltaManagerSummarizerProxy.mjs.map +0 -1
- package/lib/deltaScheduler.d.mts.map +0 -1
- package/lib/deltaScheduler.mjs.map +0 -1
- package/lib/error.d.mts.map +0 -1
- package/lib/error.mjs.map +0 -1
- package/lib/gc/garbageCollection.d.mts.map +0 -1
- package/lib/gc/garbageCollection.mjs.map +0 -1
- package/lib/gc/gcConfigs.d.mts.map +0 -1
- package/lib/gc/gcConfigs.mjs.map +0 -1
- package/lib/gc/gcDefinitions.d.mts.map +0 -1
- package/lib/gc/gcDefinitions.mjs.map +0 -1
- package/lib/gc/gcHelpers.mjs.map +0 -1
- package/lib/gc/gcReferenceGraphAlgorithm.d.mts.map +0 -1
- package/lib/gc/gcReferenceGraphAlgorithm.mjs.map +0 -1
- package/lib/gc/gcSummaryDefinitions.d.mts.map +0 -1
- package/lib/gc/gcSummaryDefinitions.mjs.map +0 -1
- package/lib/gc/gcSummaryStateTracker.d.mts.map +0 -1
- package/lib/gc/gcSummaryStateTracker.mjs.map +0 -1
- package/lib/gc/gcTelemetry.d.mts.map +0 -1
- package/lib/gc/gcTelemetry.mjs.map +0 -1
- package/lib/gc/gcUnreferencedStateTracker.d.mts.map +0 -1
- package/lib/gc/gcUnreferencedStateTracker.mjs.map +0 -1
- package/lib/gc/index.d.mts.map +0 -1
- package/lib/gc/index.mjs.map +0 -1
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs +0 -24
- package/lib/index.mjs.map +0 -1
- package/lib/messageTypes.d.mts.map +0 -1
- package/lib/messageTypes.mjs.map +0 -1
- package/lib/metadata.d.mts.map +0 -1
- package/lib/metadata.mjs.map +0 -1
- package/lib/opLifecycle/batchManager.d.mts.map +0 -1
- package/lib/opLifecycle/batchManager.mjs.map +0 -1
- package/lib/opLifecycle/definitions.d.mts.map +0 -1
- package/lib/opLifecycle/definitions.mjs.map +0 -1
- package/lib/opLifecycle/index.d.mts +0 -13
- package/lib/opLifecycle/index.d.mts.map +0 -1
- package/lib/opLifecycle/index.mjs +0 -12
- package/lib/opLifecycle/index.mjs.map +0 -1
- package/lib/opLifecycle/opCompressor.d.mts.map +0 -1
- package/lib/opLifecycle/opCompressor.mjs.map +0 -1
- package/lib/opLifecycle/opDecompressor.d.mts.map +0 -1
- package/lib/opLifecycle/opDecompressor.mjs.map +0 -1
- package/lib/opLifecycle/opGroupingManager.d.mts.map +0 -1
- package/lib/opLifecycle/opGroupingManager.mjs.map +0 -1
- package/lib/opLifecycle/opSplitter.d.mts.map +0 -1
- package/lib/opLifecycle/opSplitter.mjs.map +0 -1
- package/lib/opLifecycle/outbox.d.mts.map +0 -1
- package/lib/opLifecycle/outbox.mjs.map +0 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.mts.map +0 -1
- package/lib/opLifecycle/remoteMessageProcessor.mjs.map +0 -1
- package/lib/opProperties.d.mts.map +0 -1
- package/lib/opProperties.mjs.map +0 -1
- package/lib/packageVersion.d.mts.map +0 -1
- package/lib/packageVersion.mjs.map +0 -1
- package/lib/pendingStateManager.d.mts.map +0 -1
- package/lib/pendingStateManager.mjs.map +0 -1
- package/lib/scheduleManager.d.mts.map +0 -1
- package/lib/scheduleManager.mjs.map +0 -1
- package/lib/storageServiceWithAttachBlobs.d.mts.map +0 -1
- package/lib/storageServiceWithAttachBlobs.mjs.map +0 -1
- package/lib/summary/index.d.mts.map +0 -1
- package/lib/summary/index.mjs.map +0 -1
- package/lib/summary/orderedClientElection.d.mts.map +0 -1
- package/lib/summary/orderedClientElection.mjs.map +0 -1
- package/lib/summary/runWhileConnectedCoordinator.d.mts.map +0 -1
- package/lib/summary/runWhileConnectedCoordinator.mjs.map +0 -1
- package/lib/summary/runningSummarizer.d.mts.map +0 -1
- package/lib/summary/runningSummarizer.mjs.map +0 -1
- package/lib/summary/summarizer.d.mts.map +0 -1
- package/lib/summary/summarizer.mjs.map +0 -1
- package/lib/summary/summarizerClientElection.d.mts.map +0 -1
- package/lib/summary/summarizerClientElection.mjs.map +0 -1
- package/lib/summary/summarizerHeuristics.d.mts.map +0 -1
- package/lib/summary/summarizerHeuristics.mjs.map +0 -1
- package/lib/summary/summarizerNode/index.d.mts.map +0 -1
- package/lib/summary/summarizerNode/index.mjs +0 -7
- package/lib/summary/summarizerNode/index.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNode.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNode.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.mjs.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.mts.map +0 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.mjs.map +0 -1
- package/lib/summary/summarizerTypes.d.mts.map +0 -1
- package/lib/summary/summarizerTypes.mjs.map +0 -1
- package/lib/summary/summaryCollection.d.mts.map +0 -1
- package/lib/summary/summaryCollection.mjs.map +0 -1
- package/lib/summary/summaryFormat.d.mts.map +0 -1
- package/lib/summary/summaryFormat.mjs.map +0 -1
- package/lib/summary/summaryGenerator.d.mts.map +0 -1
- package/lib/summary/summaryGenerator.mjs.map +0 -1
- package/lib/summary/summaryManager.d.mts.map +0 -1
- package/lib/summary/summaryManager.mjs.map +0 -1
- package/lib/throttler.d.mts.map +0 -1
- package/lib/throttler.mjs.map +0 -1
- package/src/deltaManagerProxyBase.ts +0 -111
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deltaManagerSummarizerProxy.js","sourceRoot":"","sources":["../src/deltaManagerSummarizerProxy.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"deltaManagerSummarizerProxy.js","sourceRoot":"","sources":["../src/deltaManagerSummarizerProxy.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 { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type {\n\tIConnectionDetails,\n\tIDeltaManager,\n\tIDeltaManagerEvents,\n\tIDeltaQueue,\n\tIDeltaSender,\n\tReadOnlyInfo,\n} from \"@fluidframework/container-definitions\";\nimport type { IErrorBase } from \"@fluidframework/core-interfaces\";\nimport type { IAnyDriverError } from \"@fluidframework/driver-definitions\";\nimport {\n\tIClientConfiguration,\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n} from \"@fluidframework/protocol-definitions\";\n\nimport { summarizerClientType } from \"./summary/index.js\";\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 TypedEventEmitter<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\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(\n\t\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper();\n\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\n\t\tthis.deltaManager.on(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.on(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.on(\"op\", this.onOp);\n\t\tthis.deltaManager.on(\"pong\", this.onPong);\n\t\tthis.deltaManager.on(\"connect\", this.onConnect);\n\t\tthis.deltaManager.on(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.on(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.deltaManager.off(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.off(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.off(\"op\", this.onOp);\n\t\tthis.deltaManager.off(\"pong\", this.onPong);\n\t\tthis.deltaManager.off(\"connect\", this.onConnect);\n\t\tthis.deltaManager.off(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.off(\"readonly\", this.onReadonly);\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\tprivate readonly onPrepareSend = (messageBuffer: any[]): void => {\n\t\tthis.emit(\"prepareSend\", messageBuffer);\n\t};\n\tprivate readonly onSubmitOp = (message: IDocumentMessage): void => {\n\t\tthis.emit(\"submitOp\", message);\n\t};\n\tprivate readonly onOp = (message: ISequencedDocumentMessage, processingTime: number): void => {\n\t\tthis.emit(\"op\", message, processingTime);\n\t};\n\tprivate readonly onPong = (latency: number): void => {\n\t\tthis.emit(\"pong\", latency);\n\t};\n\tprivate readonly onConnect = (details: IConnectionDetails, opsBehind?: number): void => {\n\t\tthis.emit(\"connect\", details, opsBehind);\n\t};\n\tprivate readonly onDisconnect = (reason: string, error?: IAnyDriverError): void => {\n\t\tthis.emit(\"disconnect\", reason, error);\n\t};\n\tprivate readonly onReadonly = (\n\t\treadonly: boolean,\n\t\treadonlyConnectionReason?: { reason: string; error?: IErrorBase },\n\t): void => {\n\t\tthis.emit(\"readonly\", readonly, readonlyConnectionReason);\n\t};\n}\n"]}
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
import { IRequest } from "@fluidframework/core-interfaces";
|
|
6
6
|
import { IGarbageCollectionDetailsBase, ISummarizeResult, ITelemetryContext } from "@fluidframework/runtime-definitions";
|
|
7
7
|
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
8
|
-
import { RuntimeHeaderData } from "../containerRuntime";
|
|
9
|
-
import { ContainerRuntimeGCMessage } from "../messageTypes";
|
|
10
|
-
import { IRefreshSummaryResult } from "../summary";
|
|
11
|
-
import { IGarbageCollector, IGarbageCollectorCreateParams, IGCStats, IGCMetadata } from "./gcDefinitions";
|
|
8
|
+
import { RuntimeHeaderData } from "../containerRuntime.js";
|
|
9
|
+
import { ContainerRuntimeGCMessage } from "../messageTypes.js";
|
|
10
|
+
import { IRefreshSummaryResult } from "../summary/index.js";
|
|
11
|
+
import { IGarbageCollector, IGarbageCollectorCreateParams, IGCStats, IGCMetadata } from "./gcDefinitions.js";
|
|
12
12
|
/**
|
|
13
13
|
* The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains
|
|
14
14
|
* its state across summaries.
|
|
@@ -36,6 +36,7 @@ export declare class GarbageCollector implements IGarbageCollector {
|
|
|
36
36
|
private readonly mc;
|
|
37
37
|
private readonly configs;
|
|
38
38
|
get shouldRunGC(): boolean;
|
|
39
|
+
readonly sessionExpiryTimerStarted: number | undefined;
|
|
39
40
|
private gcDataFromLastRun;
|
|
40
41
|
private readonly newReferencesSinceLastRun;
|
|
41
42
|
private tombstones;
|
|
@@ -43,6 +44,11 @@ export declare class GarbageCollector implements IGarbageCollector {
|
|
|
43
44
|
private readonly baseSnapshotDataP;
|
|
44
45
|
private readonly initializeGCStateFromBaseSnapshotP;
|
|
45
46
|
private readonly baseGCDetailsP;
|
|
47
|
+
/**
|
|
48
|
+
* Map of node ids to their unreferenced state tracker
|
|
49
|
+
* NOTE: The set of keys in this map is considered as the set of unreferenced nodes
|
|
50
|
+
* as of the last GC run. So in between runs, nothing should be added or removed.
|
|
51
|
+
*/
|
|
46
52
|
private readonly unreferencedNodesState;
|
|
47
53
|
private sessionExpiryTimer;
|
|
48
54
|
private completedRuns;
|
|
@@ -196,14 +202,25 @@ export declare class GarbageCollector implements IGarbageCollector {
|
|
|
196
202
|
* @param requestHeaders - If the node was loaded via request path, the headers in the request.
|
|
197
203
|
*/
|
|
198
204
|
nodeUpdated(nodePath: string, reason: "Loaded" | "Changed", timestampMs?: number, packagePath?: readonly string[], request?: IRequest, headerData?: RuntimeHeaderData): void;
|
|
205
|
+
/**
|
|
206
|
+
* The given node should have its unreferenced state reset in the next GC,
|
|
207
|
+
* even if the true GC graph shows it is unreferenced. This will
|
|
208
|
+
* prevent it from being deleted by Sweep (after the Grace Period).
|
|
209
|
+
*
|
|
210
|
+
* Submit a GC op indicating that the Tombstone with the given path has been loaded.
|
|
211
|
+
* Broadcasting this information in the op stream allows the Summarizer to reset unreferenced state
|
|
212
|
+
* before runnint GC next.
|
|
213
|
+
*/
|
|
214
|
+
private triggerAutoRecovery;
|
|
199
215
|
/**
|
|
200
216
|
* Called when an outbound reference is added to a node. This is used to identify all nodes that have been
|
|
201
217
|
* referenced between summaries so that their unreferenced timestamp can be reset.
|
|
202
218
|
*
|
|
203
219
|
* @param fromNodePath - The node from which the reference is added.
|
|
204
220
|
* @param toNodePath - The node to which the reference is added.
|
|
221
|
+
* @param autorecovery - This reference is added artificially, for autorecovery. Used for logging.
|
|
205
222
|
*/
|
|
206
|
-
addedOutboundReference(fromNodePath: string, toNodePath: string): void;
|
|
223
|
+
addedOutboundReference(fromNodePath: string, toNodePath: string, autorecovery?: true): void;
|
|
207
224
|
/**
|
|
208
225
|
* Returns whether a node with the given path has been deleted or not. This can be used by the runtime to identify
|
|
209
226
|
* cases where objects are used after they are deleted and throw / log errors accordingly.
|
|
@@ -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,EAInB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAEN,iBAAiB,EAEjB,MAAM,
|
|
1
|
+
{"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,17 +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
|
|
22
|
-
const
|
|
12
|
+
const blobManager_js_1 = require("../blobManager.js");
|
|
13
|
+
const containerRuntime_js_1 = require("../containerRuntime.js");
|
|
14
|
+
const error_js_1 = require("../error.js");
|
|
15
|
+
const messageTypes_js_1 = require("../messageTypes.js");
|
|
16
|
+
const gcConfigs_js_1 = require("./gcConfigs.js");
|
|
17
|
+
const gcDefinitions_js_1 = require("./gcDefinitions.js");
|
|
18
|
+
const gcHelpers_js_1 = require("./gcHelpers.js");
|
|
19
|
+
const gcReferenceGraphAlgorithm_js_1 = require("./gcReferenceGraphAlgorithm.js");
|
|
20
|
+
const gcSummaryStateTracker_js_1 = require("./gcSummaryStateTracker.js");
|
|
21
|
+
const gcUnreferencedStateTracker_js_1 = require("./gcUnreferencedStateTracker.js");
|
|
22
|
+
const gcTelemetry_js_1 = require("./gcTelemetry.js");
|
|
23
23
|
/**
|
|
24
24
|
* The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains
|
|
25
25
|
* its state across summaries.
|
|
@@ -76,8 +76,12 @@ class GarbageCollector {
|
|
|
76
76
|
this.tombstones = [];
|
|
77
77
|
// A list of nodes that have been deleted during sweep phase.
|
|
78
78
|
this.deletedNodes = new Set();
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Map of node ids to their unreferenced state tracker
|
|
81
|
+
* NOTE: The set of keys in this map is considered as the set of unreferenced nodes
|
|
82
|
+
* as of the last GC run. So in between runs, nothing should be added or removed.
|
|
83
|
+
*/
|
|
84
|
+
this.unreferencedNodesState = new gcUnreferencedStateTracker_js_1.UnreferencedStateTrackerMap();
|
|
81
85
|
// The number of times GC has successfully completed on this instance of GarbageCollector.
|
|
82
86
|
this.completedRuns = 0;
|
|
83
87
|
this.runtime = createParams.runtime;
|
|
@@ -87,6 +91,7 @@ class GarbageCollector {
|
|
|
87
91
|
this.submitMessage = createParams.submitMessage;
|
|
88
92
|
const baseSnapshot = createParams.baseSnapshot;
|
|
89
93
|
const readAndParseBlob = createParams.readAndParseBlob;
|
|
94
|
+
const pendingSessionExpiryTimerStarted = createParams.sessionExpiryTimerStarted;
|
|
90
95
|
this.mc = (0, telemetry_utils_1.createChildMonitoringContext)({
|
|
91
96
|
logger: createParams.baseLogger,
|
|
92
97
|
namespace: "GarbageCollector",
|
|
@@ -94,19 +99,29 @@ class GarbageCollector {
|
|
|
94
99
|
all: { completedGCRuns: () => this.completedRuns },
|
|
95
100
|
},
|
|
96
101
|
});
|
|
97
|
-
this.configs = (0,
|
|
102
|
+
this.configs = (0, gcConfigs_js_1.generateGCConfigs)(this.mc, createParams);
|
|
98
103
|
// If session expiry is enabled, we need to close the container when the session expiry timeout expires.
|
|
99
104
|
if (this.configs.sessionExpiryTimeoutMs !== undefined) {
|
|
100
105
|
// If Test Override config is set, override Session Expiry timeout.
|
|
101
106
|
const overrideSessionExpiryTimeoutMs = this.mc.config.getNumber("Fluid.GarbageCollection.TestOverride.SessionExpiryMs");
|
|
102
|
-
|
|
107
|
+
let timeoutMs = this.configs.sessionExpiryTimeoutMs;
|
|
108
|
+
if (pendingSessionExpiryTimerStarted) {
|
|
109
|
+
// NOTE: This assumes the client clock hasn't been tampered with since the original session
|
|
110
|
+
const timeLapsedSincePendingTimer = Date.now() - pendingSessionExpiryTimerStarted;
|
|
111
|
+
timeoutMs -= timeLapsedSincePendingTimer;
|
|
112
|
+
}
|
|
113
|
+
timeoutMs = overrideSessionExpiryTimeoutMs ?? timeoutMs;
|
|
114
|
+
if (timeoutMs <= 0) {
|
|
115
|
+
this.runtime.closeFn(new error_js_1.ClientSessionExpiredError(`Client session expired.`, timeoutMs));
|
|
116
|
+
}
|
|
103
117
|
this.sessionExpiryTimer = new core_utils_1.Timer(timeoutMs, () => {
|
|
104
|
-
this.runtime.closeFn(new
|
|
118
|
+
this.runtime.closeFn(new error_js_1.ClientSessionExpiredError(`Client session expired.`, timeoutMs));
|
|
105
119
|
});
|
|
106
120
|
this.sessionExpiryTimer.start();
|
|
121
|
+
this.sessionExpiryTimerStarted = Date.now();
|
|
107
122
|
}
|
|
108
|
-
this.summaryStateTracker = new
|
|
109
|
-
this.telemetryTracker = new
|
|
123
|
+
this.summaryStateTracker = new gcSummaryStateTracker_js_1.GCSummaryStateTracker(this.configs, baseSnapshot?.trees[runtime_definitions_1.gcTreeKey] !== undefined /* wasGCRunInBaseSnapshot */);
|
|
124
|
+
this.telemetryTracker = new gcTelemetry_js_1.GCTelemetryTracker(this.mc, this.configs, this.isSummarizerClient, createParams.createContainerMetadata, (nodeId) => this.runtime.getNodeType(nodeId), (nodeId) => this.unreferencedNodesState.get(nodeId), this.getNodePackagePath);
|
|
110
125
|
// Get the GC data from the base snapshot. Use LazyPromise because we only want to do this once since it
|
|
111
126
|
// it involves fetching blobs from storage which is expensive.
|
|
112
127
|
this.baseSnapshotDataP = new core_utils_1.LazyPromise(async () => {
|
|
@@ -121,7 +136,7 @@ class GarbageCollector {
|
|
|
121
136
|
// incremental gc summary will not work with older gc data as well
|
|
122
137
|
return undefined;
|
|
123
138
|
}
|
|
124
|
-
const snapshotData = await (0,
|
|
139
|
+
const snapshotData = await (0, gcHelpers_js_1.getGCDataFromSnapshot)(gcSnapshotTree, readAndParseBlob);
|
|
125
140
|
// If the GC version in base snapshot does not match the GC version currently in effect, the GC data
|
|
126
141
|
// in the snapshot cannot be interpreted correctly. Set everything to undefined except for
|
|
127
142
|
// deletedNodes because irrespective of GC versions, these nodes have been deleted and cannot be
|
|
@@ -168,7 +183,7 @@ class GarbageCollector {
|
|
|
168
183
|
const gcNodes = {};
|
|
169
184
|
for (const [nodeId, nodeData] of Object.entries(baseSnapshotData.gcState.gcNodes)) {
|
|
170
185
|
if (nodeData.unreferencedTimestampMs !== undefined) {
|
|
171
|
-
this.unreferencedNodesState.set(nodeId, new
|
|
186
|
+
this.unreferencedNodesState.set(nodeId, new gcUnreferencedStateTracker_js_1.UnreferencedStateTracker(nodeData.unreferencedTimestampMs, this.configs.inactiveTimeoutMs, currentReferenceTimestampMs, this.configs.tombstoneTimeoutMs, this.configs.sweepGracePeriodMs));
|
|
172
187
|
}
|
|
173
188
|
gcNodes[nodeId] = Array.from(nodeData.outboundRoutes);
|
|
174
189
|
}
|
|
@@ -188,7 +203,7 @@ class GarbageCollector {
|
|
|
188
203
|
// Run GC on the nodes in the base summary to get the routes used in each node in the container.
|
|
189
204
|
// This is an optimization for space (vs performance) wherein we don't need to store the used routes of
|
|
190
205
|
// each node in the summary.
|
|
191
|
-
const usedRoutes = (0,
|
|
206
|
+
const usedRoutes = (0, gcReferenceGraphAlgorithm_js_1.runGarbageCollection)(gcNodes, ["/"]).referencedNodeIds;
|
|
192
207
|
return { gcData: { gcNodes }, usedRoutes };
|
|
193
208
|
});
|
|
194
209
|
// Log all the GC options and the state determined by the garbage collector.
|
|
@@ -290,7 +305,9 @@ class GarbageCollector {
|
|
|
290
305
|
*/
|
|
291
306
|
async collectGarbage(options, telemetryContext) {
|
|
292
307
|
const fullGC = options.fullGC ??
|
|
293
|
-
(this.configs.runFullGC === true ||
|
|
308
|
+
(this.configs.runFullGC === true ||
|
|
309
|
+
this.summaryStateTracker.autoRecovery.fullGCRequested() ||
|
|
310
|
+
this.summaryStateTracker.doesSummaryStateNeedReset);
|
|
294
311
|
// Add the options that are used to run GC to the telemetry context.
|
|
295
312
|
telemetryContext?.setMultiple("fluid_GC", "Options", {
|
|
296
313
|
fullGC,
|
|
@@ -366,7 +383,7 @@ class GarbageCollector {
|
|
|
366
383
|
// 1. Generate / analyze the runtime's reference graph.
|
|
367
384
|
// Get the reference graph (gcData) and run GC algorithm to get referenced / unreferenced nodes.
|
|
368
385
|
const gcData = await this.runtime.getGCData(fullGC);
|
|
369
|
-
const gcResult = (0,
|
|
386
|
+
const gcResult = (0, gcReferenceGraphAlgorithm_js_1.runGarbageCollection)(gcData.gcNodes, ["/"]);
|
|
370
387
|
// Get all referenced nodes - References in this run + references between the previous and current runs.
|
|
371
388
|
const allReferencedNodeIds = this.findAllNodesReferencedBetweenGCs(gcData, this.gcDataFromLastRun, logger) ??
|
|
372
389
|
gcResult.referencedNodeIds;
|
|
@@ -381,7 +398,7 @@ class GarbageCollector {
|
|
|
381
398
|
// allowed to be deleted per config, and tombstone the rest along with the tombstone-ready nodes.
|
|
382
399
|
// Note that no nodes will be deleted until the GC Sweep op is processed.
|
|
383
400
|
this.runSweepPhase(gcResult, tombstoneReadyNodeIds, sweepReadyNodeIds);
|
|
384
|
-
this.gcDataFromLastRun = (0,
|
|
401
|
+
this.gcDataFromLastRun = (0, gcHelpers_js_1.cloneGCData)(gcData);
|
|
385
402
|
// 5. Get the sweep phase stats.
|
|
386
403
|
const sweepPhaseStats = this.getSweepPhaseStats(this.deletedNodes, sweepReadyNodeIds, markPhaseStats);
|
|
387
404
|
return { ...markPhaseStats, ...sweepPhaseStats };
|
|
@@ -403,31 +420,25 @@ class GarbageCollector {
|
|
|
403
420
|
runMarkPhase(gcResult, allReferencedNodeIds, currentReferenceTimestampMs) {
|
|
404
421
|
// 1. Marks all referenced nodes by clearing their unreferenced tracker, if any.
|
|
405
422
|
for (const nodeId of allReferencedNodeIds) {
|
|
406
|
-
|
|
407
|
-
if (nodeStateTracker !== undefined) {
|
|
408
|
-
// Stop tracking so as to clear out any running timers.
|
|
409
|
-
nodeStateTracker.stopTracking();
|
|
410
|
-
// Delete the node as we don't need to track it any more.
|
|
411
|
-
this.unreferencedNodesState.delete(nodeId);
|
|
412
|
-
}
|
|
423
|
+
this.unreferencedNodesState.delete(nodeId);
|
|
413
424
|
}
|
|
414
|
-
// 2. Mark unreferenced nodes in this run by starting unreferenced tracking for them.
|
|
425
|
+
// 2. Mark unreferenced nodes in this run by starting or updating unreferenced tracking for them.
|
|
415
426
|
const tombstoneReadyNodeIds = new Set();
|
|
416
427
|
const sweepReadyNodeIds = new Set();
|
|
417
428
|
for (const nodeId of gcResult.deletedNodeIds) {
|
|
418
429
|
const nodeStateTracker = this.unreferencedNodesState.get(nodeId);
|
|
419
430
|
if (nodeStateTracker === undefined) {
|
|
420
|
-
this.unreferencedNodesState.set(nodeId, new
|
|
431
|
+
this.unreferencedNodesState.set(nodeId, new gcUnreferencedStateTracker_js_1.UnreferencedStateTracker(currentReferenceTimestampMs, this.configs.inactiveTimeoutMs, currentReferenceTimestampMs, this.configs.tombstoneTimeoutMs, this.configs.sweepGracePeriodMs));
|
|
421
432
|
}
|
|
422
433
|
else {
|
|
423
434
|
// If a node was already unreferenced, update its tracking information. Since the current reference time
|
|
424
435
|
// is from the ops seen, this will ensure that we keep updating unreferenced state as time moves forward.
|
|
425
436
|
nodeStateTracker.updateTracking(currentReferenceTimestampMs);
|
|
426
437
|
// If a node is tombstone or sweep-ready, store it so it can be returned.
|
|
427
|
-
if (nodeStateTracker.state ===
|
|
438
|
+
if (nodeStateTracker.state === gcDefinitions_js_1.UnreferencedState.TombstoneReady) {
|
|
428
439
|
tombstoneReadyNodeIds.add(nodeId);
|
|
429
440
|
}
|
|
430
|
-
if (nodeStateTracker.state ===
|
|
441
|
+
if (nodeStateTracker.state === gcDefinitions_js_1.UnreferencedState.SweepReady) {
|
|
431
442
|
sweepReadyNodeIds.add(nodeId);
|
|
432
443
|
}
|
|
433
444
|
}
|
|
@@ -476,7 +487,7 @@ class GarbageCollector {
|
|
|
476
487
|
case "ONLY_BLOBS":
|
|
477
488
|
sweepReadyNodes.forEach((nodeId) => {
|
|
478
489
|
const nodeType = this.runtime.getNodeType(nodeId);
|
|
479
|
-
if (nodeType ===
|
|
490
|
+
if (nodeType === gcDefinitions_js_1.GCNodeType.Blob) {
|
|
480
491
|
nodesToDelete.push(nodeId);
|
|
481
492
|
}
|
|
482
493
|
else {
|
|
@@ -499,17 +510,17 @@ class GarbageCollector {
|
|
|
499
510
|
// local state when processing the op.
|
|
500
511
|
const sweepReadyDSAndBlobs = nodesToDelete.filter((nodeId) => {
|
|
501
512
|
const nodeType = this.runtime.getNodeType(nodeId);
|
|
502
|
-
return nodeType ===
|
|
513
|
+
return nodeType === gcDefinitions_js_1.GCNodeType.DataStore || nodeType === gcDefinitions_js_1.GCNodeType.Blob;
|
|
503
514
|
});
|
|
504
515
|
const contents = {
|
|
505
|
-
type:
|
|
516
|
+
type: gcDefinitions_js_1.GarbageCollectionMessageType.Sweep,
|
|
506
517
|
deletedNodeIds: sweepReadyDSAndBlobs,
|
|
507
518
|
};
|
|
508
519
|
// Its fine for older clients to ignore this op because it doesn't have any functional impact. This op
|
|
509
520
|
// is an optimization to ensure that all clients are in sync when it comes to deleted nodes to prevent their
|
|
510
521
|
// accidental usage. The clients will sync without the delete op too but it may take longer.
|
|
511
522
|
const containerGCMessage = {
|
|
512
|
-
type:
|
|
523
|
+
type: messageTypes_js_1.ContainerMessageType.GC,
|
|
513
524
|
contents,
|
|
514
525
|
compatDetails: { behavior: "Ignore" },
|
|
515
526
|
};
|
|
@@ -564,7 +575,7 @@ class GarbageCollector {
|
|
|
564
575
|
* - We don't require DDSes handles to be stored in a referenced DDS.
|
|
565
576
|
* - A new data store may have "root" DDSes already created and we don't detect them today.
|
|
566
577
|
*/
|
|
567
|
-
const gcDataSuperSet = (0,
|
|
578
|
+
const gcDataSuperSet = (0, gcHelpers_js_1.concatGarbageCollectionData)(previousGCData, currentGCData);
|
|
568
579
|
const newOutboundRoutesSinceLastRun = [];
|
|
569
580
|
this.newReferencesSinceLastRun.forEach((outboundRoutes, sourceNodeId) => {
|
|
570
581
|
if (gcDataSuperSet.gcNodes[sourceNodeId] === undefined) {
|
|
@@ -582,7 +593,7 @@ class GarbageCollector {
|
|
|
582
593
|
* Note that some of these nodes may be unreferenced now and if so, the current run will mark them as
|
|
583
594
|
* unreferenced and add unreferenced state.
|
|
584
595
|
*/
|
|
585
|
-
const gcResult = (0,
|
|
596
|
+
const gcResult = (0, gcReferenceGraphAlgorithm_js_1.runGarbageCollection)(gcDataSuperSet.gcNodes, [
|
|
586
597
|
"/",
|
|
587
598
|
...newOutboundRoutesSinceLastRun,
|
|
588
599
|
]);
|
|
@@ -604,7 +615,7 @@ class GarbageCollector {
|
|
|
604
615
|
unreferencedTimestampMs: this.unreferencedNodesState.get(nodeId)?.unreferencedTimestampMs,
|
|
605
616
|
};
|
|
606
617
|
}
|
|
607
|
-
return this.summaryStateTracker.summarize(fullTree,
|
|
618
|
+
return this.summaryStateTracker.summarize(trackState && !fullTree, gcState, this.deletedNodes, this.tombstones);
|
|
608
619
|
}
|
|
609
620
|
getMetadata() {
|
|
610
621
|
return {
|
|
@@ -631,15 +642,28 @@ class GarbageCollector {
|
|
|
631
642
|
* @param local - Whether it was send by this client.
|
|
632
643
|
*/
|
|
633
644
|
processMessage(message, local) {
|
|
634
|
-
|
|
635
|
-
|
|
645
|
+
const gcMessageType = message.contents.type;
|
|
646
|
+
switch (gcMessageType) {
|
|
647
|
+
case gcDefinitions_js_1.GarbageCollectionMessageType.Sweep: {
|
|
636
648
|
// Delete the nodes whose ids are present in the contents.
|
|
637
649
|
this.deleteSweepReadyNodes(message.contents.deletedNodeIds);
|
|
638
650
|
break;
|
|
639
651
|
}
|
|
652
|
+
case gcDefinitions_js_1.GarbageCollectionMessageType.TombstoneLoaded: {
|
|
653
|
+
if (this.mc.config.getBoolean(gcDefinitions_js_1.disableAutoRecoveryKey) === true) {
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
656
|
+
// Mark the node as referenced to ensure it isn't Swept
|
|
657
|
+
const tombstonedNodePath = message.contents.nodePath;
|
|
658
|
+
this.addedOutboundReference("/", tombstonedNodePath, true /* autorecovery */);
|
|
659
|
+
// In case the cause of the TombstoneLoaded event is incorrect GC Data (i.e. the object is actually reachable),
|
|
660
|
+
// do fullGC on the next run to get a chance to repair (in the likely case the bug is not deterministic)
|
|
661
|
+
this.summaryStateTracker.autoRecovery.requestFullGCOnNextRun();
|
|
662
|
+
break;
|
|
663
|
+
}
|
|
640
664
|
default: {
|
|
641
|
-
if (!(0,
|
|
642
|
-
const error = telemetry_utils_1.DataProcessingError.create(`Garbage collection message of unknown type ${
|
|
665
|
+
if (!(0, gcHelpers_js_1.compatBehaviorAllowsGCMessageType)(gcMessageType, message.compatDetails?.behavior)) {
|
|
666
|
+
const error = telemetry_utils_1.DataProcessingError.create(`Garbage collection message of unknown type ${gcMessageType}`, "processMessage");
|
|
643
667
|
throw error;
|
|
644
668
|
}
|
|
645
669
|
break;
|
|
@@ -678,13 +702,9 @@ class GarbageCollector {
|
|
|
678
702
|
const deletedNodeIds = this.runtime.deleteSweepReadyNodes(allSweepReadyNodeIds);
|
|
679
703
|
// Clear unreferenced state tracking for deleted nodes.
|
|
680
704
|
for (const nodeId of deletedNodeIds) {
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
nodeStateTracker.stopTracking();
|
|
685
|
-
// Delete the node as we don't need to track it any more.
|
|
686
|
-
this.unreferencedNodesState.delete(nodeId);
|
|
687
|
-
}
|
|
705
|
+
// Usually we avoid modifying the set of unreferencedNodesState keys in between GC runs,
|
|
706
|
+
// but this is ok since this node won't exist at all in the next GC run.
|
|
707
|
+
this.unreferencedNodesState.delete(nodeId);
|
|
688
708
|
this.deletedNodes.add(nodeId);
|
|
689
709
|
}
|
|
690
710
|
}
|
|
@@ -714,17 +734,24 @@ class GarbageCollector {
|
|
|
714
734
|
lastSummaryTime: this.getLastSummaryTimestampMs(),
|
|
715
735
|
headers: headerData,
|
|
716
736
|
});
|
|
737
|
+
// Any time we log a Tombstone Loaded error (via Telemetry Tracker),
|
|
738
|
+
// we want to also trigger autorecovery to avoid the object being deleted
|
|
739
|
+
// Note: We don't need to trigger on "Changed" because any change will cause the object
|
|
740
|
+
// to be loaded by the Summarizer, and auto-recovery will be triggered then.
|
|
741
|
+
if (isTombstoned && reason === "Loaded") {
|
|
742
|
+
// Note that when a DataStore and its DDS are all loaded, each will trigger AutoRecovery for itself.
|
|
743
|
+
this.triggerAutoRecovery(nodePath);
|
|
744
|
+
}
|
|
717
745
|
const nodeType = this.runtime.getNodeType(nodePath);
|
|
718
746
|
// Unless this is a Loaded event for a Blob or DataStore, we're done after telemetry tracking
|
|
719
|
-
if (reason !== "Loaded" || ![
|
|
747
|
+
if (reason !== "Loaded" || ![gcDefinitions_js_1.GCNodeType.Blob, gcDefinitions_js_1.GCNodeType.DataStore].includes(nodeType)) {
|
|
720
748
|
return;
|
|
721
749
|
}
|
|
722
750
|
const errorRequest = request ?? { url: nodePath };
|
|
723
|
-
// If the object is tombstoned and tombstone enforcement is configured, throw an error.
|
|
724
751
|
if (isTombstoned && this.throwOnTombstoneLoad && headerData?.allowTombstone !== true) {
|
|
725
752
|
// The requested data store is removed by gc. Create a 404 gc response exception.
|
|
726
753
|
throw (0, runtime_utils_1.responseToException)((0, runtime_utils_1.createResponseError)(404, `${nodeType} was tombstoned`, errorRequest, {
|
|
727
|
-
[
|
|
754
|
+
[containerRuntime_js_1.TombstoneResponseHeaderKey]: true,
|
|
728
755
|
}), errorRequest);
|
|
729
756
|
}
|
|
730
757
|
// If the object is inactive and inactive enforcement is configured, throw an error.
|
|
@@ -734,19 +761,45 @@ class GarbageCollector {
|
|
|
734
761
|
headerData?.allowInactive !== true;
|
|
735
762
|
if (shouldThrowOnInactiveLoad) {
|
|
736
763
|
throw (0, runtime_utils_1.responseToException)((0, runtime_utils_1.createResponseError)(404, `${nodeType} is inactive`, errorRequest, {
|
|
737
|
-
[
|
|
764
|
+
[containerRuntime_js_1.InactiveResponseHeaderKey]: true,
|
|
738
765
|
}), errorRequest);
|
|
739
766
|
}
|
|
740
767
|
}
|
|
741
768
|
}
|
|
769
|
+
/**
|
|
770
|
+
* The given node should have its unreferenced state reset in the next GC,
|
|
771
|
+
* even if the true GC graph shows it is unreferenced. This will
|
|
772
|
+
* prevent it from being deleted by Sweep (after the Grace Period).
|
|
773
|
+
*
|
|
774
|
+
* Submit a GC op indicating that the Tombstone with the given path has been loaded.
|
|
775
|
+
* Broadcasting this information in the op stream allows the Summarizer to reset unreferenced state
|
|
776
|
+
* before runnint GC next.
|
|
777
|
+
*/
|
|
778
|
+
triggerAutoRecovery(nodePath) {
|
|
779
|
+
if (this.mc.config.getBoolean(gcDefinitions_js_1.disableAutoRecoveryKey) === true) {
|
|
780
|
+
return;
|
|
781
|
+
}
|
|
782
|
+
// Use compat behavior "Ignore" since this is an optimization to opportunistically protect
|
|
783
|
+
// objects from deletion, so it's fine for older clients to ignore this op.
|
|
784
|
+
const containerGCMessage = {
|
|
785
|
+
type: messageTypes_js_1.ContainerMessageType.GC,
|
|
786
|
+
contents: {
|
|
787
|
+
type: gcDefinitions_js_1.GarbageCollectionMessageType.TombstoneLoaded,
|
|
788
|
+
nodePath,
|
|
789
|
+
},
|
|
790
|
+
compatDetails: { behavior: "Ignore" },
|
|
791
|
+
};
|
|
792
|
+
this.submitMessage(containerGCMessage);
|
|
793
|
+
}
|
|
742
794
|
/**
|
|
743
795
|
* Called when an outbound reference is added to a node. This is used to identify all nodes that have been
|
|
744
796
|
* referenced between summaries so that their unreferenced timestamp can be reset.
|
|
745
797
|
*
|
|
746
798
|
* @param fromNodePath - The node from which the reference is added.
|
|
747
799
|
* @param toNodePath - The node to which the reference is added.
|
|
800
|
+
* @param autorecovery - This reference is added artificially, for autorecovery. Used for logging.
|
|
748
801
|
*/
|
|
749
|
-
addedOutboundReference(fromNodePath, toNodePath) {
|
|
802
|
+
addedOutboundReference(fromNodePath, toNodePath, autorecovery) {
|
|
750
803
|
if (!this.configs.shouldRunGC) {
|
|
751
804
|
return;
|
|
752
805
|
}
|
|
@@ -772,7 +825,13 @@ class GarbageCollector {
|
|
|
772
825
|
isTombstoned: this.tombstones.includes(toNodePath),
|
|
773
826
|
lastSummaryTime: this.getLastSummaryTimestampMs(),
|
|
774
827
|
fromId: fromNodePath,
|
|
828
|
+
autorecovery,
|
|
775
829
|
});
|
|
830
|
+
// This node is referenced - Clear its unreferenced state
|
|
831
|
+
// But don't delete the node id from the map yet.
|
|
832
|
+
// When generating GC stats, the set of nodes in here is used as the baseline for
|
|
833
|
+
// what was unreferenced in the last GC run.
|
|
834
|
+
this.unreferencedNodesState.get(toNodePath)?.stopTracking();
|
|
776
835
|
}
|
|
777
836
|
/**
|
|
778
837
|
* Returns whether a node with the given path has been deleted or not. This can be used by the runtime to identify
|
|
@@ -802,33 +861,33 @@ class GarbageCollector {
|
|
|
802
861
|
updatedDataStoreCount: 0,
|
|
803
862
|
updatedAttachmentBlobCount: 0,
|
|
804
863
|
};
|
|
805
|
-
const updateNodeStats = (nodeId,
|
|
864
|
+
const updateNodeStats = (nodeId, isReferenced) => {
|
|
806
865
|
markPhaseStats.nodeCount++;
|
|
807
866
|
// If there is no previous GC data, every node's state is generated and is considered as updated.
|
|
808
867
|
// Otherwise, find out if any node went from referenced to unreferenced or vice-versa.
|
|
809
|
-
const
|
|
810
|
-
|
|
868
|
+
const wasNotReferenced = this.unreferencedNodesState.has(nodeId);
|
|
869
|
+
const stateUpdated = this.gcDataFromLastRun === undefined || wasNotReferenced === isReferenced;
|
|
811
870
|
if (stateUpdated) {
|
|
812
871
|
markPhaseStats.updatedNodeCount++;
|
|
813
872
|
}
|
|
814
|
-
if (!
|
|
873
|
+
if (!isReferenced) {
|
|
815
874
|
markPhaseStats.unrefNodeCount++;
|
|
816
875
|
}
|
|
817
|
-
if (this.runtime.getNodeType(nodeId) ===
|
|
876
|
+
if (this.runtime.getNodeType(nodeId) === gcDefinitions_js_1.GCNodeType.DataStore) {
|
|
818
877
|
markPhaseStats.dataStoreCount++;
|
|
819
878
|
if (stateUpdated) {
|
|
820
879
|
markPhaseStats.updatedDataStoreCount++;
|
|
821
880
|
}
|
|
822
|
-
if (!
|
|
881
|
+
if (!isReferenced) {
|
|
823
882
|
markPhaseStats.unrefDataStoreCount++;
|
|
824
883
|
}
|
|
825
884
|
}
|
|
826
|
-
if (this.runtime.getNodeType(nodeId) ===
|
|
885
|
+
if (this.runtime.getNodeType(nodeId) === gcDefinitions_js_1.GCNodeType.Blob) {
|
|
827
886
|
markPhaseStats.attachmentBlobCount++;
|
|
828
887
|
if (stateUpdated) {
|
|
829
888
|
markPhaseStats.updatedAttachmentBlobCount++;
|
|
830
889
|
}
|
|
831
|
-
if (!
|
|
890
|
+
if (!isReferenced) {
|
|
832
891
|
markPhaseStats.unrefAttachmentBlobCount++;
|
|
833
892
|
}
|
|
834
893
|
}
|
|
@@ -864,24 +923,24 @@ class GarbageCollector {
|
|
|
864
923
|
// be good enough because the only types that participate in GC today are data stores, DDSes and blobs.
|
|
865
924
|
const getDeletedNodeType = (nodeId) => {
|
|
866
925
|
const pathParts = nodeId.split("/");
|
|
867
|
-
if (pathParts[1] ===
|
|
868
|
-
return
|
|
926
|
+
if (pathParts[1] === blobManager_js_1.BlobManager.basePath) {
|
|
927
|
+
return gcDefinitions_js_1.GCNodeType.Blob;
|
|
869
928
|
}
|
|
870
929
|
if (pathParts.length === 2) {
|
|
871
|
-
return
|
|
930
|
+
return gcDefinitions_js_1.GCNodeType.DataStore;
|
|
872
931
|
}
|
|
873
932
|
if (pathParts.length === 3) {
|
|
874
|
-
return
|
|
933
|
+
return gcDefinitions_js_1.GCNodeType.SubDataStore;
|
|
875
934
|
}
|
|
876
|
-
return
|
|
935
|
+
return gcDefinitions_js_1.GCNodeType.Other;
|
|
877
936
|
};
|
|
878
937
|
for (const nodeId of deletedNodes) {
|
|
879
938
|
sweepPhaseStats.deletedNodeCount++;
|
|
880
939
|
const nodeType = getDeletedNodeType(nodeId);
|
|
881
|
-
if (nodeType ===
|
|
940
|
+
if (nodeType === gcDefinitions_js_1.GCNodeType.DataStore) {
|
|
882
941
|
sweepPhaseStats.deletedDataStoreCount++;
|
|
883
942
|
}
|
|
884
|
-
else if (nodeType ===
|
|
943
|
+
else if (nodeType === gcDefinitions_js_1.GCNodeType.Blob) {
|
|
885
944
|
sweepPhaseStats.deletedAttachmentBlobCount++;
|
|
886
945
|
}
|
|
887
946
|
}
|
|
@@ -899,10 +958,10 @@ class GarbageCollector {
|
|
|
899
958
|
for (const nodeId of sweepReadyNodes) {
|
|
900
959
|
sweepPhaseStats.deletedNodeCount++;
|
|
901
960
|
const nodeType = this.runtime.getNodeType(nodeId);
|
|
902
|
-
if (nodeType ===
|
|
961
|
+
if (nodeType === gcDefinitions_js_1.GCNodeType.DataStore) {
|
|
903
962
|
sweepPhaseStats.deletedDataStoreCount++;
|
|
904
963
|
}
|
|
905
|
-
else if (nodeType ===
|
|
964
|
+
else if (nodeType === gcDefinitions_js_1.GCNodeType.Blob) {
|
|
906
965
|
sweepPhaseStats.deletedAttachmentBlobCount++;
|
|
907
966
|
}
|
|
908
967
|
}
|