@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
package/dist/batchTracker.d.ts
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
6
5
|
import type { EventEmitter } from "@fluid-internal/client-utils";
|
|
7
6
|
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
7
|
+
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
8
8
|
export declare class BatchTracker {
|
|
9
9
|
private readonly batchEventEmitter;
|
|
10
10
|
private readonly logger;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batchTracker.d.ts","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"batchTracker.d.ts","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGtE,qBAAa,YAAY;IAOvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,6BAA6B,CAAqB;gBAGxC,iBAAiB,EAAE,YAAY,EAChD,MAAM,EAAE,oBAAoB,EAC5B,oBAAoB,EAAE,MAAM,EAC5B,sBAAsB,EAAE,MAAM,EAC9B,gBAAgB,GAAE,MAAM,MAAgC;CA8CzD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,sBACT,YAAY,UACvB,mBAAmB,yBACL,MAAM,2BACJ,MAAM,iBAC+D,CAAC"}
|
package/dist/batchTracker.js
CHANGED
|
@@ -5,21 +5,21 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.BindBatchTracker = exports.BatchTracker = void 0;
|
|
8
|
-
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
9
|
-
const core_utils_1 = require("@fluidframework/core-utils");
|
|
10
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
9
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
10
|
+
const internal_2 = require("@fluidframework/telemetry-utils/internal");
|
|
11
11
|
class BatchTracker {
|
|
12
12
|
constructor(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate, dateTimeProvider = () => client_utils_1.performance.now()) {
|
|
13
13
|
this.batchEventEmitter = batchEventEmitter;
|
|
14
14
|
this.trackedBatchCount = 0;
|
|
15
|
-
this.logger = (0,
|
|
15
|
+
this.logger = (0, internal_2.createChildLogger)({ logger, namespace: "Batching" });
|
|
16
16
|
this.batchEventEmitter.on("batchBegin", (message) => {
|
|
17
17
|
this.startBatchSequenceNumber = message.sequenceNumber;
|
|
18
18
|
this.batchProcessingStartTimeStamp = dateTimeProvider();
|
|
19
19
|
this.trackedBatchCount++;
|
|
20
20
|
});
|
|
21
21
|
this.batchEventEmitter.on("batchEnd", (error, message) => {
|
|
22
|
-
(0,
|
|
22
|
+
(0, internal_1.assert)(this.startBatchSequenceNumber !== undefined &&
|
|
23
23
|
this.batchProcessingStartTimeStamp !== undefined, 0x2ba /* "batchBegin must fire before batchEnd" */);
|
|
24
24
|
const length = message.sequenceNumber - this.startBatchSequenceNumber + 1;
|
|
25
25
|
if (length >= batchLengthThreshold) {
|
package/dist/batchTracker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batchTracker.js","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;
|
|
1
|
+
{"version":3,"file":"batchTracker.js","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAA2D;AAE3D,kEAA6D;AAG7D,uEAA6E;AAE7E,MAAa,YAAY;IAMxB,YACkB,iBAA+B,EAChD,MAA4B,EAC5B,oBAA4B,EAC5B,sBAA8B,EAC9B,mBAAiC,GAAG,EAAE,CAAC,0BAAW,CAAC,GAAG,EAAE;QAJvC,sBAAiB,GAAjB,iBAAiB,CAAc;QAJzC,sBAAiB,GAAW,CAAC,CAAC;QAUrC,IAAI,CAAC,MAAM,GAAG,IAAA,4BAAiB,EAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAkC,EAAE,EAAE;YAC9E,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;YACvD,IAAI,CAAC,6BAA6B,GAAG,gBAAgB,EAAE,CAAC;YACxD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CACxB,UAAU,EACV,CAAC,KAAsB,EAAE,OAAkC,EAAE,EAAE;YAC9D,IAAA,iBAAM,EACL,IAAI,CAAC,wBAAwB,KAAK,SAAS;gBAC1C,IAAI,CAAC,6BAA6B,KAAK,SAAS,EACjD,KAAK,CAAC,4CAA4C,CAClD,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;YAC1E,IAAI,MAAM,IAAI,oBAAoB,EAAE;gBACnC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAChC,SAAS,EAAE,cAAc;oBACzB,MAAM;oBACN,SAAS,EAAE,oBAAoB;oBAC/B,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;oBACjE,UAAU,EAAE,KAAK,KAAK,SAAS;iBAC/B,CAAC,CAAC;aACH;YAED,IAAI,IAAI,CAAC,iBAAiB,GAAG,sBAAsB,KAAK,CAAC,EAAE;gBAC1D,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAChC,SAAS,EAAE,QAAQ;oBACnB,MAAM;oBACN,YAAY,EAAE,sBAAsB;oBACpC,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;iBACjE,CAAC,CAAC;aACH;YAED,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,6BAA6B,GAAG,SAAS,CAAC;QAChD,CAAC,CACD,CAAC;IACH,CAAC;CACD;AAzDD,oCAyDC;AAED;;;;;;;GAOG;AACI,MAAM,gBAAgB,GAAG,CAC/B,iBAA+B,EAC/B,MAA2B,EAC3B,uBAA+B,IAAI,EACnC,yBAAiC,IAAI,EACpC,EAAE,CAAC,IAAI,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;AALlF,QAAA,gBAAgB,oBAKkE","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { EventEmitter } from \"@fluid-internal/client-utils\";\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\n\nexport class BatchTracker {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate startBatchSequenceNumber: number | undefined;\n\tprivate trackedBatchCount: number = 0;\n\tprivate batchProcessingStartTimeStamp: number | undefined;\n\n\tconstructor(\n\t\tprivate readonly batchEventEmitter: EventEmitter,\n\t\tlogger: ITelemetryBaseLogger,\n\t\tbatchLengthThreshold: number,\n\t\tbatchCountSamplingRate: number,\n\t\tdateTimeProvider: () => number = () => performance.now(),\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Batching\" });\n\n\t\tthis.batchEventEmitter.on(\"batchBegin\", (message: ISequencedDocumentMessage) => {\n\t\t\tthis.startBatchSequenceNumber = message.sequenceNumber;\n\t\t\tthis.batchProcessingStartTimeStamp = dateTimeProvider();\n\t\t\tthis.trackedBatchCount++;\n\t\t});\n\n\t\tthis.batchEventEmitter.on(\n\t\t\t\"batchEnd\",\n\t\t\t(error: any | undefined, message: ISequencedDocumentMessage) => {\n\t\t\t\tassert(\n\t\t\t\t\tthis.startBatchSequenceNumber !== undefined &&\n\t\t\t\t\t\tthis.batchProcessingStartTimeStamp !== undefined,\n\t\t\t\t\t0x2ba /* \"batchBegin must fire before batchEnd\" */,\n\t\t\t\t);\n\n\t\t\t\tconst length = message.sequenceNumber - this.startBatchSequenceNumber + 1;\n\t\t\t\tif (length >= batchLengthThreshold) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"LengthTooBig\",\n\t\t\t\t\t\tlength,\n\t\t\t\t\t\tthreshold: batchLengthThreshold,\n\t\t\t\t\t\tbatchEndSequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\tduration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n\t\t\t\t\t\tbatchError: error !== undefined,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this.trackedBatchCount % batchCountSamplingRate === 0) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"Length\",\n\t\t\t\t\t\tlength,\n\t\t\t\t\t\tsamplingRate: batchCountSamplingRate,\n\t\t\t\t\t\tbatchEndSequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\tduration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.startBatchSequenceNumber = undefined;\n\t\t\t\tthis.batchProcessingStartTimeStamp = undefined;\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Track batch sizes in terms of op counts and processing times\n *\n * @param batchEventEmitter - event emitter which tracks the lifecycle of batch operations\n * @param logger - See {@link @fluidframework/core-interfaces#ITelemetryLoggerExt}\n * @param batchLengthThreshold - threshold for the length of a batch when to send an error event\n * @param batchCountSamplingRate - rate for batches for which to send an event with its characteristics\n */\nexport const BindBatchTracker = (\n\tbatchEventEmitter: EventEmitter,\n\tlogger: ITelemetryLoggerExt,\n\tbatchLengthThreshold: number = 1000,\n\tbatchCountSamplingRate: number = 1000,\n) => new BatchTracker(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate);\n"]}
|
package/dist/blobManager.d.ts
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { IFluidHandle, IFluidHandleContext } from "@fluidframework/core-interfaces";
|
|
6
|
-
import { IDocumentStorageService } from "@fluidframework/driver-definitions";
|
|
7
|
-
import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
|
|
8
5
|
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
9
|
-
import { IContainerRuntime, IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions";
|
|
10
6
|
import { ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
7
|
+
import { IContainerRuntime, IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions/internal";
|
|
8
|
+
import { IFluidHandle, IFluidHandleContext } from "@fluidframework/core-interfaces";
|
|
9
|
+
import { IDocumentStorageService } from "@fluidframework/driver-definitions/internal";
|
|
10
|
+
import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
|
|
11
11
|
import { IGarbageCollectionData, ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
|
|
12
12
|
/**
|
|
13
13
|
* This class represents blob (long string)
|
|
@@ -44,7 +44,6 @@ export interface IPendingBlobs {
|
|
|
44
44
|
storageId?: string;
|
|
45
45
|
uploadTime?: number;
|
|
46
46
|
minTTLInSeconds?: number;
|
|
47
|
-
attached?: boolean;
|
|
48
47
|
acked?: boolean;
|
|
49
48
|
};
|
|
50
49
|
}
|
|
@@ -52,12 +51,6 @@ export interface IBlobManagerEvents {
|
|
|
52
51
|
(event: "noPendingBlobs", listener: () => void): any;
|
|
53
52
|
}
|
|
54
53
|
export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
55
|
-
private readonly routeContext;
|
|
56
|
-
private readonly getStorage;
|
|
57
|
-
private readonly blobRequested;
|
|
58
|
-
private readonly isBlobDeleted;
|
|
59
|
-
private readonly runtime;
|
|
60
|
-
private readonly closeContainer;
|
|
61
54
|
static readonly basePath = "_blobs";
|
|
62
55
|
private static readonly redirectTableBlobName;
|
|
63
56
|
private readonly mc;
|
|
@@ -88,26 +81,41 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
88
81
|
private readonly tombstonedBlobs;
|
|
89
82
|
private readonly sendBlobAttachOp;
|
|
90
83
|
private stopAttaching;
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
84
|
+
private readonly routeContext;
|
|
85
|
+
private readonly getStorage;
|
|
86
|
+
private readonly blobRequested;
|
|
87
|
+
private readonly isBlobDeleted;
|
|
88
|
+
private readonly runtime;
|
|
89
|
+
private readonly closeContainer;
|
|
90
|
+
constructor(props: {
|
|
91
|
+
readonly routeContext: IFluidHandleContext;
|
|
92
|
+
snapshot: IBlobManagerLoadInfo;
|
|
93
|
+
readonly getStorage: () => IDocumentStorageService;
|
|
94
|
+
/**
|
|
95
|
+
* Submit a BlobAttach op. When a blob is uploaded, there is a short grace period before which the blob is
|
|
96
|
+
* deleted. The BlobAttach op notifies the server that blob is in use. The server will then not delete the
|
|
97
|
+
* the blob as long as it is listed as referenced in future summaries. The summarizing client will know to
|
|
98
|
+
* include the storage ID in the summary when it sees the op.
|
|
99
|
+
*
|
|
100
|
+
* The op will also include a local ID to inform all clients of the relation to the storage ID, without
|
|
101
|
+
* knowledge of which they cannot request the blob from storage. It's important that this op is sequenced
|
|
102
|
+
* before any ops that reference the local ID, otherwise, an invalid handle could be added to the document.
|
|
103
|
+
*/
|
|
104
|
+
sendBlobAttachOp: (localId: string, storageId?: string) => void;
|
|
105
|
+
readonly blobRequested: (blobPath: string) => void;
|
|
106
|
+
readonly isBlobDeleted: (blobPath: string) => boolean;
|
|
107
|
+
readonly runtime: IBlobManagerRuntime;
|
|
108
|
+
stashedBlobs: IPendingBlobs | undefined;
|
|
109
|
+
readonly closeContainer: (error?: ICriticalContainerError) => void;
|
|
110
|
+
});
|
|
103
111
|
get allBlobsAttached(): boolean;
|
|
104
112
|
get hasPendingBlobs(): boolean;
|
|
105
113
|
private createAbortError;
|
|
106
|
-
|
|
114
|
+
hasPendingStashedUploads(): boolean;
|
|
107
115
|
/**
|
|
108
116
|
* Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
|
|
109
117
|
*/
|
|
110
|
-
|
|
118
|
+
trackPendingStashedUploads(): Promise<void>;
|
|
111
119
|
/**
|
|
112
120
|
* Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
|
|
113
121
|
* detached or there are no (non-pending) attachment blobs in the document
|
|
@@ -152,11 +160,6 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
152
160
|
* about this for now because the data is a simple list of blob ids.
|
|
153
161
|
*/
|
|
154
162
|
getGCData(fullGC?: boolean): IGarbageCollectionData;
|
|
155
|
-
/**
|
|
156
|
-
* This is called to update blobs whose routes are unused. The unused blobs are deleted.
|
|
157
|
-
* @param unusedRoutes - The routes of the blob nodes that are unused. These routes will be based off of local ids.
|
|
158
|
-
*/
|
|
159
|
-
updateUnusedRoutes(unusedRoutes: readonly string[]): void;
|
|
160
163
|
/**
|
|
161
164
|
* Delete attachment blobs that are sweep ready.
|
|
162
165
|
* @param sweepReadyBlobRoutes - The routes of blobs that are sweep ready and should be deleted. These routes will
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobManager.d.ts","sourceRoot":"","sources":["../src/blobManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"blobManager.d.ts","sourceRoot":"","sources":["../src/blobManager.ts"],"names":[],"mappings":"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"}
|
package/dist/blobManager.js
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.BlobManager = exports.BlobHandle = void 0;
|
|
8
|
-
const uuid_1 = require("uuid");
|
|
9
|
-
const runtime_utils_1 = require("@fluidframework/runtime-utils");
|
|
10
|
-
const core_utils_1 = require("@fluidframework/core-utils");
|
|
11
8
|
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
12
9
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
13
|
-
const
|
|
14
|
-
const
|
|
10
|
+
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
11
|
+
const internal_2 = require("@fluidframework/driver-utils/internal");
|
|
12
|
+
const internal_3 = require("@fluidframework/runtime-utils/internal");
|
|
13
|
+
const internal_4 = require("@fluidframework/telemetry-utils/internal");
|
|
14
|
+
const uuid_1 = require("uuid");
|
|
15
15
|
/**
|
|
16
16
|
* This class represents blob (long string)
|
|
17
17
|
* This object is used only when creating (writing) new blob and serialization purposes.
|
|
@@ -32,7 +32,7 @@ class BlobHandle {
|
|
|
32
32
|
this.get = get;
|
|
33
33
|
this.onAttachGraph = onAttachGraph;
|
|
34
34
|
this.attached = false;
|
|
35
|
-
this.absolutePath = (0,
|
|
35
|
+
this.absolutePath = (0, internal_3.generateHandleContextPath)(path, this.routeContext);
|
|
36
36
|
}
|
|
37
37
|
attachGraph() {
|
|
38
38
|
if (!this.attached) {
|
|
@@ -45,32 +45,15 @@ class BlobHandle {
|
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
exports.BlobHandle = BlobHandle;
|
|
48
|
+
const stashedPendingBlobOverrides = {
|
|
49
|
+
stashedUpload: true,
|
|
50
|
+
storageId: undefined,
|
|
51
|
+
minTTLInSeconds: undefined,
|
|
52
|
+
uploadTime: undefined,
|
|
53
|
+
};
|
|
48
54
|
class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
49
|
-
constructor(
|
|
50
|
-
/**
|
|
51
|
-
* Submit a BlobAttach op. When a blob is uploaded, there is a short grace period before which the blob is
|
|
52
|
-
* deleted. The BlobAttach op notifies the server that blob is in use. The server will then not delete the
|
|
53
|
-
* the blob as long as it is listed as referenced in future summaries. The summarizing client will know to
|
|
54
|
-
* include the storage ID in the summary when it sees the op.
|
|
55
|
-
*
|
|
56
|
-
* The op will also include a local ID to inform all clients of the relation to the storage ID, without
|
|
57
|
-
* knowledge of which they cannot request the blob from storage. It's important that this op is sequenced
|
|
58
|
-
* before any ops that reference the local ID, otherwise, an invalid handle could be added to the document.
|
|
59
|
-
*/
|
|
60
|
-
sendBlobAttachOp,
|
|
61
|
-
// Called when a blob node is requested. blobPath is the path of the blob's node in GC's graph.
|
|
62
|
-
// blobPath's format - `/<BlobManager.basePath>/<blobId>`.
|
|
63
|
-
blobRequested,
|
|
64
|
-
// Called to check if a blob has been deleted by GC.
|
|
65
|
-
// blobPath's format - `/<BlobManager.basePath>/<blobId>`.
|
|
66
|
-
isBlobDeleted, runtime, stashedBlobs = {}, closeContainer) {
|
|
55
|
+
constructor(props) {
|
|
67
56
|
super();
|
|
68
|
-
this.routeContext = routeContext;
|
|
69
|
-
this.getStorage = getStorage;
|
|
70
|
-
this.blobRequested = blobRequested;
|
|
71
|
-
this.isBlobDeleted = isBlobDeleted;
|
|
72
|
-
this.runtime = runtime;
|
|
73
|
-
this.closeContainer = closeContainer;
|
|
74
57
|
/**
|
|
75
58
|
* Blobs which we have not yet seen a BlobAttach op round-trip and not yet attached to a DDS.
|
|
76
59
|
*/
|
|
@@ -89,50 +72,50 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
89
72
|
*/
|
|
90
73
|
this.tombstonedBlobs = new Set();
|
|
91
74
|
this.stopAttaching = false;
|
|
92
|
-
|
|
75
|
+
const { routeContext, snapshot, getStorage, sendBlobAttachOp, blobRequested, isBlobDeleted, runtime, stashedBlobs, closeContainer, } = props;
|
|
76
|
+
this.routeContext = routeContext;
|
|
77
|
+
this.getStorage = getStorage;
|
|
78
|
+
this.blobRequested = blobRequested;
|
|
79
|
+
this.isBlobDeleted = isBlobDeleted;
|
|
80
|
+
this.runtime = runtime;
|
|
81
|
+
this.closeContainer = closeContainer;
|
|
82
|
+
this.mc = (0, internal_4.createChildMonitoringContext)({
|
|
93
83
|
logger: this.runtime.logger,
|
|
94
84
|
namespace: "BlobManager",
|
|
95
85
|
});
|
|
96
86
|
this.redirectTable = this.load(snapshot);
|
|
97
87
|
// Begin uploading stashed blobs from previous container instance
|
|
98
|
-
Object.entries(stashedBlobs).forEach(([localId, entry]) => {
|
|
88
|
+
Object.entries(stashedBlobs ?? {}).forEach(([localId, entry]) => {
|
|
89
|
+
const { acked, storageId, minTTLInSeconds, uploadTime } = entry;
|
|
99
90
|
const blob = (0, client_utils_1.stringToBuffer)(entry.blob, "base64");
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
91
|
+
const pendingEntry = {
|
|
92
|
+
blob,
|
|
93
|
+
opsent: true,
|
|
94
|
+
handleP: new internal_1.Deferred(),
|
|
95
|
+
storageId,
|
|
96
|
+
uploadP: undefined,
|
|
97
|
+
uploadTime,
|
|
98
|
+
minTTLInSeconds,
|
|
99
|
+
attached: true,
|
|
100
|
+
acked,
|
|
101
|
+
};
|
|
102
|
+
this.pendingBlobs.set(localId, pendingEntry);
|
|
103
|
+
if (storageId !== undefined && minTTLInSeconds && uploadTime) {
|
|
104
|
+
const timeLapseSinceLocalUpload = (Date.now() - uploadTime) / 1000;
|
|
105
105
|
// stashed entries with more than half-life in storage will not be reuploaded
|
|
106
|
-
if (
|
|
107
|
-
this.pendingBlobs.set(localId, {
|
|
108
|
-
blob,
|
|
109
|
-
uploading: false,
|
|
110
|
-
opsent: true,
|
|
111
|
-
handleP: new core_utils_1.Deferred(),
|
|
112
|
-
storageId,
|
|
113
|
-
uploadP: undefined,
|
|
114
|
-
uploadTime: entry.uploadTime,
|
|
115
|
-
minTTLInSeconds: entry.minTTLInSeconds,
|
|
116
|
-
attached,
|
|
117
|
-
acked,
|
|
118
|
-
});
|
|
106
|
+
if (minTTLInSeconds - timeLapseSinceLocalUpload > minTTLInSeconds / 2) {
|
|
119
107
|
return;
|
|
120
108
|
}
|
|
121
109
|
}
|
|
122
110
|
this.pendingBlobs.set(localId, {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
handleP: new core_utils_1.Deferred(),
|
|
111
|
+
...pendingEntry,
|
|
112
|
+
...stashedPendingBlobOverrides,
|
|
126
113
|
uploadP: this.uploadBlob(localId, blob),
|
|
127
|
-
attached,
|
|
128
|
-
acked,
|
|
129
|
-
opsent: true,
|
|
130
|
-
pendingStashed: true,
|
|
131
114
|
});
|
|
132
115
|
});
|
|
133
116
|
this.sendBlobAttachOp = (localId, blobId) => {
|
|
134
117
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
135
|
-
(0,
|
|
118
|
+
(0, internal_1.assert)(pendingEntry !== undefined, 0x725 /* Must have pending blob entry for upcoming op */);
|
|
136
119
|
if (pendingEntry?.uploadTime && pendingEntry?.minTTLInSeconds) {
|
|
137
120
|
const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
|
|
138
121
|
const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
|
|
@@ -144,7 +127,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
144
127
|
});
|
|
145
128
|
if (expired) {
|
|
146
129
|
// we want to avoid submitting ops with broken handles
|
|
147
|
-
this.closeContainer(new
|
|
130
|
+
this.closeContainer(new internal_4.GenericError("Trying to submit a BlobAttach for expired blob", undefined, {
|
|
148
131
|
localId,
|
|
149
132
|
blobId,
|
|
150
133
|
secondsSinceUpload,
|
|
@@ -168,22 +151,25 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
168
151
|
this.pendingBlobs.size > 0);
|
|
169
152
|
}
|
|
170
153
|
createAbortError(pending) {
|
|
171
|
-
return new
|
|
154
|
+
return new internal_4.LoggingError("uploadBlob aborted", {
|
|
172
155
|
acked: pending?.acked,
|
|
173
156
|
uploadTime: pending?.uploadTime,
|
|
174
157
|
});
|
|
175
158
|
}
|
|
176
|
-
|
|
177
|
-
return Array.from(this.pendingBlobs.values()).some((e) => e.
|
|
159
|
+
hasPendingStashedUploads() {
|
|
160
|
+
return Array.from(this.pendingBlobs.values()).some((e) => e.stashedUpload === true);
|
|
178
161
|
}
|
|
179
162
|
/**
|
|
180
163
|
* Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
|
|
181
164
|
*/
|
|
182
|
-
async
|
|
165
|
+
async trackPendingStashedUploads() {
|
|
183
166
|
const pendingUploads = Array.from(this.pendingBlobs.values())
|
|
184
|
-
.filter((e) => e.
|
|
167
|
+
.filter((e) => e.stashedUpload === true)
|
|
185
168
|
.map(async (e) => e.uploadP);
|
|
186
|
-
|
|
169
|
+
if (pendingUploads.length === 0) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
await internal_4.PerformanceEvent.timedExecAsync(this.mc.logger, {
|
|
187
173
|
eventName: "BlobUploadProcessStashedChanges",
|
|
188
174
|
count: pendingUploads.length,
|
|
189
175
|
}, async () => Promise.all(pendingUploads), { start: true, end: true });
|
|
@@ -198,7 +184,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
198
184
|
const undefinedValueInTable = ids.delete(undefined);
|
|
199
185
|
// For a detached container, entries are inserted into the redirect table with an undefined storage ID.
|
|
200
186
|
// For an attached container, entries are inserted w/storage ID after the BlobAttach op round-trips.
|
|
201
|
-
(0,
|
|
187
|
+
(0, internal_1.assert)(!undefinedValueInTable ||
|
|
202
188
|
(this.runtime.attachState === container_definitions_1.AttachState.Detached && ids.size === 0), 0x382 /* 'redirectTable' must contain only undefined while detached / defined values while attached */);
|
|
203
189
|
return ids;
|
|
204
190
|
}
|
|
@@ -216,22 +202,22 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
216
202
|
}
|
|
217
203
|
let storageId;
|
|
218
204
|
if (this.runtime.attachState === container_definitions_1.AttachState.Detached) {
|
|
219
|
-
(0,
|
|
205
|
+
(0, internal_1.assert)(this.redirectTable.has(blobId), 0x383 /* requesting unknown blobs */);
|
|
220
206
|
// Blobs created while the container is detached are stored in IDetachedBlobStorage.
|
|
221
207
|
// The 'IDocumentStorageService.readBlob()' call below will retrieve these via localId.
|
|
222
208
|
storageId = blobId;
|
|
223
209
|
}
|
|
224
210
|
else {
|
|
225
211
|
const attachedStorageId = this.redirectTable.get(blobId);
|
|
226
|
-
(0,
|
|
212
|
+
(0, internal_1.assert)(!!attachedStorageId, 0x11f /* "requesting unknown blobs" */);
|
|
227
213
|
storageId = attachedStorageId;
|
|
228
214
|
}
|
|
229
|
-
return
|
|
215
|
+
return internal_4.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "AttachmentReadBlob", id: storageId }, async () => {
|
|
230
216
|
return this.getStorage().readBlob(storageId);
|
|
231
217
|
}, { end: true, cancel: "error" });
|
|
232
218
|
}
|
|
233
219
|
getBlobHandle(id) {
|
|
234
|
-
(0,
|
|
220
|
+
(0, internal_1.assert)(this.redirectTable.has(id) || this.pendingBlobs.has(id), 0x384 /* requesting handle for unknown blob */);
|
|
235
221
|
const pending = this.pendingBlobs.get(id);
|
|
236
222
|
const callback = pending
|
|
237
223
|
? () => {
|
|
@@ -258,7 +244,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
258
244
|
this.mc.logger.sendTelemetryEvent({ eventName: "CreateBlobWhileAttaching" });
|
|
259
245
|
await new Promise((resolve) => this.runtime.once("attached", resolve));
|
|
260
246
|
}
|
|
261
|
-
(0,
|
|
247
|
+
(0, internal_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Attached, 0x385 /* For clarity and paranoid defense against adding future attachment states */);
|
|
262
248
|
if (signal?.aborted) {
|
|
263
249
|
throw this.createAbortError();
|
|
264
250
|
}
|
|
@@ -267,8 +253,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
267
253
|
const localId = (0, uuid_1.v4)();
|
|
268
254
|
const pendingEntry = {
|
|
269
255
|
blob,
|
|
270
|
-
|
|
271
|
-
handleP: new core_utils_1.Deferred(),
|
|
256
|
+
handleP: new internal_1.Deferred(),
|
|
272
257
|
uploadP: this.uploadBlob(localId, blob),
|
|
273
258
|
attached: false,
|
|
274
259
|
acked: false,
|
|
@@ -287,15 +272,15 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
287
272
|
});
|
|
288
273
|
}
|
|
289
274
|
async uploadBlob(localId, blob) {
|
|
290
|
-
return (0,
|
|
275
|
+
return (0, internal_2.runWithRetry)(async () => {
|
|
291
276
|
try {
|
|
292
277
|
return await this.getStorage().createBlob(blob);
|
|
293
278
|
}
|
|
294
279
|
catch (error) {
|
|
295
280
|
const entry = this.pendingBlobs.get(localId);
|
|
296
|
-
(0,
|
|
297
|
-
if (entry.opsent && !(0,
|
|
298
|
-
throw (0,
|
|
281
|
+
(0, internal_1.assert)(!!entry, 0x387 /* Must have pending blob entry for blob which failed to upload */);
|
|
282
|
+
if (entry.opsent && !(0, internal_2.canRetryOnError)(error)) {
|
|
283
|
+
throw (0, internal_4.wrapError)(error, () => new internal_4.LoggingError(`uploadBlob error`, { canRetry: true }));
|
|
299
284
|
}
|
|
300
285
|
throw error;
|
|
301
286
|
}
|
|
@@ -331,12 +316,13 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
331
316
|
}
|
|
332
317
|
onUploadResolve(localId, response) {
|
|
333
318
|
const entry = this.pendingBlobs.get(localId);
|
|
334
|
-
(0,
|
|
319
|
+
(0, internal_1.assert)(entry !== undefined, 0x6c8 /* pending blob entry not found for uploaded blob */);
|
|
335
320
|
if ((entry.abortSignal?.aborted === true && !entry.opsent) || this.stopAttaching) {
|
|
336
321
|
this.deletePendingBlob(localId);
|
|
337
322
|
return;
|
|
338
323
|
}
|
|
339
|
-
(0,
|
|
324
|
+
(0, internal_1.assert)(entry.storageId === undefined, 0x386 /* Must have pending blob entry for uploaded blob */);
|
|
325
|
+
entry.stashedUpload = undefined;
|
|
340
326
|
entry.storageId = response.id;
|
|
341
327
|
entry.uploadTime = Date.now();
|
|
342
328
|
entry.minTTLInSeconds = response.minTTLInSeconds;
|
|
@@ -370,13 +356,13 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
370
356
|
* @param metadata - op metadata containing storage and/or local IDs
|
|
371
357
|
*/
|
|
372
358
|
reSubmit(metadata) {
|
|
373
|
-
(0,
|
|
359
|
+
(0, internal_1.assert)(!!metadata, 0x38b /* Resubmitted ops must have metadata */);
|
|
374
360
|
const { localId, blobId } = metadata;
|
|
375
|
-
(0,
|
|
361
|
+
(0, internal_1.assert)(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
|
|
376
362
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
377
363
|
if (!blobId) {
|
|
378
364
|
// We submitted this op while offline. The blob should have been uploaded by now.
|
|
379
|
-
(0,
|
|
365
|
+
(0, internal_1.assert)(pendingEntry?.opsent === true && !!pendingEntry?.storageId, 0x38d /* blob must be uploaded before resubmitting BlobAttach op */);
|
|
380
366
|
return this.sendBlobAttachOp(localId, pendingEntry?.storageId);
|
|
381
367
|
}
|
|
382
368
|
return this.sendBlobAttachOp(localId, blobId);
|
|
@@ -390,11 +376,8 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
390
376
|
this.deletePendingBlob(localId);
|
|
391
377
|
return;
|
|
392
378
|
}
|
|
393
|
-
if (pendingEntry?.pendingStashed) {
|
|
394
|
-
pendingEntry.pendingStashed = false;
|
|
395
|
-
}
|
|
396
379
|
}
|
|
397
|
-
(0,
|
|
380
|
+
(0, internal_1.assert)(blobId !== undefined, 0x12a /* "Missing blob id on metadata" */);
|
|
398
381
|
// Set up a mapping from local ID to storage ID. This is crucial since without this the blob cannot be
|
|
399
382
|
// requested from the server.
|
|
400
383
|
// Note: The check for undefined is needed for back-compat when localId was not part of the BlobAttach op that
|
|
@@ -405,7 +388,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
405
388
|
// set identity (id -> id) entry
|
|
406
389
|
this.setRedirection(blobId, blobId);
|
|
407
390
|
if (local) {
|
|
408
|
-
(0,
|
|
391
|
+
(0, internal_1.assert)(localId !== undefined, 0x50e /* local ID not present in blob attach message */);
|
|
409
392
|
const waitingBlobs = this.opsInFlight.get(blobId);
|
|
410
393
|
if (waitingBlobs !== undefined) {
|
|
411
394
|
// For each op corresponding to this storage ID that we are waiting for, resolve the pending blob.
|
|
@@ -413,7 +396,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
413
396
|
// storage ID is already in flight and any op containing this local ID will be sequenced after that.
|
|
414
397
|
waitingBlobs.forEach((pendingLocalId) => {
|
|
415
398
|
const entry = this.pendingBlobs.get(pendingLocalId);
|
|
416
|
-
(0,
|
|
399
|
+
(0, internal_1.assert)(entry !== undefined, 0x38f /* local online BlobAttach op with no pending blob entry */);
|
|
417
400
|
this.setRedirection(pendingLocalId, blobId);
|
|
418
401
|
entry.acked = true;
|
|
419
402
|
entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
|
|
@@ -472,7 +455,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
472
455
|
const blobIds = this.storageIds.size > 0
|
|
473
456
|
? Array.from(this.storageIds)
|
|
474
457
|
: Array.from(this.redirectTable.keys());
|
|
475
|
-
const builder = new
|
|
458
|
+
const builder = new internal_3.SummaryTreeBuilder();
|
|
476
459
|
blobIds.forEach((blobId) => {
|
|
477
460
|
builder.addAttachment(blobId);
|
|
478
461
|
});
|
|
@@ -493,7 +476,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
493
476
|
getGCData(fullGC = false) {
|
|
494
477
|
const gcData = { gcNodes: {} };
|
|
495
478
|
for (const [localId, storageId] of this.redirectTable) {
|
|
496
|
-
(0,
|
|
479
|
+
(0, internal_1.assert)(!!storageId, 0x390 /* Must be attached to get GC data */);
|
|
497
480
|
// Only return local ids as GC nodes because a blob can only be referenced via its local id. The storage
|
|
498
481
|
// id entries have the same key and value, ignore them.
|
|
499
482
|
// The outbound routes are empty because a blob node cannot reference other nodes. It can only be referenced
|
|
@@ -504,13 +487,6 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
504
487
|
}
|
|
505
488
|
return gcData;
|
|
506
489
|
}
|
|
507
|
-
/**
|
|
508
|
-
* This is called to update blobs whose routes are unused. The unused blobs are deleted.
|
|
509
|
-
* @param unusedRoutes - The routes of the blob nodes that are unused. These routes will be based off of local ids.
|
|
510
|
-
*/
|
|
511
|
-
updateUnusedRoutes(unusedRoutes) {
|
|
512
|
-
this.deleteBlobsFromRedirectTable(unusedRoutes);
|
|
513
|
-
}
|
|
514
490
|
/**
|
|
515
491
|
* Delete attachment blobs that are sweep ready.
|
|
516
492
|
* @param sweepReadyBlobRoutes - The routes of blobs that are sweep ready and should be deleted. These routes will
|
|
@@ -555,14 +531,14 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
555
531
|
continue;
|
|
556
532
|
}
|
|
557
533
|
const storageId = this.redirectTable.get(blobId);
|
|
558
|
-
(0,
|
|
534
|
+
(0, internal_1.assert)(!!storageId, 0x5bb /* Must be attached to run GC */);
|
|
559
535
|
maybeUnusedStorageIds.add(storageId);
|
|
560
536
|
this.redirectTable.delete(blobId);
|
|
561
537
|
}
|
|
562
538
|
// Find out storage ids that are in-use and remove them from maybeUnusedStorageIds. A storage id is in-use if
|
|
563
539
|
// the redirect table has a local id -> storage id entry for it.
|
|
564
540
|
for (const [localId, storageId] of this.redirectTable.entries()) {
|
|
565
|
-
(0,
|
|
541
|
+
(0, internal_1.assert)(!!storageId, 0x5bc /* Must be attached to run GC */);
|
|
566
542
|
// For every storage id, the redirect table has a id -> id entry. These do not make the storage id in-use.
|
|
567
543
|
if (maybeUnusedStorageIds.has(storageId) && localId !== storageId) {
|
|
568
544
|
maybeUnusedStorageIds.delete(storageId);
|
|
@@ -610,7 +586,7 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
610
586
|
return;
|
|
611
587
|
}
|
|
612
588
|
const request = { url: blobId };
|
|
613
|
-
const error = (0,
|
|
589
|
+
const error = (0, internal_3.responseToException)((0, internal_3.createResponseError)(404, `Blob was deleted`, request), request);
|
|
614
590
|
// Only log deleted events. Tombstone events are logged by garbage collector.
|
|
615
591
|
this.mc.logger.sendErrorEvent({
|
|
616
592
|
eventName: "GC_Deleted_Blob_Requested",
|
|
@@ -619,17 +595,17 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
619
595
|
throw error;
|
|
620
596
|
}
|
|
621
597
|
setRedirectTable(table) {
|
|
622
|
-
(0,
|
|
623
|
-
(0,
|
|
598
|
+
(0, internal_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Detached, 0x252 /* "redirect table can only be set in detached container" */);
|
|
599
|
+
(0, internal_1.assert)(this.redirectTable.size === table.size, 0x391 /* Redirect table size must match BlobManager's local ID count */);
|
|
624
600
|
for (const [localId, storageId] of table) {
|
|
625
|
-
(0,
|
|
601
|
+
(0, internal_1.assert)(this.redirectTable.has(localId), 0x254 /* "unrecognized id in redirect table" */);
|
|
626
602
|
this.setRedirection(localId, storageId);
|
|
627
603
|
// set identity (id -> id) entry
|
|
628
604
|
this.setRedirection(storageId, storageId);
|
|
629
605
|
}
|
|
630
606
|
}
|
|
631
607
|
async attachAndGetPendingBlobs(stopBlobAttachingSignal) {
|
|
632
|
-
return
|
|
608
|
+
return internal_4.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "GetPendingBlobs" }, async () => {
|
|
633
609
|
if (this.pendingBlobs.size === 0) {
|
|
634
610
|
return;
|
|
635
611
|
}
|
|
@@ -671,14 +647,13 @@ class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
|
671
647
|
});
|
|
672
648
|
continue;
|
|
673
649
|
}
|
|
674
|
-
(0,
|
|
650
|
+
(0, internal_1.assert)(entry.attached === true, 0x790 /* stashed blob should be attached */);
|
|
675
651
|
if (!entry.opsent) {
|
|
676
652
|
this.sendBlobAttachOp(id, entry.storageId);
|
|
677
653
|
}
|
|
678
654
|
blobs[id] = {
|
|
679
655
|
blob: (0, client_utils_1.bufferToString)(entry.blob, "base64"),
|
|
680
656
|
storageId: entry.storageId,
|
|
681
|
-
attached: entry.attached,
|
|
682
657
|
acked: entry.acked,
|
|
683
658
|
minTTLInSeconds: entry.minTTLInSeconds,
|
|
684
659
|
uploadTime: entry.uploadTime,
|
|
@@ -704,7 +679,7 @@ function getGCNodePathFromBlobId(blobId) {
|
|
|
704
679
|
*/
|
|
705
680
|
function getBlobIdFromGCNodePath(nodePath) {
|
|
706
681
|
const pathParts = nodePath.split("/");
|
|
707
|
-
(0,
|
|
682
|
+
(0, internal_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x5bd /* Invalid blob node path */);
|
|
708
683
|
return pathParts[2];
|
|
709
684
|
}
|
|
710
685
|
//# sourceMappingURL=blobManager.js.map
|