@fluidframework/container-runtime 2.0.0-rc.2.0.1 → 2.0.0-rc.3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/api-report/container-runtime.api.md +471 -52
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +4 -4
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +33 -30
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +82 -107
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +27 -22
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +189 -165
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +3 -3
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +17 -17
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +2 -2
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +42 -39
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +425 -292
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +8 -8
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +58 -19
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +171 -114
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -0
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +12 -11
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +5 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +4 -4
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +6 -6
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.d.ts +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +4 -4
- package/dist/error.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +3 -2
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +23 -23
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +2 -2
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +4 -5
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +4 -5
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +5 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +21 -12
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +2 -2
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +11 -11
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +2 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +11 -9
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +6 -6
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +2 -1
- package/dist/gc/index.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +91 -0
- package/dist/messageTypes.d.ts +11 -5
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +4 -0
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -20
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +3 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +5 -6
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +15 -4
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +62 -63
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +14 -16
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +12 -4
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +63 -53
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +2 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +30 -29
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +18 -18
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/public.d.ts +12 -0
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +28 -24
- package/dist/scheduleManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
- package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js +2 -2
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +209 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +390 -0
- package/dist/summary/documentSchema.js.map +1 -0
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +4 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +12 -7
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +3 -3
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +16 -16
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +3 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +13 -13
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js +2 -2
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +28 -28
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +5 -3
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +7 -7
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +6 -17
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +8 -8
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +4 -3
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +17 -17
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +15 -14
- package/dist/summary/summaryManager.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +33 -30
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +48 -73
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +27 -22
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +132 -108
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +3 -3
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +42 -39
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +276 -141
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +3 -3
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +58 -19
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +110 -53
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -0
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +5 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.d.ts +1 -1
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +2 -2
- package/lib/error.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +3 -2
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +8 -8
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +2 -2
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +4 -5
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +4 -5
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +5 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +10 -2
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +2 -2
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +2 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +4 -2
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +2 -2
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +1 -1
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- package/lib/gc/index.js.map +1 -1
- package/lib/index.d.ts +5 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -2
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +91 -0
- package/lib/messageTypes.d.ts +11 -5
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js +4 -0
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +2 -20
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +3 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +15 -4
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +61 -62
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +9 -12
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +12 -4
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +47 -38
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +2 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +19 -18
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +2 -2
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/public.d.ts +12 -0
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +7 -3
- package/lib/scheduleManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +209 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +386 -0
- package/lib/summary/documentSchema.js.map +1 -0
- package/lib/summary/index.d.ts +2 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -0
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +7 -2
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +3 -3
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +3 -3
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +3 -2
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +2 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +5 -5
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +5 -3
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +6 -17
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +3 -3
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +4 -3
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +4 -4
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +9 -8
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +57 -65
- package/src/batchTracker.ts +4 -3
- package/src/blobManager.ts +100 -77
- package/src/channelCollection.ts +223 -167
- package/src/connectionTelemetry.ts +12 -12
- package/src/containerHandleContext.ts +3 -2
- package/src/containerRuntime.ts +481 -277
- package/src/dataStore.ts +9 -4
- package/src/dataStoreContext.ts +201 -97
- package/src/dataStoreContexts.ts +5 -2
- package/src/dataStoreRegistry.ts +3 -2
- package/src/deltaManagerSummarizerProxy.ts +1 -1
- package/src/deltaScheduler.ts +2 -1
- package/src/error.ts +2 -2
- package/src/gc/garbageCollection.ts +21 -20
- package/src/gc/gcConfigs.ts +15 -18
- package/src/gc/gcDefinitions.ts +6 -8
- package/src/gc/gcHelpers.ts +22 -5
- package/src/gc/gcSummaryStateTracker.ts +7 -5
- package/src/gc/gcTelemetry.ts +13 -7
- package/src/gc/gcUnreferencedStateTracker.ts +3 -2
- package/src/gc/index.ts +1 -0
- package/src/index.ts +22 -1
- package/src/messageTypes.ts +20 -6
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/batchManager.ts +1 -0
- package/src/opLifecycle/definitions.ts +3 -21
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +90 -100
- package/src/opLifecycle/opGroupingManager.ts +12 -14
- package/src/opLifecycle/opSplitter.ts +76 -48
- package/src/opLifecycle/outbox.ts +30 -38
- package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +6 -6
- package/src/scheduleManager.ts +10 -8
- package/src/storageServiceWithAttachBlobs.ts +2 -2
- package/src/summary/documentSchema.ts +631 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +7 -7
- package/src/summary/runWhileConnectedCoordinator.ts +3 -2
- package/src/summary/runningSummarizer.ts +22 -20
- package/src/summary/summarizer.ts +17 -15
- package/src/summary/summarizerClientElection.ts +3 -2
- package/src/summary/summarizerHeuristics.ts +4 -2
- package/src/summary/summarizerNode/summarizerNode.ts +20 -18
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
- package/src/summary/summarizerTypes.ts +7 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +14 -26
- package/src/summary/summaryGenerator.ts +12 -15
- package/src/summary/summaryManager.ts +16 -13
- package/api-extractor-cjs.json +0 -8
- package/dist/container-runtime-alpha.d.ts +0 -1753
- package/dist/container-runtime-beta.d.ts +0 -268
- package/dist/container-runtime-public.d.ts +0 -268
- package/dist/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/container-runtime-alpha.d.ts +0 -1753
- package/lib/container-runtime-beta.d.ts +0 -268
- package/lib/container-runtime-public.d.ts +0 -268
- package/lib/container-runtime-untrimmed.d.ts +0 -1893
- package/lib/test/batchTracker.spec.js +0 -88
- package/lib/test/batchTracker.spec.js.map +0 -1
- package/lib/test/blobManager.spec.js +0 -835
- package/lib/test/blobManager.spec.js.map +0 -1
- package/lib/test/channelCollection.spec.js +0 -141
- package/lib/test/channelCollection.spec.js.map +0 -1
- package/lib/test/containerRuntime.spec.js +0 -1748
- package/lib/test/containerRuntime.spec.js.map +0 -1
- package/lib/test/dataStoreContext.spec.js +0 -801
- package/lib/test/dataStoreContext.spec.js.map +0 -1
- package/lib/test/dataStoreCreation.spec.js +0 -312
- package/lib/test/dataStoreCreation.spec.js.map +0 -1
- package/lib/test/dataStoreRegistry.spec.js +0 -26
- package/lib/test/dataStoreRegistry.spec.js.map +0 -1
- package/lib/test/fuzz/fuzzUtils.js +0 -66
- package/lib/test/fuzz/fuzzUtils.js.map +0 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
- package/lib/test/gc/garbageCollection.spec.js +0 -1465
- package/lib/test/gc/garbageCollection.spec.js.map +0 -1
- package/lib/test/gc/gcConfigs.spec.js +0 -690
- package/lib/test/gc/gcConfigs.spec.js.map +0 -1
- package/lib/test/gc/gcHelpers.spec.js +0 -110
- package/lib/test/gc/gcHelpers.spec.js.map +0 -1
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
- package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
- package/lib/test/gc/gcStats.spec.js +0 -391
- package/lib/test/gc/gcStats.spec.js.map +0 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
- package/lib/test/gc/gcTelemetry.spec.js +0 -530
- package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
- package/lib/test/gc/gcUnitTestHelpers.js +0 -29
- package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
- package/lib/test/getPendingBlobs.spec.js +0 -193
- package/lib/test/getPendingBlobs.spec.js.map +0 -1
- package/lib/test/hardwareStats.spec.js +0 -93
- package/lib/test/hardwareStats.spec.js.map +0 -1
- package/lib/test/index.js +0 -6
- package/lib/test/index.js.map +0 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/batchManager.spec.js +0 -189
- package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
- package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
- package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
- package/lib/test/opLifecycle/outbox.spec.js +0 -675
- package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
- package/lib/test/pendingStateManager.spec.js +0 -329
- package/lib/test/pendingStateManager.spec.js.map +0 -1
- package/lib/test/scheduleManager.spec.js +0 -270
- package/lib/test/scheduleManager.spec.js.map +0 -1
- package/lib/test/summarizerNode.spec.js +0 -326
- package/lib/test/summarizerNode.spec.js.map +0 -1
- package/lib/test/summarizerNodeWithGc.spec.js +0 -318
- package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
- package/lib/test/summary/orderedClientElection.spec.js +0 -535
- package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
- package/lib/test/summary/runningSummarizer.spec.js +0 -1349
- package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizer.spec.js +0 -29
- package/lib/test/summary/summarizer.spec.js.map +0 -1
- package/lib/test/summary/summarizerClientElection.spec.js +0 -436
- package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
- package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
- package/lib/test/summary/summaryCollection.spec.js +0 -200
- package/lib/test/summary/summaryCollection.spec.js.map +0 -1
- package/lib/test/summary/summaryManager.spec.js +0 -430
- package/lib/test/summary/summaryManager.spec.js.map +0 -1
- package/lib/test/summary/testQuorumClients.js +0 -34
- package/lib/test/summary/testQuorumClients.js.map +0 -1
- package/lib/test/throttler.spec.js +0 -175
- package/lib/test/throttler.spec.js.map +0 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "assert";
|
|
6
|
-
import sinon from "sinon";
|
|
7
|
-
import { Deferred } from "@fluidframework/core-utils";
|
|
8
|
-
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
9
|
-
import { MessageType, } from "@fluidframework/protocol-definitions";
|
|
10
|
-
import { MockLogger } from "@fluidframework/telemetry-utils";
|
|
11
|
-
import { MockDeltaManager } from "@fluidframework/test-runtime-utils";
|
|
12
|
-
import { DefaultSummaryConfiguration } from "../../containerRuntime.js";
|
|
13
|
-
import { SummaryManager, SummaryManagerState, RunningSummarizer, SummarizeHeuristicData, SummaryCollection, neverCancelledSummaryToken, } from "../../summary/index.js";
|
|
14
|
-
class MockRuntime {
|
|
15
|
-
constructor(deltaManager) {
|
|
16
|
-
this.deltaManager = deltaManager;
|
|
17
|
-
}
|
|
18
|
-
on(_event, _listener) {
|
|
19
|
-
return this;
|
|
20
|
-
}
|
|
21
|
-
off(_event, _listener) {
|
|
22
|
-
return this;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
describe("Summary Manager", () => {
|
|
26
|
-
let clock;
|
|
27
|
-
before(() => {
|
|
28
|
-
clock = sinon.useFakeTimers();
|
|
29
|
-
});
|
|
30
|
-
after(() => clock.restore());
|
|
31
|
-
const flushPromises = async () => new Promise((resolve) => process.nextTick(resolve));
|
|
32
|
-
const thisClientId = "this";
|
|
33
|
-
const mockLogger = new MockLogger();
|
|
34
|
-
const mockDeltaManager = new MockDeltaManager();
|
|
35
|
-
const mockRuntime = new MockRuntime(mockDeltaManager);
|
|
36
|
-
let summaryManager;
|
|
37
|
-
let runningSummarizer;
|
|
38
|
-
// let runCount: number;
|
|
39
|
-
const summarizerClientId = "test";
|
|
40
|
-
// Fake objects
|
|
41
|
-
const summaryCollection = new SummaryCollection(mockDeltaManager, mockLogger.toTelemetryLogger());
|
|
42
|
-
const throttler = {
|
|
43
|
-
delayMs: 0,
|
|
44
|
-
numAttempts: 0,
|
|
45
|
-
getDelay() {
|
|
46
|
-
return this.delayMs;
|
|
47
|
-
},
|
|
48
|
-
maxDelayMs: 0,
|
|
49
|
-
delayWindowMs: 0,
|
|
50
|
-
delayFn: () => 0,
|
|
51
|
-
};
|
|
52
|
-
const summaryOp = {
|
|
53
|
-
clientId: "clientId",
|
|
54
|
-
clientSequenceNumber: 5,
|
|
55
|
-
minimumSequenceNumber: 5,
|
|
56
|
-
referenceSequenceNumber: 5,
|
|
57
|
-
sequenceNumber: 6,
|
|
58
|
-
timestamp: 6,
|
|
59
|
-
type: MessageType.Summarize,
|
|
60
|
-
contents: {
|
|
61
|
-
handle: "OpHandle",
|
|
62
|
-
head: "head",
|
|
63
|
-
message: "message",
|
|
64
|
-
parents: ["parents"],
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
class TestConnectedState extends TypedEventEmitter {
|
|
68
|
-
constructor() {
|
|
69
|
-
super(...arguments);
|
|
70
|
-
this.connected = false;
|
|
71
|
-
}
|
|
72
|
-
connect() {
|
|
73
|
-
this.connected = true;
|
|
74
|
-
this.clientId = thisClientId;
|
|
75
|
-
this.emit("connected", this.clientId);
|
|
76
|
-
}
|
|
77
|
-
disconnect() {
|
|
78
|
-
this.connected = false;
|
|
79
|
-
this.emit("disconnected");
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
class TestSummarizer extends TypedEventEmitter {
|
|
83
|
-
notImplemented() {
|
|
84
|
-
throw Error("not implemented");
|
|
85
|
-
}
|
|
86
|
-
constructor() {
|
|
87
|
-
super();
|
|
88
|
-
this.state = "notStarted";
|
|
89
|
-
this.stopDeferred = new Deferred();
|
|
90
|
-
this.runDeferred = new Deferred();
|
|
91
|
-
this.summarizeOnDemand = () => this.notImplemented();
|
|
92
|
-
this.enqueueSummarize = () => this.notImplemented();
|
|
93
|
-
}
|
|
94
|
-
async setSummarizer() {
|
|
95
|
-
this.notImplemented();
|
|
96
|
-
}
|
|
97
|
-
get cancelled() {
|
|
98
|
-
// Approximation, as ideally it should become cancelled immediately after stop() call
|
|
99
|
-
return this.state !== "running";
|
|
100
|
-
}
|
|
101
|
-
close() { }
|
|
102
|
-
stop(reason) {
|
|
103
|
-
this.stopDeferred.resolve(reason);
|
|
104
|
-
}
|
|
105
|
-
async run(onBehalfOf) {
|
|
106
|
-
this.onBehalfOf = onBehalfOf;
|
|
107
|
-
this.state = "running";
|
|
108
|
-
runningSummarizer = await RunningSummarizer.start(mockLogger, summaryCollection.createWatcher(summarizerClientId), {
|
|
109
|
-
...DefaultSummaryConfiguration,
|
|
110
|
-
...{
|
|
111
|
-
initialSummarizerDelayMs: 0,
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
// submitSummaryCallback
|
|
115
|
-
async (options) => {
|
|
116
|
-
return {
|
|
117
|
-
stage: "base",
|
|
118
|
-
minimumSequenceNumber: 0,
|
|
119
|
-
referenceSequenceNumber: 0,
|
|
120
|
-
error: undefined,
|
|
121
|
-
};
|
|
122
|
-
}, async (options) => { }, new SummarizeHeuristicData(0, { refSequenceNumber: 0, summaryTime: Date.now() }), summaryCollection, neverCancelledSummaryToken,
|
|
123
|
-
// stopSummarizerCallback
|
|
124
|
-
(reason) => { }, mockRuntime);
|
|
125
|
-
await Promise.all([this.stopDeferred.promise, this.runDeferred.promise]);
|
|
126
|
-
await runningSummarizer.waitStop(true);
|
|
127
|
-
this.state = "stopped";
|
|
128
|
-
return "summarizerClientDisconnected";
|
|
129
|
-
}
|
|
130
|
-
get IFluidLoadable() {
|
|
131
|
-
return this.notImplemented();
|
|
132
|
-
}
|
|
133
|
-
get handle() {
|
|
134
|
-
return this.notImplemented();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
class TestSummarizerClientElection extends TypedEventEmitter {
|
|
138
|
-
get electedParentId() {
|
|
139
|
-
return this.electedClientId;
|
|
140
|
-
}
|
|
141
|
-
electClient(clientId) {
|
|
142
|
-
this.electedClientId = clientId;
|
|
143
|
-
this.emit("electedSummarizerChanged");
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
let clientElection;
|
|
147
|
-
let connectedState;
|
|
148
|
-
let summarizer;
|
|
149
|
-
let requestCalls = 0;
|
|
150
|
-
let requestDeferred = new Deferred();
|
|
151
|
-
/**
|
|
152
|
-
* Mocks the request Summarizer function by incrementing a call counter.
|
|
153
|
-
* The requestDeferred object must be resolved outside of this function
|
|
154
|
-
* by calling completeSummarizerRequest() before this function will complete.
|
|
155
|
-
* This is used to simulate delaying the request call for testing the
|
|
156
|
-
* SummaryManager state machine timings.
|
|
157
|
-
*/
|
|
158
|
-
const requestSummarizer = async () => {
|
|
159
|
-
summarizer = new TestSummarizer();
|
|
160
|
-
requestCalls++;
|
|
161
|
-
requestDeferred = new Deferred();
|
|
162
|
-
await requestDeferred.promise;
|
|
163
|
-
return summarizer;
|
|
164
|
-
};
|
|
165
|
-
/** Completes the pending request Summarizer call. */
|
|
166
|
-
const completeSummarizerRequest = () => requestDeferred.resolve();
|
|
167
|
-
function createSummaryManager({ connected = false, ...config } = {}) {
|
|
168
|
-
connectedState = new TestConnectedState();
|
|
169
|
-
if (connected) {
|
|
170
|
-
connectedState.connect();
|
|
171
|
-
}
|
|
172
|
-
clientElection = new TestSummarizerClientElection();
|
|
173
|
-
summaryManager = new SummaryManager(clientElection, connectedState, summaryCollection, mockLogger, requestSummarizer, throttler, config);
|
|
174
|
-
summaryManager.start();
|
|
175
|
-
}
|
|
176
|
-
function assertState(expectedState, message) {
|
|
177
|
-
assert.strictEqual(summaryManager.currentState, expectedState, message);
|
|
178
|
-
}
|
|
179
|
-
function assertRequests(count, message) {
|
|
180
|
-
const prefix = message ? `${message} - ` : "";
|
|
181
|
-
assert.strictEqual(requestCalls, count, `${prefix}Unexpected request count`);
|
|
182
|
-
}
|
|
183
|
-
afterEach(() => {
|
|
184
|
-
clientElection.removeAllListeners();
|
|
185
|
-
summarizer.removeAllListeners();
|
|
186
|
-
connectedState.removeAllListeners();
|
|
187
|
-
throttler.delayMs = 0;
|
|
188
|
-
mockDeltaManager.lastSequenceNumber = 0;
|
|
189
|
-
requestCalls = 0;
|
|
190
|
-
clock.reset();
|
|
191
|
-
});
|
|
192
|
-
it("Should become summarizer if connected, then elected; stop summarizer after disconnect", async () => {
|
|
193
|
-
createSummaryManager({ opsToBypassInitialDelay: 0 });
|
|
194
|
-
assertState(SummaryManagerState.Off, "should start off");
|
|
195
|
-
connectedState.connect();
|
|
196
|
-
await flushPromises();
|
|
197
|
-
assertState(SummaryManagerState.Off, "connected but not yet elected");
|
|
198
|
-
clientElection.electClient("other");
|
|
199
|
-
await flushPromises();
|
|
200
|
-
assertState(SummaryManagerState.Off, "connected but other client elected");
|
|
201
|
-
clientElection.electClient(thisClientId);
|
|
202
|
-
await flushPromises();
|
|
203
|
-
assertState(SummaryManagerState.Running, "should request summarizer");
|
|
204
|
-
assertRequests(1, "should have requested summarizer");
|
|
205
|
-
completeSummarizerRequest();
|
|
206
|
-
await flushPromises();
|
|
207
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
208
|
-
connectedState.disconnect();
|
|
209
|
-
await flushPromises();
|
|
210
|
-
assertState(SummaryManagerState.Stopping, "should be stopping after disconnect");
|
|
211
|
-
summarizer.runDeferred.resolve();
|
|
212
|
-
await flushPromises();
|
|
213
|
-
assertState(SummaryManagerState.Off, "should be off after summarizer finishes running");
|
|
214
|
-
assertRequests(1, "should not have requested summarizer again");
|
|
215
|
-
});
|
|
216
|
-
it("Should become summarizer if elected, then connected; stop summarizer after unelected", async () => {
|
|
217
|
-
createSummaryManager({ opsToBypassInitialDelay: 0, initialDelayMs: 0 });
|
|
218
|
-
assertState(SummaryManagerState.Off, "should start off");
|
|
219
|
-
clientElection.electClient(thisClientId);
|
|
220
|
-
await flushPromises();
|
|
221
|
-
assertState(SummaryManagerState.Off, "elected but not yet connected");
|
|
222
|
-
connectedState.connect();
|
|
223
|
-
await flushPromises();
|
|
224
|
-
assertState(SummaryManagerState.Running, "should request summarizer");
|
|
225
|
-
assertRequests(1, "should have requested summarizer");
|
|
226
|
-
completeSummarizerRequest();
|
|
227
|
-
await flushPromises();
|
|
228
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
229
|
-
clientElection.electClient("other");
|
|
230
|
-
await flushPromises();
|
|
231
|
-
assertState(SummaryManagerState.Stopping, "should be stopping after other client elected");
|
|
232
|
-
summarizer.runDeferred.resolve();
|
|
233
|
-
await flushPromises();
|
|
234
|
-
assertState(SummaryManagerState.Off, "should be off after summarizer finishes running");
|
|
235
|
-
assertRequests(1, "should not have requested summarizer again");
|
|
236
|
-
});
|
|
237
|
-
it("Should restart if summarizer closes itself", async () => {
|
|
238
|
-
createSummaryManager({ opsToBypassInitialDelay: 0 });
|
|
239
|
-
assertState(SummaryManagerState.Off, "should start off");
|
|
240
|
-
connectedState.connect();
|
|
241
|
-
await flushPromises();
|
|
242
|
-
assertState(SummaryManagerState.Off, "connected but not yet elected");
|
|
243
|
-
clientElection.electClient(thisClientId);
|
|
244
|
-
await flushPromises();
|
|
245
|
-
assertState(SummaryManagerState.Running, "should request summarizer");
|
|
246
|
-
assertRequests(1, "should have requested summarizer");
|
|
247
|
-
completeSummarizerRequest();
|
|
248
|
-
await flushPromises();
|
|
249
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
250
|
-
summarizer.stop(); // Simulate summarizer stopping itself
|
|
251
|
-
summarizer.runDeferred.resolve();
|
|
252
|
-
await flushPromises();
|
|
253
|
-
assertState(SummaryManagerState.Running, "should restart itself");
|
|
254
|
-
assertRequests(2, "should have requested a new summarizer");
|
|
255
|
-
completeSummarizerRequest();
|
|
256
|
-
await flushPromises();
|
|
257
|
-
assertState(SummaryManagerState.Running, "should be running new summarizer");
|
|
258
|
-
});
|
|
259
|
-
describe("Start Summarizer Delay", () => {
|
|
260
|
-
it("Should wait for initial delay before first start", async () => {
|
|
261
|
-
mockDeltaManager.lastSequenceNumber = 999; // 999 < 1000, so do not bypass
|
|
262
|
-
createSummaryManager({
|
|
263
|
-
initialDelayMs: 2000,
|
|
264
|
-
opsToBypassInitialDelay: 1000,
|
|
265
|
-
connected: true,
|
|
266
|
-
});
|
|
267
|
-
clientElection.electClient(thisClientId);
|
|
268
|
-
await flushPromises();
|
|
269
|
-
assertState(SummaryManagerState.Starting, "should enter starting state immediately");
|
|
270
|
-
clock.tick(1999);
|
|
271
|
-
await flushPromises();
|
|
272
|
-
assertRequests(0, "should not have requested summarizer yet");
|
|
273
|
-
clock.tick(1);
|
|
274
|
-
await flushPromises();
|
|
275
|
-
assertRequests(1, "should request summarizer after initial delay");
|
|
276
|
-
completeSummarizerRequest();
|
|
277
|
-
await flushPromises();
|
|
278
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
279
|
-
});
|
|
280
|
-
it("Should bypass initial delay if enough ops have already passed", async () => {
|
|
281
|
-
mockDeltaManager.lastSequenceNumber = 1000; // seq >= opsToBypass, so bypass
|
|
282
|
-
createSummaryManager({
|
|
283
|
-
initialDelayMs: 2000,
|
|
284
|
-
opsToBypassInitialDelay: 1000,
|
|
285
|
-
connected: true,
|
|
286
|
-
});
|
|
287
|
-
clientElection.electClient(thisClientId);
|
|
288
|
-
await flushPromises();
|
|
289
|
-
assertState(SummaryManagerState.Running, "should enter starting state immediately");
|
|
290
|
-
assertRequests(1, "should request summarizer immediately, bypassing initial delay");
|
|
291
|
-
completeSummarizerRequest();
|
|
292
|
-
await flushPromises();
|
|
293
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
294
|
-
});
|
|
295
|
-
// This test attempts to validate a case where summarizer client does not wait
|
|
296
|
-
// initial delay if there are enough unsummarized ops.
|
|
297
|
-
// The way it was implemented (and tested here) is that it only worked if given
|
|
298
|
-
// client was selected to be a summarizer in the past, then got disconnected and later
|
|
299
|
-
// again was elected a summarizer and at that moment we had enough ops to cut short wait.
|
|
300
|
-
// If we want to cut short such wait, we should do it properly by listening for incoming ops
|
|
301
|
-
// and cut wait short based on op count when a single op triggers overflow, i.e.
|
|
302
|
-
// make it work in main scenario, not some corner case that does not matter.
|
|
303
|
-
// Issue #7273 tracks making appropriate product and test change and re-enable the test.
|
|
304
|
-
it("Should bypass initial delay if enough ops pass later", async () => {
|
|
305
|
-
mockDeltaManager.lastSequenceNumber = 500;
|
|
306
|
-
createSummaryManager({
|
|
307
|
-
initialDelayMs: 2000,
|
|
308
|
-
opsToBypassInitialDelay: 1000,
|
|
309
|
-
connected: true,
|
|
310
|
-
});
|
|
311
|
-
clientElection.electClient(thisClientId);
|
|
312
|
-
await flushPromises();
|
|
313
|
-
assertState(SummaryManagerState.Starting, "should enter starting state immediately");
|
|
314
|
-
clock.tick(1999);
|
|
315
|
-
await flushPromises();
|
|
316
|
-
assertRequests(0, "should not have requested summarizer yet");
|
|
317
|
-
mockDeltaManager.lastSequenceNumber = 999; // seq < opsToBypass. No bypass.
|
|
318
|
-
mockDeltaManager.emit("op", summaryOp);
|
|
319
|
-
clientElection.electClient(thisClientId); // force trigger refresh
|
|
320
|
-
await flushPromises();
|
|
321
|
-
assertRequests(0, "still should not have requested summarizer yet");
|
|
322
|
-
mockDeltaManager.lastSequenceNumber = 1000; // Bypass now
|
|
323
|
-
mockDeltaManager.emit("op", summaryOp);
|
|
324
|
-
clientElection.electClient(thisClientId); // force trigger refresh
|
|
325
|
-
await flushPromises();
|
|
326
|
-
assertRequests(1, "should request summarizer, bypassing initial delay");
|
|
327
|
-
completeSummarizerRequest();
|
|
328
|
-
await flushPromises();
|
|
329
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
330
|
-
});
|
|
331
|
-
it("Should bypass initial delay if enough ops pass and summarize if disconnected", async () => {
|
|
332
|
-
mockDeltaManager.lastSequenceNumber = 1001; // seq > opsToBypass
|
|
333
|
-
createSummaryManager({
|
|
334
|
-
initialDelayMs: 0,
|
|
335
|
-
opsToBypassInitialDelay: 1000,
|
|
336
|
-
connected: true,
|
|
337
|
-
});
|
|
338
|
-
clientElection.electClient(thisClientId);
|
|
339
|
-
connectedState.disconnect(); // To enforce stopReasonCanRunLastSummary == true.
|
|
340
|
-
await flushPromises();
|
|
341
|
-
mockDeltaManager.emit("op", summaryOp);
|
|
342
|
-
await flushPromises();
|
|
343
|
-
assertRequests(1, "should request summarizer and run the last summary.");
|
|
344
|
-
completeSummarizerRequest();
|
|
345
|
-
await flushPromises();
|
|
346
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
347
|
-
});
|
|
348
|
-
it("Should create last summary when summarizer created without delay, then disconnected", async () => {
|
|
349
|
-
throttler.delayMs = 0;
|
|
350
|
-
createSummaryManager({
|
|
351
|
-
opsToBypassInitialDelay: 0,
|
|
352
|
-
connected: false,
|
|
353
|
-
});
|
|
354
|
-
clientElection.electClient(thisClientId);
|
|
355
|
-
await flushPromises();
|
|
356
|
-
assertState(SummaryManagerState.Off, "not connected");
|
|
357
|
-
mockDeltaManager.lastSequenceNumber = 10001;
|
|
358
|
-
connectedState.connect();
|
|
359
|
-
await flushPromises();
|
|
360
|
-
assertState(SummaryManagerState.Running, "Summarizer should be starting");
|
|
361
|
-
assertRequests(1, "Should begin without delay");
|
|
362
|
-
completeSummarizerRequest();
|
|
363
|
-
await flushPromises();
|
|
364
|
-
assertState(SummaryManagerState.Running, "Should be running");
|
|
365
|
-
connectedState.disconnect();
|
|
366
|
-
await flushPromises();
|
|
367
|
-
assertState(SummaryManagerState.Stopping, "Should be stopping");
|
|
368
|
-
});
|
|
369
|
-
it("Should wait for throttler delay before starting summarizer", async () => {
|
|
370
|
-
throttler.delayMs = 100;
|
|
371
|
-
createSummaryManager({
|
|
372
|
-
opsToBypassInitialDelay: 0,
|
|
373
|
-
connected: true,
|
|
374
|
-
});
|
|
375
|
-
clientElection.electClient(thisClientId);
|
|
376
|
-
await flushPromises();
|
|
377
|
-
assertState(SummaryManagerState.Starting, "should enter starting state immediately");
|
|
378
|
-
clock.tick(99);
|
|
379
|
-
await flushPromises();
|
|
380
|
-
assertRequests(0, "should not have requested summarizer yet");
|
|
381
|
-
clock.tick(1);
|
|
382
|
-
await flushPromises();
|
|
383
|
-
assertRequests(1, "should request summarizer after throttler delay");
|
|
384
|
-
completeSummarizerRequest();
|
|
385
|
-
await flushPromises();
|
|
386
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
387
|
-
});
|
|
388
|
-
it("Should wait for longer delay (initial) before starting summarizer", async () => {
|
|
389
|
-
throttler.delayMs = 100;
|
|
390
|
-
createSummaryManager({
|
|
391
|
-
initialDelayMs: 2000,
|
|
392
|
-
opsToBypassInitialDelay: 1000,
|
|
393
|
-
connected: true,
|
|
394
|
-
});
|
|
395
|
-
clientElection.electClient(thisClientId);
|
|
396
|
-
await flushPromises();
|
|
397
|
-
assertState(SummaryManagerState.Starting, "should enter starting state immediately");
|
|
398
|
-
clock.tick(1999);
|
|
399
|
-
await flushPromises();
|
|
400
|
-
assertRequests(0, "should not have requested summarizer yet");
|
|
401
|
-
clock.tick(1);
|
|
402
|
-
await flushPromises();
|
|
403
|
-
assertRequests(1, "should request summarizer after both delays");
|
|
404
|
-
completeSummarizerRequest();
|
|
405
|
-
await flushPromises();
|
|
406
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
407
|
-
});
|
|
408
|
-
it("Should wait for longer delay (throttler) before starting summarizer", async () => {
|
|
409
|
-
throttler.delayMs = 100;
|
|
410
|
-
createSummaryManager({
|
|
411
|
-
initialDelayMs: 50,
|
|
412
|
-
opsToBypassInitialDelay: 1000,
|
|
413
|
-
connected: true,
|
|
414
|
-
});
|
|
415
|
-
clientElection.electClient(thisClientId);
|
|
416
|
-
await flushPromises();
|
|
417
|
-
assertState(SummaryManagerState.Starting, "should enter starting state immediately");
|
|
418
|
-
clock.tick(99);
|
|
419
|
-
await flushPromises();
|
|
420
|
-
assertRequests(0, "should not have requested summarizer yet");
|
|
421
|
-
clock.tick(1);
|
|
422
|
-
await flushPromises();
|
|
423
|
-
assertRequests(1, "should request summarizer after both delays");
|
|
424
|
-
completeSummarizerRequest();
|
|
425
|
-
await flushPromises();
|
|
426
|
-
assertState(SummaryManagerState.Running, "summarizer should be running");
|
|
427
|
-
});
|
|
428
|
-
});
|
|
429
|
-
});
|
|
430
|
-
//# sourceMappingURL=summaryManager.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"summaryManager.spec.js","sourceRoot":"","sources":["../../../src/test/summary/summaryManager.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 sinon from \"sinon\";\nimport { Deferred } from \"@fluidframework/core-utils\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport { IFluidHandle, IFluidLoadable } from \"@fluidframework/core-interfaces\";\nimport {\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tMessageType,\n} from \"@fluidframework/protocol-definitions\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { MockDeltaManager } from \"@fluidframework/test-runtime-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { DefaultSummaryConfiguration } from \"../../containerRuntime.js\";\nimport {\n\tIConnectedEvents,\n\tIConnectedState,\n\tISummaryManagerConfig,\n\tSummaryManager,\n\tSummaryManagerState,\n\tSummarizer,\n\tISummarizer,\n\tISummarizerEvents,\n\tSummarizerStopReason,\n\tISummarizerClientElection,\n\tISummarizerClientElectionEvents,\n\tRunningSummarizer,\n\tSummarizeHeuristicData,\n\tSummaryCollection,\n\tISummaryOpMessage,\n\tneverCancelledSummaryToken,\n\tISummarizerRuntime,\n} from \"../../summary/index.js\";\n\nclass MockRuntime {\n\tconstructor(\n\t\tpublic readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {}\n\tpublic on(\n\t\t_event: \"op\",\n\t\t_listener: (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => void,\n\t) {\n\t\treturn this;\n\t}\n\n\tpublic off(\n\t\t_event: \"op\",\n\t\t_listener: (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => void,\n\t) {\n\t\treturn this;\n\t}\n}\n\ndescribe(\"Summary Manager\", () => {\n\tlet clock: sinon.SinonFakeTimers;\n\tbefore(() => {\n\t\tclock = sinon.useFakeTimers();\n\t});\n\tafter(() => clock.restore());\n\tconst flushPromises = async () => new Promise((resolve) => process.nextTick(resolve));\n\tconst thisClientId = \"this\";\n\tconst mockLogger = new MockLogger();\n\tconst mockDeltaManager = new MockDeltaManager();\n\tconst mockRuntime = new MockRuntime(mockDeltaManager);\n\tlet summaryManager: SummaryManager;\n\tlet runningSummarizer: RunningSummarizer;\n\t// let runCount: number;\n\tconst summarizerClientId = \"test\";\n\n\t// Fake objects\n\tconst summaryCollection = new SummaryCollection(\n\t\tmockDeltaManager,\n\t\tmockLogger.toTelemetryLogger(),\n\t);\n\tconst throttler = {\n\t\tdelayMs: 0,\n\t\tnumAttempts: 0,\n\t\tgetDelay() {\n\t\t\treturn this.delayMs;\n\t\t},\n\t\tmaxDelayMs: 0,\n\t\tdelayWindowMs: 0,\n\t\tdelayFn: () => 0,\n\t};\n\n\tconst summaryOp: ISummaryOpMessage = {\n\t\tclientId: \"clientId\",\n\t\tclientSequenceNumber: 5,\n\t\tminimumSequenceNumber: 5,\n\t\treferenceSequenceNumber: 5,\n\t\tsequenceNumber: 6,\n\t\ttimestamp: 6,\n\t\ttype: MessageType.Summarize,\n\t\tcontents: {\n\t\t\thandle: \"OpHandle\",\n\t\t\thead: \"head\",\n\t\t\tmessage: \"message\",\n\t\t\tparents: [\"parents\"],\n\t\t},\n\t};\n\n\tclass TestConnectedState\n\t\textends TypedEventEmitter<IConnectedEvents>\n\t\timplements IConnectedState\n\t{\n\t\tpublic connected = false;\n\t\tpublic clientId: string | undefined;\n\n\t\tpublic connect() {\n\t\t\tthis.connected = true;\n\t\t\tthis.clientId = thisClientId;\n\t\t\tthis.emit(\"connected\", this.clientId);\n\t\t}\n\n\t\tpublic disconnect() {\n\t\t\tthis.connected = false;\n\t\t\tthis.emit(\"disconnected\");\n\t\t}\n\t}\n\n\tclass TestSummarizer extends TypedEventEmitter<ISummarizerEvents> implements ISummarizer {\n\t\tprivate notImplemented(): never {\n\t\t\tthrow Error(\"not implemented\");\n\t\t}\n\t\tpublic onBehalfOf: string | undefined;\n\t\tpublic state: \"notStarted\" | \"running\" | \"stopped\" = \"notStarted\";\n\t\tpublic readonly stopDeferred = new Deferred<string | undefined>();\n\t\tpublic readonly runDeferred = new Deferred<void>();\n\n\t\tconstructor() {\n\t\t\tsuper();\n\t\t}\n\t\tpublic async setSummarizer(): Promise<Summarizer> {\n\t\t\tthis.notImplemented();\n\t\t}\n\t\tpublic get cancelled() {\n\t\t\t// Approximation, as ideally it should become cancelled immediately after stop() call\n\t\t\treturn this.state !== \"running\";\n\t\t}\n\t\tpublic close() {}\n\t\tpublic stop(reason?: string): void {\n\t\t\tthis.stopDeferred.resolve(reason);\n\t\t}\n\t\tpublic async run(onBehalfOf: string): Promise<SummarizerStopReason> {\n\t\t\tthis.onBehalfOf = onBehalfOf;\n\t\t\tthis.state = \"running\";\n\t\t\trunningSummarizer = await RunningSummarizer.start(\n\t\t\t\tmockLogger,\n\t\t\t\tsummaryCollection.createWatcher(summarizerClientId),\n\t\t\t\t{\n\t\t\t\t\t...DefaultSummaryConfiguration,\n\t\t\t\t\t...{\n\t\t\t\t\t\tinitialSummarizerDelayMs: 0,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// submitSummaryCallback\n\t\t\t\tasync (options) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstage: \"base\",\n\t\t\t\t\t\tminimumSequenceNumber: 0,\n\t\t\t\t\t\treferenceSequenceNumber: 0,\n\t\t\t\t\t\terror: undefined,\n\t\t\t\t\t} as const;\n\t\t\t\t},\n\t\t\t\tasync (options) => {},\n\t\t\t\tnew SummarizeHeuristicData(0, { refSequenceNumber: 0, summaryTime: Date.now() }),\n\t\t\t\tsummaryCollection,\n\t\t\t\tneverCancelledSummaryToken,\n\t\t\t\t// stopSummarizerCallback\n\t\t\t\t(reason) => {},\n\t\t\t\tmockRuntime as any as ISummarizerRuntime,\n\t\t\t);\n\t\t\tawait Promise.all([this.stopDeferred.promise, this.runDeferred.promise]);\n\t\t\tawait runningSummarizer.waitStop(true);\n\t\t\tthis.state = \"stopped\";\n\t\t\treturn \"summarizerClientDisconnected\";\n\t\t}\n\n\t\tpublic readonly summarizeOnDemand: ISummarizer[\"summarizeOnDemand\"] = () =>\n\t\t\tthis.notImplemented();\n\t\tpublic readonly enqueueSummarize: ISummarizer[\"enqueueSummarize\"] = () =>\n\t\t\tthis.notImplemented();\n\t\tpublic get IFluidLoadable(): IFluidLoadable {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t\tpublic get handle(): IFluidHandle {\n\t\t\treturn this.notImplemented();\n\t\t}\n\t}\n\n\tclass TestSummarizerClientElection\n\t\textends TypedEventEmitter<ISummarizerClientElectionEvents>\n\t\timplements ISummarizerClientElection\n\t{\n\t\tpublic electedClientId: string | undefined;\n\t\tpublic get electedParentId() {\n\t\t\treturn this.electedClientId;\n\t\t}\n\n\t\tpublic electClient(clientId: string | undefined) {\n\t\t\tthis.electedClientId = clientId;\n\t\t\tthis.emit(\"electedSummarizerChanged\");\n\t\t}\n\t}\n\n\tlet clientElection: TestSummarizerClientElection;\n\tlet connectedState: TestConnectedState;\n\tlet summarizer: TestSummarizer;\n\tlet requestCalls = 0;\n\tlet requestDeferred = new Deferred<void>();\n\n\t/**\n\t * Mocks the request Summarizer function by incrementing a call counter.\n\t * The requestDeferred object must be resolved outside of this function\n\t * by calling completeSummarizerRequest() before this function will complete.\n\t * This is used to simulate delaying the request call for testing the\n\t * SummaryManager state machine timings.\n\t */\n\tconst requestSummarizer = async (): Promise<ISummarizer> => {\n\t\tsummarizer = new TestSummarizer();\n\t\trequestCalls++;\n\t\trequestDeferred = new Deferred();\n\t\tawait requestDeferred.promise;\n\t\treturn summarizer;\n\t};\n\n\t/** Completes the pending request Summarizer call. */\n\tconst completeSummarizerRequest = () => requestDeferred.resolve();\n\n\tfunction createSummaryManager({\n\t\tconnected = false,\n\t\t...config\n\t}: Readonly<Partial<{ connected?: boolean } & ISummaryManagerConfig>> = {}) {\n\t\tconnectedState = new TestConnectedState();\n\t\tif (connected) {\n\t\t\tconnectedState.connect();\n\t\t}\n\t\tclientElection = new TestSummarizerClientElection();\n\t\tsummaryManager = new SummaryManager(\n\t\t\tclientElection,\n\t\t\tconnectedState,\n\t\t\tsummaryCollection,\n\t\t\tmockLogger,\n\t\t\trequestSummarizer,\n\t\t\tthrottler,\n\t\t\tconfig,\n\t\t);\n\t\tsummaryManager.start();\n\t}\n\n\tfunction assertState(expectedState: SummaryManagerState, message: string) {\n\t\tassert.strictEqual(summaryManager.currentState, expectedState, message);\n\t}\n\n\tfunction assertRequests(count: number, message?: string) {\n\t\tconst prefix = message ? `${message} - ` : \"\";\n\t\tassert.strictEqual(requestCalls, count, `${prefix}Unexpected request count`);\n\t}\n\n\tafterEach(() => {\n\t\tclientElection.removeAllListeners();\n\t\tsummarizer.removeAllListeners();\n\t\tconnectedState.removeAllListeners();\n\t\tthrottler.delayMs = 0;\n\t\tmockDeltaManager.lastSequenceNumber = 0;\n\t\trequestCalls = 0;\n\t\tclock.reset();\n\t});\n\n\tit(\"Should become summarizer if connected, then elected; stop summarizer after disconnect\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but not yet elected\");\n\t\tclientElection.electClient(\"other\");\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but other client elected\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tconnectedState.disconnect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Stopping, \"should be stopping after disconnect\");\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"should be off after summarizer finishes running\");\n\t\tassertRequests(1, \"should not have requested summarizer again\");\n\t});\n\n\tit(\"Should become summarizer if elected, then connected; stop summarizer after unelected\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0, initialDelayMs: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"elected but not yet connected\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tclientElection.electClient(\"other\");\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Stopping, \"should be stopping after other client elected\");\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"should be off after summarizer finishes running\");\n\t\tassertRequests(1, \"should not have requested summarizer again\");\n\t});\n\n\tit(\"Should restart if summarizer closes itself\", async () => {\n\t\tcreateSummaryManager({ opsToBypassInitialDelay: 0 });\n\t\tassertState(SummaryManagerState.Off, \"should start off\");\n\t\tconnectedState.connect();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Off, \"connected but not yet elected\");\n\t\tclientElection.electClient(thisClientId);\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should request summarizer\");\n\t\tassertRequests(1, \"should have requested summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\tsummarizer.stop(); // Simulate summarizer stopping itself\n\t\tsummarizer.runDeferred.resolve();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should restart itself\");\n\t\tassertRequests(2, \"should have requested a new summarizer\");\n\t\tcompleteSummarizerRequest();\n\t\tawait flushPromises();\n\t\tassertState(SummaryManagerState.Running, \"should be running new summarizer\");\n\t});\n\n\tdescribe(\"Start Summarizer Delay\", () => {\n\t\tit(\"Should wait for initial delay before first start\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 999; // 999 < 1000, so do not bypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should bypass initial delay if enough ops have already passed\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 1000; // seq >= opsToBypass, so bypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"should enter starting state immediately\");\n\t\t\tassertRequests(1, \"should request summarizer immediately, bypassing initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\t// This test attempts to validate a case where summarizer client does not wait\n\t\t// initial delay if there are enough unsummarized ops.\n\t\t// The way it was implemented (and tested here) is that it only worked if given\n\t\t// client was selected to be a summarizer in the past, then got disconnected and later\n\t\t// again was elected a summarizer and at that moment we had enough ops to cut short wait.\n\t\t// If we want to cut short such wait, we should do it properly by listening for incoming ops\n\t\t// and cut wait short based on op count when a single op triggers overflow, i.e.\n\t\t// make it work in main scenario, not some corner case that does not matter.\n\t\t// Issue #7273 tracks making appropriate product and test change and re-enable the test.\n\t\tit(\"Should bypass initial delay if enough ops pass later\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 500;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 999; // seq < opsToBypass. No bypass.\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tclientElection.electClient(thisClientId); // force trigger refresh\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"still should not have requested summarizer yet\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 1000; // Bypass now\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tclientElection.electClient(thisClientId); // force trigger refresh\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer, bypassing initial delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should bypass initial delay if enough ops pass and summarize if disconnected\", async () => {\n\t\t\tmockDeltaManager.lastSequenceNumber = 1001; // seq > opsToBypass\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 0,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tconnectedState.disconnect(); // To enforce stopReasonCanRunLastSummary == true.\n\t\t\tawait flushPromises();\n\t\t\tmockDeltaManager.emit(\"op\", summaryOp);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer and run the last summary.\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should create last summary when summarizer created without delay, then disconnected\", async () => {\n\t\t\tthrottler.delayMs = 0;\n\t\t\tcreateSummaryManager({\n\t\t\t\topsToBypassInitialDelay: 0,\n\t\t\t\tconnected: false,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Off, \"not connected\");\n\t\t\tmockDeltaManager.lastSequenceNumber = 10001;\n\t\t\tconnectedState.connect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"Summarizer should be starting\");\n\t\t\tassertRequests(1, \"Should begin without delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"Should be running\");\n\t\t\tconnectedState.disconnect();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Stopping, \"Should be stopping\");\n\t\t});\n\n\t\tit(\"Should wait for throttler delay before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\topsToBypassInitialDelay: 0,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(99);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after throttler delay\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should wait for longer delay (initial) before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 2000,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(1999);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after both delays\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\n\t\tit(\"Should wait for longer delay (throttler) before starting summarizer\", async () => {\n\t\t\tthrottler.delayMs = 100;\n\t\t\tcreateSummaryManager({\n\t\t\t\tinitialDelayMs: 50,\n\t\t\t\topsToBypassInitialDelay: 1000,\n\t\t\t\tconnected: true,\n\t\t\t});\n\t\t\tclientElection.electClient(thisClientId);\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Starting, \"should enter starting state immediately\");\n\t\t\tclock.tick(99);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(0, \"should not have requested summarizer yet\");\n\t\t\tclock.tick(1);\n\t\t\tawait flushPromises();\n\t\t\tassertRequests(1, \"should request summarizer after both delays\");\n\t\t\tcompleteSummarizerRequest();\n\t\t\tawait flushPromises();\n\t\t\tassertState(SummaryManagerState.Running, \"summarizer should be running\");\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
6
|
-
export class TestQuorumClients extends TypedEventEmitter {
|
|
7
|
-
constructor() {
|
|
8
|
-
super(...arguments);
|
|
9
|
-
this.disposed = false;
|
|
10
|
-
this.members = new Map();
|
|
11
|
-
}
|
|
12
|
-
dispose() {
|
|
13
|
-
this.disposed = true;
|
|
14
|
-
}
|
|
15
|
-
getMembers() {
|
|
16
|
-
return this.members;
|
|
17
|
-
}
|
|
18
|
-
getMember(clientId) {
|
|
19
|
-
return this.members.get(clientId);
|
|
20
|
-
}
|
|
21
|
-
addClient(clientId, client) {
|
|
22
|
-
this.members.set(clientId, client);
|
|
23
|
-
this.emit("addMember", clientId, client);
|
|
24
|
-
}
|
|
25
|
-
removeClient(clientId) {
|
|
26
|
-
this.members.delete(clientId);
|
|
27
|
-
this.emit("removeMember", clientId);
|
|
28
|
-
}
|
|
29
|
-
reset() {
|
|
30
|
-
this.members.clear();
|
|
31
|
-
this.removeAllListeners();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=testQuorumClients.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"testQuorumClients.js","sourceRoot":"","sources":["../../../src/test/summary/testQuorumClients.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,OAAO,iBAAkB,SAAQ,iBAAgC;IAAvE;;QACQ,aAAQ,GAAG,KAAK,CAAC;QAKP,YAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IAwBhE,CAAC;IA5BO,OAAO;QACb,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtB,CAAC;IAIM,UAAU;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAEM,SAAS,CAAC,QAAgB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAEM,SAAS,CAAC,QAAgB,EAAE,MAAwB;QAC1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEM,YAAY,CAAC,QAAgB;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAEM,KAAK;QACX,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC3B,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tIQuorumClients,\n\tIQuorumEvents,\n\tISequencedClient,\n} from \"@fluidframework/protocol-definitions\";\n\nexport class TestQuorumClients extends TypedEventEmitter<IQuorumEvents> implements IQuorumClients {\n\tpublic disposed = false;\n\tpublic dispose() {\n\t\tthis.disposed = true;\n\t}\n\n\tprivate readonly members = new Map<string, ISequencedClient>();\n\n\tpublic getMembers(): Map<string, ISequencedClient> {\n\t\treturn this.members;\n\t}\n\n\tpublic getMember(clientId: string): ISequencedClient | undefined {\n\t\treturn this.members.get(clientId);\n\t}\n\n\tpublic addClient(clientId: string, client: ISequencedClient) {\n\t\tthis.members.set(clientId, client);\n\t\tthis.emit(\"addMember\", clientId, client);\n\t}\n\n\tpublic removeClient(clientId: string) {\n\t\tthis.members.delete(clientId);\n\t\tthis.emit(\"removeMember\", clientId);\n\t}\n\n\tpublic reset() {\n\t\tthis.members.clear();\n\t\tthis.removeAllListeners();\n\t}\n}\n"]}
|