@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,29 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Creates a test config provider with the ability to set configs values and clear all config values.
|
|
7
|
-
* @internal
|
|
8
|
-
*/
|
|
9
|
-
export const createTestConfigProvider = () => {
|
|
10
|
-
const settings = {};
|
|
11
|
-
return {
|
|
12
|
-
getRawConfig: (name) => settings[name],
|
|
13
|
-
set: (key, value) => {
|
|
14
|
-
settings[key] = value;
|
|
15
|
-
},
|
|
16
|
-
clear: () => {
|
|
17
|
-
Object.keys(settings).forEach((key) => {
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
19
|
-
delete settings[key];
|
|
20
|
-
});
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
export const parseNothing = async () => {
|
|
25
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
26
|
-
const x = {};
|
|
27
|
-
return x;
|
|
28
|
-
};
|
|
29
|
-
//# sourceMappingURL=gcUnitTestHelpers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gcUnitTestHelpers.js","sourceRoot":"","sources":["../../../src/test/gc/gcUnitTestHelpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,EAAE;IAC5C,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,OAAO;QACN,YAAY,EAAE,CAAC,IAAY,EAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC3D,GAAG,EAAE,CAAC,GAAW,EAAE,KAAkB,EAAE,EAAE;YACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACX,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBACrC,gEAAgE;gBAChE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACJ,CAAC;KACD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAqB,KAAK,IAAO,EAAE;IAC3D,yEAAyE;IACzE,MAAM,CAAC,GAAM,EAAO,CAAC;IACrB,OAAO,CAAC,CAAC;AACV,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ConfigTypes } from \"@fluidframework/core-interfaces\";\nimport { ReadAndParseBlob } from \"@fluidframework/runtime-utils\";\n\n/**\n * Creates a test config provider with the ability to set configs values and clear all config values.\n * @internal\n */\nexport const createTestConfigProvider = () => {\n\tconst settings: Record<string, ConfigTypes> = {};\n\treturn {\n\t\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n\t\tset: (key: string, value: ConfigTypes) => {\n\t\t\tsettings[key] = value;\n\t\t},\n\t\tclear: () => {\n\t\t\tObject.keys(settings).forEach((key) => {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\tdelete settings[key];\n\t\t\t});\n\t\t},\n\t};\n};\n\nexport const parseNothing: ReadAndParseBlob = async <T>() => {\n\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\tconst x: T = {} as T;\n\treturn x;\n};\n"]}
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "assert";
|
|
6
|
-
import { useFakeTimers, spy } from "sinon";
|
|
7
|
-
import { UnreferencedState, UnreferencedStateTracker } from "../../gc/index.js";
|
|
8
|
-
describe("Garbage Collection Tests", () => {
|
|
9
|
-
let clock;
|
|
10
|
-
before(() => {
|
|
11
|
-
clock = useFakeTimers();
|
|
12
|
-
});
|
|
13
|
-
afterEach(() => {
|
|
14
|
-
clock.reset();
|
|
15
|
-
});
|
|
16
|
-
after(() => {
|
|
17
|
-
clock.restore();
|
|
18
|
-
});
|
|
19
|
-
describe("UnreferencedStateTracker", () => {
|
|
20
|
-
let tracker;
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
tracker.stopTracking();
|
|
23
|
-
});
|
|
24
|
-
/**
|
|
25
|
-
* During the lifetime of an unreferenced object, its state is tracked and updated in two ways.
|
|
26
|
-
* Timers are set to trigger transitioning to the next state, and updateTracking is also called
|
|
27
|
-
* whenever GC runs.
|
|
28
|
-
* These tests specify how to advance the clock (to hit the timers) and also when to call updateTracking,
|
|
29
|
-
* checking that the expected state transitions occur as specified
|
|
30
|
-
*/
|
|
31
|
-
function runTestCase(allSteps) {
|
|
32
|
-
const [start, ...steps] = allSteps;
|
|
33
|
-
clock.tick(start.time);
|
|
34
|
-
tracker = new UnreferencedStateTracker(0 /* unreferencedTimestampMs */, 10 /* inactiveTimeoutMs */, start.time /* currentReferenceTimestampMs */, 20 /* tombstoneTimeoutMs */, start.sweepGracePeriodMs ?? 10 /* sweepGracePeriodMs */);
|
|
35
|
-
assert.equal(tracker.state, start.state, `Wrong starting state`);
|
|
36
|
-
steps.forEach(({ time: advanceClockTo, updateWith, state: expectedState }, index) => {
|
|
37
|
-
assert(advanceClockTo > clock.now, "INVALID TEST CASE: steps must move forward in time, following start");
|
|
38
|
-
clock.tick(advanceClockTo - clock.now);
|
|
39
|
-
if (updateWith !== undefined) {
|
|
40
|
-
tracker.updateTracking(updateWith);
|
|
41
|
-
}
|
|
42
|
-
assert.equal(tracker.state, expectedState, `Wrong state at step ${index + 1}`); // 0-indexed including start
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Test cases to run through above function runTestCase
|
|
47
|
-
*
|
|
48
|
-
* In all cases:
|
|
49
|
-
* - unreferencedTimestampMs = 0
|
|
50
|
-
* - inactiveTimeoutMs = 10
|
|
51
|
-
* - tombstoneTimeoutMs = 20
|
|
52
|
-
* - sweepGracePeriodMs defaults to 10 (so sweep at 30)
|
|
53
|
-
*/
|
|
54
|
-
const testCases = [
|
|
55
|
-
{
|
|
56
|
-
name: "No calls to updateTracking",
|
|
57
|
-
steps: [
|
|
58
|
-
{ time: 0, state: "Active" },
|
|
59
|
-
{ time: 3, state: "Active" },
|
|
60
|
-
{ time: 5, state: "Active" },
|
|
61
|
-
{ time: 12, state: "Inactive" },
|
|
62
|
-
{ time: 15, state: "Inactive" },
|
|
63
|
-
{ time: 25, state: "TombstoneReady" },
|
|
64
|
-
{ time: 35, state: "SweepReady" },
|
|
65
|
-
],
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
name: "No calls to updateTracking - sweepGracePeriodMs 0 (no Tombstone phase)",
|
|
69
|
-
steps: [
|
|
70
|
-
{ time: 0, state: "Active", sweepGracePeriodMs: 0 },
|
|
71
|
-
{ time: 3, state: "Active" },
|
|
72
|
-
{ time: 5, state: "Active" },
|
|
73
|
-
{ time: 12, state: "Inactive" },
|
|
74
|
-
{ time: 19, state: "Inactive" },
|
|
75
|
-
{ time: 20, state: "SweepReady" },
|
|
76
|
-
{ time: 21, state: "SweepReady" },
|
|
77
|
-
],
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
name: "Skip to SweepReady",
|
|
81
|
-
steps: [
|
|
82
|
-
{ time: 0, state: "Active" },
|
|
83
|
-
{ time: 5, state: "Active" },
|
|
84
|
-
{ time: 35, state: "SweepReady" },
|
|
85
|
-
],
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
name: "Skip to SweepReady - sweepGracePeriodMs 0 (no Tombstone phase)",
|
|
89
|
-
steps: [
|
|
90
|
-
{ time: 0, state: "Active", sweepGracePeriodMs: 0 },
|
|
91
|
-
{ time: 5, state: "Active" },
|
|
92
|
-
{ time: 20, state: "SweepReady" },
|
|
93
|
-
],
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
name: "Skip to SweepReady (via updateTracking) - sweepGracePeriodMs 0 (no Tombstone phase)",
|
|
97
|
-
steps: [
|
|
98
|
-
{ time: 0, state: "Active", sweepGracePeriodMs: 0 },
|
|
99
|
-
{ time: 5, state: "Active" },
|
|
100
|
-
{ time: 20, updateWith: 20, state: "SweepReady" },
|
|
101
|
-
],
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
name: "Call update, but triggered via timers",
|
|
105
|
-
steps: [
|
|
106
|
-
{ time: 0, state: "Active" },
|
|
107
|
-
{ time: 3, updateWith: 2, state: "Active" },
|
|
108
|
-
{ time: 5, updateWith: 5, state: "Active" },
|
|
109
|
-
{ time: 12, updateWith: 9, state: "Inactive" },
|
|
110
|
-
{ time: 17, updateWith: 15, state: "Inactive" }, // No-op, timer already fired
|
|
111
|
-
],
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
name: "currentReferenceTimestampMs jumps ahead",
|
|
115
|
-
steps: [
|
|
116
|
-
{ time: 0, state: "Active" },
|
|
117
|
-
{ time: 5, state: "Active" },
|
|
118
|
-
{ time: 10, state: "Inactive" },
|
|
119
|
-
{ time: 11, updateWith: 20, state: "TombstoneReady" }, // Shouldn't be physically possible, but supported in API
|
|
120
|
-
],
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
name: "Start Inactive",
|
|
124
|
-
steps: [
|
|
125
|
-
{ time: 12, state: "Inactive" },
|
|
126
|
-
{ time: 15, state: "Inactive" },
|
|
127
|
-
{ time: 20, state: "TombstoneReady" },
|
|
128
|
-
{ time: 35, state: "SweepReady" },
|
|
129
|
-
],
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
name: "Start TombstoneReady",
|
|
133
|
-
steps: [
|
|
134
|
-
{ time: 22, state: "TombstoneReady" },
|
|
135
|
-
{ time: 25, state: "TombstoneReady" },
|
|
136
|
-
{ time: 35, state: "SweepReady" },
|
|
137
|
-
],
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
name: "Start SweepReady",
|
|
141
|
-
steps: [{ time: 32, state: "SweepReady" }],
|
|
142
|
-
},
|
|
143
|
-
];
|
|
144
|
-
testCases.forEach((testCase) => {
|
|
145
|
-
it(testCase.name, () => {
|
|
146
|
-
runTestCase(testCase.steps);
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
it("Non-zero unreferencedTimestampMs properly offsets", () => {
|
|
150
|
-
tracker = new UnreferencedStateTracker(10 /* unreferencedTimestampMs */, 3 /* inactiveTimeoutMs */, 11 /* currentReferenceTimestampMs */, 7 /* tombstoneTimeoutMs */, 15 /* sweepGracePeriodMs */);
|
|
151
|
-
assert.equal(tracker.state, UnreferencedState.Active, "Should start as Active");
|
|
152
|
-
clock.tick(2);
|
|
153
|
-
assert.equal(tracker.state, UnreferencedState.Inactive, "Should be Inactive 2ms later (at 13)");
|
|
154
|
-
tracker.updateTracking(17);
|
|
155
|
-
assert.equal(tracker.state, UnreferencedState.TombstoneReady, "Should be TombstoneReady after currentReferenceTimestampMs=17");
|
|
156
|
-
clock.tick(15);
|
|
157
|
-
assert.equal(tracker.state, UnreferencedState.SweepReady, "Should be SweepReady 15ms later");
|
|
158
|
-
});
|
|
159
|
-
it("Timers can't be crossed", () => {
|
|
160
|
-
tracker = new UnreferencedStateTracker(0 /* unreferencedTimestampMs */, 10 /* inactiveTimeoutMs */, 0 /* currentReferenceTimestampMs */, 12 /* tombstoneTimeoutMs */, 0 /* sweepGracePeriodMs */);
|
|
161
|
-
assert.equal(tracker.state, UnreferencedState.Active, "Should start as Active");
|
|
162
|
-
tracker.updateTracking(10);
|
|
163
|
-
// Would be 10ms left on Inactive timer, but it was just cleared. 2ms left on Sweep timer
|
|
164
|
-
assert.equal(tracker.state, UnreferencedState.Inactive, "Should be Inactive after currentReferenceTimestampMs=10");
|
|
165
|
-
clock.tick(2);
|
|
166
|
-
assert.equal(tracker.state, UnreferencedState.SweepReady, "Should be SweepReady 2ms later");
|
|
167
|
-
});
|
|
168
|
-
it("Timers can tighten up over time", () => {
|
|
169
|
-
clock.tick(10);
|
|
170
|
-
tracker = new UnreferencedStateTracker(0 /* unreferencedTimestampMs */, 20 /* inactiveTimeoutMs */, 5 /* currentReferenceTimestampMs */, undefined /* tombstoneTimeoutMs */, 0 /* sweepGracePeriodMs */);
|
|
171
|
-
assert.equal(tracker.state, UnreferencedState.Active, "Should start as Active");
|
|
172
|
-
const timerClearSpy = spy(tracker.inactiveTimer, "clear");
|
|
173
|
-
// At T10 we had 15 to go based on server timestamps, so Timer is set to 25
|
|
174
|
-
clock.tick(6); // at T16 (9 to go)
|
|
175
|
-
tracker.updateTracking(15); // Simulate processing a more-recent Summary (reference time 15 at T16). Pulls in timer to 21 (5 to go)
|
|
176
|
-
assert(timerClearSpy.callCount > 0, "Expected underlying Timer to clear and reset to support shorter timeout");
|
|
177
|
-
clock.tick(5);
|
|
178
|
-
assert.equal(tracker.state, UnreferencedState.Inactive, "Should be Inactive at T21");
|
|
179
|
-
});
|
|
180
|
-
it("Timers can loosen up over time", () => {
|
|
181
|
-
tracker = new UnreferencedStateTracker(0 /* unreferencedTimestampMs */, 10 /* inactiveTimeoutMs */, 0 /* currentReferenceTimestampMs */, undefined /* tombstoneTimeoutMs */, 0 /* sweepGracePeriodMs */);
|
|
182
|
-
assert.equal(tracker.state, UnreferencedState.Active, "Should start as Active");
|
|
183
|
-
clock.tick(5); // at T5, 5 to go
|
|
184
|
-
tracker.updateTracking(1); // Simulate processing an older Summary (reference time 1 at T5). Pushes out timer to 14 (9 to go)
|
|
185
|
-
clock.tick(5);
|
|
186
|
-
assert.equal(tracker.state, UnreferencedState.Active, "Should still be Active since timer was pushed out");
|
|
187
|
-
clock.tick(4);
|
|
188
|
-
assert.equal(tracker.state, UnreferencedState.Inactive, "Should be Inactive finally at T14");
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
//# sourceMappingURL=gcUnreferencedStateTracker.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gcUnreferencedStateTracker.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcUnreferencedStateTracker.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { SinonFakeTimers, SinonSpy, useFakeTimers, spy } from \"sinon\";\nimport { UnreferencedState, UnreferencedStateTracker } from \"../../gc/index.js\";\n\n/** Schema for steps taken to test unreferenced state progression / tracking */\ntype Steps = [\n\t{\n\t\t/** Start time (used as both local time and currentReferenceTimestampMs) */\n\t\ttime: number;\n\t\t/** Expected initial state */\n\t\tstate: UnreferencedState;\n\t\t/** Configured sweepGracePeriodMs - defaults to 10ms for these tests */\n\t\tsweepGracePeriodMs?: number;\n\t},\n\t...{\n\t\t/** Local time of the next step */\n\t\ttime: number;\n\t\t/** If defined, call updateTracking with this as currentReferenceTimestampMs */\n\t\tupdateWith?: number;\n\t\t/** Expected new state (after calling updateTracking if applicable) */\n\t\tstate: UnreferencedState;\n\t}[],\n];\n\ndescribe(\"Garbage Collection Tests\", () => {\n\tlet clock: SinonFakeTimers;\n\n\tbefore(() => {\n\t\tclock = useFakeTimers();\n\t});\n\n\tafterEach(() => {\n\t\tclock.reset();\n\t});\n\n\tafter(() => {\n\t\tclock.restore();\n\t});\n\n\tdescribe(\"UnreferencedStateTracker\", () => {\n\t\tlet tracker: UnreferencedStateTracker;\n\n\t\tafterEach(() => {\n\t\t\ttracker.stopTracking();\n\t\t});\n\n\t\t/**\n\t\t * During the lifetime of an unreferenced object, its state is tracked and updated in two ways.\n\t\t * Timers are set to trigger transitioning to the next state, and updateTracking is also called\n\t\t * whenever GC runs.\n\t\t * These tests specify how to advance the clock (to hit the timers) and also when to call updateTracking,\n\t\t * checking that the expected state transitions occur as specified\n\t\t */\n\t\tfunction runTestCase(allSteps: Steps) {\n\t\t\tconst [start, ...steps] = allSteps;\n\t\t\tclock.tick(start.time);\n\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t0 /* unreferencedTimestampMs */,\n\t\t\t\t10 /* inactiveTimeoutMs */,\n\t\t\t\tstart.time /* currentReferenceTimestampMs */,\n\t\t\t\t20 /* tombstoneTimeoutMs */,\n\t\t\t\tstart.sweepGracePeriodMs ?? 10 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, start.state, `Wrong starting state`);\n\t\t\tsteps.forEach(({ time: advanceClockTo, updateWith, state: expectedState }, index) => {\n\t\t\t\tassert(\n\t\t\t\t\tadvanceClockTo > clock.now,\n\t\t\t\t\t\"INVALID TEST CASE: steps must move forward in time, following start\",\n\t\t\t\t);\n\t\t\t\tclock.tick(advanceClockTo - clock.now);\n\n\t\t\t\tif (updateWith !== undefined) {\n\t\t\t\t\ttracker.updateTracking(updateWith);\n\t\t\t\t}\n\n\t\t\t\tassert.equal(tracker.state, expectedState, `Wrong state at step ${index + 1}`); // 0-indexed including start\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Test cases to run through above function runTestCase\n\t\t *\n\t\t * In all cases:\n\t\t * - unreferencedTimestampMs = 0\n\t\t * - inactiveTimeoutMs = 10\n\t\t * - tombstoneTimeoutMs = 20\n\t\t * - sweepGracePeriodMs defaults to 10 (so sweep at 30)\n\t\t */\n\t\tconst testCases: {\n\t\t\tname: string;\n\t\t\tsteps: Steps;\n\t\t}[] = [\n\t\t\t{\n\t\t\t\tname: \"No calls to updateTracking\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\" },\n\t\t\t\t\t{ time: 3, state: \"Active\" },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 12, state: \"Inactive\" },\n\t\t\t\t\t{ time: 15, state: \"Inactive\" },\n\t\t\t\t\t{ time: 25, state: \"TombstoneReady\" },\n\t\t\t\t\t{ time: 35, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"No calls to updateTracking - sweepGracePeriodMs 0 (no Tombstone phase)\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\", sweepGracePeriodMs: 0 },\n\t\t\t\t\t{ time: 3, state: \"Active\" },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 12, state: \"Inactive\" },\n\t\t\t\t\t{ time: 19, state: \"Inactive\" },\n\t\t\t\t\t{ time: 20, state: \"SweepReady\" },\n\t\t\t\t\t{ time: 21, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Skip to SweepReady\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\" },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 35, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Skip to SweepReady - sweepGracePeriodMs 0 (no Tombstone phase)\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\", sweepGracePeriodMs: 0 },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 20, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Skip to SweepReady (via updateTracking) - sweepGracePeriodMs 0 (no Tombstone phase)\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\", sweepGracePeriodMs: 0 },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 20, updateWith: 20, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Call update, but triggered via timers\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\" },\n\t\t\t\t\t{ time: 3, updateWith: 2, state: \"Active\" },\n\t\t\t\t\t{ time: 5, updateWith: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 12, updateWith: 9, state: \"Inactive\" }, // Timer will have fired even though server time hasn't passed threshold\n\t\t\t\t\t{ time: 17, updateWith: 15, state: \"Inactive\" }, // No-op, timer already fired\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"currentReferenceTimestampMs jumps ahead\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 0, state: \"Active\" },\n\t\t\t\t\t{ time: 5, state: \"Active\" },\n\t\t\t\t\t{ time: 10, state: \"Inactive\" },\n\t\t\t\t\t{ time: 11, updateWith: 20, state: \"TombstoneReady\" }, // Shouldn't be physically possible, but supported in API\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Start Inactive\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 12, state: \"Inactive\" },\n\t\t\t\t\t{ time: 15, state: \"Inactive\" },\n\t\t\t\t\t{ time: 20, state: \"TombstoneReady\" },\n\t\t\t\t\t{ time: 35, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Start TombstoneReady\",\n\t\t\t\tsteps: [\n\t\t\t\t\t{ time: 22, state: \"TombstoneReady\" },\n\t\t\t\t\t{ time: 25, state: \"TombstoneReady\" },\n\t\t\t\t\t{ time: 35, state: \"SweepReady\" },\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Start SweepReady\",\n\t\t\t\tsteps: [{ time: 32, state: \"SweepReady\" }],\n\t\t\t},\n\t\t];\n\n\t\ttestCases.forEach((testCase) => {\n\t\t\tit(testCase.name, () => {\n\t\t\t\trunTestCase(testCase.steps);\n\t\t\t});\n\t\t});\n\n\t\tit(\"Non-zero unreferencedTimestampMs properly offsets\", () => {\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t10 /* unreferencedTimestampMs */,\n\t\t\t\t3 /* inactiveTimeoutMs */,\n\t\t\t\t11 /* currentReferenceTimestampMs */,\n\t\t\t\t7 /* tombstoneTimeoutMs */,\n\t\t\t\t15 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Active, \"Should start as Active\");\n\t\t\tclock.tick(2);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.Inactive,\n\t\t\t\t\"Should be Inactive 2ms later (at 13)\",\n\t\t\t);\n\t\t\ttracker.updateTracking(17);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.TombstoneReady,\n\t\t\t\t\"Should be TombstoneReady after currentReferenceTimestampMs=17\",\n\t\t\t);\n\t\t\tclock.tick(15);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.SweepReady,\n\t\t\t\t\"Should be SweepReady 15ms later\",\n\t\t\t);\n\t\t});\n\t\tit(\"Timers can't be crossed\", () => {\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t0 /* unreferencedTimestampMs */,\n\t\t\t\t10 /* inactiveTimeoutMs */,\n\t\t\t\t0 /* currentReferenceTimestampMs */,\n\t\t\t\t12 /* tombstoneTimeoutMs */,\n\t\t\t\t0 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Active, \"Should start as Active\");\n\t\t\ttracker.updateTracking(10);\n\t\t\t// Would be 10ms left on Inactive timer, but it was just cleared. 2ms left on Sweep timer\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.Inactive,\n\t\t\t\t\"Should be Inactive after currentReferenceTimestampMs=10\",\n\t\t\t);\n\t\t\tclock.tick(2);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.SweepReady,\n\t\t\t\t\"Should be SweepReady 2ms later\",\n\t\t\t);\n\t\t});\n\t\tit(\"Timers can tighten up over time\", () => {\n\t\t\tclock.tick(10);\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t0 /* unreferencedTimestampMs */,\n\t\t\t\t20 /* inactiveTimeoutMs */,\n\t\t\t\t5 /* currentReferenceTimestampMs */,\n\t\t\t\tundefined /* tombstoneTimeoutMs */,\n\t\t\t\t0 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Active, \"Should start as Active\");\n\t\t\tconst timerClearSpy: SinonSpy = spy((tracker as any).inactiveTimer, \"clear\");\n\t\t\t// At T10 we had 15 to go based on server timestamps, so Timer is set to 25\n\t\t\tclock.tick(6); // at T16 (9 to go)\n\t\t\ttracker.updateTracking(15); // Simulate processing a more-recent Summary (reference time 15 at T16). Pulls in timer to 21 (5 to go)\n\t\t\tassert(\n\t\t\t\ttimerClearSpy.callCount > 0,\n\t\t\t\t\"Expected underlying Timer to clear and reset to support shorter timeout\",\n\t\t\t);\n\t\t\tclock.tick(5);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Inactive, \"Should be Inactive at T21\");\n\t\t});\n\t\tit(\"Timers can loosen up over time\", () => {\n\t\t\ttracker = new UnreferencedStateTracker(\n\t\t\t\t0 /* unreferencedTimestampMs */,\n\t\t\t\t10 /* inactiveTimeoutMs */,\n\t\t\t\t0 /* currentReferenceTimestampMs */,\n\t\t\t\tundefined /* tombstoneTimeoutMs */,\n\t\t\t\t0 /* sweepGracePeriodMs */,\n\t\t\t);\n\t\t\tassert.equal(tracker.state, UnreferencedState.Active, \"Should start as Active\");\n\t\t\tclock.tick(5); // at T5, 5 to go\n\t\t\ttracker.updateTracking(1); // Simulate processing an older Summary (reference time 1 at T5). Pushes out timer to 14 (9 to go)\n\t\t\tclock.tick(5);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.Active,\n\t\t\t\t\"Should still be Active since timer was pushed out\",\n\t\t\t);\n\t\t\tclock.tick(4);\n\t\t\tassert.equal(\n\t\t\t\ttracker.state,\n\t\t\t\tUnreferencedState.Inactive,\n\t\t\t\t\"Should be Inactive finally at T14\",\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1,193 +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 { createChildLogger, mixinMonitoringContext, } from "@fluidframework/telemetry-utils";
|
|
7
|
-
import { IsoBuffer } from "@fluid-internal/client-utils";
|
|
8
|
-
import { MockRuntime, validateSummary } from "./blobManager.spec.js";
|
|
9
|
-
describe("getPendingLocalState", () => {
|
|
10
|
-
let runtime;
|
|
11
|
-
let mc;
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
mc = mixinMonitoringContext(createChildLogger(), undefined);
|
|
14
|
-
runtime = new MockRuntime(mc);
|
|
15
|
-
});
|
|
16
|
-
it("get blobs while uploading", async () => {
|
|
17
|
-
await runtime.attach();
|
|
18
|
-
await runtime.connect();
|
|
19
|
-
const blob = IsoBuffer.from("blob", "utf8");
|
|
20
|
-
const handleP = runtime.createBlob(blob);
|
|
21
|
-
const pendingStateP = runtime.getPendingLocalState();
|
|
22
|
-
await runtime.processHandles();
|
|
23
|
-
await assert.doesNotReject(handleP);
|
|
24
|
-
const pendingState = await pendingStateP;
|
|
25
|
-
const pendingBlobs = pendingState[1] ?? {};
|
|
26
|
-
assert.strictEqual(Object.keys(pendingBlobs).length, 1);
|
|
27
|
-
assert.strictEqual(Object.values(pendingBlobs)[0].acked, false);
|
|
28
|
-
assert.strictEqual(Object.values(pendingBlobs)[0].attached, true);
|
|
29
|
-
assert.strictEqual(Object.values(pendingBlobs)[0].uploadTime, undefined);
|
|
30
|
-
const summaryData = validateSummary(runtime);
|
|
31
|
-
assert.strictEqual(summaryData.ids.length, 0);
|
|
32
|
-
assert.strictEqual(summaryData.redirectTable, undefined);
|
|
33
|
-
const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
|
|
34
|
-
await runtime2.attach();
|
|
35
|
-
await runtime2.connect();
|
|
36
|
-
await runtime2.processAll();
|
|
37
|
-
const summaryData2 = validateSummary(runtime2);
|
|
38
|
-
assert.strictEqual(summaryData2.ids.length, 1);
|
|
39
|
-
assert.strictEqual(summaryData2.redirectTable.size, 1);
|
|
40
|
-
});
|
|
41
|
-
it("get blobs and wait for blob attach while waiting for op", async () => {
|
|
42
|
-
await runtime.attach();
|
|
43
|
-
await runtime.connect();
|
|
44
|
-
const blob = IsoBuffer.from("blob", "utf8");
|
|
45
|
-
const handleP = runtime.createBlob(blob);
|
|
46
|
-
await runtime.processBlobs(true);
|
|
47
|
-
const pendingStateP = runtime.getPendingLocalState();
|
|
48
|
-
await runtime.processHandles();
|
|
49
|
-
await assert.doesNotReject(handleP);
|
|
50
|
-
const pendingState = await pendingStateP;
|
|
51
|
-
const pendingBlobs = pendingState[1] ?? {};
|
|
52
|
-
assert.strictEqual(Object.keys(pendingBlobs).length, 1);
|
|
53
|
-
assert.strictEqual(Object.values(pendingBlobs)[0].acked, false);
|
|
54
|
-
assert.strictEqual(Object.values(pendingBlobs)[0].attached, true);
|
|
55
|
-
assert.ok(Object.values(pendingBlobs)[0].uploadTime);
|
|
56
|
-
const summaryData = validateSummary(runtime);
|
|
57
|
-
assert.strictEqual(summaryData.ids.length, 0);
|
|
58
|
-
assert.strictEqual(summaryData.redirectTable, undefined);
|
|
59
|
-
const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
|
|
60
|
-
await runtime2.attach();
|
|
61
|
-
await runtime2.connect();
|
|
62
|
-
await runtime2.processAll();
|
|
63
|
-
const summaryData2 = validateSummary(runtime2);
|
|
64
|
-
assert.strictEqual(summaryData2.ids.length, 1);
|
|
65
|
-
assert.strictEqual(summaryData2.redirectTable.size, 1);
|
|
66
|
-
});
|
|
67
|
-
it("shutdown multiple blobs", async () => {
|
|
68
|
-
await runtime.attach();
|
|
69
|
-
await runtime.connect();
|
|
70
|
-
const blob = IsoBuffer.from("blob", "utf8");
|
|
71
|
-
const handleP = runtime.createBlob(blob);
|
|
72
|
-
await runtime.processBlobs(true);
|
|
73
|
-
const blob2 = IsoBuffer.from("blob2", "utf8");
|
|
74
|
-
const handleP2 = runtime.createBlob(blob2);
|
|
75
|
-
const pendingStateP = runtime.getPendingLocalState();
|
|
76
|
-
await runtime.processHandles();
|
|
77
|
-
await assert.doesNotReject(handleP);
|
|
78
|
-
await assert.doesNotReject(handleP2);
|
|
79
|
-
const pendingState = await pendingStateP;
|
|
80
|
-
const pendingBlobs = pendingState[1] ?? {};
|
|
81
|
-
assert.strictEqual(Object.keys(pendingBlobs).length, 2);
|
|
82
|
-
const summaryData = validateSummary(runtime);
|
|
83
|
-
assert.strictEqual(summaryData.ids.length, 0);
|
|
84
|
-
assert.strictEqual(summaryData.redirectTable, undefined);
|
|
85
|
-
const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
|
|
86
|
-
await runtime2.attach();
|
|
87
|
-
await runtime2.connect();
|
|
88
|
-
await runtime2.processAll();
|
|
89
|
-
const summaryData2 = validateSummary(runtime2);
|
|
90
|
-
assert.strictEqual(summaryData2.ids.length, 2);
|
|
91
|
-
assert.strictEqual(summaryData2.redirectTable.size, 2);
|
|
92
|
-
});
|
|
93
|
-
it("upload blob while getting pending state", async () => {
|
|
94
|
-
await runtime.attach();
|
|
95
|
-
await runtime.connect();
|
|
96
|
-
const blob = IsoBuffer.from("blob", "utf8");
|
|
97
|
-
const handleP = runtime.createBlob(blob);
|
|
98
|
-
await runtime.processBlobs(true);
|
|
99
|
-
const blob2 = IsoBuffer.from("blob2", "utf8");
|
|
100
|
-
const handleP2 = runtime.createBlob(blob2);
|
|
101
|
-
const pendingStateP = runtime.getPendingLocalState();
|
|
102
|
-
await runtime.processHandles();
|
|
103
|
-
const handleP3 = runtime.createBlob(IsoBuffer.from("blob3", "utf8"));
|
|
104
|
-
await runtime.processBlobs(true);
|
|
105
|
-
await runtime.processHandles();
|
|
106
|
-
await assert.doesNotReject(handleP);
|
|
107
|
-
await assert.doesNotReject(handleP2);
|
|
108
|
-
await assert.doesNotReject(handleP3);
|
|
109
|
-
const pendingState = await pendingStateP;
|
|
110
|
-
const pendingBlobs = pendingState[1] ?? {};
|
|
111
|
-
assert.strictEqual(Object.keys(pendingBlobs).length, 3);
|
|
112
|
-
const summaryData = validateSummary(runtime);
|
|
113
|
-
assert.strictEqual(summaryData.ids.length, 0);
|
|
114
|
-
assert.strictEqual(summaryData.redirectTable, undefined);
|
|
115
|
-
const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
|
|
116
|
-
await runtime2.attach();
|
|
117
|
-
await runtime2.connect();
|
|
118
|
-
await runtime2.processAll();
|
|
119
|
-
const summaryData2 = validateSummary(runtime2);
|
|
120
|
-
assert.strictEqual(summaryData2.ids.length, 3);
|
|
121
|
-
assert.strictEqual(summaryData2.redirectTable.size, 3);
|
|
122
|
-
});
|
|
123
|
-
it("retries blob after being rejected if it was stashed", async () => {
|
|
124
|
-
await runtime.attach();
|
|
125
|
-
await runtime.connect();
|
|
126
|
-
const blob = IsoBuffer.from("blob", "utf8");
|
|
127
|
-
const handleP = runtime.createBlob(blob);
|
|
128
|
-
const pendingStateP = runtime.getPendingLocalState();
|
|
129
|
-
await runtime.processHandles();
|
|
130
|
-
await assert.doesNotReject(handleP);
|
|
131
|
-
const pendingState = await pendingStateP;
|
|
132
|
-
const pendingBlobs = pendingState[1] ?? {};
|
|
133
|
-
assert.strictEqual(Object.keys(pendingBlobs).length, 1);
|
|
134
|
-
assert.strictEqual(Object.values(pendingBlobs)[0].acked, false);
|
|
135
|
-
assert.strictEqual(Object.values(pendingBlobs)[0].attached, true);
|
|
136
|
-
assert.strictEqual(Object.values(pendingBlobs)[0].uploadTime, undefined);
|
|
137
|
-
const summaryData = validateSummary(runtime);
|
|
138
|
-
assert.strictEqual(summaryData.ids.length, 0);
|
|
139
|
-
assert.strictEqual(summaryData.redirectTable, undefined);
|
|
140
|
-
const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
|
|
141
|
-
await runtime2.attach();
|
|
142
|
-
await runtime2.connect(0, true);
|
|
143
|
-
await runtime2.processAll();
|
|
144
|
-
const summaryData2 = validateSummary(runtime2);
|
|
145
|
-
assert.strictEqual(summaryData2.ids.length, 1);
|
|
146
|
-
assert.strictEqual(summaryData2.redirectTable.size, 1);
|
|
147
|
-
});
|
|
148
|
-
it("does not restart upload after applying stashed ops if not expired", async () => {
|
|
149
|
-
await runtime.attach();
|
|
150
|
-
await runtime.connect();
|
|
151
|
-
const blob = IsoBuffer.from("blob", "utf8");
|
|
152
|
-
const handleP = runtime.createBlob(blob);
|
|
153
|
-
await runtime.processBlobs(true);
|
|
154
|
-
const pendingStateP = runtime.getPendingLocalState();
|
|
155
|
-
await runtime.processHandles();
|
|
156
|
-
await assert.doesNotReject(handleP);
|
|
157
|
-
const pendingState = await pendingStateP;
|
|
158
|
-
const pendingBlobs = pendingState[1] ?? {};
|
|
159
|
-
assert.ok(pendingBlobs[Object.keys(pendingBlobs)[0]].storageId);
|
|
160
|
-
const summaryData = validateSummary(runtime);
|
|
161
|
-
const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
|
|
162
|
-
await runtime2.attach();
|
|
163
|
-
assert.strictEqual(runtime2.unprocessedBlobs.size, 0);
|
|
164
|
-
await runtime2.connect();
|
|
165
|
-
await runtime2.processAll();
|
|
166
|
-
const summaryData2 = validateSummary(runtime2);
|
|
167
|
-
assert.strictEqual(summaryData2.ids.length, 1);
|
|
168
|
-
assert.strictEqual(summaryData2.redirectTable.size, 1);
|
|
169
|
-
});
|
|
170
|
-
it("does restart upload after applying stashed ops if expired", async () => {
|
|
171
|
-
await runtime.attach();
|
|
172
|
-
await runtime.connect();
|
|
173
|
-
runtime.attachedStorage.minTTL = 0.001;
|
|
174
|
-
const blob = IsoBuffer.from("blob", "utf8");
|
|
175
|
-
const handleP = runtime.createBlob(blob);
|
|
176
|
-
await runtime.processBlobs(true);
|
|
177
|
-
const pendingStateP = runtime.getPendingLocalState();
|
|
178
|
-
await runtime.processHandles();
|
|
179
|
-
await assert.doesNotReject(handleP);
|
|
180
|
-
const pendingState = await pendingStateP;
|
|
181
|
-
const pendingBlobs = pendingState[1] ?? {};
|
|
182
|
-
assert.ok(pendingBlobs[Object.keys(pendingBlobs)[0]].storageId);
|
|
183
|
-
const summaryData = validateSummary(runtime);
|
|
184
|
-
const runtime2 = new MockRuntime(mc, summaryData, false, pendingState);
|
|
185
|
-
await runtime2.attach();
|
|
186
|
-
await runtime2.connect();
|
|
187
|
-
await runtime2.processAll();
|
|
188
|
-
const summaryData2 = validateSummary(runtime2);
|
|
189
|
-
assert.strictEqual(summaryData2.ids.length, 1);
|
|
190
|
-
assert.strictEqual(summaryData2.redirectTable.size, 1);
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
//# sourceMappingURL=getPendingBlobs.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getPendingBlobs.spec.js","sourceRoot":"","sources":["../../src/test/getPendingBlobs.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 {\n\tMonitoringContext,\n\tcreateChildLogger,\n\tmixinMonitoringContext,\n} from \"@fluidframework/telemetry-utils\";\nimport { IsoBuffer } from \"@fluid-internal/client-utils\";\nimport { MockRuntime, validateSummary } from \"./blobManager.spec.js\";\n\ndescribe(\"getPendingLocalState\", () => {\n\tlet runtime: MockRuntime;\n\tlet mc: MonitoringContext;\n\n\tbeforeEach(() => {\n\t\tmc = mixinMonitoringContext(createChildLogger(), undefined);\n\t\truntime = new MockRuntime(mc);\n\t});\n\n\tit(\"get blobs while uploading\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 1);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].acked, false);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].attached, true);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].uploadTime, undefined);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n\n\tit(\"get blobs and wait for blob attach while waiting for op\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 1);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].acked, false);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].attached, true);\n\t\tassert.ok(Object.values<any>(pendingBlobs)[0].uploadTime);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n\n\tit(\"shutdown multiple blobs\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst blob2 = IsoBuffer.from(\"blob2\", \"utf8\");\n\t\tconst handleP2 = runtime.createBlob(blob2);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tawait assert.doesNotReject(handleP2);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 2);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 2);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 2);\n\t});\n\n\tit(\"upload blob while getting pending state\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst blob2 = IsoBuffer.from(\"blob2\", \"utf8\");\n\t\tconst handleP2 = runtime.createBlob(blob2);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tconst handleP3 = runtime.createBlob(IsoBuffer.from(\"blob3\", \"utf8\"));\n\t\tawait runtime.processBlobs(true);\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tawait assert.doesNotReject(handleP2);\n\t\tawait assert.doesNotReject(handleP3);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 3);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 3);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 3);\n\t});\n\n\tit(\"retries blob after being rejected if it was stashed\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.strictEqual(Object.keys(pendingBlobs).length, 1);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].acked, false);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].attached, true);\n\t\tassert.strictEqual(Object.values<any>(pendingBlobs)[0].uploadTime, undefined);\n\n\t\tconst summaryData = validateSummary(runtime);\n\t\tassert.strictEqual(summaryData.ids.length, 0);\n\t\tassert.strictEqual(summaryData.redirectTable, undefined);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect(0, true);\n\t\tawait runtime2.processAll();\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n\n\tit(\"does not restart upload after applying stashed ops if not expired\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.ok(pendingBlobs[Object.keys(pendingBlobs)[0]].storageId);\n\t\tconst summaryData = validateSummary(runtime);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tassert.strictEqual(runtime2.unprocessedBlobs.size, 0);\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n\n\tit(\"does restart upload after applying stashed ops if expired\", async () => {\n\t\tawait runtime.attach();\n\t\tawait runtime.connect();\n\t\truntime.attachedStorage.minTTL = 0.001;\n\t\tconst blob = IsoBuffer.from(\"blob\", \"utf8\");\n\t\tconst handleP = runtime.createBlob(blob);\n\t\tawait runtime.processBlobs(true);\n\t\tconst pendingStateP = runtime.getPendingLocalState();\n\t\tawait runtime.processHandles();\n\t\tawait assert.doesNotReject(handleP);\n\t\tconst pendingState = await pendingStateP;\n\t\tconst pendingBlobs = pendingState[1] ?? {};\n\t\tassert.ok(pendingBlobs[Object.keys(pendingBlobs)[0]].storageId);\n\t\tconst summaryData = validateSummary(runtime);\n\n\t\tconst runtime2 = new MockRuntime(mc, summaryData, false, pendingState);\n\t\tawait runtime2.attach();\n\t\tawait runtime2.connect();\n\t\tawait runtime2.processAll();\n\n\t\tconst summaryData2 = validateSummary(runtime2);\n\t\tassert.strictEqual(summaryData2.ids.length, 1);\n\t\tassert.strictEqual(summaryData2.redirectTable.size, 1);\n\t});\n});\n"]}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import assert from "assert";
|
|
6
|
-
import { MockDeltaManager, MockQuorumClients } from "@fluidframework/test-runtime-utils";
|
|
7
|
-
import { MockLogger } from "@fluidframework/telemetry-utils";
|
|
8
|
-
import { ContainerRuntime, getDeviceSpec } from "../containerRuntime.js";
|
|
9
|
-
function setNavigator(navigator) {
|
|
10
|
-
global.navigator = navigator;
|
|
11
|
-
}
|
|
12
|
-
describe("Hardware Stats", () => {
|
|
13
|
-
let mockLogger = new MockLogger();
|
|
14
|
-
let mockContext = {
|
|
15
|
-
deltaManager: new MockDeltaManager(),
|
|
16
|
-
quorum: new MockQuorumClients(),
|
|
17
|
-
taggedLogger: mockLogger,
|
|
18
|
-
clientDetails: { capabilities: { interactive: true } },
|
|
19
|
-
updateDirtyContainerState: (dirty) => { },
|
|
20
|
-
getLoadedFromVersion: () => undefined,
|
|
21
|
-
};
|
|
22
|
-
const getDeviceSpecEvents = () => mockLogger.events.filter((event) => event.eventName === "DeviceSpec");
|
|
23
|
-
const loadContainer = async () => ContainerRuntime.loadRuntime({
|
|
24
|
-
context: mockContext,
|
|
25
|
-
registryEntries: [],
|
|
26
|
-
runtimeOptions: {
|
|
27
|
-
summaryOptions: {
|
|
28
|
-
summaryConfigOverrides: { state: "disabled" },
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
provideEntryPoint: async () => ({
|
|
32
|
-
myProp: "myValue",
|
|
33
|
-
}),
|
|
34
|
-
existing: false,
|
|
35
|
-
});
|
|
36
|
-
beforeEach(async () => {
|
|
37
|
-
mockLogger = new MockLogger();
|
|
38
|
-
mockContext = {
|
|
39
|
-
deltaManager: new MockDeltaManager(),
|
|
40
|
-
quorum: new MockQuorumClients(),
|
|
41
|
-
taggedLogger: mockLogger,
|
|
42
|
-
clientDetails: { capabilities: { interactive: true } },
|
|
43
|
-
updateDirtyContainerState: (dirty) => { },
|
|
44
|
-
getLoadedFromVersion: () => undefined,
|
|
45
|
-
};
|
|
46
|
-
});
|
|
47
|
-
it("should generate correct hardware stats with regular navigator", async () => {
|
|
48
|
-
const navigator = {
|
|
49
|
-
deviceMemory: 10,
|
|
50
|
-
hardwareConcurrency: 8,
|
|
51
|
-
};
|
|
52
|
-
setNavigator(navigator);
|
|
53
|
-
// testing function
|
|
54
|
-
const { deviceMemory, hardwareConcurrency } = getDeviceSpec();
|
|
55
|
-
assert.strictEqual(deviceMemory, 10, "incorrect deviceMemory value");
|
|
56
|
-
assert.strictEqual(hardwareConcurrency, 8, "incorrect hardwareConcurrency value");
|
|
57
|
-
await loadContainer();
|
|
58
|
-
// checking telemetry
|
|
59
|
-
const events = getDeviceSpecEvents();
|
|
60
|
-
assert(events !== undefined, "No deviceSpec event found");
|
|
61
|
-
assert.strictEqual(events[0].deviceMemory, 10, "incorrect deviceMemory logged");
|
|
62
|
-
assert.strictEqual(events[0].hardwareConcurrency, 8, "incorrect hardwareConcurrency logged");
|
|
63
|
-
});
|
|
64
|
-
it("should generate correct hardware stats with null navigator", async () => {
|
|
65
|
-
const navigator = null;
|
|
66
|
-
setNavigator(navigator);
|
|
67
|
-
// testing function
|
|
68
|
-
const { deviceMemory, hardwareConcurrency } = getDeviceSpec();
|
|
69
|
-
assert.strictEqual(deviceMemory, undefined, "incorrect deviceMemory value");
|
|
70
|
-
assert.strictEqual(hardwareConcurrency, undefined, "incorrect hardwareConcurrency value");
|
|
71
|
-
await loadContainer();
|
|
72
|
-
// checking telemetry
|
|
73
|
-
const events = getDeviceSpecEvents();
|
|
74
|
-
assert(events !== undefined, "No deviceSpec event found");
|
|
75
|
-
assert.strictEqual(events[0].deviceMemory, undefined, "incorrect deviceMemory logged");
|
|
76
|
-
assert.strictEqual(events[0].hardwareConcurrency, undefined, "incorrect hardwareConcurrency logged");
|
|
77
|
-
});
|
|
78
|
-
it("should generate correct hardware stats with undefined navigator", async () => {
|
|
79
|
-
const navigator = undefined;
|
|
80
|
-
setNavigator(navigator);
|
|
81
|
-
// testing function
|
|
82
|
-
const { deviceMemory, hardwareConcurrency } = getDeviceSpec();
|
|
83
|
-
assert.strictEqual(deviceMemory, undefined, "incorrect deviceMemory value");
|
|
84
|
-
assert.strictEqual(hardwareConcurrency, undefined, "incorrect hardwareConcurrency value");
|
|
85
|
-
await loadContainer();
|
|
86
|
-
// checking telemetry
|
|
87
|
-
const events = getDeviceSpecEvents();
|
|
88
|
-
assert(events !== undefined, "No deviceSpec event found");
|
|
89
|
-
assert.strictEqual(events[0].deviceMemory, undefined, "incorrect deviceMemory logged");
|
|
90
|
-
assert.strictEqual(events[0].hardwareConcurrency, undefined, "incorrect hardwareConcurrency logged");
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
//# sourceMappingURL=hardwareStats.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hardwareStats.spec.js","sourceRoot":"","sources":["../../src/test/hardwareStats.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 assert from \"assert\";\nimport { ITelemetryBaseEvent } from \"@fluidframework/core-interfaces\";\nimport { IContainerContext } from \"@fluidframework/container-definitions\";\nimport { MockDeltaManager, MockQuorumClients } from \"@fluidframework/test-runtime-utils\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ContainerRuntime, getDeviceSpec } from \"../containerRuntime.js\";\n\nfunction setNavigator(\n\tnavigator: Partial<Navigator & { deviceMemory?: number }> | undefined | null,\n) {\n\tglobal.navigator = navigator as Navigator;\n}\n\ndescribe(\"Hardware Stats\", () => {\n\tlet mockLogger = new MockLogger();\n\tlet mockContext: Partial<IContainerContext> = {\n\t\tdeltaManager: new MockDeltaManager(),\n\t\tquorum: new MockQuorumClients(),\n\t\ttaggedLogger: mockLogger,\n\t\tclientDetails: { capabilities: { interactive: true } },\n\t\tupdateDirtyContainerState: (dirty: boolean) => {},\n\t\tgetLoadedFromVersion: () => undefined,\n\t};\n\n\tconst getDeviceSpecEvents = (): ITelemetryBaseEvent[] =>\n\t\tmockLogger.events.filter((event) => event.eventName === \"DeviceSpec\");\n\n\tconst loadContainer = async () =>\n\t\tContainerRuntime.loadRuntime({\n\t\t\tcontext: mockContext as IContainerContext,\n\t\t\tregistryEntries: [],\n\t\t\truntimeOptions: {\n\t\t\t\tsummaryOptions: {\n\t\t\t\t\tsummaryConfigOverrides: { state: \"disabled\" },\n\t\t\t\t},\n\t\t\t},\n\t\t\tprovideEntryPoint: async () => ({\n\t\t\t\tmyProp: \"myValue\",\n\t\t\t}),\n\t\t\texisting: false,\n\t\t});\n\n\tbeforeEach(async () => {\n\t\tmockLogger = new MockLogger();\n\t\tmockContext = {\n\t\t\tdeltaManager: new MockDeltaManager(),\n\t\t\tquorum: new MockQuorumClients(),\n\t\t\ttaggedLogger: mockLogger,\n\t\t\tclientDetails: { capabilities: { interactive: true } },\n\t\t\tupdateDirtyContainerState: (dirty: boolean) => {},\n\t\t\tgetLoadedFromVersion: () => undefined,\n\t\t};\n\t});\n\n\tit(\"should generate correct hardware stats with regular navigator\", async () => {\n\t\tconst navigator = {\n\t\t\tdeviceMemory: 10,\n\t\t\thardwareConcurrency: 8,\n\t\t};\n\t\tsetNavigator(navigator);\n\t\t// testing function\n\t\tconst { deviceMemory, hardwareConcurrency } = getDeviceSpec();\n\t\tassert.strictEqual(deviceMemory, 10, \"incorrect deviceMemory value\");\n\t\tassert.strictEqual(hardwareConcurrency, 8, \"incorrect hardwareConcurrency value\");\n\n\t\tawait loadContainer();\n\n\t\t// checking telemetry\n\t\tconst events = getDeviceSpecEvents();\n\t\tassert(events !== undefined, \"No deviceSpec event found\");\n\t\tassert.strictEqual(events[0].deviceMemory, 10, \"incorrect deviceMemory logged\");\n\t\tassert.strictEqual(\n\t\t\tevents[0].hardwareConcurrency,\n\t\t\t8,\n\t\t\t\"incorrect hardwareConcurrency logged\",\n\t\t);\n\t});\n\n\tit(\"should generate correct hardware stats with null navigator\", async () => {\n\t\tconst navigator = null;\n\t\tsetNavigator(navigator);\n\t\t// testing function\n\t\tconst { deviceMemory, hardwareConcurrency } = getDeviceSpec();\n\t\tassert.strictEqual(deviceMemory, undefined, \"incorrect deviceMemory value\");\n\t\tassert.strictEqual(hardwareConcurrency, undefined, \"incorrect hardwareConcurrency value\");\n\n\t\tawait loadContainer();\n\n\t\t// checking telemetry\n\t\tconst events = getDeviceSpecEvents();\n\t\tassert(events !== undefined, \"No deviceSpec event found\");\n\t\tassert.strictEqual(events[0].deviceMemory, undefined, \"incorrect deviceMemory logged\");\n\t\tassert.strictEqual(\n\t\t\tevents[0].hardwareConcurrency,\n\t\t\tundefined,\n\t\t\t\"incorrect hardwareConcurrency logged\",\n\t\t);\n\t});\n\n\tit(\"should generate correct hardware stats with undefined navigator\", async () => {\n\t\tconst navigator = undefined;\n\t\tsetNavigator(navigator);\n\t\t// testing function\n\t\tconst { deviceMemory, hardwareConcurrency } = getDeviceSpec();\n\t\tassert.strictEqual(deviceMemory, undefined, \"incorrect deviceMemory value\");\n\t\tassert.strictEqual(hardwareConcurrency, undefined, \"incorrect hardwareConcurrency value\");\n\n\t\tawait loadContainer();\n\n\t\t// checking telemetry\n\t\tconst events = getDeviceSpecEvents();\n\t\tassert(events !== undefined, \"No deviceSpec event found\");\n\t\tassert.strictEqual(events[0].deviceMemory, undefined, \"incorrect deviceMemory logged\");\n\t\tassert.strictEqual(\n\t\t\tevents[0].hardwareConcurrency,\n\t\t\tundefined,\n\t\t\t\"incorrect hardwareConcurrency logged\",\n\t\t);\n\t});\n});\n"]}
|
package/lib/test/index.js
DELETED
package/lib/test/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport { IPendingRuntimeState } from \"../containerRuntime.js\";\nexport { IPendingBlobs } from \"../blobManager.js\";\n"]}
|