@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,318 +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 { SummaryType } from "@fluidframework/protocol-definitions";
|
|
7
|
-
import { CreateSummarizerNodeSource, } from "@fluidframework/runtime-definitions";
|
|
8
|
-
import { GCDataBuilder, mergeStats } from "@fluidframework/runtime-utils";
|
|
9
|
-
import { MockLogger, TelemetryDataTag, createChildLogger } from "@fluidframework/telemetry-utils";
|
|
10
|
-
import { createRootSummarizerNodeWithGC,
|
|
11
|
-
// eslint-disable-next-line import/no-internal-modules
|
|
12
|
-
} from "../summary/summarizerNode/summarizerNodeWithGc.js";
|
|
13
|
-
import { cloneGCData } from "../gc/index.js";
|
|
14
|
-
describe("SummarizerNodeWithGC Tests", () => {
|
|
15
|
-
const summarizerNodeId = "testNode";
|
|
16
|
-
const node1Id = "/gcNode1";
|
|
17
|
-
const node2Id = "/gcNode2";
|
|
18
|
-
const subNode1Id = "/gcNode1/subNode";
|
|
19
|
-
const subNode2Id = "/gcNode2/subNode";
|
|
20
|
-
let rootSummarizerNode;
|
|
21
|
-
let summarizerNode;
|
|
22
|
-
// The base GC details of the root summarizer node. The child base GC details from this is passed on to the child
|
|
23
|
-
// summarizer node during its creation.
|
|
24
|
-
let rootBaseGCDetails;
|
|
25
|
-
// The GC data returned by the getGCData() API of the child summarizer node.
|
|
26
|
-
let childInternalGCData;
|
|
27
|
-
let mockLogger;
|
|
28
|
-
const getRootBaseGCDetails = async () => rootBaseGCDetails;
|
|
29
|
-
const getChildInternalGCData = async () => childInternalGCData;
|
|
30
|
-
beforeEach(async () => {
|
|
31
|
-
mockLogger = new MockLogger();
|
|
32
|
-
rootSummarizerNode = createRootSummarizerNodeWithGC(mockLogger, (() => undefined), 0, 0, undefined, undefined, getRootBaseGCDetails);
|
|
33
|
-
rootSummarizerNode.startSummary(0, createChildLogger(), 0);
|
|
34
|
-
summarizerNode = rootSummarizerNode.createChild(summarizeInternal, summarizerNodeId, { type: CreateSummarizerNodeSource.FromSummary }, undefined, getChildInternalGCData);
|
|
35
|
-
// Initialize the values to be returned by the child node's getGCData.
|
|
36
|
-
childInternalGCData = {
|
|
37
|
-
gcNodes: {
|
|
38
|
-
"/": [node1Id, node2Id],
|
|
39
|
-
[node1Id]: [subNode1Id],
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
// Initialize the values to be returned by the getBaseGCDetails() API of the root summarizer node.
|
|
43
|
-
rootBaseGCDetails = {
|
|
44
|
-
usedRoutes: [],
|
|
45
|
-
};
|
|
46
|
-
});
|
|
47
|
-
async function summarizeInternal(fullTree, trackState) {
|
|
48
|
-
const stats = mergeStats();
|
|
49
|
-
stats.treeNodeCount++;
|
|
50
|
-
return {
|
|
51
|
-
summary: {
|
|
52
|
-
type: SummaryType.Tree,
|
|
53
|
-
tree: {},
|
|
54
|
-
},
|
|
55
|
-
stats,
|
|
56
|
-
id: summarizerNodeId,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Given the GC data of a child, build the GC data of the root (parent) node.
|
|
61
|
-
*/
|
|
62
|
-
function buildRootGCData(childGCData, childId) {
|
|
63
|
-
const builder = new GCDataBuilder();
|
|
64
|
-
builder.prefixAndAddNodes(childId, childGCData.gcNodes);
|
|
65
|
-
return builder.getGCData();
|
|
66
|
-
}
|
|
67
|
-
describe("getGCData API", () => {
|
|
68
|
-
it("fails when function to get GC data is not provided", async () => {
|
|
69
|
-
// Root summarizer node does not have the function to get GC data. Trying to get GC data from it should
|
|
70
|
-
// fail.
|
|
71
|
-
let failed = false;
|
|
72
|
-
try {
|
|
73
|
-
await rootSummarizerNode.getGCData();
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
failed = true;
|
|
77
|
-
}
|
|
78
|
-
assert(failed, "Getting GC data should have failed");
|
|
79
|
-
});
|
|
80
|
-
it("can return GC data when data has changed since last summary", async () => {
|
|
81
|
-
// Invalidate the summarizer node to force it to generate GC data and not use cached value.
|
|
82
|
-
summarizerNode.invalidate(10);
|
|
83
|
-
const gcData = await summarizerNode.getGCData();
|
|
84
|
-
assert.deepStrictEqual(gcData, childInternalGCData, "GC data should be generated by calling getChildInternalGCData");
|
|
85
|
-
});
|
|
86
|
-
it("can return base GC data when nothing has changed since last summary", async () => {
|
|
87
|
-
// The base GC data of the child summarizer node.
|
|
88
|
-
const childBaseGCData = {
|
|
89
|
-
gcNodes: {
|
|
90
|
-
"/": [node1Id],
|
|
91
|
-
[node1Id]: ["/"],
|
|
92
|
-
[node2Id]: [subNode1Id, subNode2Id],
|
|
93
|
-
},
|
|
94
|
-
};
|
|
95
|
-
// Set the root base GC details to include the child node's base GC data.
|
|
96
|
-
rootBaseGCDetails = {
|
|
97
|
-
usedRoutes: [""],
|
|
98
|
-
gcData: buildRootGCData(childBaseGCData, summarizerNodeId),
|
|
99
|
-
};
|
|
100
|
-
// We did not invalidate the summarizer node, so it will get the base GC data because nothing changed
|
|
101
|
-
// since last summary.
|
|
102
|
-
const gcData = await summarizerNode.getGCData();
|
|
103
|
-
assert.deepStrictEqual(gcData, childBaseGCData, "Base GC data should have been returned");
|
|
104
|
-
});
|
|
105
|
-
it("can return GC data when base GC data is not available", async () => {
|
|
106
|
-
// The base GC data of the child summarizer node is undefined by default. So, the node will generate GC
|
|
107
|
-
// data even though nothing changed since last summary.
|
|
108
|
-
const gcData = await summarizerNode.getGCData();
|
|
109
|
-
assert.deepStrictEqual(gcData, childInternalGCData, "GC data should be generated by calling getChildInternalGCData");
|
|
110
|
-
});
|
|
111
|
-
it("can return cached GC data", async () => {
|
|
112
|
-
// The base GC data of the child summarizer node is undefined by default. So, the node will generate GC
|
|
113
|
-
// data even though nothing changed since last summary.
|
|
114
|
-
let gcData = await summarizerNode.getGCData();
|
|
115
|
-
assert.deepStrictEqual(gcData, childInternalGCData, "GC data should be generated by calling getChildInternalGCData");
|
|
116
|
-
// Make a clone of the GC data returned above because we are about to change it.
|
|
117
|
-
const cachedGCData = cloneGCData(gcData);
|
|
118
|
-
// Add a new node to the GC data returned by getChildInternalGCData to make it different from cachedGCData above.
|
|
119
|
-
// This will validate that the data returned by getGCData is not childInternalGCData.
|
|
120
|
-
childInternalGCData.gcNodes[subNode1Id] = ["/", subNode2Id];
|
|
121
|
-
// Since nothing changed since last summary, summarizer node should return the data from the previous run.
|
|
122
|
-
gcData = await summarizerNode.getGCData();
|
|
123
|
-
assert.deepStrictEqual(gcData, cachedGCData, "GC data from previous run should be returned");
|
|
124
|
-
});
|
|
125
|
-
it("can generate GC data when nothing changed but fullGC flag is true", async () => {
|
|
126
|
-
let gcData = await summarizerNode.getGCData();
|
|
127
|
-
assert.deepStrictEqual(gcData, childInternalGCData, "GC data should be generated by calling getChildInternalGCData");
|
|
128
|
-
// Add a new node to the GC data returned by getChildInternalGCData to make it different from before.
|
|
129
|
-
// This will validate that the data returned by getGCData is the new childInternalGCData.
|
|
130
|
-
childInternalGCData.gcNodes[subNode1Id] = ["/", subNode2Id];
|
|
131
|
-
// Call getGCData() with fullGC = true. Even though nothing changed since last summary, this will force the
|
|
132
|
-
// summarizer node to generate GC data by calling getChildInternalGCData.
|
|
133
|
-
gcData = await summarizerNode.getGCData(true /* fullGC */);
|
|
134
|
-
assert.deepStrictEqual(gcData, childInternalGCData, "GC data should be generated by calling getChildInternalGCData");
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
describe("summarize API", () => {
|
|
138
|
-
it("should not allow summarizing without running GC first", async () => {
|
|
139
|
-
// Since GC is enabled, calling summarize without running GC (updating used routes) should result in
|
|
140
|
-
// an assert being thrown.
|
|
141
|
-
await assert.rejects(summarizerNode.summarize(true /* fullTree */), "summarize should have thrown since GC was run");
|
|
142
|
-
});
|
|
143
|
-
it("should allow summarizing after running GC", async () => {
|
|
144
|
-
// Update the used routes which emulates running GC.
|
|
145
|
-
summarizerNode.updateUsedRoutes([""]);
|
|
146
|
-
// Summarize should not throw since GC was run before.
|
|
147
|
-
await assert.doesNotReject(summarizerNode.summarize(true /* fullTree */), "summarize should not have thrown an error since GC was run");
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
describe("Validate Summary", () => {
|
|
151
|
-
const ids = ["rootId", "midId", "leafId"];
|
|
152
|
-
let rootNode;
|
|
153
|
-
let midNode;
|
|
154
|
-
let leafNode;
|
|
155
|
-
const logger = createChildLogger();
|
|
156
|
-
const getSummarizeInternalFn = (depth) => async (fullTree) => {
|
|
157
|
-
return {
|
|
158
|
-
id: ids[depth],
|
|
159
|
-
pathPartsForChildren: undefined,
|
|
160
|
-
stats: mergeStats(),
|
|
161
|
-
summary: { type: SummaryType.Tree, tree: {} },
|
|
162
|
-
};
|
|
163
|
-
};
|
|
164
|
-
function createRoot({ changeSeq = 1, refSeq, ...config } = {}) {
|
|
165
|
-
rootNode = createRootSummarizerNodeWithGC(logger, getSummarizeInternalFn(0), changeSeq, refSeq, config);
|
|
166
|
-
}
|
|
167
|
-
function createMid(createParam) {
|
|
168
|
-
midNode = rootNode.createChild(getSummarizeInternalFn(1), ids[1], createParam);
|
|
169
|
-
}
|
|
170
|
-
function createLeaf(createParam) {
|
|
171
|
-
leafNode = midNode?.createChild(getSummarizeInternalFn(2), ids[2], createParam);
|
|
172
|
-
}
|
|
173
|
-
it("summary validation should fail if GC not run on root node", () => {
|
|
174
|
-
createRoot();
|
|
175
|
-
rootNode.startSummary(11, logger, 0);
|
|
176
|
-
// Validate summary fails by calling validateSummary.
|
|
177
|
-
const expectedResult = {
|
|
178
|
-
success: false,
|
|
179
|
-
reason: "NodeDidNotRunGC",
|
|
180
|
-
id: {
|
|
181
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
182
|
-
value: "",
|
|
183
|
-
},
|
|
184
|
-
retryAfterSeconds: 1,
|
|
185
|
-
};
|
|
186
|
-
const result = rootNode.validateSummary();
|
|
187
|
-
assert.deepStrictEqual(result, expectedResult, "validate summary should have failed at the root node");
|
|
188
|
-
// Validate summary fails by calling completeSummary.
|
|
189
|
-
assert.throws(() => rootNode.completeSummary("test-handle", true /* validateSummary */), (error) => {
|
|
190
|
-
const correctErrorMessage = error.message === "NodeDidNotRunGC";
|
|
191
|
-
const correctErrorId = error.id.value === "";
|
|
192
|
-
return correctErrorMessage && correctErrorId;
|
|
193
|
-
}, "Complete summary should have failed at the root node");
|
|
194
|
-
});
|
|
195
|
-
it("summary validation should fail if GC not run on child node", async () => {
|
|
196
|
-
createRoot();
|
|
197
|
-
createMid({ type: CreateSummarizerNodeSource.Local });
|
|
198
|
-
createLeaf({ type: CreateSummarizerNodeSource.Local });
|
|
199
|
-
rootNode.startSummary(11, logger, 0);
|
|
200
|
-
// Call updateUsedRoutes (indicating GC ran) and summarize on the root and leaf nodes but not on the
|
|
201
|
-
// mid node. Calling summarize is important because otherwise we will see similar failures because of
|
|
202
|
-
// not running GC.
|
|
203
|
-
rootNode.updateUsedRoutes([""]);
|
|
204
|
-
leafNode?.updateUsedRoutes([""]);
|
|
205
|
-
await rootNode.summarize(false);
|
|
206
|
-
await leafNode?.summarize(false);
|
|
207
|
-
const midNodeId = `/${ids[1]}`;
|
|
208
|
-
// Validate summary fails by calling validateSummary.
|
|
209
|
-
const expectedResult = {
|
|
210
|
-
success: false,
|
|
211
|
-
reason: "NodeDidNotRunGC",
|
|
212
|
-
id: {
|
|
213
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
214
|
-
value: midNodeId,
|
|
215
|
-
},
|
|
216
|
-
retryAfterSeconds: 1,
|
|
217
|
-
};
|
|
218
|
-
const result = rootNode.validateSummary();
|
|
219
|
-
assert.deepStrictEqual(result, expectedResult, "validate summary should have failed at the mid node");
|
|
220
|
-
// Validate summary fails by calling completeSummary.
|
|
221
|
-
assert.throws(() => rootNode.completeSummary("test-handle", true /* validateSummary */), (error) => {
|
|
222
|
-
const correctErrorMessage = error.message === "NodeDidNotRunGC";
|
|
223
|
-
const correctErrorId = error.id.value === midNodeId;
|
|
224
|
-
return correctErrorMessage && correctErrorId;
|
|
225
|
-
}, "Complete summary should have failed at the mid node");
|
|
226
|
-
});
|
|
227
|
-
it("summary validation should fail if GC not run on leaf node", async () => {
|
|
228
|
-
createRoot();
|
|
229
|
-
createMid({ type: CreateSummarizerNodeSource.Local });
|
|
230
|
-
createLeaf({ type: CreateSummarizerNodeSource.Local });
|
|
231
|
-
rootNode.startSummary(11, logger, 0);
|
|
232
|
-
// Call updateUsedRoutes (indicating GC ran) and summarize on the root and leaf nodes but not on the
|
|
233
|
-
// mid node. Calling summarize is important because otherwise we will see similar failures because of
|
|
234
|
-
// not running GC.
|
|
235
|
-
rootNode.updateUsedRoutes([""]);
|
|
236
|
-
midNode?.updateUsedRoutes([""]);
|
|
237
|
-
await rootNode.summarize(false);
|
|
238
|
-
await midNode?.summarize(false);
|
|
239
|
-
const leafNodeId = `/${ids[1]}/${ids[2]}`;
|
|
240
|
-
// Validate summary fails by calling validateSummary.
|
|
241
|
-
const expectedResult = {
|
|
242
|
-
success: false,
|
|
243
|
-
reason: "NodeDidNotRunGC",
|
|
244
|
-
id: {
|
|
245
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
246
|
-
value: leafNodeId,
|
|
247
|
-
},
|
|
248
|
-
retryAfterSeconds: 1,
|
|
249
|
-
};
|
|
250
|
-
const result = rootNode.validateSummary();
|
|
251
|
-
assert.deepStrictEqual(result, expectedResult, "validate summary should have failed at the leaf node");
|
|
252
|
-
// Validate summary fails by calling completeSummary.
|
|
253
|
-
assert.throws(() => rootNode.completeSummary("test-handle", true /* validateSummary */), (error) => {
|
|
254
|
-
const correctErrorMessage = error.message === "NodeDidNotRunGC";
|
|
255
|
-
const correctErrorId = error.id.value === leafNodeId;
|
|
256
|
-
return correctErrorMessage && correctErrorId;
|
|
257
|
-
}, "Complete summary should have failed at the leaf node");
|
|
258
|
-
});
|
|
259
|
-
let summaryRefSeq = 123;
|
|
260
|
-
it("Should add GC pending summary node created after parent node was summarized with non-empty used routes", async () => {
|
|
261
|
-
createRoot();
|
|
262
|
-
createMid({ type: CreateSummarizerNodeSource.Local });
|
|
263
|
-
const latestSummaryRefSeqNum = summaryRefSeq;
|
|
264
|
-
rootNode.startSummary(summaryRefSeq++, logger, 0);
|
|
265
|
-
rootNode.updateUsedRoutes([""]);
|
|
266
|
-
midNode?.updateUsedRoutes([""]);
|
|
267
|
-
await rootNode.summarize(false);
|
|
268
|
-
await midNode?.summarize(false);
|
|
269
|
-
rootNode.completeSummary("test-handle1", true /* validateSummary */);
|
|
270
|
-
let result = await rootNode.refreshLatestSummary("test-handle1", summaryRefSeq);
|
|
271
|
-
assert(result.isSummaryTracked, "should be tracked");
|
|
272
|
-
assert(result.isSummaryNewer === true, "should be newer");
|
|
273
|
-
rootNode.startSummary(summaryRefSeq++, logger, latestSummaryRefSeqNum);
|
|
274
|
-
rootNode.updateUsedRoutes([`/`, `/${ids[1]}`, `/${ids[1]}/${ids[2]}`]);
|
|
275
|
-
midNode?.updateUsedRoutes([`/`, `/${ids[2]}`]);
|
|
276
|
-
await rootNode.summarize(false);
|
|
277
|
-
await midNode?.summarize(false);
|
|
278
|
-
rootNode.completeSummary("test-handle2", true /* validateSummary */);
|
|
279
|
-
// Create a new child node for which we will need to create a pending summary for.
|
|
280
|
-
createLeaf({ type: CreateSummarizerNodeSource.Local });
|
|
281
|
-
result = await rootNode.refreshLatestSummary("test-handle2", summaryRefSeq);
|
|
282
|
-
assert(result.isSummaryTracked, "should be tracked");
|
|
283
|
-
assert(result.isSummaryNewer === true, "should be newer");
|
|
284
|
-
const leafNodePath = `${ids[0]}/${ids[1]}/${ids[2]}`;
|
|
285
|
-
const leafNodeLatestSummary = leafNode.latestSummary;
|
|
286
|
-
assert.strictEqual(leafNodeLatestSummary?.fullPath.toString(), leafNodePath, "The child node's latest summary path is incorrect");
|
|
287
|
-
});
|
|
288
|
-
it("Should add GC pending summary node created after parent node was summarized with empty used routes", async () => {
|
|
289
|
-
createRoot();
|
|
290
|
-
createMid({ type: CreateSummarizerNodeSource.Local });
|
|
291
|
-
const latestSummaryRefSeqNum = summaryRefSeq;
|
|
292
|
-
rootNode.startSummary(summaryRefSeq++, logger, 0);
|
|
293
|
-
rootNode.updateUsedRoutes([""]);
|
|
294
|
-
midNode?.updateUsedRoutes([""]);
|
|
295
|
-
await rootNode.summarize(false);
|
|
296
|
-
await midNode?.summarize(false);
|
|
297
|
-
rootNode.completeSummary("test-handle1", true /* validateSummary */);
|
|
298
|
-
let result = await rootNode.refreshLatestSummary("test-handle1", summaryRefSeq);
|
|
299
|
-
assert(result.isSummaryTracked, "should be tracked");
|
|
300
|
-
assert(result.isSummaryNewer === true, "should be newer");
|
|
301
|
-
rootNode.startSummary(summaryRefSeq++, logger, latestSummaryRefSeqNum);
|
|
302
|
-
rootNode.updateUsedRoutes([""]);
|
|
303
|
-
midNode?.updateUsedRoutes([""]);
|
|
304
|
-
await rootNode.summarize(false);
|
|
305
|
-
await midNode?.summarize(false);
|
|
306
|
-
rootNode.completeSummary("test-handle2", true /* validateSummary */);
|
|
307
|
-
// Create a new child node for which we will need to create a pending summary for.
|
|
308
|
-
createLeaf({ type: CreateSummarizerNodeSource.Local });
|
|
309
|
-
result = await rootNode.refreshLatestSummary("test-handle2", summaryRefSeq);
|
|
310
|
-
assert(result.isSummaryTracked, "should be tracked");
|
|
311
|
-
assert(result.isSummaryNewer === true, "should be newer");
|
|
312
|
-
const leafNodePath = `${ids[0]}/${ids[1]}/${ids[2]}`;
|
|
313
|
-
const leafNodeLatestSummary = leafNode.latestSummary;
|
|
314
|
-
assert.strictEqual(leafNodeLatestSummary?.fullPath.toString(), leafNodePath, "The child node's latest summary path is incorrect");
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
//# sourceMappingURL=summarizerNodeWithGc.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summarizerNodeWithGc.spec.js","sourceRoot":"","sources":["../../src/test/summarizerNodeWithGc.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 { SummaryType } from \"@fluidframework/protocol-definitions\";\nimport {\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tIGarbageCollectionData,\n\tIGarbageCollectionDetailsBase,\n\tISummarizeInternalResult,\n\tISummarizerNodeConfig,\n\tISummarizerNodeWithGC,\n\tSummarizeInternalFn,\n} from \"@fluidframework/runtime-definitions\";\nimport { GCDataBuilder, mergeStats } from \"@fluidframework/runtime-utils\";\nimport { MockLogger, TelemetryDataTag, createChildLogger } from \"@fluidframework/telemetry-utils\";\n// eslint-disable-next-line import/no-internal-modules\nimport { ValidateSummaryResult } from \"../summary/summarizerNode/index.js\";\nimport {\n\tcreateRootSummarizerNodeWithGC,\n\tIRootSummarizerNodeWithGC,\n\tSummarizerNodeWithGC,\n\t// eslint-disable-next-line import/no-internal-modules\n} from \"../summary/summarizerNode/summarizerNodeWithGc.js\";\nimport { cloneGCData } from \"../gc/index.js\";\n\ndescribe(\"SummarizerNodeWithGC Tests\", () => {\n\tconst summarizerNodeId = \"testNode\";\n\tconst node1Id = \"/gcNode1\";\n\tconst node2Id = \"/gcNode2\";\n\tconst subNode1Id = \"/gcNode1/subNode\";\n\tconst subNode2Id = \"/gcNode2/subNode\";\n\n\tlet rootSummarizerNode: IRootSummarizerNodeWithGC;\n\tlet summarizerNode: ISummarizerNodeWithGC;\n\t// The base GC details of the root summarizer node. The child base GC details from this is passed on to the child\n\t// summarizer node during its creation.\n\tlet rootBaseGCDetails: IGarbageCollectionDetailsBase;\n\t// The GC data returned by the getGCData() API of the child summarizer node.\n\tlet childInternalGCData: IGarbageCollectionData;\n\tlet mockLogger: MockLogger;\n\n\tconst getRootBaseGCDetails = async (): Promise<IGarbageCollectionDetailsBase> =>\n\t\trootBaseGCDetails;\n\tconst getChildInternalGCData = async (): Promise<IGarbageCollectionData> => childInternalGCData;\n\n\tbeforeEach(async () => {\n\t\tmockLogger = new MockLogger();\n\t\trootSummarizerNode = createRootSummarizerNodeWithGC(\n\t\t\tmockLogger,\n\t\t\t(() => undefined) as unknown as SummarizeInternalFn,\n\t\t\t0,\n\t\t\t0,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tgetRootBaseGCDetails,\n\t\t);\n\t\trootSummarizerNode.startSummary(0, createChildLogger(), 0);\n\n\t\tsummarizerNode = rootSummarizerNode.createChild(\n\t\t\tsummarizeInternal,\n\t\t\tsummarizerNodeId,\n\t\t\t{ type: CreateSummarizerNodeSource.FromSummary },\n\t\t\tundefined,\n\t\t\tgetChildInternalGCData,\n\t\t);\n\n\t\t// Initialize the values to be returned by the child node's getGCData.\n\t\tchildInternalGCData = {\n\t\t\tgcNodes: {\n\t\t\t\t\"/\": [node1Id, node2Id],\n\t\t\t\t[node1Id]: [subNode1Id],\n\t\t\t},\n\t\t};\n\n\t\t// Initialize the values to be returned by the getBaseGCDetails() API of the root summarizer node.\n\t\trootBaseGCDetails = {\n\t\t\tusedRoutes: [],\n\t\t};\n\t});\n\n\tasync function summarizeInternal(\n\t\tfullTree: boolean,\n\t\ttrackState: boolean,\n\t): Promise<ISummarizeInternalResult> {\n\t\tconst stats = mergeStats();\n\t\tstats.treeNodeCount++;\n\t\treturn {\n\t\t\tsummary: {\n\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\ttree: {},\n\t\t\t},\n\t\t\tstats,\n\t\t\tid: summarizerNodeId,\n\t\t};\n\t}\n\n\t/**\n\t * Given the GC data of a child, build the GC data of the root (parent) node.\n\t */\n\tfunction buildRootGCData(childGCData: IGarbageCollectionData, childId: string) {\n\t\tconst builder = new GCDataBuilder();\n\t\tbuilder.prefixAndAddNodes(childId, childGCData.gcNodes);\n\t\treturn builder.getGCData();\n\t}\n\n\tdescribe(\"getGCData API\", () => {\n\t\tit(\"fails when function to get GC data is not provided\", async () => {\n\t\t\t// Root summarizer node does not have the function to get GC data. Trying to get GC data from it should\n\t\t\t// fail.\n\t\t\tlet failed = false;\n\t\t\ttry {\n\t\t\t\tawait rootSummarizerNode.getGCData();\n\t\t\t} catch {\n\t\t\t\tfailed = true;\n\t\t\t}\n\t\t\tassert(failed, \"Getting GC data should have failed\");\n\t\t});\n\n\t\tit(\"can return GC data when data has changed since last summary\", async () => {\n\t\t\t// Invalidate the summarizer node to force it to generate GC data and not use cached value.\n\t\t\tsummarizerNode.invalidate(10);\n\n\t\t\tconst gcData = await summarizerNode.getGCData();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcData,\n\t\t\t\tchildInternalGCData,\n\t\t\t\t\"GC data should be generated by calling getChildInternalGCData\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can return base GC data when nothing has changed since last summary\", async () => {\n\t\t\t// The base GC data of the child summarizer node.\n\t\t\tconst childBaseGCData: IGarbageCollectionData = {\n\t\t\t\tgcNodes: {\n\t\t\t\t\t\"/\": [node1Id],\n\t\t\t\t\t[node1Id]: [\"/\"],\n\t\t\t\t\t[node2Id]: [subNode1Id, subNode2Id],\n\t\t\t\t},\n\t\t\t};\n\t\t\t// Set the root base GC details to include the child node's base GC data.\n\t\t\trootBaseGCDetails = {\n\t\t\t\tusedRoutes: [\"\"],\n\t\t\t\tgcData: buildRootGCData(childBaseGCData, summarizerNodeId),\n\t\t\t};\n\n\t\t\t// We did not invalidate the summarizer node, so it will get the base GC data because nothing changed\n\t\t\t// since last summary.\n\t\t\tconst gcData = await summarizerNode.getGCData();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcData,\n\t\t\t\tchildBaseGCData,\n\t\t\t\t\"Base GC data should have been returned\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can return GC data when base GC data is not available\", async () => {\n\t\t\t// The base GC data of the child summarizer node is undefined by default. So, the node will generate GC\n\t\t\t// data even though nothing changed since last summary.\n\t\t\tconst gcData = await summarizerNode.getGCData();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcData,\n\t\t\t\tchildInternalGCData,\n\t\t\t\t\"GC data should be generated by calling getChildInternalGCData\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can return cached GC data\", async () => {\n\t\t\t// The base GC data of the child summarizer node is undefined by default. So, the node will generate GC\n\t\t\t// data even though nothing changed since last summary.\n\t\t\tlet gcData = await summarizerNode.getGCData();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcData,\n\t\t\t\tchildInternalGCData,\n\t\t\t\t\"GC data should be generated by calling getChildInternalGCData\",\n\t\t\t);\n\n\t\t\t// Make a clone of the GC data returned above because we are about to change it.\n\t\t\tconst cachedGCData = cloneGCData(gcData);\n\n\t\t\t// Add a new node to the GC data returned by getChildInternalGCData to make it different from cachedGCData above.\n\t\t\t// This will validate that the data returned by getGCData is not childInternalGCData.\n\t\t\tchildInternalGCData.gcNodes[subNode1Id] = [\"/\", subNode2Id];\n\n\t\t\t// Since nothing changed since last summary, summarizer node should return the data from the previous run.\n\t\t\tgcData = await summarizerNode.getGCData();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcData,\n\t\t\t\tcachedGCData,\n\t\t\t\t\"GC data from previous run should be returned\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can generate GC data when nothing changed but fullGC flag is true\", async () => {\n\t\t\tlet gcData = await summarizerNode.getGCData();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcData,\n\t\t\t\tchildInternalGCData,\n\t\t\t\t\"GC data should be generated by calling getChildInternalGCData\",\n\t\t\t);\n\n\t\t\t// Add a new node to the GC data returned by getChildInternalGCData to make it different from before.\n\t\t\t// This will validate that the data returned by getGCData is the new childInternalGCData.\n\t\t\tchildInternalGCData.gcNodes[subNode1Id] = [\"/\", subNode2Id];\n\n\t\t\t// Call getGCData() with fullGC = true. Even though nothing changed since last summary, this will force the\n\t\t\t// summarizer node to generate GC data by calling getChildInternalGCData.\n\t\t\tgcData = await summarizerNode.getGCData(true /* fullGC */);\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcData,\n\t\t\t\tchildInternalGCData,\n\t\t\t\t\"GC data should be generated by calling getChildInternalGCData\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"summarize API\", () => {\n\t\tit(\"should not allow summarizing without running GC first\", async () => {\n\t\t\t// Since GC is enabled, calling summarize without running GC (updating used routes) should result in\n\t\t\t// an assert being thrown.\n\t\t\tawait assert.rejects(\n\t\t\t\tsummarizerNode.summarize(true /* fullTree */),\n\t\t\t\t\"summarize should have thrown since GC was run\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"should allow summarizing after running GC\", async () => {\n\t\t\t// Update the used routes which emulates running GC.\n\t\t\tsummarizerNode.updateUsedRoutes([\"\"]);\n\t\t\t// Summarize should not throw since GC was run before.\n\t\t\tawait assert.doesNotReject(\n\t\t\t\tsummarizerNode.summarize(true /* fullTree */),\n\t\t\t\t\"summarize should not have thrown an error since GC was run\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Validate Summary\", () => {\n\t\tconst ids = [\"rootId\", \"midId\", \"leafId\"] as const;\n\t\tlet rootNode: IRootSummarizerNodeWithGC;\n\t\tlet midNode: ISummarizerNodeWithGC | undefined;\n\t\tlet leafNode: ISummarizerNodeWithGC | undefined;\n\n\t\tconst logger = createChildLogger();\n\t\tconst getSummarizeInternalFn = (depth: 0 | 1 | 2) => async (fullTree: boolean) => {\n\t\t\treturn {\n\t\t\t\tid: ids[depth],\n\t\t\t\tpathPartsForChildren: undefined, // extra path parts between nodes\n\t\t\t\tstats: mergeStats(),\n\t\t\t\tsummary: { type: SummaryType.Tree, tree: {} } as const,\n\t\t\t};\n\t\t};\n\n\t\tfunction createRoot({\n\t\t\tchangeSeq = 1,\n\t\t\trefSeq,\n\t\t\t...config\n\t\t}: Partial<\n\t\t\tISummarizerNodeConfig & {\n\t\t\t\tchangeSeq: number;\n\t\t\t\trefSeq: number;\n\t\t\t}\n\t\t> = {}) {\n\t\t\trootNode = createRootSummarizerNodeWithGC(\n\t\t\t\tlogger,\n\t\t\t\tgetSummarizeInternalFn(0),\n\t\t\t\tchangeSeq,\n\t\t\t\trefSeq,\n\t\t\t\tconfig,\n\t\t\t);\n\t\t}\n\n\t\tfunction createMid(createParam: CreateChildSummarizerNodeParam) {\n\t\t\tmidNode = rootNode.createChild(getSummarizeInternalFn(1), ids[1], createParam);\n\t\t}\n\n\t\tfunction createLeaf(createParam: CreateChildSummarizerNodeParam) {\n\t\t\tleafNode = midNode?.createChild(getSummarizeInternalFn(2), ids[2], createParam);\n\t\t}\n\n\t\tit(\"summary validation should fail if GC not run on root node\", () => {\n\t\t\tcreateRoot();\n\t\t\trootNode.startSummary(11, logger, 0);\n\n\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\tsuccess: false,\n\t\t\t\treason: \"NodeDidNotRunGC\",\n\t\t\t\tid: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: \"\",\n\t\t\t\t},\n\t\t\t\tretryAfterSeconds: 1,\n\t\t\t};\n\t\t\tconst result = rootNode.validateSummary();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tresult,\n\t\t\t\texpectedResult,\n\t\t\t\t\"validate summary should have failed at the root node\",\n\t\t\t);\n\n\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\tassert.throws(\n\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t(error: any) => {\n\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotRunGC\";\n\t\t\t\t\tconst correctErrorId = error.id.value === \"\";\n\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t},\n\t\t\t\t\"Complete summary should have failed at the root node\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"summary validation should fail if GC not run on child node\", async () => {\n\t\t\tcreateRoot();\n\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\t\t\trootNode.startSummary(11, logger, 0);\n\n\t\t\t// Call updateUsedRoutes (indicating GC ran) and summarize on the root and leaf nodes but not on the\n\t\t\t// mid node. Calling summarize is important because otherwise we will see similar failures because of\n\t\t\t// not running GC.\n\t\t\trootNode.updateUsedRoutes([\"\"]);\n\t\t\tleafNode?.updateUsedRoutes([\"\"]);\n\t\t\tawait rootNode.summarize(false);\n\t\t\tawait leafNode?.summarize(false);\n\t\t\tconst midNodeId = `/${ids[1]}`;\n\n\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\tsuccess: false,\n\t\t\t\treason: \"NodeDidNotRunGC\",\n\t\t\t\tid: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: midNodeId,\n\t\t\t\t},\n\t\t\t\tretryAfterSeconds: 1,\n\t\t\t};\n\t\t\tconst result = rootNode.validateSummary();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tresult,\n\t\t\t\texpectedResult,\n\t\t\t\t\"validate summary should have failed at the mid node\",\n\t\t\t);\n\n\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\tassert.throws(\n\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t(error: any) => {\n\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotRunGC\";\n\t\t\t\t\tconst correctErrorId = error.id.value === midNodeId;\n\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t},\n\t\t\t\t\"Complete summary should have failed at the mid node\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"summary validation should fail if GC not run on leaf node\", async () => {\n\t\t\tcreateRoot();\n\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t// Call updateUsedRoutes (indicating GC ran) and summarize on the root and leaf nodes but not on the\n\t\t\t// mid node. Calling summarize is important because otherwise we will see similar failures because of\n\t\t\t// not running GC.\n\t\t\trootNode.updateUsedRoutes([\"\"]);\n\t\t\tmidNode?.updateUsedRoutes([\"\"]);\n\t\t\tawait rootNode.summarize(false);\n\t\t\tawait midNode?.summarize(false);\n\t\t\tconst leafNodeId = `/${ids[1]}/${ids[2]}`;\n\n\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\tsuccess: false,\n\t\t\t\treason: \"NodeDidNotRunGC\",\n\t\t\t\tid: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: leafNodeId,\n\t\t\t\t},\n\t\t\t\tretryAfterSeconds: 1,\n\t\t\t};\n\t\t\tconst result = rootNode.validateSummary();\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tresult,\n\t\t\t\texpectedResult,\n\t\t\t\t\"validate summary should have failed at the leaf node\",\n\t\t\t);\n\n\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\tassert.throws(\n\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t(error: any) => {\n\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotRunGC\";\n\t\t\t\t\tconst correctErrorId = error.id.value === leafNodeId;\n\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t},\n\t\t\t\t\"Complete summary should have failed at the leaf node\",\n\t\t\t);\n\t\t});\n\n\t\tlet summaryRefSeq = 123;\n\n\t\tit(\"Should add GC pending summary node created after parent node was summarized with non-empty used routes\", async () => {\n\t\t\tcreateRoot();\n\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\tconst latestSummaryRefSeqNum = summaryRefSeq;\n\t\t\trootNode.startSummary(summaryRefSeq++, logger, 0);\n\t\t\trootNode.updateUsedRoutes([\"\"]);\n\t\t\tmidNode?.updateUsedRoutes([\"\"]);\n\n\t\t\tawait rootNode.summarize(false);\n\t\t\tawait midNode?.summarize(false);\n\t\t\trootNode.completeSummary(\"test-handle1\", true /* validateSummary */);\n\n\t\t\tlet result = await rootNode.refreshLatestSummary(\"test-handle1\", summaryRefSeq);\n\t\t\tassert(result.isSummaryTracked, \"should be tracked\");\n\t\t\tassert(result.isSummaryNewer === true, \"should be newer\");\n\n\t\t\trootNode.startSummary(summaryRefSeq++, logger, latestSummaryRefSeqNum);\n\t\t\trootNode.updateUsedRoutes([`/`, `/${ids[1]}`, `/${ids[1]}/${ids[2]}`]);\n\t\t\tmidNode?.updateUsedRoutes([`/`, `/${ids[2]}`]);\n\n\t\t\tawait rootNode.summarize(false);\n\t\t\tawait midNode?.summarize(false);\n\t\t\trootNode.completeSummary(\"test-handle2\", true /* validateSummary */);\n\n\t\t\t// Create a new child node for which we will need to create a pending summary for.\n\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\n\t\t\tresult = await rootNode.refreshLatestSummary(\"test-handle2\", summaryRefSeq);\n\t\t\tassert(result.isSummaryTracked, \"should be tracked\");\n\t\t\tassert(result.isSummaryNewer === true, \"should be newer\");\n\t\t\tconst leafNodePath = `${ids[0]}/${ids[1]}/${ids[2]}`;\n\t\t\tconst leafNodeLatestSummary = (leafNode as SummarizerNodeWithGC).latestSummary;\n\t\t\tassert.strictEqual(\n\t\t\t\tleafNodeLatestSummary?.fullPath.toString(),\n\t\t\t\tleafNodePath,\n\t\t\t\t\"The child node's latest summary path is incorrect\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Should add GC pending summary node created after parent node was summarized with empty used routes\", async () => {\n\t\t\tcreateRoot();\n\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\tconst latestSummaryRefSeqNum = summaryRefSeq;\n\t\t\trootNode.startSummary(summaryRefSeq++, logger, 0);\n\t\t\trootNode.updateUsedRoutes([\"\"]);\n\t\t\tmidNode?.updateUsedRoutes([\"\"]);\n\n\t\t\tawait rootNode.summarize(false);\n\t\t\tawait midNode?.summarize(false);\n\t\t\trootNode.completeSummary(\"test-handle1\", true /* validateSummary */);\n\n\t\t\tlet result = await rootNode.refreshLatestSummary(\"test-handle1\", summaryRefSeq);\n\t\t\tassert(result.isSummaryTracked, \"should be tracked\");\n\t\t\tassert(result.isSummaryNewer === true, \"should be newer\");\n\n\t\t\trootNode.startSummary(summaryRefSeq++, logger, latestSummaryRefSeqNum);\n\t\t\trootNode.updateUsedRoutes([\"\"]);\n\t\t\tmidNode?.updateUsedRoutes([\"\"]);\n\n\t\t\tawait rootNode.summarize(false);\n\t\t\tawait midNode?.summarize(false);\n\t\t\trootNode.completeSummary(\"test-handle2\", true /* validateSummary */);\n\n\t\t\t// Create a new child node for which we will need to create a pending summary for.\n\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\n\t\t\tresult = await rootNode.refreshLatestSummary(\"test-handle2\", summaryRefSeq);\n\t\t\tassert(result.isSummaryTracked, \"should be tracked\");\n\t\t\tassert(result.isSummaryNewer === true, \"should be newer\");\n\t\t\tconst leafNodePath = `${ids[0]}/${ids[1]}/${ids[2]}`;\n\t\t\tconst leafNodeLatestSummary = (leafNode as SummarizerNodeWithGC).latestSummary;\n\t\t\tassert.strictEqual(\n\t\t\t\tleafNodeLatestSummary?.fullPath.toString(),\n\t\t\t\tleafNodePath,\n\t\t\t\t\"The child node's latest summary path is incorrect\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
|