@fluidframework/container-runtime 2.0.0-rc.2.0.2 → 2.0.0-rc.3.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/CHANGELOG.md +23 -0
- package/api-report/container-runtime.api.md +471 -52
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +4 -4
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +33 -30
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +82 -107
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +27 -22
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +155 -165
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +3 -3
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +17 -17
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +2 -2
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +42 -39
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +425 -292
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +8 -8
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +58 -19
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +169 -114
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -0
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +12 -11
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +5 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +4 -4
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +6 -6
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.d.ts +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +4 -4
- package/dist/error.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +3 -2
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +23 -23
- 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 +4 -5
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +4 -5
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +5 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +21 -12
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +11 -11
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +2 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +11 -9
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +6 -6
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +2 -1
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +91 -0
- package/dist/messageTypes.d.ts +11 -5
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +4 -0
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -20
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +3 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +5 -6
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +15 -4
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +62 -63
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +14 -16
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +12 -4
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +63 -53
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +2 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +30 -29
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +18 -18
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/public.d.ts +12 -0
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +28 -24
- package/dist/scheduleManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
- package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js +2 -2
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +209 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +390 -0
- package/dist/summary/documentSchema.js.map +1 -0
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +4 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +12 -7
- 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 +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +3 -3
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +16 -16
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +3 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +13 -13
- 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 +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js +2 -2
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +28 -28
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +5 -3
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +7 -7
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +6 -17
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +8 -8
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +4 -3
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +17 -17
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +15 -14
- package/dist/summary/summaryManager.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +33 -30
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +48 -73
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +27 -22
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +96 -106
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +3 -3
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +42 -39
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +276 -141
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +3 -3
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +58 -19
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +107 -52
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -0
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +5 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.d.ts +1 -1
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +2 -2
- package/lib/error.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +3 -2
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +8 -8
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +2 -2
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +4 -5
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +4 -5
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +5 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +10 -2
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +2 -2
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +2 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +4 -2
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +2 -2
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +1 -1
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- package/lib/gc/index.js.map +1 -1
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -2
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +91 -0
- package/lib/messageTypes.d.ts +11 -5
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js +4 -0
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +2 -20
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +3 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +15 -4
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +61 -62
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +9 -12
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +12 -4
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +47 -38
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +2 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +19 -18
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +2 -2
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/public.d.ts +12 -0
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +7 -3
- package/lib/scheduleManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +209 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +386 -0
- package/lib/summary/documentSchema.js.map +1 -0
- package/lib/summary/index.d.ts +2 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -0
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +7 -2
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +3 -3
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +3 -3
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +3 -2
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +2 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +5 -5
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +5 -3
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +6 -17
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +3 -3
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +4 -3
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +4 -4
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +9 -8
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +57 -65
- package/src/batchTracker.ts +4 -3
- package/src/blobManager.ts +100 -77
- package/src/channelCollection.ts +180 -165
- package/src/connectionTelemetry.ts +12 -12
- package/src/containerHandleContext.ts +3 -2
- package/src/containerRuntime.ts +481 -277
- package/src/dataStore.ts +9 -4
- package/src/dataStoreContext.ts +195 -93
- package/src/dataStoreContexts.ts +5 -2
- package/src/dataStoreRegistry.ts +3 -2
- package/src/deltaManagerSummarizerProxy.ts +1 -1
- package/src/deltaScheduler.ts +2 -1
- package/src/error.ts +2 -2
- package/src/gc/garbageCollection.ts +21 -20
- package/src/gc/gcConfigs.ts +15 -18
- package/src/gc/gcDefinitions.ts +6 -8
- package/src/gc/gcHelpers.ts +22 -5
- package/src/gc/gcSummaryStateTracker.ts +7 -5
- package/src/gc/gcTelemetry.ts +13 -7
- package/src/gc/gcUnreferencedStateTracker.ts +3 -2
- package/src/gc/index.ts +1 -0
- package/src/index.ts +22 -1
- package/src/messageTypes.ts +20 -6
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/batchManager.ts +1 -0
- package/src/opLifecycle/definitions.ts +3 -21
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +90 -100
- package/src/opLifecycle/opGroupingManager.ts +12 -14
- package/src/opLifecycle/opSplitter.ts +76 -48
- package/src/opLifecycle/outbox.ts +30 -38
- package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +6 -6
- package/src/scheduleManager.ts +10 -8
- package/src/storageServiceWithAttachBlobs.ts +2 -2
- package/src/summary/documentSchema.ts +631 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +7 -7
- package/src/summary/runWhileConnectedCoordinator.ts +3 -2
- package/src/summary/runningSummarizer.ts +22 -20
- package/src/summary/summarizer.ts +17 -15
- package/src/summary/summarizerClientElection.ts +3 -2
- package/src/summary/summarizerHeuristics.ts +4 -2
- package/src/summary/summarizerNode/summarizerNode.ts +20 -18
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
- package/src/summary/summarizerTypes.ts +7 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +14 -26
- package/src/summary/summaryGenerator.ts +12 -15
- package/src/summary/summaryManager.ts +16 -13
- package/api-extractor-cjs.json +0 -8
- package/dist/container-runtime-alpha.d.ts +0 -1753
- package/dist/container-runtime-beta.d.ts +0 -268
- package/dist/container-runtime-public.d.ts +0 -268
- package/dist/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/container-runtime-alpha.d.ts +0 -1753
- package/lib/container-runtime-beta.d.ts +0 -268
- package/lib/container-runtime-public.d.ts +0 -268
- package/lib/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/test/batchTracker.spec.js +0 -88
- package/lib/test/batchTracker.spec.js.map +0 -1
- package/lib/test/blobManager.spec.js +0 -835
- package/lib/test/blobManager.spec.js.map +0 -1
- package/lib/test/channelCollection.spec.js +0 -141
- package/lib/test/channelCollection.spec.js.map +0 -1
- package/lib/test/containerRuntime.spec.js +0 -1748
- package/lib/test/containerRuntime.spec.js.map +0 -1
- package/lib/test/dataStoreContext.spec.js +0 -801
- package/lib/test/dataStoreContext.spec.js.map +0 -1
- package/lib/test/dataStoreCreation.spec.js +0 -312
- package/lib/test/dataStoreCreation.spec.js.map +0 -1
- package/lib/test/dataStoreRegistry.spec.js +0 -26
- package/lib/test/dataStoreRegistry.spec.js.map +0 -1
- package/lib/test/fuzz/fuzzUtils.js +0 -66
- package/lib/test/fuzz/fuzzUtils.js.map +0 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
- package/lib/test/gc/garbageCollection.spec.js +0 -1465
- package/lib/test/gc/garbageCollection.spec.js.map +0 -1
- package/lib/test/gc/gcConfigs.spec.js +0 -690
- package/lib/test/gc/gcConfigs.spec.js.map +0 -1
- package/lib/test/gc/gcHelpers.spec.js +0 -110
- package/lib/test/gc/gcHelpers.spec.js.map +0 -1
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
- package/lib/test/gc/gcStats.spec.js +0 -391
- package/lib/test/gc/gcStats.spec.js.map +0 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
- package/lib/test/gc/gcTelemetry.spec.js +0 -530
- package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
- package/lib/test/gc/gcUnitTestHelpers.js +0 -29
- package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
- package/lib/test/getPendingBlobs.spec.js +0 -193
- package/lib/test/getPendingBlobs.spec.js.map +0 -1
- package/lib/test/hardwareStats.spec.js +0 -93
- package/lib/test/hardwareStats.spec.js.map +0 -1
- package/lib/test/index.js +0 -6
- package/lib/test/index.js.map +0 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/batchManager.spec.js +0 -189
- package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
- package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
- package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
- package/lib/test/opLifecycle/outbox.spec.js +0 -675
- package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
- package/lib/test/pendingStateManager.spec.js +0 -329
- package/lib/test/pendingStateManager.spec.js.map +0 -1
- package/lib/test/scheduleManager.spec.js +0 -270
- package/lib/test/scheduleManager.spec.js.map +0 -1
- package/lib/test/summarizerNode.spec.js +0 -326
- package/lib/test/summarizerNode.spec.js.map +0 -1
- package/lib/test/summarizerNodeWithGc.spec.js +0 -318
- package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
- package/lib/test/summary/orderedClientElection.spec.js +0 -535
- package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
- package/lib/test/summary/runningSummarizer.spec.js +0 -1349
- package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizer.spec.js +0 -29
- package/lib/test/summary/summarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizerClientElection.spec.js +0 -436
- package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
- package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
- package/lib/test/summary/summaryCollection.spec.js +0 -200
- package/lib/test/summary/summaryCollection.spec.js.map +0 -1
- package/lib/test/summary/summaryManager.spec.js +0 -430
- package/lib/test/summary/summaryManager.spec.js.map +0 -1
- package/lib/test/summary/testQuorumClients.js +0 -34
- package/lib/test/summary/testQuorumClients.js.map +0 -1
- package/lib/test/throttler.spec.js +0 -175
- package/lib/test/throttler.spec.js.map +0 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
|
@@ -1,391 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "assert";
|
|
6
|
-
import { useFakeTimers } from "sinon";
|
|
7
|
-
import { MockLogger, mixinMonitoringContext, createChildLogger, } from "@fluidframework/telemetry-utils";
|
|
8
|
-
import { GarbageCollector, GCNodeType, defaultSessionExpiryDurationMs, oneDayMs, stableGCVersion, defaultSweepGracePeriodMs, } from "../../gc/index.js";
|
|
9
|
-
import { pkgVersion } from "../../packageVersion.js";
|
|
10
|
-
describe("Garbage Collection Stats", () => {
|
|
11
|
-
// Nodes in the reference graph.
|
|
12
|
-
const nodes = ["/node1", "/node2", "/node3", "/node4", "/node5", "/node6"];
|
|
13
|
-
const testPkgPath = ["testPkg"];
|
|
14
|
-
let mockLogger;
|
|
15
|
-
let mc;
|
|
16
|
-
let clock;
|
|
17
|
-
let lastGCMessage;
|
|
18
|
-
let gcMessagesCount = 0;
|
|
19
|
-
// The default GC data returned by `getGCData` on which GC is run. Update this to update the referenced graph.
|
|
20
|
-
let defaultGCData = { gcNodes: {} };
|
|
21
|
-
/**
|
|
22
|
-
* Called when sweep runs. It deleted the nodes from defaultGCData.
|
|
23
|
-
*/
|
|
24
|
-
function deleteSweepReadyNodes(sweepReadyRoutes) {
|
|
25
|
-
for (const nodeId of sweepReadyRoutes) {
|
|
26
|
-
assert(defaultGCData.gcNodes[nodeId] !== undefined, `Deleted node ${nodeId} doesn't exist`);
|
|
27
|
-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
28
|
-
delete defaultGCData.gcNodes[nodeId];
|
|
29
|
-
}
|
|
30
|
-
return sweepReadyRoutes;
|
|
31
|
-
}
|
|
32
|
-
function createGarbageCollector(createParams = {}, gcBlobsMap = new Map(), gcMetadata = {}, closeFn = () => { }, isSummarizerClient = true) {
|
|
33
|
-
const getNodeType = (nodePath) => {
|
|
34
|
-
if (nodePath.split("/").length !== 2) {
|
|
35
|
-
return GCNodeType.Other;
|
|
36
|
-
}
|
|
37
|
-
return GCNodeType.DataStore;
|
|
38
|
-
};
|
|
39
|
-
// The runtime to be passed to the garbage collector.
|
|
40
|
-
const gcRuntime = {
|
|
41
|
-
updateStateBeforeGC: async () => { },
|
|
42
|
-
getGCData: async (fullGC) => defaultGCData,
|
|
43
|
-
updateUsedRoutes: (usedRoutes) => {
|
|
44
|
-
return { totalNodeCount: 0, unusedNodeCount: 0 };
|
|
45
|
-
},
|
|
46
|
-
updateUnusedRoutes: (unusedRoutes) => { },
|
|
47
|
-
deleteSweepReadyNodes,
|
|
48
|
-
updateTombstonedRoutes: (tombstoneRoutes) => { },
|
|
49
|
-
getNodeType,
|
|
50
|
-
getCurrentReferenceTimestampMs: () => Date.now(),
|
|
51
|
-
closeFn,
|
|
52
|
-
};
|
|
53
|
-
let metadata = createParams.metadata;
|
|
54
|
-
const existing = createParams.baseSnapshot !== undefined;
|
|
55
|
-
// For existing, add container runtime metadata which is required for GC to be enabled.
|
|
56
|
-
if (existing) {
|
|
57
|
-
metadata = {
|
|
58
|
-
...metadata,
|
|
59
|
-
...gcMetadata,
|
|
60
|
-
gcFeature: gcMetadata.gcFeature ?? stableGCVersion,
|
|
61
|
-
summaryFormatVersion: 1,
|
|
62
|
-
message: undefined,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
return GarbageCollector.create({
|
|
66
|
-
...createParams,
|
|
67
|
-
runtime: gcRuntime,
|
|
68
|
-
gcOptions: createParams.gcOptions ?? {},
|
|
69
|
-
baseSnapshot: createParams.baseSnapshot,
|
|
70
|
-
baseLogger: createChildLogger({ logger: mc.logger }),
|
|
71
|
-
existing,
|
|
72
|
-
metadata,
|
|
73
|
-
createContainerMetadata: {
|
|
74
|
-
createContainerRuntimeVersion: pkgVersion,
|
|
75
|
-
createContainerTimestamp: Date.now(),
|
|
76
|
-
},
|
|
77
|
-
isSummarizerClient,
|
|
78
|
-
readAndParseBlob: async (id) => gcBlobsMap.get(id),
|
|
79
|
-
getNodePackagePath: async (nodeId) => testPkgPath,
|
|
80
|
-
getLastSummaryTimestampMs: () => Date.now(),
|
|
81
|
-
submitMessage: (message) => {
|
|
82
|
-
gcMessagesCount++;
|
|
83
|
-
lastGCMessage = message;
|
|
84
|
-
},
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
before(() => {
|
|
88
|
-
clock = useFakeTimers();
|
|
89
|
-
});
|
|
90
|
-
beforeEach(() => {
|
|
91
|
-
lastGCMessage = undefined;
|
|
92
|
-
mockLogger = new MockLogger();
|
|
93
|
-
mc = mixinMonitoringContext(mockLogger);
|
|
94
|
-
// Set up initial GC graph with 5 nodes and 2 are unreferenced.
|
|
95
|
-
defaultGCData.gcNodes["/"] = [nodes[0]];
|
|
96
|
-
defaultGCData.gcNodes[nodes[0]] = [nodes[1]];
|
|
97
|
-
defaultGCData.gcNodes[nodes[1]] = [];
|
|
98
|
-
defaultGCData.gcNodes[nodes[2]] = [];
|
|
99
|
-
defaultGCData.gcNodes[nodes[3]] = [];
|
|
100
|
-
// Set up the initial GC stats based on the initial GC graph.
|
|
101
|
-
initialStats = {
|
|
102
|
-
nodeCount: 5,
|
|
103
|
-
unrefNodeCount: 2,
|
|
104
|
-
updatedNodeCount: 5,
|
|
105
|
-
dataStoreCount: 5,
|
|
106
|
-
unrefDataStoreCount: 2,
|
|
107
|
-
updatedDataStoreCount: 5,
|
|
108
|
-
attachmentBlobCount: 0,
|
|
109
|
-
unrefAttachmentBlobCount: 0,
|
|
110
|
-
updatedAttachmentBlobCount: 0,
|
|
111
|
-
lifetimeNodeCount: 5,
|
|
112
|
-
lifetimeDataStoreCount: 5,
|
|
113
|
-
lifetimeAttachmentBlobCount: 0,
|
|
114
|
-
deletedNodeCount: 0,
|
|
115
|
-
deletedDataStoreCount: 0,
|
|
116
|
-
deletedAttachmentBlobCount: 0,
|
|
117
|
-
};
|
|
118
|
-
});
|
|
119
|
-
afterEach(() => {
|
|
120
|
-
clock.reset();
|
|
121
|
-
mockLogger.clear();
|
|
122
|
-
defaultGCData = { gcNodes: {} };
|
|
123
|
-
});
|
|
124
|
-
after(() => {
|
|
125
|
-
clock.restore();
|
|
126
|
-
});
|
|
127
|
-
let garbageCollector;
|
|
128
|
-
let initialStats;
|
|
129
|
-
/** Helper function that makes the garbage collector process the last GC message */
|
|
130
|
-
function processLastGCMessage() {
|
|
131
|
-
if (lastGCMessage === undefined) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
garbageCollector.processMessage(lastGCMessage, true /* local */);
|
|
135
|
-
}
|
|
136
|
-
describe("Mark phase stats", () => {
|
|
137
|
-
beforeEach(() => {
|
|
138
|
-
garbageCollector = createGarbageCollector({});
|
|
139
|
-
});
|
|
140
|
-
it("can generate initial stats", async () => {
|
|
141
|
-
const gcStats = await garbageCollector.collectGarbage({});
|
|
142
|
-
assert.deepStrictEqual(gcStats, initialStats, "The stats for first GC run should be same as initial stats");
|
|
143
|
-
});
|
|
144
|
-
it("can generate stats with unreferenced nodes", async () => {
|
|
145
|
-
const expectedStats = initialStats;
|
|
146
|
-
let gcStats = await garbageCollector.collectGarbage({});
|
|
147
|
-
assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
|
|
148
|
-
// Unreference another data store node.
|
|
149
|
-
defaultGCData.gcNodes[nodes[0]] = [];
|
|
150
|
-
// There should be 1 more unreferenced node / data store.
|
|
151
|
-
// There should be 1 node / data store whose reference state got updated.
|
|
152
|
-
expectedStats.unrefNodeCount++;
|
|
153
|
-
expectedStats.unrefDataStoreCount++;
|
|
154
|
-
expectedStats.updatedNodeCount = 1;
|
|
155
|
-
expectedStats.updatedDataStoreCount = 1;
|
|
156
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
157
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 1");
|
|
158
|
-
// Unreference another data store node
|
|
159
|
-
defaultGCData.gcNodes["/"] = [];
|
|
160
|
-
// There should be 1 more unreferenced node / data store.
|
|
161
|
-
// There should be 1 node / data store whose reference state got updated.
|
|
162
|
-
expectedStats.unrefNodeCount++;
|
|
163
|
-
expectedStats.unrefDataStoreCount++;
|
|
164
|
-
expectedStats.updatedNodeCount = 1;
|
|
165
|
-
expectedStats.updatedDataStoreCount = 1;
|
|
166
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
167
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
|
|
168
|
-
});
|
|
169
|
-
it("can generate stats with re-referenced nodes", async () => {
|
|
170
|
-
const expectedStats = initialStats;
|
|
171
|
-
let gcStats = await garbageCollector.collectGarbage({});
|
|
172
|
-
assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
|
|
173
|
-
// Unreference another data store node.
|
|
174
|
-
defaultGCData.gcNodes[nodes[0]] = [];
|
|
175
|
-
// There should be 1 more unreferenced node / data store.
|
|
176
|
-
// There should be 1 node / data store whose reference state got updated.
|
|
177
|
-
expectedStats.unrefNodeCount++;
|
|
178
|
-
expectedStats.unrefDataStoreCount++;
|
|
179
|
-
expectedStats.updatedNodeCount = 1;
|
|
180
|
-
expectedStats.updatedDataStoreCount = 1;
|
|
181
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
182
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 1");
|
|
183
|
-
// Add a new reference.
|
|
184
|
-
defaultGCData.gcNodes[nodes[0]] = [nodes[2]];
|
|
185
|
-
// There should be 1 less unreferenced node / data store.
|
|
186
|
-
// There should be 1 node / data store whose reference state got updated.
|
|
187
|
-
expectedStats.unrefNodeCount--;
|
|
188
|
-
expectedStats.unrefDataStoreCount--;
|
|
189
|
-
expectedStats.updatedNodeCount = 1;
|
|
190
|
-
expectedStats.updatedDataStoreCount = 1;
|
|
191
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
192
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
|
|
193
|
-
});
|
|
194
|
-
it("can generate stats with new nodes", async () => {
|
|
195
|
-
const expectedStats = initialStats;
|
|
196
|
-
let gcStats = await garbageCollector.collectGarbage({});
|
|
197
|
-
assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
|
|
198
|
-
// Add 2 new nodes and make one of them unreferenced.
|
|
199
|
-
defaultGCData.gcNodes["/"].push(nodes[4]);
|
|
200
|
-
defaultGCData.gcNodes[nodes[4]] = [];
|
|
201
|
-
defaultGCData.gcNodes[nodes[5]] = [];
|
|
202
|
-
// There should be 2 more nodes / data stores.
|
|
203
|
-
// There should be 1 more unreferenced node / data store.
|
|
204
|
-
// There should be 1 node / data store whose referenced state got updated.
|
|
205
|
-
expectedStats.nodeCount += 2;
|
|
206
|
-
expectedStats.dataStoreCount += 2;
|
|
207
|
-
expectedStats.lifetimeNodeCount += 2;
|
|
208
|
-
expectedStats.lifetimeDataStoreCount += 2;
|
|
209
|
-
expectedStats.unrefNodeCount++;
|
|
210
|
-
expectedStats.unrefDataStoreCount++;
|
|
211
|
-
expectedStats.updatedNodeCount = 1;
|
|
212
|
-
expectedStats.updatedDataStoreCount = 1;
|
|
213
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
214
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats");
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
/**
|
|
218
|
-
* Note that the life time and deleted stats are the same whether sweep is enabled or not.
|
|
219
|
-
*/
|
|
220
|
-
describe("Sweep phase stats", () => {
|
|
221
|
-
const defaultSnapshotCacheExpiryMs = 5 * oneDayMs;
|
|
222
|
-
const sweepTimeoutMs =
|
|
223
|
-
// Tombstone timeout
|
|
224
|
-
defaultSessionExpiryDurationMs +
|
|
225
|
-
defaultSnapshotCacheExpiryMs +
|
|
226
|
-
oneDayMs +
|
|
227
|
-
// + Grace Period
|
|
228
|
-
defaultSweepGracePeriodMs;
|
|
229
|
-
/**
|
|
230
|
-
* When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become
|
|
231
|
-
* sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.
|
|
232
|
-
*/
|
|
233
|
-
it("can generate stats with deleted nodes - sweep enabled", async () => {
|
|
234
|
-
// Create garbage collector with sweep enabled.
|
|
235
|
-
garbageCollector = createGarbageCollector({
|
|
236
|
-
gcOptions: { enableGCSweep: true },
|
|
237
|
-
});
|
|
238
|
-
let previousGCMessagesCount = gcMessagesCount;
|
|
239
|
-
const expectedStats = initialStats;
|
|
240
|
-
let gcStats = await garbageCollector.collectGarbage({});
|
|
241
|
-
assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
|
|
242
|
-
assert(gcMessagesCount === previousGCMessagesCount, "There shouldn't be new GC messages");
|
|
243
|
-
// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.
|
|
244
|
-
clock.tick(sweepTimeoutMs + 1);
|
|
245
|
-
// There shouldn't be any nodes whose reference state updated.
|
|
246
|
-
expectedStats.updatedNodeCount = 0;
|
|
247
|
-
expectedStats.updatedDataStoreCount = 0;
|
|
248
|
-
// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)
|
|
249
|
-
// but we account for them in the deleted stats now.
|
|
250
|
-
expectedStats.deletedNodeCount += 2;
|
|
251
|
-
expectedStats.deletedDataStoreCount += 2;
|
|
252
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
253
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 1");
|
|
254
|
-
assert(gcMessagesCount === ++previousGCMessagesCount, "There should be one new GC message");
|
|
255
|
-
// Process the GC message so that the sweep ready nodes are deleted.
|
|
256
|
-
processLastGCMessage();
|
|
257
|
-
// The 2 sweep ready nodes / data stores should now be truly deleted.
|
|
258
|
-
// They should be removed from the total node and unreferenced counts.
|
|
259
|
-
expectedStats.nodeCount -= 2;
|
|
260
|
-
expectedStats.dataStoreCount -= 2;
|
|
261
|
-
expectedStats.unrefNodeCount -= 2;
|
|
262
|
-
expectedStats.unrefDataStoreCount -= 2;
|
|
263
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
264
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
|
|
265
|
-
});
|
|
266
|
-
/**
|
|
267
|
-
* When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become
|
|
268
|
-
* sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.
|
|
269
|
-
*/
|
|
270
|
-
it("can generate stats with deleted nodes after multiple sweep runs - sweep enabled", async () => {
|
|
271
|
-
garbageCollector = createGarbageCollector({
|
|
272
|
-
gcOptions: { enableGCSweep: true },
|
|
273
|
-
});
|
|
274
|
-
const expectedStats = initialStats;
|
|
275
|
-
let gcStats = await garbageCollector.collectGarbage({});
|
|
276
|
-
assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
|
|
277
|
-
let previousGCMessagesCount = gcMessagesCount;
|
|
278
|
-
// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.
|
|
279
|
-
clock.tick(sweepTimeoutMs + 1);
|
|
280
|
-
// There shouldn't be any nodes whose reference state updated.
|
|
281
|
-
expectedStats.updatedNodeCount = 0;
|
|
282
|
-
expectedStats.updatedDataStoreCount = 0;
|
|
283
|
-
// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)
|
|
284
|
-
// but we account for them in the deleted stats now.
|
|
285
|
-
expectedStats.deletedNodeCount += 2;
|
|
286
|
-
expectedStats.deletedDataStoreCount += 2;
|
|
287
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
288
|
-
assert(gcMessagesCount === ++previousGCMessagesCount, "There should be one new GC message");
|
|
289
|
-
// Process the GC message so that the sweep ready nodes are deleted.
|
|
290
|
-
processLastGCMessage();
|
|
291
|
-
// Unreference one more data store node (nodes[1])
|
|
292
|
-
defaultGCData.gcNodes[nodes[0]] = [];
|
|
293
|
-
// The 2 sweep ready nodes / data stores should now be deleted.
|
|
294
|
-
// They should be removed from the total node and unreferenced counts.
|
|
295
|
-
expectedStats.nodeCount -= 2;
|
|
296
|
-
expectedStats.dataStoreCount -= 2;
|
|
297
|
-
expectedStats.unrefNodeCount -= 2;
|
|
298
|
-
expectedStats.unrefDataStoreCount -= 2;
|
|
299
|
-
// There should 1 new unreferenced node / data store and its reference state is updated.
|
|
300
|
-
expectedStats.unrefNodeCount++;
|
|
301
|
-
expectedStats.unrefDataStoreCount++;
|
|
302
|
-
expectedStats.updatedNodeCount = 1;
|
|
303
|
-
expectedStats.updatedDataStoreCount = 1;
|
|
304
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
305
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
|
|
306
|
-
// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.
|
|
307
|
-
clock.tick(sweepTimeoutMs + 1);
|
|
308
|
-
// No nodes are updated since the last run.
|
|
309
|
-
expectedStats.updatedNodeCount = 0;
|
|
310
|
-
expectedStats.updatedDataStoreCount = 0;
|
|
311
|
-
// Note that the new sweep-ready node won't actually be deleted yet (until the GC op is processed)
|
|
312
|
-
// but we account for it in the deleted stats now.
|
|
313
|
-
expectedStats.deletedNodeCount += 1;
|
|
314
|
-
expectedStats.deletedDataStoreCount += 1;
|
|
315
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
316
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 3");
|
|
317
|
-
assert(gcMessagesCount === ++previousGCMessagesCount, "There should be one new GC message");
|
|
318
|
-
// Process the GC message so that the sweep ready node is deleted.
|
|
319
|
-
processLastGCMessage();
|
|
320
|
-
// The sweep ready node / data store should now be truly deleted.
|
|
321
|
-
// It should be removed from the total node and unreferenced counts.
|
|
322
|
-
expectedStats.nodeCount--;
|
|
323
|
-
expectedStats.dataStoreCount--;
|
|
324
|
-
expectedStats.unrefNodeCount--;
|
|
325
|
-
expectedStats.unrefDataStoreCount--;
|
|
326
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
327
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 4");
|
|
328
|
-
});
|
|
329
|
-
/**
|
|
330
|
-
* When sweep is disabled, deleted stats are updated in the same GC run where the objects become
|
|
331
|
-
* sweep ready. This is because the stats are based on sweep ready state.
|
|
332
|
-
*/
|
|
333
|
-
it("can generate stats with deleted nodes - sweep disabled", async () => {
|
|
334
|
-
garbageCollector = createGarbageCollector({});
|
|
335
|
-
const expectedStats = initialStats;
|
|
336
|
-
let gcStats = await garbageCollector.collectGarbage({});
|
|
337
|
-
assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
|
|
338
|
-
// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.
|
|
339
|
-
clock.tick(sweepTimeoutMs + 1);
|
|
340
|
-
// The 2 sweep ready nodes / data stores should now show up deleted.
|
|
341
|
-
// There shouldn't be any nodes whose reference state updated.
|
|
342
|
-
expectedStats.deletedNodeCount = 2;
|
|
343
|
-
expectedStats.deletedDataStoreCount = 2;
|
|
344
|
-
expectedStats.updatedNodeCount = 0;
|
|
345
|
-
expectedStats.updatedDataStoreCount = 0;
|
|
346
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
347
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats");
|
|
348
|
-
});
|
|
349
|
-
/**
|
|
350
|
-
* When sweep is disabled, deleted stats are updated in the same GC run where the objects become
|
|
351
|
-
* sweep ready. This is because the stats are based on sweep ready state.
|
|
352
|
-
*/
|
|
353
|
-
it("can generate stats with deleted nodes after multiple sweep runs - sweep disabled", async () => {
|
|
354
|
-
garbageCollector = createGarbageCollector({});
|
|
355
|
-
const expectedStats = initialStats;
|
|
356
|
-
let gcStats = await garbageCollector.collectGarbage({});
|
|
357
|
-
assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
|
|
358
|
-
// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.
|
|
359
|
-
clock.tick(sweepTimeoutMs + 1);
|
|
360
|
-
// The 2 sweep ready nodes / data stores should now show up deleted.
|
|
361
|
-
// There shouldn't be any nodes whose reference state updated.
|
|
362
|
-
expectedStats.deletedNodeCount = 2;
|
|
363
|
-
expectedStats.deletedDataStoreCount = 2;
|
|
364
|
-
expectedStats.updatedNodeCount = 0;
|
|
365
|
-
expectedStats.updatedDataStoreCount = 0;
|
|
366
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
367
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 1");
|
|
368
|
-
// Unreference another data store node.
|
|
369
|
-
defaultGCData.gcNodes[nodes[0]] = [];
|
|
370
|
-
// There should be 1 more unreferenced node / data store and its referenced
|
|
371
|
-
// state is updated.
|
|
372
|
-
expectedStats.unrefNodeCount++;
|
|
373
|
-
expectedStats.unrefDataStoreCount++;
|
|
374
|
-
expectedStats.updatedNodeCount = 1;
|
|
375
|
-
expectedStats.updatedDataStoreCount = 1;
|
|
376
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
377
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
|
|
378
|
-
// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.
|
|
379
|
-
clock.tick(sweepTimeoutMs + 1);
|
|
380
|
-
// No nodes are updated since the last run.
|
|
381
|
-
// The sweep ready node / data store should show up as deleted.
|
|
382
|
-
expectedStats.updatedNodeCount = 0;
|
|
383
|
-
expectedStats.updatedDataStoreCount = 0;
|
|
384
|
-
expectedStats.deletedNodeCount++;
|
|
385
|
-
expectedStats.deletedDataStoreCount++;
|
|
386
|
-
gcStats = await garbageCollector.collectGarbage({});
|
|
387
|
-
assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 3");
|
|
388
|
-
});
|
|
389
|
-
});
|
|
390
|
-
});
|
|
391
|
-
//# sourceMappingURL=gcStats.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gcStats.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcStats.spec.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 { strict as assert } from \"assert\";\nimport { SinonFakeTimers, useFakeTimers } from \"sinon\";\nimport { ICriticalContainerError } from \"@fluidframework/container-definitions\";\nimport { IGarbageCollectionData } from \"@fluidframework/runtime-definitions\";\nimport {\n\tMockLogger,\n\tmixinMonitoringContext,\n\tMonitoringContext,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tGarbageCollector,\n\tGCNodeType,\n\tIGarbageCollectionRuntime,\n\tIGarbageCollector,\n\tIGarbageCollectorCreateParams,\n\tIGCMetadata,\n\tdefaultSessionExpiryDurationMs,\n\toneDayMs,\n\tstableGCVersion,\n\tIGCStats,\n\tdefaultSweepGracePeriodMs,\n} from \"../../gc/index.js\";\nimport { ContainerRuntimeGCMessage } from \"../../messageTypes.js\";\nimport { pkgVersion } from \"../../packageVersion.js\";\n\ndescribe(\"Garbage Collection Stats\", () => {\n\t// Nodes in the reference graph.\n\tconst nodes: string[] = [\"/node1\", \"/node2\", \"/node3\", \"/node4\", \"/node5\", \"/node6\"];\n\tconst testPkgPath = [\"testPkg\"];\n\n\tlet mockLogger: MockLogger;\n\tlet mc: MonitoringContext<MockLogger>;\n\tlet clock: SinonFakeTimers;\n\tlet lastGCMessage: ContainerRuntimeGCMessage | undefined;\n\tlet gcMessagesCount: number = 0;\n\n\t// The default GC data returned by `getGCData` on which GC is run. Update this to update the referenced graph.\n\tlet defaultGCData: IGarbageCollectionData = { gcNodes: {} };\n\n\t/**\n\t * Called when sweep runs. It deleted the nodes from defaultGCData.\n\t */\n\tfunction deleteSweepReadyNodes(sweepReadyRoutes: string[]): string[] {\n\t\tfor (const nodeId of sweepReadyRoutes) {\n\t\t\tassert(\n\t\t\t\tdefaultGCData.gcNodes[nodeId] !== undefined,\n\t\t\t\t`Deleted node ${nodeId} doesn't exist`,\n\t\t\t);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\tdelete defaultGCData.gcNodes[nodeId];\n\t\t}\n\t\treturn sweepReadyRoutes;\n\t}\n\n\tfunction createGarbageCollector(\n\t\tcreateParams: Partial<IGarbageCollectorCreateParams> = {},\n\t\tgcBlobsMap: Map<string, any> = new Map(),\n\t\tgcMetadata: IGCMetadata = {},\n\t\tcloseFn: (error?: ICriticalContainerError) => void = () => {},\n\t\tisSummarizerClient: boolean = true,\n\t) {\n\t\tconst getNodeType = (nodePath: string) => {\n\t\t\tif (nodePath.split(\"/\").length !== 2) {\n\t\t\t\treturn GCNodeType.Other;\n\t\t\t}\n\t\t\treturn GCNodeType.DataStore;\n\t\t};\n\n\t\t// The runtime to be passed to the garbage collector.\n\t\tconst gcRuntime: IGarbageCollectionRuntime = {\n\t\t\tupdateStateBeforeGC: async () => {},\n\t\t\tgetGCData: async (fullGC?: boolean) => defaultGCData,\n\t\t\tupdateUsedRoutes: (usedRoutes: string[]) => {\n\t\t\t\treturn { totalNodeCount: 0, unusedNodeCount: 0 };\n\t\t\t},\n\t\t\tupdateUnusedRoutes: (unusedRoutes: string[]) => {},\n\t\t\tdeleteSweepReadyNodes,\n\t\t\tupdateTombstonedRoutes: (tombstoneRoutes: string[]) => {},\n\t\t\tgetNodeType,\n\t\t\tgetCurrentReferenceTimestampMs: () => Date.now(),\n\t\t\tcloseFn,\n\t\t};\n\n\t\tlet metadata = createParams.metadata;\n\t\tconst existing = createParams.baseSnapshot !== undefined;\n\t\t// For existing, add container runtime metadata which is required for GC to be enabled.\n\t\tif (existing) {\n\t\t\tmetadata = {\n\t\t\t\t...metadata,\n\t\t\t\t...gcMetadata,\n\t\t\t\tgcFeature: gcMetadata.gcFeature ?? stableGCVersion,\n\t\t\t\tsummaryFormatVersion: 1,\n\t\t\t\tmessage: undefined,\n\t\t\t};\n\t\t}\n\n\t\treturn GarbageCollector.create({\n\t\t\t...createParams,\n\t\t\truntime: gcRuntime,\n\t\t\tgcOptions: createParams.gcOptions ?? {},\n\t\t\tbaseSnapshot: createParams.baseSnapshot,\n\t\t\tbaseLogger: createChildLogger({ logger: mc.logger }),\n\t\t\texisting,\n\t\t\tmetadata,\n\t\t\tcreateContainerMetadata: {\n\t\t\t\tcreateContainerRuntimeVersion: pkgVersion,\n\t\t\t\tcreateContainerTimestamp: Date.now(),\n\t\t\t},\n\t\t\tisSummarizerClient,\n\t\t\treadAndParseBlob: async <T>(id: string) => gcBlobsMap.get(id) as T,\n\t\t\tgetNodePackagePath: async (nodeId: string) => testPkgPath,\n\t\t\tgetLastSummaryTimestampMs: () => Date.now(),\n\t\t\tsubmitMessage: (message: ContainerRuntimeGCMessage) => {\n\t\t\t\tgcMessagesCount++;\n\t\t\t\tlastGCMessage = message;\n\t\t\t},\n\t\t});\n\t}\n\n\tbefore(() => {\n\t\tclock = useFakeTimers();\n\t});\n\n\tbeforeEach(() => {\n\t\tlastGCMessage = undefined;\n\t\tmockLogger = new MockLogger();\n\t\tmc = mixinMonitoringContext(mockLogger);\n\n\t\t// Set up initial GC graph with 5 nodes and 2 are unreferenced.\n\t\tdefaultGCData.gcNodes[\"/\"] = [nodes[0]];\n\t\tdefaultGCData.gcNodes[nodes[0]] = [nodes[1]];\n\t\tdefaultGCData.gcNodes[nodes[1]] = [];\n\t\tdefaultGCData.gcNodes[nodes[2]] = [];\n\t\tdefaultGCData.gcNodes[nodes[3]] = [];\n\n\t\t// Set up the initial GC stats based on the initial GC graph.\n\t\tinitialStats = {\n\t\t\tnodeCount: 5,\n\t\t\tunrefNodeCount: 2,\n\t\t\tupdatedNodeCount: 5,\n\t\t\tdataStoreCount: 5,\n\t\t\tunrefDataStoreCount: 2,\n\t\t\tupdatedDataStoreCount: 5,\n\t\t\tattachmentBlobCount: 0,\n\t\t\tunrefAttachmentBlobCount: 0,\n\t\t\tupdatedAttachmentBlobCount: 0,\n\t\t\tlifetimeNodeCount: 5,\n\t\t\tlifetimeDataStoreCount: 5,\n\t\t\tlifetimeAttachmentBlobCount: 0,\n\t\t\tdeletedNodeCount: 0,\n\t\t\tdeletedDataStoreCount: 0,\n\t\t\tdeletedAttachmentBlobCount: 0,\n\t\t};\n\t});\n\n\tafterEach(() => {\n\t\tclock.reset();\n\t\tmockLogger.clear();\n\t\tdefaultGCData = { gcNodes: {} };\n\t});\n\n\tafter(() => {\n\t\tclock.restore();\n\t});\n\n\tlet garbageCollector: IGarbageCollector;\n\tlet initialStats: IGCStats;\n\n\t/** Helper function that makes the garbage collector process the last GC message */\n\tfunction processLastGCMessage() {\n\t\tif (lastGCMessage === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tgarbageCollector.processMessage(lastGCMessage, true /* local */);\n\t}\n\n\tdescribe(\"Mark phase stats\", () => {\n\t\tbeforeEach(() => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\t\t});\n\n\t\tit(\"can generate initial stats\", async () => {\n\t\t\tconst gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\tinitialStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can generate stats with unreferenced nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Unreference another data store node\n\t\t\tdefaultGCData.gcNodes[\"/\"] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\tit(\"can generate stats with re-referenced nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Add a new reference.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [nodes[2]];\n\n\t\t\t// There should be 1 less unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount--;\n\t\t\texpectedStats.unrefDataStoreCount--;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\tit(\"can generate stats with new nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Add 2 new nodes and make one of them unreferenced.\n\t\t\tdefaultGCData.gcNodes[\"/\"].push(nodes[4]);\n\t\t\tdefaultGCData.gcNodes[nodes[4]] = [];\n\t\t\tdefaultGCData.gcNodes[nodes[5]] = [];\n\n\t\t\t// There should be 2 more nodes / data stores.\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose referenced state got updated.\n\t\t\texpectedStats.nodeCount += 2;\n\t\t\texpectedStats.dataStoreCount += 2;\n\t\t\texpectedStats.lifetimeNodeCount += 2;\n\t\t\texpectedStats.lifetimeDataStoreCount += 2;\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats\");\n\t\t});\n\t});\n\n\t/**\n\t * Note that the life time and deleted stats are the same whether sweep is enabled or not.\n\t */\n\tdescribe(\"Sweep phase stats\", () => {\n\t\tconst defaultSnapshotCacheExpiryMs = 5 * oneDayMs;\n\t\tconst sweepTimeoutMs =\n\t\t\t// Tombstone timeout\n\t\t\tdefaultSessionExpiryDurationMs +\n\t\t\tdefaultSnapshotCacheExpiryMs +\n\t\t\toneDayMs +\n\t\t\t// + Grace Period\n\t\t\tdefaultSweepGracePeriodMs;\n\n\t\t/**\n\t\t * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become\n\t\t * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes - sweep enabled\", async () => {\n\t\t\t// Create garbage collector with sweep enabled.\n\t\t\tgarbageCollector = createGarbageCollector({\n\t\t\t\tgcOptions: { enableGCSweep: true },\n\t\t\t});\n\n\t\t\tlet previousGCMessagesCount = gcMessagesCount;\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === previousGCMessagesCount,\n\t\t\t\t\"There shouldn't be new GC messages\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for them in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 2;\n\t\t\texpectedStats.deletedDataStoreCount += 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready nodes are deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// The 2 sweep ready nodes / data stores should now be truly deleted.\n\t\t\t// They should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount -= 2;\n\t\t\texpectedStats.dataStoreCount -= 2;\n\t\t\texpectedStats.unrefNodeCount -= 2;\n\t\t\texpectedStats.unrefDataStoreCount -= 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become\n\t\t * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes after multiple sweep runs - sweep enabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({\n\t\t\t\tgcOptions: { enableGCSweep: true },\n\t\t\t});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\tlet previousGCMessagesCount = gcMessagesCount;\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for them in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 2;\n\t\t\texpectedStats.deletedDataStoreCount += 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready nodes are deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// Unreference one more data store node (nodes[1])\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// The 2 sweep ready nodes / data stores should now be deleted.\n\t\t\t// They should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount -= 2;\n\t\t\texpectedStats.dataStoreCount -= 2;\n\t\t\texpectedStats.unrefNodeCount -= 2;\n\t\t\texpectedStats.unrefDataStoreCount -= 2;\n\t\t\t// There should 1 new unreferenced node / data store and its reference state is updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\n\t\t\t// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// No nodes are updated since the last run.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the new sweep-ready node won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for it in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 1;\n\t\t\texpectedStats.deletedDataStoreCount += 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 3\");\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready node is deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// The sweep ready node / data store should now be truly deleted.\n\t\t\t// It should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount--;\n\t\t\texpectedStats.dataStoreCount--;\n\t\t\texpectedStats.unrefNodeCount--;\n\t\t\texpectedStats.unrefDataStoreCount--;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 4\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is disabled, deleted stats are updated in the same GC run where the objects become\n\t\t * sweep ready. This is because the stats are based on sweep ready state.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes - sweep disabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// The 2 sweep ready nodes / data stores should now show up deleted.\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.deletedNodeCount = 2;\n\t\t\texpectedStats.deletedDataStoreCount = 2;\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is disabled, deleted stats are updated in the same GC run where the objects become\n\t\t * sweep ready. This is because the stats are based on sweep ready state.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes after multiple sweep runs - sweep disabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// The 2 sweep ready nodes / data stores should now show up deleted.\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.deletedNodeCount = 2;\n\t\t\texpectedStats.deletedDataStoreCount = 2;\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store and its referenced\n\t\t\t// state is updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\n\t\t\t// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// No nodes are updated since the last run.\n\t\t\t// The sweep ready node / data store should show up as deleted.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\t\t\texpectedStats.deletedNodeCount++;\n\t\t\texpectedStats.deletedDataStoreCount++;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 3\");\n\t\t});\n\t});\n});\n"]}
|