@fluidframework/container-runtime 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.3.0.0.250606
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/api-report/container-runtime.api.md +81 -27
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +2 -2
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +3 -3
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +3 -3
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +6 -5
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +57 -19
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +2 -2
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +3 -3
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/container-runtime-alpha.d.ts +205 -12
- package/dist/container-runtime-beta.d.ts +16 -3
- package/dist/container-runtime-public.d.ts +16 -3
- package/dist/container-runtime-untrimmed.d.ts +207 -26
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +32 -26
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +235 -133
- 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 +2 -2
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +4 -4
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +18 -18
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +4 -0
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +2 -2
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +1 -1
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +1 -1
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- 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/definitions.d.ts +1 -19
- 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 +2 -3
- 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 +60 -61
- 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 +9 -11
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +11 -3
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +48 -38
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +18 -17
- 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.map +1 -1
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +6 -2
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +178 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +345 -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 +7 -2
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +2 -2
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +2 -2
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +2 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +2 -2
- 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.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +3 -3
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +3 -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 +1 -1
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +5 -16
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +2 -2
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +2 -2
- 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 +2 -2
- package/dist/summary/summaryManager.js.map +1 -1
- 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 +3 -3
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +5 -5
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +6 -5
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +59 -21
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +2 -2
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/container-runtime-alpha.d.ts +205 -12
- package/lib/container-runtime-beta.d.ts +16 -3
- package/lib/container-runtime-public.d.ts +16 -3
- package/lib/container-runtime-untrimmed.d.ts +207 -26
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +32 -26
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +197 -95
- 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 +2 -2
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +4 -4
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +3 -3
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +4 -0
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.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/gc/garbageCollection.d.ts +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +3 -3
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +1 -1
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +1 -1
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +1 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +1 -1
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- 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/definitions.d.ts +1 -19
- 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 +60 -61
- 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 +7 -10
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +11 -3
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +46 -37
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +18 -17
- 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.map +1 -1
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +6 -2
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +178 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +341 -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.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +2 -2
- 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 +2 -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.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +4 -4
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +3 -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 +5 -16
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +2 -2
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +3 -3
- 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 +2 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/test/blobManager.spec.js +3 -3
- package/lib/test/blobManager.spec.js.map +1 -1
- package/lib/test/containerRuntime.spec.js +6 -4
- package/lib/test/containerRuntime.spec.js.map +1 -1
- package/lib/test/dataStoreContext.spec.js +4 -4
- package/lib/test/dataStoreContext.spec.js.map +1 -1
- package/lib/test/dataStoreCreation.spec.js +1 -1
- package/lib/test/dataStoreCreation.spec.js.map +1 -1
- package/lib/test/dataStoreRegistry.spec.js.map +1 -1
- package/lib/test/documentSchema.spec.js +282 -0
- package/lib/test/documentSchema.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +11 -7
- package/lib/test/fuzz/fuzzUtils.js.map +1 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +9 -7
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +43 -25
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +7 -4
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -1
- package/lib/test/gc/garbageCollection.spec.js +5 -5
- package/lib/test/gc/garbageCollection.spec.js.map +1 -1
- package/lib/test/gc/gcConfigs.spec.js +2 -2
- package/lib/test/gc/gcConfigs.spec.js.map +1 -1
- package/lib/test/gc/gcHelpers.spec.js.map +1 -1
- package/lib/test/gc/gcStats.spec.js +2 -2
- package/lib/test/gc/gcStats.spec.js.map +1 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +1 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -1
- package/lib/test/gc/gcTelemetry.spec.js +3 -3
- package/lib/test/gc/gcTelemetry.spec.js.map +1 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +1 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -1
- package/lib/test/getPendingBlobs.spec.js +1 -1
- package/lib/test/getPendingBlobs.spec.js.map +1 -1
- package/lib/test/hardwareStats.spec.js +1 -1
- package/lib/test/hardwareStats.spec.js.map +1 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +95 -118
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -1
- package/lib/test/opLifecycle/batchManager.spec.js +1 -1
- package/lib/test/opLifecycle/batchManager.spec.js.map +1 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +60 -55
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +56 -41
- package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -1
- package/lib/test/opLifecycle/outbox.spec.js +118 -10
- package/lib/test/opLifecycle/outbox.spec.js.map +1 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +115 -91
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -1
- package/lib/test/pendingStateManager.spec.js +1 -1
- package/lib/test/pendingStateManager.spec.js.map +1 -1
- package/lib/test/scheduleManager.spec.js +1 -1
- package/lib/test/scheduleManager.spec.js.map +1 -1
- package/lib/test/summarizerNode.spec.js +1 -1
- package/lib/test/summarizerNode.spec.js.map +1 -1
- package/lib/test/summarizerNodeWithGc.spec.js +1 -1
- package/lib/test/summarizerNodeWithGc.spec.js.map +1 -1
- package/lib/test/summary/runningSummarizer.spec.js +4 -4
- package/lib/test/summary/runningSummarizer.spec.js.map +1 -1
- package/lib/test/summary/summarizer.spec.js.map +1 -1
- package/lib/test/summary/summarizerClientElection.spec.js +2 -2
- package/lib/test/summary/summarizerClientElection.spec.js.map +1 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +1 -1
- package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -1
- package/lib/test/summary/summaryCollection.spec.js +1 -1
- package/lib/test/summary/summaryCollection.spec.js.map +1 -1
- package/lib/test/summary/summaryManager.spec.js +3 -3
- package/lib/test/summary/summaryManager.spec.js.map +1 -1
- package/lib/test/throttler.spec.js +1 -1
- package/lib/test/throttler.spec.js.map +1 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +6 -4
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -1
- package/package.json +35 -21
- package/src/batchTracker.ts +3 -3
- package/src/blobManager.ts +15 -15
- package/src/channelCollection.ts +90 -44
- package/src/connectionTelemetry.ts +10 -10
- package/src/containerHandleContext.ts +1 -1
- package/src/containerRuntime.ts +375 -213
- package/src/dataStore.ts +2 -2
- package/src/dataStoreContext.ts +19 -19
- package/src/dataStoreContexts.ts +2 -2
- package/src/dataStoreRegistry.ts +2 -1
- package/src/deltaScheduler.ts +1 -1
- package/src/gc/garbageCollection.ts +12 -12
- package/src/gc/gcConfigs.ts +11 -11
- package/src/gc/gcDefinitions.ts +2 -2
- package/src/gc/gcHelpers.ts +2 -2
- package/src/gc/gcSummaryStateTracker.ts +4 -4
- package/src/gc/gcTelemetry.ts +6 -6
- package/src/index.ts +8 -1
- package/src/messageTypes.ts +18 -5
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/definitions.ts +1 -20
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +4 -5
- package/src/opLifecycle/opDecompressor.ts +83 -100
- package/src/opLifecycle/opGroupingManager.ts +9 -12
- package/src/opLifecycle/opSplitter.ts +73 -47
- package/src/opLifecycle/outbox.ts +26 -37
- package/src/opLifecycle/remoteMessageProcessor.ts +41 -55
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +2 -2
- package/src/scheduleManager.ts +8 -7
- package/src/summary/documentSchema.ts +553 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +7 -5
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +19 -19
- package/src/summary/summarizer.ts +14 -14
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +15 -15
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -1
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
- package/src/summary/summarizerTypes.ts +3 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +8 -19
- package/src/summary/summaryGenerator.ts +10 -10
- package/src/summary/summaryManager.ts +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizerNode.spec.js","sourceRoot":"","sources":["../../src/test/summarizerNode.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\";\n\nimport { ILoggingError } from \"@fluidframework/core-interfaces\";\nimport {\n\tISequencedDocumentMessage,\n\tISnapshotTree,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tchannelsTreeName,\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tISummarizerNode,\n\tISummarizerNodeConfig,\n} from \"@fluidframework/runtime-definitions\";\nimport { mergeStats } from \"@fluidframework/runtime-utils\";\nimport { TelemetryDataTag, createChildLogger } from \"@fluidframework/telemetry-utils\";\n\nimport { createRootSummarizerNode, IRootSummarizerNode } from \"../summary/index.js\";\n// eslint-disable-next-line import/no-internal-modules\nimport { SummarizerNode } from \"../summary/summarizerNode/summarizerNode.js\";\n// eslint-disable-next-line import/no-internal-modules\nimport { ValidateSummaryResult } from \"../summary/summarizerNode/index.js\";\n\ndescribe(\"Runtime\", () => {\n\tdescribe(\"Summarization\", () => {\n\t\tdescribe(\"Summarizer Node\", () => {\n\t\t\tconst names = [\"root\", \"mid\", \"leaf\"] as const;\n\t\t\tconst ids = [\"rootId\", \"midId\", \"leafId\"] as const;\n\t\t\tlet rootNode: IRootSummarizerNode;\n\t\t\tlet midNode: ISummarizerNode | undefined;\n\t\t\tlet leafNode: ISummarizerNode | undefined;\n\n\t\t\tconst logger = createChildLogger();\n\t\t\tlet summarizeCalls = [0, 0, 0];\n\t\t\tfunction assertSummarizeCalls(...expected: [root: number, mid: number, leaf: number]) {\n\t\t\t\tfor (let i = 0; i < expected.length; i++) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpected[i] === summarizeCalls[i],\n\t\t\t\t\t\t`unexpected ${names[i]} summarize call count: ${expected[i]} !== ${summarizeCalls[i]}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst getSummarizeInternalFn = (depth: 0 | 1 | 2) => async (fullTree: boolean) => {\n\t\t\t\tsummarizeCalls[depth]++;\n\t\t\t\treturn {\n\t\t\t\t\tid: ids[depth],\n\t\t\t\t\tpathPartsForChildren: undefined, // extra path parts between nodes\n\t\t\t\t\tstats: mergeStats(),\n\t\t\t\t\tsummary: { type: SummaryType.Tree, tree: {} } as const,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tfunction createRoot({\n\t\t\t\tchangeSeq = 1,\n\t\t\t\trefSeq,\n\t\t\t\t...config\n\t\t\t}: Partial<\n\t\t\t\tISummarizerNodeConfig & {\n\t\t\t\t\tchangeSeq: number;\n\t\t\t\t\trefSeq: number;\n\t\t\t\t}\n\t\t\t> = {}) {\n\t\t\t\trootNode = createRootSummarizerNode(\n\t\t\t\t\tlogger,\n\t\t\t\t\tgetSummarizeInternalFn(0),\n\t\t\t\t\tchangeSeq,\n\t\t\t\t\trefSeq,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction createMid(\n\t\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t\t\tconfig?: ISummarizerNodeConfig,\n\t\t\t) {\n\t\t\t\tmidNode = rootNode.createChild(\n\t\t\t\t\tgetSummarizeInternalFn(1),\n\t\t\t\t\tids[1],\n\t\t\t\t\tcreateParam,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction createLeaf(\n\t\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t\t\tconfig?: ISummarizerNodeConfig,\n\t\t\t) {\n\t\t\t\tleafNode = midNode?.createChild(\n\t\t\t\t\tgetSummarizeInternalFn(2),\n\t\t\t\t\tids[2],\n\t\t\t\t\tcreateParam,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction expectThrow(\n\t\t\t\tfn: () => unknown,\n\t\t\t\tfailMsg: string,\n\t\t\t\terrMsg: string,\n\t\t\t\t...expectedErrors: string[]\n\t\t\t): void {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t\tthrow Error(`${failMsg}: Expected to fail`);\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpectedErrors.some((e) => e === (error as ILoggingError).message),\n\t\t\t\t\t\terrMsg,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tasync function expectReject(\n\t\t\t\tfn: () => Promise<unknown>,\n\t\t\t\tfailMsg: string,\n\t\t\t\terrMsg: string,\n\t\t\t\t...expectedErrors: string[]\n\t\t\t): Promise<void> {\n\t\t\t\ttry {\n\t\t\t\t\tawait fn();\n\t\t\t\t\tthrow Error(`${failMsg}: Expected to reject`);\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpectedErrors.some((e) => e === (error as ILoggingError).message),\n\t\t\t\t\t\terrMsg,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst summaryRefSeq = 123;\n\t\t\tconst fakeOp = (sequenceNumber: number): ISequencedDocumentMessage =>\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t({ sequenceNumber }) as ISequencedDocumentMessage;\n\n\t\t\tconst emptySnapshot: ISnapshotTree = { blobs: {}, trees: {} };\n\t\t\tconst protocolTree: ISnapshotTree = {\n\t\t\t\tblobs: { attributes: \"protocolAttributes\" },\n\t\t\t\ttrees: {},\n\t\t\t};\n\t\t\tconst coreSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t[ids[1]]: {\n\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t[ids[2]]: emptySnapshot,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst simpleSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t...coreSnapshot.trees,\n\t\t\t\t\t\".protocol\": protocolTree,\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst channelsSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t[channelsTreeName]: coreSnapshot,\n\t\t\t\t\t\".protocol\": protocolTree,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tbeforeEach(() => {\n\t\t\t\tsummarizeCalls = [0, 0, 0];\n\t\t\t});\n\n\t\t\tdescribe(\"Create Child\", () => {\n\t\t\t\tit(\"Should fail to create child with same id\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\texpectThrow(\n\t\t\t\t\t\t() => createMid({ type: CreateSummarizerNodeSource.Local }),\n\t\t\t\t\t\t\"create child\",\n\t\t\t\t\t\t\"child node with same id already exists\",\n\t\t\t\t\t\t\"0x1ab\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Load Base Summary\", () => {\n\t\t\t\tit(\"Load base summary should do nothing for simple snapshot\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 1 });\n\t\t\t\t\trootNode.updateBaseSummaryState(simpleSnapshot);\n\n\t\t\t\t\tconst latestSummary = (rootNode as SummarizerNode).latestSummary;\n\t\t\t\t\tassert(latestSummary !== undefined, \"latest summary should exist\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tlatestSummary.additionalPath?.path,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"should not have any path parts for children\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Load base summary should strip channels subtree\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 1 });\n\t\t\t\t\trootNode.updateBaseSummaryState(channelsSnapshot);\n\n\t\t\t\t\tconst latestSummary = (rootNode as SummarizerNode).latestSummary;\n\t\t\t\t\tassert(latestSummary !== undefined, \"latest summary should exist\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tlatestSummary.additionalPath?.path,\n\t\t\t\t\t\tchannelsTreeName,\n\t\t\t\t\t\t\"should have channels path for children\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Start Summary\", () => {\n\t\t\t\tit(\"Should fail startSummary if previous attempt is not completed/cleared\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\texpectThrow(\n\t\t\t\t\t\t() => rootNode.startSummary(12, logger, 0),\n\t\t\t\t\t\t\"start summary\",\n\t\t\t\t\t\t\"wip referenceSequenceNumber and logger are still set\",\n\t\t\t\t\t\t\"0x19f\",\n\t\t\t\t\t\t\"0x1a0\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary if previous attempt is completed\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\trootNode.startSummary(12, logger, 0); // This is 0 since we did not \"ack\" the latest summary\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary if previous attempt is cleared\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\trootNode.clearSummary();\n\t\t\t\t\trootNode.startSummary(12, logger, 0); // This is 0 since we did not \"ack\" the latest summary\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary with the right sequence number\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\t// Refreshing should be necessary for startSummary to occur\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\t\t\t\t\tconst result = rootNode.startSummary(12, logger, 11);\n\t\t\t\t\tassert.strictEqual(result.invalidNodes, 0, \"startSummary have succeeded\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail startSummary when missing refresh\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\t// Need one latest summary\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\n\t\t\t\t\t// Summary with missing refresh\n\t\t\t\t\trootNode.startSummary(12, logger, 11);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\n\t\t\t\t\t// Failing to refresh the root node should generate failing summaries\n\t\t\t\t\tconst result = rootNode.startSummary(21, logger, 12);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tresult.invalidNodes,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"startSummary fails due to no refresh\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.deepEqual(\n\t\t\t\t\t\tresult.mismatchNumbers,\n\t\t\t\t\t\tnew Set([\"12-11\"]),\n\t\t\t\t\t\t\"startSummary should have mismatched numbers\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail startSummary with the wrong sequence number\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\t\t\t\t\tconst result = rootNode.startSummary(12, logger, 0); // 0 is wrong here (so we can get invalid results)\n\t\t\t\t\tassert.strictEqual(result.invalidNodes, 1, \"expected failure wrong ref seq\");\n\t\t\t\t\tassert.deepEqual(\n\t\t\t\t\t\tresult.mismatchNumbers,\n\t\t\t\t\t\tnew Set([\"0-11\"]),\n\t\t\t\t\t\t\"startSummary have succeeded\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Validate Summary\", () => {\n\t\t\t\tit(\"summary validation should fail if summarize not called on root node\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the root node\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === \"\";\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the root node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"summary validation should fail if summarize not called on child node\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait leafNode?.summarize(false);\n\t\t\t\t\tconst midNodeId = `/${ids[1]}`;\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: midNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the mid node\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === midNodeId;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the mid node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"summary validation should fail if summarize not called on leaf node\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait midNode?.summarize(false);\n\t\t\t\t\tconst leafNodeId = `/${ids[1]}/${ids[2]}`;\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: leafNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the leaf node\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === leafNodeId;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the leaf node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Summarize\", () => {\n\t\t\t\tit(\"Should fail summarize if startSummary is not called\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tawait expectReject(\n\t\t\t\t\t\tasync () => rootNode.summarize(false),\n\t\t\t\t\t\t\"summarize\",\n\t\t\t\t\t\t\"no wip referenceSequenceNumber or logger\",\n\t\t\t\t\t\t\"0x1a1\",\n\t\t\t\t\t\t\"0x1a2\",\n\t\t\t\t\t);\n\t\t\t\t\tassertSummarizeCalls(0, 0, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal with later op\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(12));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal with later invalidate\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.invalidate(12);\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not call summarize internal and instead use handle\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(11));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(0, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Handle, \"should be handle\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal always when fullTree true\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(10));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(true);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Refresh Latest Summary\", () => {\n\t\t\t\tit(\"Should not refresh latest if already passed ref seq number\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: summaryRefSeq });\n\t\t\t\t\tconst result = await rootNode.refreshLatestSummary(\n\t\t\t\t\t\t\"test-handle\",\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t);\n\t\t\t\t\tassert(!result.isSummaryTracked, \"we already got this summary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should refresh from pending\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tconst proposalHandle = \"test-handle\";\n\n\t\t\t\t\trootNode.startSummary(10, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(proposalHandle, true /* validateSummary */);\n\n\t\t\t\t\tconst result = await rootNode.refreshLatestSummary(\n\t\t\t\t\t\tproposalHandle,\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t);\n\t\t\t\t\tassert(result.isSummaryTracked, \"should be tracked\");\n\t\t\t\t\tassert(result.isSummaryNewer === true, \"should be newer\");\n\t\t\t\t});\n\n\t\t\t\tit(\"should fail refresh when summary is in progress\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tconst proposalHandle = \"test-handle\";\n\n\t\t\t\t\tconst referenceSeqNum = 10;\n\t\t\t\t\trootNode.startSummary(referenceSeqNum, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait assert.rejects(\n\t\t\t\t\t\tasync () => rootNode.refreshLatestSummary(proposalHandle, summaryRefSeq),\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\terror: ILoggingError & { inProgressSummaryRefSeq: number | undefined },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst correctErrorMessage =\n\t\t\t\t\t\t\t\terror.message === \"UnexpectedRefreshDuringSummarize\";\n\t\t\t\t\t\t\tconst correctInProgressRefSeq =\n\t\t\t\t\t\t\t\terror.inProgressSummaryRefSeq === referenceSeqNum;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctInProgressRefSeq;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Refresh should fail if called when summary is in progress\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"summarizerNode.spec.js","sourceRoot":"","sources":["../../src/test/summarizerNode.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\";\n\nimport { ILoggingError } from \"@fluidframework/core-interfaces\";\nimport {\n\tISequencedDocumentMessage,\n\tISnapshotTree,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tISummarizerNode,\n\tISummarizerNodeConfig,\n\tchannelsTreeName,\n} from \"@fluidframework/runtime-definitions\";\nimport { mergeStats } from \"@fluidframework/runtime-utils\";\nimport { TelemetryDataTag, createChildLogger } from \"@fluidframework/telemetry-utils\";\n\nimport { IRootSummarizerNode, createRootSummarizerNode } from \"../summary/index.js\";\n// eslint-disable-next-line import/no-internal-modules\nimport { ValidateSummaryResult } from \"../summary/summarizerNode/index.js\";\n// eslint-disable-next-line import/no-internal-modules\nimport { SummarizerNode } from \"../summary/summarizerNode/summarizerNode.js\";\n\ndescribe(\"Runtime\", () => {\n\tdescribe(\"Summarization\", () => {\n\t\tdescribe(\"Summarizer Node\", () => {\n\t\t\tconst names = [\"root\", \"mid\", \"leaf\"] as const;\n\t\t\tconst ids = [\"rootId\", \"midId\", \"leafId\"] as const;\n\t\t\tlet rootNode: IRootSummarizerNode;\n\t\t\tlet midNode: ISummarizerNode | undefined;\n\t\t\tlet leafNode: ISummarizerNode | undefined;\n\n\t\t\tconst logger = createChildLogger();\n\t\t\tlet summarizeCalls = [0, 0, 0];\n\t\t\tfunction assertSummarizeCalls(...expected: [root: number, mid: number, leaf: number]) {\n\t\t\t\tfor (let i = 0; i < expected.length; i++) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpected[i] === summarizeCalls[i],\n\t\t\t\t\t\t`unexpected ${names[i]} summarize call count: ${expected[i]} !== ${summarizeCalls[i]}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst getSummarizeInternalFn = (depth: 0 | 1 | 2) => async (fullTree: boolean) => {\n\t\t\t\tsummarizeCalls[depth]++;\n\t\t\t\treturn {\n\t\t\t\t\tid: ids[depth],\n\t\t\t\t\tpathPartsForChildren: undefined, // extra path parts between nodes\n\t\t\t\t\tstats: mergeStats(),\n\t\t\t\t\tsummary: { type: SummaryType.Tree, tree: {} } as const,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tfunction createRoot({\n\t\t\t\tchangeSeq = 1,\n\t\t\t\trefSeq,\n\t\t\t\t...config\n\t\t\t}: Partial<\n\t\t\t\tISummarizerNodeConfig & {\n\t\t\t\t\tchangeSeq: number;\n\t\t\t\t\trefSeq: number;\n\t\t\t\t}\n\t\t\t> = {}) {\n\t\t\t\trootNode = createRootSummarizerNode(\n\t\t\t\t\tlogger,\n\t\t\t\t\tgetSummarizeInternalFn(0),\n\t\t\t\t\tchangeSeq,\n\t\t\t\t\trefSeq,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction createMid(\n\t\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t\t\tconfig?: ISummarizerNodeConfig,\n\t\t\t) {\n\t\t\t\tmidNode = rootNode.createChild(\n\t\t\t\t\tgetSummarizeInternalFn(1),\n\t\t\t\t\tids[1],\n\t\t\t\t\tcreateParam,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction createLeaf(\n\t\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t\t\tconfig?: ISummarizerNodeConfig,\n\t\t\t) {\n\t\t\t\tleafNode = midNode?.createChild(\n\t\t\t\t\tgetSummarizeInternalFn(2),\n\t\t\t\t\tids[2],\n\t\t\t\t\tcreateParam,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfunction expectThrow(\n\t\t\t\tfn: () => unknown,\n\t\t\t\tfailMsg: string,\n\t\t\t\terrMsg: string,\n\t\t\t\t...expectedErrors: string[]\n\t\t\t): void {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t\tthrow Error(`${failMsg}: Expected to fail`);\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpectedErrors.some((e) => e === (error as ILoggingError).message),\n\t\t\t\t\t\terrMsg,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tasync function expectReject(\n\t\t\t\tfn: () => Promise<unknown>,\n\t\t\t\tfailMsg: string,\n\t\t\t\terrMsg: string,\n\t\t\t\t...expectedErrors: string[]\n\t\t\t): Promise<void> {\n\t\t\t\ttry {\n\t\t\t\t\tawait fn();\n\t\t\t\t\tthrow Error(`${failMsg}: Expected to reject`);\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\texpectedErrors.some((e) => e === (error as ILoggingError).message),\n\t\t\t\t\t\terrMsg,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst summaryRefSeq = 123;\n\t\t\tconst fakeOp = (sequenceNumber: number): ISequencedDocumentMessage =>\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\t\t({ sequenceNumber }) as ISequencedDocumentMessage;\n\n\t\t\tconst emptySnapshot: ISnapshotTree = { blobs: {}, trees: {} };\n\t\t\tconst protocolTree: ISnapshotTree = {\n\t\t\t\tblobs: { attributes: \"protocolAttributes\" },\n\t\t\t\ttrees: {},\n\t\t\t};\n\t\t\tconst coreSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t[ids[1]]: {\n\t\t\t\t\t\tblobs: {},\n\t\t\t\t\t\ttrees: {\n\t\t\t\t\t\t\t[ids[2]]: emptySnapshot,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst simpleSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t...coreSnapshot.trees,\n\t\t\t\t\t\".protocol\": protocolTree,\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst channelsSnapshot: ISnapshotTree = {\n\t\t\t\tblobs: {},\n\t\t\t\ttrees: {\n\t\t\t\t\t[channelsTreeName]: coreSnapshot,\n\t\t\t\t\t\".protocol\": protocolTree,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tbeforeEach(() => {\n\t\t\t\tsummarizeCalls = [0, 0, 0];\n\t\t\t});\n\n\t\t\tdescribe(\"Create Child\", () => {\n\t\t\t\tit(\"Should fail to create child with same id\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\texpectThrow(\n\t\t\t\t\t\t() => createMid({ type: CreateSummarizerNodeSource.Local }),\n\t\t\t\t\t\t\"create child\",\n\t\t\t\t\t\t\"child node with same id already exists\",\n\t\t\t\t\t\t\"0x1ab\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Load Base Summary\", () => {\n\t\t\t\tit(\"Load base summary should do nothing for simple snapshot\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 1 });\n\t\t\t\t\trootNode.updateBaseSummaryState(simpleSnapshot);\n\n\t\t\t\t\tconst latestSummary = (rootNode as SummarizerNode).latestSummary;\n\t\t\t\t\tassert(latestSummary !== undefined, \"latest summary should exist\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tlatestSummary.additionalPath?.path,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"should not have any path parts for children\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Load base summary should strip channels subtree\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 1 });\n\t\t\t\t\trootNode.updateBaseSummaryState(channelsSnapshot);\n\n\t\t\t\t\tconst latestSummary = (rootNode as SummarizerNode).latestSummary;\n\t\t\t\t\tassert(latestSummary !== undefined, \"latest summary should exist\");\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tlatestSummary.additionalPath?.path,\n\t\t\t\t\t\tchannelsTreeName,\n\t\t\t\t\t\t\"should have channels path for children\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Start Summary\", () => {\n\t\t\t\tit(\"Should fail startSummary if previous attempt is not completed/cleared\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\texpectThrow(\n\t\t\t\t\t\t() => rootNode.startSummary(12, logger, 0),\n\t\t\t\t\t\t\"start summary\",\n\t\t\t\t\t\t\"wip referenceSequenceNumber and logger are still set\",\n\t\t\t\t\t\t\"0x19f\",\n\t\t\t\t\t\t\"0x1a0\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary if previous attempt is completed\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\trootNode.startSummary(12, logger, 0); // This is 0 since we did not \"ack\" the latest summary\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary if previous attempt is cleared\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\trootNode.clearSummary();\n\t\t\t\t\trootNode.startSummary(12, logger, 0); // This is 0 since we did not \"ack\" the latest summary\n\t\t\t\t});\n\n\t\t\t\tit(\"Should succeed startSummary with the right sequence number\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\t// Refreshing should be necessary for startSummary to occur\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\t\t\t\t\tconst result = rootNode.startSummary(12, logger, 11);\n\t\t\t\t\tassert.strictEqual(result.invalidNodes, 0, \"startSummary have succeeded\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail startSummary when missing refresh\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\t// Need one latest summary\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\n\t\t\t\t\t// Summary with missing refresh\n\t\t\t\t\trootNode.startSummary(12, logger, 11);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\n\t\t\t\t\t// Failing to refresh the root node should generate failing summaries\n\t\t\t\t\tconst result = rootNode.startSummary(21, logger, 12);\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tresult.invalidNodes,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"startSummary fails due to no refresh\",\n\t\t\t\t\t);\n\t\t\t\t\tassert.deepEqual(\n\t\t\t\t\t\tresult.mismatchNumbers,\n\t\t\t\t\t\tnew Set([\"12-11\"]),\n\t\t\t\t\t\t\"startSummary should have mismatched numbers\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should fail startSummary with the wrong sequence number\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(\"test-handle\", true /* validateSummary */);\n\t\t\t\t\tawait rootNode.refreshLatestSummary(\"test-handle\", 11);\n\t\t\t\t\tconst result = rootNode.startSummary(12, logger, 0); // 0 is wrong here (so we can get invalid results)\n\t\t\t\t\tassert.strictEqual(result.invalidNodes, 1, \"expected failure wrong ref seq\");\n\t\t\t\t\tassert.deepEqual(\n\t\t\t\t\t\tresult.mismatchNumbers,\n\t\t\t\t\t\tnew Set([\"0-11\"]),\n\t\t\t\t\t\t\"startSummary have succeeded\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Validate Summary\", () => {\n\t\t\t\tit(\"summary validation should fail if summarize not called on root node\", () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the root node\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === \"\";\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the root node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"summary validation should fail if summarize not called on child node\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait leafNode?.summarize(false);\n\t\t\t\t\tconst midNodeId = `/${ids[1]}`;\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: midNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the mid node\",\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === midNodeId;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the mid node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"summary validation should fail if summarize not called on leaf node\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tcreateMid({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\tcreateLeaf({ type: CreateSummarizerNodeSource.Local });\n\t\t\t\t\trootNode.startSummary(11, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait midNode?.summarize(false);\n\t\t\t\t\tconst leafNodeId = `/${ids[1]}/${ids[2]}`;\n\n\t\t\t\t\t// Validate summary fails by calling validateSummary.\n\t\t\t\t\tconst expectedResult: ValidateSummaryResult = {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\treason: \"NodeDidNotSummarize\",\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\t\t\tvalue: leafNodeId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tretryAfterSeconds: 1,\n\t\t\t\t\t};\n\t\t\t\t\tconst result = rootNode.validateSummary();\n\t\t\t\t\tassert.deepStrictEqual(\n\t\t\t\t\t\tresult,\n\t\t\t\t\t\texpectedResult,\n\t\t\t\t\t\t\"validate summary should have failed at the leaf node\",\n\t\t\t\t\t);\n\n\t\t\t\t\t// Validate summary fails by calling completeSummary.\n\t\t\t\t\tassert.throws(\n\t\t\t\t\t\t() => rootNode.completeSummary(\"test-handle\", true /* validateSummary */),\n\t\t\t\t\t\t(error: any) => {\n\t\t\t\t\t\t\tconst correctErrorMessage = error.message === \"NodeDidNotSummarize\";\n\t\t\t\t\t\t\tconst correctErrorId = error.id.value === leafNodeId;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctErrorId;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Complete summary should have failed at the leaf node\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Summarize\", () => {\n\t\t\t\tit(\"Should fail summarize if startSummary is not called\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tawait expectReject(\n\t\t\t\t\t\tasync () => rootNode.summarize(false),\n\t\t\t\t\t\t\"summarize\",\n\t\t\t\t\t\t\"no wip referenceSequenceNumber or logger\",\n\t\t\t\t\t\t\"0x1a1\",\n\t\t\t\t\t\t\"0x1a2\",\n\t\t\t\t\t);\n\t\t\t\t\tassertSummarizeCalls(0, 0, 0);\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal with later op\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(12));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal with later invalidate\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.invalidate(12);\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should not call summarize internal and instead use handle\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(11));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(false);\n\t\t\t\t\tassertSummarizeCalls(0, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Handle, \"should be handle\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should call summarize internal always when fullTree true\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: 11 });\n\t\t\t\t\trootNode.recordChange(fakeOp(10));\n\t\t\t\t\trootNode.startSummary(99, logger, 11);\n\t\t\t\t\tconst result = await rootNode.summarize(true);\n\t\t\t\t\tassertSummarizeCalls(1, 0, 0);\n\t\t\t\t\tassert(result.summary.type === SummaryType.Tree, \"should be tree\");\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe(\"Refresh Latest Summary\", () => {\n\t\t\t\tit(\"Should not refresh latest if already passed ref seq number\", async () => {\n\t\t\t\t\tcreateRoot({ refSeq: summaryRefSeq });\n\t\t\t\t\tconst result = await rootNode.refreshLatestSummary(\n\t\t\t\t\t\t\"test-handle\",\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t);\n\t\t\t\t\tassert(!result.isSummaryTracked, \"we already got this summary\");\n\t\t\t\t});\n\n\t\t\t\tit(\"Should refresh from pending\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tconst proposalHandle = \"test-handle\";\n\n\t\t\t\t\trootNode.startSummary(10, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\trootNode.completeSummary(proposalHandle, true /* validateSummary */);\n\n\t\t\t\t\tconst result = await rootNode.refreshLatestSummary(\n\t\t\t\t\t\tproposalHandle,\n\t\t\t\t\t\tsummaryRefSeq,\n\t\t\t\t\t);\n\t\t\t\t\tassert(result.isSummaryTracked, \"should be tracked\");\n\t\t\t\t\tassert(result.isSummaryNewer === true, \"should be newer\");\n\t\t\t\t});\n\n\t\t\t\tit(\"should fail refresh when summary is in progress\", async () => {\n\t\t\t\t\tcreateRoot();\n\t\t\t\t\tconst proposalHandle = \"test-handle\";\n\n\t\t\t\t\tconst referenceSeqNum = 10;\n\t\t\t\t\trootNode.startSummary(referenceSeqNum, logger, 0);\n\t\t\t\t\tawait rootNode.summarize(false);\n\t\t\t\t\tawait assert.rejects(\n\t\t\t\t\t\tasync () => rootNode.refreshLatestSummary(proposalHandle, summaryRefSeq),\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\terror: ILoggingError & { inProgressSummaryRefSeq: number | undefined },\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst correctErrorMessage =\n\t\t\t\t\t\t\t\terror.message === \"UnexpectedRefreshDuringSummarize\";\n\t\t\t\t\t\t\tconst correctInProgressRefSeq =\n\t\t\t\t\t\t\t\terror.inProgressSummaryRefSeq === referenceSeqNum;\n\t\t\t\t\t\t\treturn correctErrorMessage && correctInProgressRefSeq;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"Refresh should fail if called when summary is in progress\",\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|
|
@@ -7,10 +7,10 @@ import { SummaryType } from "@fluidframework/protocol-definitions";
|
|
|
7
7
|
import { CreateSummarizerNodeSource, } from "@fluidframework/runtime-definitions";
|
|
8
8
|
import { GCDataBuilder, mergeStats } from "@fluidframework/runtime-utils";
|
|
9
9
|
import { MockLogger, TelemetryDataTag, createChildLogger } from "@fluidframework/telemetry-utils";
|
|
10
|
+
import { cloneGCData } from "../gc/index.js";
|
|
10
11
|
import { createRootSummarizerNodeWithGC,
|
|
11
12
|
// eslint-disable-next-line import/no-internal-modules
|
|
12
13
|
} from "../summary/summarizerNode/summarizerNodeWithGc.js";
|
|
13
|
-
import { cloneGCData } from "../gc/index.js";
|
|
14
14
|
describe("SummarizerNodeWithGC Tests", () => {
|
|
15
15
|
const summarizerNodeId = "testNode";
|
|
16
16
|
const node1Id = "/gcNode1";
|
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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\";\nimport { cloneGCData } from \"../gc/index.js\";\n// eslint-disable-next-line import/no-internal-modules\nimport { ValidateSummaryResult } from \"../summary/summarizerNode/index.js\";\nimport {\n\tIRootSummarizerNodeWithGC,\n\tSummarizerNodeWithGC,\n\tcreateRootSummarizerNodeWithGC,\n\t// eslint-disable-next-line import/no-internal-modules\n} from \"../summary/summarizerNode/summarizerNodeWithGc.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"]}
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { strict as assert } from "assert";
|
|
6
|
-
import sinon from "sinon";
|
|
7
|
-
import { Deferred } from "@fluidframework/core-utils";
|
|
8
6
|
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
|
+
import { Deferred } from "@fluidframework/core-utils";
|
|
8
|
+
import { isRuntimeMessage } from "@fluidframework/driver-utils";
|
|
9
9
|
import { MessageType, SummaryType, } from "@fluidframework/protocol-definitions";
|
|
10
10
|
import { MockLogger, mixinMonitoringContext } from "@fluidframework/telemetry-utils";
|
|
11
11
|
import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
|
|
12
|
-
import
|
|
13
|
-
import {
|
|
12
|
+
import sinon from "sinon";
|
|
13
|
+
import { RetriableSummaryError, RunningSummarizer, SummarizeHeuristicData, SummaryCollection, getFailMessage, neverCancelledSummaryToken, } from "../../summary/index.js";
|
|
14
14
|
import { defaultMaxAttempts, defaultMaxAttemptsForSubmitFailures,
|
|
15
15
|
// eslint-disable-next-line import/no-internal-modules
|
|
16
16
|
} from "../../summary/runningSummarizer.js";
|