@fluidframework/container-runtime 2.0.0-dev.5.3.2.178189 → 2.0.0-dev.6.4.0.191457
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 +123 -0
- package/README.md +4 -3
- package/dist/batchTracker.d.ts +3 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +6 -5
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +10 -16
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +184 -172
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +25 -16
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +161 -35
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +697 -449
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +15 -7
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +3 -2
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +83 -87
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -2
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +8 -9
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.js +2 -2
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/dataStores.d.ts +22 -6
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +123 -81
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerProxyBase.d.ts +35 -0
- package/dist/deltaManagerProxyBase.d.ts.map +1 -0
- package/dist/deltaManagerProxyBase.js +77 -0
- package/dist/deltaManagerProxyBase.js.map +1 -0
- package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +4 -2
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +10 -10
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.d.ts +14 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +21 -0
- package/dist/error.js.map +1 -0
- package/dist/gc/garbageCollection.d.ts +10 -9
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +61 -53
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +18 -14
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +17 -4
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +14 -15
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +0 -8
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +11 -24
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +19 -58
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +45 -35
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +4 -4
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +2 -2
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +3 -5
- package/dist/gc/index.js.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.d.ts +8 -30
- package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.js +26 -68
- package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/finalSpace.d.ts +29 -0
- package/dist/id-compressor/finalSpace.d.ts.map +1 -0
- package/dist/id-compressor/finalSpace.js +62 -0
- package/dist/id-compressor/finalSpace.js.map +1 -0
- package/dist/id-compressor/idCompressor.d.ts +25 -250
- package/dist/id-compressor/idCompressor.d.ts.map +1 -1
- package/dist/id-compressor/idCompressor.js +390 -1153
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/identifiers.d.ts +32 -0
- package/dist/id-compressor/identifiers.d.ts.map +1 -0
- package/dist/id-compressor/identifiers.js +15 -0
- package/dist/id-compressor/identifiers.js.map +1 -0
- package/dist/id-compressor/index.d.ts +5 -6
- package/dist/id-compressor/index.d.ts.map +1 -1
- package/dist/id-compressor/index.js +20 -26
- package/dist/id-compressor/index.js.map +1 -1
- package/dist/id-compressor/persistanceUtilities.d.ts +22 -0
- package/dist/id-compressor/persistanceUtilities.d.ts.map +1 -0
- package/dist/id-compressor/persistanceUtilities.js +43 -0
- package/dist/id-compressor/persistanceUtilities.js.map +1 -0
- package/dist/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
- package/dist/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
- package/dist/id-compressor/sessionSpaceNormalizer.js +80 -0
- package/dist/id-compressor/sessionSpaceNormalizer.js.map +1 -0
- package/dist/id-compressor/sessions.d.ts +115 -0
- package/dist/id-compressor/sessions.d.ts.map +1 -0
- package/dist/id-compressor/sessions.js +305 -0
- package/dist/id-compressor/sessions.js.map +1 -0
- package/dist/id-compressor/utilities.d.ts +49 -0
- package/dist/id-compressor/utilities.d.ts.map +1 -0
- package/dist/id-compressor/utilities.js +166 -0
- package/dist/id-compressor/utilities.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.js +10 -6
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +2 -2
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +12 -7
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +2 -2
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +23 -20
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +19 -9
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +2 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +22 -19
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +7 -5
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +22 -31
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +19 -7
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.js +1 -2
- package/dist/opProperties.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 +18 -8
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +73 -51
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +36 -32
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +3 -3
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +2 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +3 -3
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +26 -27
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +31 -10
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +271 -139
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +8 -7
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +79 -78
- 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 +7 -11
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +10 -14
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts +1 -1
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +10 -19
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +57 -130
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -14
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +15 -101
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +38 -25
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -3
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +12 -13
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +3 -0
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +6 -4
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +10 -4
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +106 -57
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +8 -8
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +38 -28
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +3 -2
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +5 -4
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +10 -16
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +159 -147
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +15 -6
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +161 -35
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +651 -402
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +13 -5
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +3 -2
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +47 -51
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -2
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -4
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.js +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/dataStores.d.ts +22 -6
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +107 -65
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerProxyBase.d.ts +35 -0
- package/lib/deltaManagerProxyBase.d.ts.map +1 -0
- package/lib/deltaManagerProxyBase.js +73 -0
- package/lib/deltaManagerProxyBase.js.map +1 -0
- package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js +3 -1
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +7 -7
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.d.ts +14 -0
- package/lib/error.d.ts.map +1 -0
- package/lib/error.js +17 -0
- package/lib/error.js.map +1 -0
- package/lib/gc/garbageCollection.d.ts +10 -9
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +61 -53
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +16 -12
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +17 -4
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +13 -14
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +0 -8
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +5 -17
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +20 -59
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +46 -36
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +2 -2
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +2 -2
- package/lib/gc/index.js.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.d.ts +8 -30
- package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.js +25 -66
- package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/finalSpace.d.ts +29 -0
- package/lib/id-compressor/finalSpace.d.ts.map +1 -0
- package/lib/id-compressor/finalSpace.js +58 -0
- package/lib/id-compressor/finalSpace.js.map +1 -0
- package/lib/id-compressor/idCompressor.d.ts +25 -250
- package/lib/id-compressor/idCompressor.d.ts.map +1 -1
- package/lib/id-compressor/idCompressor.js +385 -1142
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/identifiers.d.ts +32 -0
- package/lib/id-compressor/identifiers.d.ts.map +1 -0
- package/lib/id-compressor/identifiers.js +11 -0
- package/lib/id-compressor/identifiers.js.map +1 -0
- package/lib/id-compressor/index.d.ts +5 -6
- package/lib/id-compressor/index.d.ts.map +1 -1
- package/lib/id-compressor/index.js +5 -6
- package/lib/id-compressor/index.js.map +1 -1
- package/lib/id-compressor/persistanceUtilities.d.ts +22 -0
- package/lib/id-compressor/persistanceUtilities.d.ts.map +1 -0
- package/lib/id-compressor/persistanceUtilities.js +34 -0
- package/lib/id-compressor/persistanceUtilities.js.map +1 -0
- package/lib/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
- package/lib/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
- package/lib/id-compressor/sessionSpaceNormalizer.js +76 -0
- package/lib/id-compressor/sessionSpaceNormalizer.js.map +1 -0
- package/lib/id-compressor/sessions.d.ts +115 -0
- package/lib/id-compressor/sessions.d.ts.map +1 -0
- package/lib/id-compressor/sessions.js +290 -0
- package/lib/id-compressor/sessions.js.map +1 -0
- package/lib/id-compressor/utilities.d.ts +49 -0
- package/lib/id-compressor/utilities.d.ts.map +1 -0
- package/lib/id-compressor/utilities.js +148 -0
- package/lib/id-compressor/utilities.js.map +1 -0
- package/lib/index.d.ts +3 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.js +10 -6
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +10 -5
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +15 -12
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +17 -7
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +13 -10
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +7 -5
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +13 -22
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +20 -8
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.js +1 -2
- package/lib/opProperties.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 +18 -8
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +62 -40
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +18 -14
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/index.d.ts +3 -3
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +3 -3
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +21 -22
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +31 -10
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +265 -133
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +8 -7
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +75 -74
- 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 +6 -10
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +9 -13
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/index.d.ts +1 -1
- package/lib/summary/summarizerNode/index.d.ts.map +1 -1
- package/lib/summary/summarizerNode/index.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +10 -19
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +42 -115
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -14
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +14 -100
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +38 -25
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -3
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +5 -6
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +3 -0
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +5 -3
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +10 -4
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +100 -51
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +8 -8
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +35 -25
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +28 -31
- package/src/batchTracker.ts +7 -5
- package/src/blobManager.ts +188 -166
- package/src/connectionTelemetry.ts +9 -4
- package/src/containerRuntime.ts +806 -441
- package/src/dataStore.ts +12 -4
- package/src/dataStoreContext.ts +39 -43
- package/src/dataStoreContexts.ts +4 -6
- package/src/dataStoreRegistry.ts +1 -1
- package/src/dataStores.ts +114 -80
- package/src/deltaManagerProxyBase.ts +111 -0
- package/src/deltaManagerSummarizerProxy.ts +4 -1
- package/src/deltaScheduler.ts +7 -11
- package/src/error.ts +18 -0
- package/src/gc/garbageCollection.md +53 -5
- package/src/gc/garbageCollection.ts +58 -52
- package/src/gc/gcConfigs.ts +4 -2
- package/src/gc/gcDefinitions.ts +17 -20
- package/src/gc/gcEarlyAdoption.md +145 -0
- package/src/gc/gcHelpers.ts +1 -12
- package/src/gc/gcSummaryStateTracker.ts +19 -65
- package/src/gc/gcTelemetry.ts +14 -12
- package/src/gc/gcUnreferencedStateTracker.ts +1 -1
- package/src/gc/index.ts +2 -4
- package/src/id-compressor/appendOnlySortedMap.ts +26 -87
- package/src/id-compressor/finalSpace.ts +67 -0
- package/src/id-compressor/idCompressor.ts +458 -1682
- package/src/id-compressor/identifiers.ts +42 -0
- package/src/id-compressor/index.ts +11 -20
- package/src/id-compressor/persistanceUtilities.ts +58 -0
- package/src/id-compressor/sessionSpaceNormalizer.ts +83 -0
- package/src/id-compressor/sessions.ts +405 -0
- package/src/id-compressor/utilities.ts +187 -0
- package/src/index.ts +7 -2
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +6 -4
- package/src/opLifecycle/opGroupingManager.ts +9 -6
- package/src/opLifecycle/opSplitter.ts +7 -6
- package/src/opLifecycle/outbox.ts +23 -32
- package/src/opLifecycle/remoteMessageProcessor.ts +27 -8
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +72 -42
- package/src/scheduleManager.ts +7 -5
- package/src/summary/index.ts +4 -3
- package/src/summary/orderedClientElection.ts +10 -6
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +291 -163
- package/src/summary/summarizer.ts +27 -16
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +1 -1
- package/src/summary/summarizerNode/index.ts +1 -2
- package/src/summary/summarizerNode/summarizerNode.ts +36 -160
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +7 -38
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -130
- package/src/summary/summarizerTypes.ts +40 -25
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +4 -1
- package/src/summary/summaryGenerator.ts +52 -52
- package/src/summary/summaryManager.ts +44 -17
- package/dist/id-compressor/idRange.d.ts +0 -11
- package/dist/id-compressor/idRange.d.ts.map +0 -1
- package/dist/id-compressor/idRange.js +0 -29
- package/dist/id-compressor/idRange.js.map +0 -1
- package/dist/id-compressor/numericUuid.d.ts +0 -59
- package/dist/id-compressor/numericUuid.d.ts.map +0 -1
- package/dist/id-compressor/numericUuid.js +0 -325
- package/dist/id-compressor/numericUuid.js.map +0 -1
- package/dist/id-compressor/sessionIdNormalizer.d.ts +0 -138
- package/dist/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
- package/dist/id-compressor/sessionIdNormalizer.js +0 -488
- package/dist/id-compressor/sessionIdNormalizer.js.map +0 -1
- package/dist/id-compressor/utils.d.ts +0 -57
- package/dist/id-compressor/utils.d.ts.map +0 -1
- package/dist/id-compressor/utils.js +0 -90
- package/dist/id-compressor/utils.js.map +0 -1
- package/dist/id-compressor/uuidUtilities.d.ts +0 -28
- package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
- package/dist/id-compressor/uuidUtilities.js +0 -104
- package/dist/id-compressor/uuidUtilities.js.map +0 -1
- package/lib/id-compressor/idRange.d.ts +0 -11
- package/lib/id-compressor/idRange.d.ts.map +0 -1
- package/lib/id-compressor/idRange.js +0 -25
- package/lib/id-compressor/idRange.js.map +0 -1
- package/lib/id-compressor/numericUuid.d.ts +0 -59
- package/lib/id-compressor/numericUuid.d.ts.map +0 -1
- package/lib/id-compressor/numericUuid.js +0 -315
- package/lib/id-compressor/numericUuid.js.map +0 -1
- package/lib/id-compressor/sessionIdNormalizer.d.ts +0 -138
- package/lib/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
- package/lib/id-compressor/sessionIdNormalizer.js +0 -484
- package/lib/id-compressor/sessionIdNormalizer.js.map +0 -1
- package/lib/id-compressor/utils.d.ts +0 -57
- package/lib/id-compressor/utils.d.ts.map +0 -1
- package/lib/id-compressor/utils.js +0 -79
- package/lib/id-compressor/utils.js.map +0 -1
- package/lib/id-compressor/uuidUtilities.d.ts +0 -28
- package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
- package/lib/id-compressor/uuidUtilities.js +0 -96
- package/lib/id-compressor/uuidUtilities.js.map +0 -1
- package/src/id-compressor/idRange.ts +0 -35
- package/src/id-compressor/numericUuid.ts +0 -383
- package/src/id-compressor/sessionIdNormalizer.ts +0 -609
- package/src/id-compressor/utils.ts +0 -114
- package/src/id-compressor/uuidUtilities.ts +0 -120
package/dist/blobManager.js
CHANGED
|
@@ -7,10 +7,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.BlobManager = exports.BlobHandle = void 0;
|
|
8
8
|
const uuid_1 = require("uuid");
|
|
9
9
|
const runtime_utils_1 = require("@fluidframework/runtime-utils");
|
|
10
|
-
const
|
|
10
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
11
|
+
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
11
12
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
12
13
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
13
|
-
const container_utils_1 = require("@fluidframework/container-utils");
|
|
14
14
|
const containerRuntime_1 = require("./containerRuntime");
|
|
15
15
|
const gc_1 = require("./gc");
|
|
16
16
|
const throttler_1 = require("./throttler");
|
|
@@ -38,10 +38,9 @@ class BlobHandle {
|
|
|
38
38
|
return this.routeContext.isAttached && this.attached;
|
|
39
39
|
}
|
|
40
40
|
attachGraph() {
|
|
41
|
-
var _a;
|
|
42
41
|
if (!this.attached) {
|
|
43
42
|
this.attached = true;
|
|
44
|
-
|
|
43
|
+
this.onAttachGraph?.();
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
bind(handle) {
|
|
@@ -52,7 +51,7 @@ exports.BlobHandle = BlobHandle;
|
|
|
52
51
|
class CancellableThrottler {
|
|
53
52
|
constructor(throttler) {
|
|
54
53
|
this.throttler = throttler;
|
|
55
|
-
this.cancelP = new
|
|
54
|
+
this.cancelP = new core_utils_1.Deferred();
|
|
56
55
|
}
|
|
57
56
|
async getDelay() {
|
|
58
57
|
return Promise.race([
|
|
@@ -62,19 +61,10 @@ class CancellableThrottler {
|
|
|
62
61
|
}
|
|
63
62
|
cancel() {
|
|
64
63
|
this.cancelP.resolve();
|
|
65
|
-
this.cancelP = new
|
|
64
|
+
this.cancelP = new core_utils_1.Deferred();
|
|
66
65
|
}
|
|
67
66
|
}
|
|
68
|
-
|
|
69
|
-
// expect blobs to be uploaded before we actually see the op round-trip
|
|
70
|
-
var PendingBlobStatus;
|
|
71
|
-
(function (PendingBlobStatus) {
|
|
72
|
-
PendingBlobStatus[PendingBlobStatus["OnlinePendingUpload"] = 0] = "OnlinePendingUpload";
|
|
73
|
-
PendingBlobStatus[PendingBlobStatus["OnlinePendingOp"] = 1] = "OnlinePendingOp";
|
|
74
|
-
PendingBlobStatus[PendingBlobStatus["OfflinePendingUpload"] = 2] = "OfflinePendingUpload";
|
|
75
|
-
PendingBlobStatus[PendingBlobStatus["OfflinePendingOp"] = 3] = "OfflinePendingOp";
|
|
76
|
-
})(PendingBlobStatus || (PendingBlobStatus = {}));
|
|
77
|
-
class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
67
|
+
class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
78
68
|
constructor(routeContext, snapshot, getStorage,
|
|
79
69
|
/**
|
|
80
70
|
* Submit a BlobAttach op. When a blob is uploaded, there is a short grace period before which the blob is
|
|
@@ -101,9 +91,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
101
91
|
this.runtime = runtime;
|
|
102
92
|
this.closeContainer = closeContainer;
|
|
103
93
|
/**
|
|
104
|
-
* Blobs which
|
|
105
|
-
* Until we see the op round-trip, there is a possibility we may need to re-upload the blob, so
|
|
106
|
-
* we must save it. This is true for both the online and offline flow.
|
|
94
|
+
* Blobs which we have not yet seen a BlobAttach op round-trip and not yet attached to a DDS.
|
|
107
95
|
*/
|
|
108
96
|
this.pendingBlobs = new Map();
|
|
109
97
|
/**
|
|
@@ -121,27 +109,32 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
121
109
|
* Tombstone is a temporary feature that imitates a blob getting swept by garbage collection.
|
|
122
110
|
*/
|
|
123
111
|
this.tombstonedBlobs = new Set();
|
|
124
|
-
this.mc = (0, telemetry_utils_1.
|
|
112
|
+
this.mc = (0, telemetry_utils_1.createChildMonitoringContext)({
|
|
113
|
+
logger: this.runtime.logger,
|
|
114
|
+
namespace: "BlobManager",
|
|
115
|
+
});
|
|
125
116
|
// Read the feature flag that tells whether to throw when a tombstone blob is requested.
|
|
126
117
|
this.throwOnTombstoneLoad =
|
|
127
118
|
this.mc.config.getBoolean(gc_1.throwOnTombstoneLoadKey) === true &&
|
|
128
119
|
this.runtime.gcTombstoneEnforcementAllowed &&
|
|
129
120
|
this.runtime.clientDetails.type !== summary_1.summarizerClientType;
|
|
130
|
-
this.runtime.on("disconnected", () => this.onDisconnected());
|
|
131
121
|
this.redirectTable = this.load(snapshot);
|
|
132
122
|
// Begin uploading stashed blobs from previous container instance
|
|
133
123
|
Object.entries(stashedBlobs).forEach(([localId, entry]) => {
|
|
134
|
-
const blob = (0,
|
|
124
|
+
const blob = (0, client_utils_1.stringToBuffer)(entry.blob, "base64");
|
|
135
125
|
const attached = entry.attached;
|
|
136
126
|
const acked = entry.acked;
|
|
127
|
+
const storageId = entry.storageId; // entry.storageId = response.id
|
|
137
128
|
if (entry.minTTLInSeconds && entry.uploadTime) {
|
|
138
129
|
const timeLapseSinceLocalUpload = (Date.now() - entry.uploadTime) / 1000;
|
|
139
130
|
// stashed entries with more than half-life in storage will not be reuploaded
|
|
140
131
|
if (entry.minTTLInSeconds - timeLapseSinceLocalUpload > entry.minTTLInSeconds / 2) {
|
|
141
132
|
this.pendingBlobs.set(localId, {
|
|
142
133
|
blob,
|
|
143
|
-
|
|
144
|
-
|
|
134
|
+
uploading: false,
|
|
135
|
+
opsent: true,
|
|
136
|
+
handleP: new core_utils_1.Deferred(),
|
|
137
|
+
storageId,
|
|
145
138
|
uploadP: undefined,
|
|
146
139
|
uploadTime: entry.uploadTime,
|
|
147
140
|
minTTLInSeconds: entry.minTTLInSeconds,
|
|
@@ -153,72 +146,70 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
153
146
|
}
|
|
154
147
|
this.pendingBlobs.set(localId, {
|
|
155
148
|
blob,
|
|
156
|
-
|
|
157
|
-
handleP: new
|
|
149
|
+
uploading: true,
|
|
150
|
+
handleP: new core_utils_1.Deferred(),
|
|
158
151
|
uploadP: this.uploadBlob(localId, blob),
|
|
159
152
|
attached,
|
|
160
153
|
acked,
|
|
154
|
+
opsent: true,
|
|
161
155
|
});
|
|
162
156
|
});
|
|
163
157
|
this.sendBlobAttachOp = (localId, blobId) => {
|
|
164
158
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
165
|
-
|
|
159
|
+
(0, core_utils_1.assert)(pendingEntry !== undefined, 0x725 /* Must have pending blob entry for upcoming op */);
|
|
160
|
+
if (pendingEntry?.uploadTime && pendingEntry?.minTTLInSeconds) {
|
|
166
161
|
const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
|
|
167
162
|
const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
|
|
168
163
|
this.mc.logger.sendTelemetryEvent({
|
|
169
164
|
eventName: "sendBlobAttach",
|
|
170
|
-
entryStatus: pendingEntry.status,
|
|
171
165
|
secondsSinceUpload,
|
|
172
166
|
minTTLInSeconds: pendingEntry.minTTLInSeconds,
|
|
173
167
|
expired,
|
|
174
168
|
});
|
|
175
169
|
if (expired) {
|
|
176
170
|
// we want to avoid submitting ops with broken handles
|
|
177
|
-
this.closeContainer(new
|
|
171
|
+
this.closeContainer(new telemetry_utils_1.GenericError("Trying to submit a BlobAttach for expired blob", undefined, {
|
|
178
172
|
localId,
|
|
179
173
|
blobId,
|
|
180
|
-
entryStatus: pendingEntry.status,
|
|
181
174
|
secondsSinceUpload,
|
|
182
175
|
}));
|
|
183
176
|
}
|
|
184
177
|
}
|
|
178
|
+
pendingEntry.opsent = true;
|
|
185
179
|
return sendBlobAttachOp(localId, blobId);
|
|
186
180
|
};
|
|
187
181
|
}
|
|
188
|
-
get
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
182
|
+
get allBlobsAttached() {
|
|
183
|
+
for (const [, entry] of this.pendingBlobs) {
|
|
184
|
+
if (entry.attached === false) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return true;
|
|
193
189
|
}
|
|
194
190
|
get hasPendingBlobs() {
|
|
195
191
|
return ((this.runtime.attachState !== container_definitions_1.AttachState.Attached && this.redirectTable.size > 0) ||
|
|
196
192
|
this.pendingBlobs.size > 0);
|
|
197
193
|
}
|
|
194
|
+
createAbortError(pending) {
|
|
195
|
+
return new telemetry_utils_1.LoggingError("uploadBlob aborted", {
|
|
196
|
+
acked: pending?.acked,
|
|
197
|
+
uploadTime: pending?.uploadTime,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
198
200
|
/**
|
|
199
201
|
* Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
|
|
200
202
|
*/
|
|
201
|
-
async
|
|
203
|
+
async processStashedChanges() {
|
|
202
204
|
this.retryThrottler.cancel();
|
|
203
|
-
const pendingUploads = this.
|
|
205
|
+
const pendingUploads = Array.from(this.pendingBlobs.values())
|
|
206
|
+
.filter((e) => e.uploading === true)
|
|
207
|
+
.map(async (e) => e.uploadP);
|
|
204
208
|
await telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, {
|
|
205
|
-
eventName: "
|
|
209
|
+
eventName: "BlobUploadProcessStashedChanges",
|
|
206
210
|
count: pendingUploads.length,
|
|
207
211
|
}, async () => Promise.all(pendingUploads), { start: true, end: true });
|
|
208
212
|
}
|
|
209
|
-
/**
|
|
210
|
-
* Transition online blobs waiting for BlobAttach op round-trip since we will not see the op until we are connected
|
|
211
|
-
* again
|
|
212
|
-
*/
|
|
213
|
-
onDisconnected() {
|
|
214
|
-
for (const [localId, entry] of this.pendingBlobs) {
|
|
215
|
-
if (entry.status === PendingBlobStatus.OnlinePendingOp) {
|
|
216
|
-
// This will submit another BlobAttach op for this blob. This is necessary because the one we sent
|
|
217
|
-
// already didn't have the local ID.
|
|
218
|
-
this.transitionToOffline(localId);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
213
|
/**
|
|
223
214
|
* Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
|
|
224
215
|
* detached or there are no (non-pending) attachment blobs in the document
|
|
@@ -229,7 +220,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
229
220
|
const undefinedValueInTable = ids.delete(undefined);
|
|
230
221
|
// For a detached container, entries are inserted into the redirect table with an undefined storage ID.
|
|
231
222
|
// For an attached container, entries are inserted w/storage ID after the BlobAttach op round-trips.
|
|
232
|
-
(0,
|
|
223
|
+
(0, core_utils_1.assert)(!undefinedValueInTable ||
|
|
233
224
|
(this.runtime.attachState === container_definitions_1.AttachState.Detached && ids.size === 0), 0x382 /* 'redirectTable' must contain only undefined while detached / defined values while attached */);
|
|
234
225
|
return ids;
|
|
235
226
|
}
|
|
@@ -243,14 +234,14 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
243
234
|
}
|
|
244
235
|
let storageId;
|
|
245
236
|
if (this.runtime.attachState === container_definitions_1.AttachState.Detached) {
|
|
246
|
-
(0,
|
|
237
|
+
(0, core_utils_1.assert)(this.redirectTable.has(blobId), 0x383 /* requesting unknown blobs */);
|
|
247
238
|
// Blobs created while the container is detached are stored in IDetachedBlobStorage.
|
|
248
239
|
// The 'IDocumentStorageService.readBlob()' call below will retrieve these via localId.
|
|
249
240
|
storageId = blobId;
|
|
250
241
|
}
|
|
251
242
|
else {
|
|
252
243
|
const attachedStorageId = this.redirectTable.get(blobId);
|
|
253
|
-
(0,
|
|
244
|
+
(0, core_utils_1.assert)(!!attachedStorageId, 0x11f /* "requesting unknown blobs" */);
|
|
254
245
|
storageId = attachedStorageId;
|
|
255
246
|
}
|
|
256
247
|
// Let runtime know that the corresponding GC node was requested.
|
|
@@ -260,11 +251,12 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
260
251
|
}, { end: true, cancel: "error" });
|
|
261
252
|
}
|
|
262
253
|
getBlobHandle(id) {
|
|
263
|
-
(0,
|
|
254
|
+
(0, core_utils_1.assert)(this.redirectTable.has(id) || this.pendingBlobs.has(id), 0x384 /* requesting handle for unknown blob */);
|
|
264
255
|
const pending = this.pendingBlobs.get(id);
|
|
265
256
|
const callback = pending
|
|
266
257
|
? () => {
|
|
267
258
|
pending.attached = true;
|
|
259
|
+
this.emit("blobAttached", pending);
|
|
268
260
|
this.deletePendingBlobMaybe(id);
|
|
269
261
|
}
|
|
270
262
|
: undefined;
|
|
@@ -277,7 +269,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
277
269
|
this.setRedirection(response.id, undefined);
|
|
278
270
|
return this.getBlobHandle(response.id);
|
|
279
271
|
}
|
|
280
|
-
async createBlob(blob) {
|
|
272
|
+
async createBlob(blob, signal) {
|
|
281
273
|
if (this.runtime.attachState === container_definitions_1.AttachState.Detached) {
|
|
282
274
|
return this.createBlobDetached(blob);
|
|
283
275
|
}
|
|
@@ -286,20 +278,33 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
286
278
|
this.mc.logger.sendTelemetryEvent({ eventName: "CreateBlobWhileAttaching" });
|
|
287
279
|
await new Promise((resolve) => this.runtime.once("attached", resolve));
|
|
288
280
|
}
|
|
289
|
-
(0,
|
|
281
|
+
(0, core_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Attached, 0x385 /* For clarity and paranoid defense against adding future attachment states */);
|
|
282
|
+
if (signal?.aborted) {
|
|
283
|
+
throw this.createAbortError();
|
|
284
|
+
}
|
|
290
285
|
// Create a local ID for the blob. After uploading it to storage and before returning it, a local ID to
|
|
291
286
|
// storage ID mapping is created.
|
|
292
287
|
const localId = (0, uuid_1.v4)();
|
|
293
288
|
const pendingEntry = {
|
|
294
289
|
blob,
|
|
295
|
-
|
|
296
|
-
handleP: new
|
|
290
|
+
uploading: true,
|
|
291
|
+
handleP: new core_utils_1.Deferred(),
|
|
297
292
|
uploadP: this.uploadBlob(localId, blob),
|
|
298
293
|
attached: false,
|
|
299
294
|
acked: false,
|
|
295
|
+
abortSignal: signal,
|
|
296
|
+
opsent: false,
|
|
300
297
|
};
|
|
301
298
|
this.pendingBlobs.set(localId, pendingEntry);
|
|
302
|
-
|
|
299
|
+
const abortListener = () => {
|
|
300
|
+
if (!pendingEntry.acked) {
|
|
301
|
+
pendingEntry.handleP.reject(this.createAbortError(pendingEntry));
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
signal?.addEventListener("abort", abortListener, { once: true });
|
|
305
|
+
return pendingEntry.handleP.promise.finally(() => {
|
|
306
|
+
signal?.removeEventListener("abort", abortListener);
|
|
307
|
+
});
|
|
303
308
|
}
|
|
304
309
|
async uploadBlob(localId, blob) {
|
|
305
310
|
return telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "createBlob" }, async () => this.getStorage().createBlob(blob), { end: true, cancel: this.runtime.connected ? "error" : "generic" }).then((response) => this.onUploadResolve(localId, response), async (err) => this.onUploadReject(localId, err));
|
|
@@ -314,69 +319,59 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
314
319
|
deletePendingBlobMaybe(id) {
|
|
315
320
|
if (this.pendingBlobs.has(id)) {
|
|
316
321
|
const entry = this.pendingBlobs.get(id);
|
|
317
|
-
if (
|
|
318
|
-
this.
|
|
319
|
-
if (!this.hasPendingBlobs) {
|
|
320
|
-
this.emit("noPendingBlobs");
|
|
321
|
-
}
|
|
322
|
+
if (entry?.attached && entry?.acked) {
|
|
323
|
+
this.deletePendingBlob(id);
|
|
322
324
|
}
|
|
323
325
|
}
|
|
324
326
|
}
|
|
327
|
+
deletePendingBlob(id) {
|
|
328
|
+
if (this.pendingBlobs.delete(id) && !this.hasPendingBlobs) {
|
|
329
|
+
this.emit("noPendingBlobs");
|
|
330
|
+
}
|
|
331
|
+
}
|
|
325
332
|
onUploadResolve(localId, response) {
|
|
326
|
-
var _a;
|
|
327
333
|
const entry = this.pendingBlobs.get(localId);
|
|
328
|
-
(0,
|
|
329
|
-
|
|
330
|
-
|
|
334
|
+
(0, core_utils_1.assert)(entry !== undefined, 0x6c8 /* pending blob entry not found for uploaded blob */);
|
|
335
|
+
if (entry.abortSignal?.aborted === true && !entry.opsent) {
|
|
336
|
+
this.deletePendingBlob(localId);
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
(0, core_utils_1.assert)(entry.uploading === true, 0x386 /* Must have pending blob entry for uploaded blob */);
|
|
331
340
|
entry.storageId = response.id;
|
|
332
341
|
entry.uploadTime = Date.now();
|
|
333
342
|
entry.minTTLInSeconds = response.minTTLInSeconds;
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
// If there is already an op for this storage ID, append the local ID to the list. Once any op for
|
|
352
|
-
// this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
|
|
353
|
-
// blob alive in storage.
|
|
354
|
-
this.opsInFlight.set(response.id, ((_a = this.opsInFlight.get(response.id)) !== null && _a !== void 0 ? _a : []).concat(localId));
|
|
355
|
-
entry.status = PendingBlobStatus.OnlinePendingOp;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
else if (entry.status === PendingBlobStatus.OfflinePendingUpload) {
|
|
359
|
-
// We already submitted a BlobAttach op for this blob when it was transitioned to offline flow
|
|
360
|
-
entry.status = PendingBlobStatus.OfflinePendingOp;
|
|
361
|
-
}
|
|
343
|
+
// Send a blob attach op. This serves two purposes:
|
|
344
|
+
// 1. If its a new blob, i.e., it isn't de-duped, the server will keep the blob alive if it sees this op
|
|
345
|
+
// until its storage ID is added to the next summary.
|
|
346
|
+
// 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
|
|
347
|
+
// blob from the server via the storage ID.
|
|
348
|
+
if (!entry.opsent) {
|
|
349
|
+
this.sendBlobAttachOp(localId, response.id);
|
|
350
|
+
}
|
|
351
|
+
if (this.storageIds.has(response.id)) {
|
|
352
|
+
// The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
|
|
353
|
+
// an existing blob, we don't have to wait for the op to be ack'd since this step has already
|
|
354
|
+
// happened before and so, the server won't delete it.
|
|
355
|
+
this.setRedirection(localId, response.id);
|
|
356
|
+
entry.handleP.resolve(this.getBlobHandle(localId));
|
|
357
|
+
this.deletePendingBlobMaybe(localId);
|
|
362
358
|
}
|
|
363
359
|
else {
|
|
364
|
-
//
|
|
365
|
-
this
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
}
|
|
369
|
-
entry.status = PendingBlobStatus.OfflinePendingOp;
|
|
360
|
+
// If there is already an op for this storage ID, append the local ID to the list. Once any op for
|
|
361
|
+
// this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
|
|
362
|
+
// blob alive in storage.
|
|
363
|
+
this.opsInFlight.set(response.id, (this.opsInFlight.get(response.id) ?? []).concat(localId));
|
|
370
364
|
}
|
|
371
365
|
return response;
|
|
372
366
|
}
|
|
373
367
|
async onUploadReject(localId, error) {
|
|
374
368
|
const entry = this.pendingBlobs.get(localId);
|
|
375
|
-
(0,
|
|
369
|
+
(0, core_utils_1.assert)(!!entry, 0x387 /* Must have pending blob entry for blob which failed to upload */);
|
|
370
|
+
if (entry.abortSignal?.aborted === true && !entry.opsent) {
|
|
371
|
+
this.deletePendingBlob(localId);
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
376
374
|
if (!this.runtime.connected) {
|
|
377
|
-
if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
|
|
378
|
-
this.transitionToOffline(localId);
|
|
379
|
-
}
|
|
380
375
|
// we are probably not connected to storage but start another upload request in case we are
|
|
381
376
|
entry.uploadP = this.retryThrottler
|
|
382
377
|
.getDelay()
|
|
@@ -388,50 +383,34 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
388
383
|
throw error;
|
|
389
384
|
}
|
|
390
385
|
}
|
|
391
|
-
transitionToOffline(localId) {
|
|
392
|
-
(0, common_utils_1.assert)(!this.runtime.connected, 0x388 /* Must only transition to offline flow while runtime is disconnected */);
|
|
393
|
-
const entry = this.pendingBlobs.get(localId);
|
|
394
|
-
(0, common_utils_1.assert)(!!entry, 0x389 /* No pending blob entry */);
|
|
395
|
-
(0, common_utils_1.assert)([PendingBlobStatus.OnlinePendingUpload, PendingBlobStatus.OnlinePendingOp].includes(entry.status), 0x38a /* Blob must be in online flow to transition to offline flow */);
|
|
396
|
-
/**
|
|
397
|
-
* If we haven't already submitted a BlobAttach op for this entry, send it before returning the blob handle.
|
|
398
|
-
* This will make sure that the BlobAttach op is sequenced prior to any ops referencing the handle. Otherwise,
|
|
399
|
-
* an invalid handle could be added to the document.
|
|
400
|
-
* storageId may be undefined but since we are not connected we will have a chance to add it when reSubmit()
|
|
401
|
-
* is called on reconnection.
|
|
402
|
-
*/
|
|
403
|
-
if (entry.status !== PendingBlobStatus.OnlinePendingOp) {
|
|
404
|
-
this.sendBlobAttachOp(localId, entry.storageId);
|
|
405
|
-
}
|
|
406
|
-
entry.status =
|
|
407
|
-
entry.status === PendingBlobStatus.OnlinePendingUpload
|
|
408
|
-
? PendingBlobStatus.OfflinePendingUpload
|
|
409
|
-
: PendingBlobStatus.OfflinePendingOp;
|
|
410
|
-
entry.handleP.resolve(this.getBlobHandle(localId));
|
|
411
|
-
}
|
|
412
386
|
/**
|
|
413
387
|
* Resubmit a BlobAttach op. Used to add storage IDs to ops that were
|
|
414
388
|
* submitted to runtime while disconnected.
|
|
415
389
|
* @param metadata - op metadata containing storage and/or local IDs
|
|
416
390
|
*/
|
|
417
391
|
reSubmit(metadata) {
|
|
418
|
-
(0,
|
|
392
|
+
(0, core_utils_1.assert)(!!metadata, 0x38b /* Resubmitted ops must have metadata */);
|
|
419
393
|
const { localId, blobId } = metadata;
|
|
420
|
-
(0,
|
|
394
|
+
(0, core_utils_1.assert)(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
|
|
421
395
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
422
396
|
if (!blobId) {
|
|
423
397
|
// We submitted this op while offline. The blob should have been uploaded by now.
|
|
424
|
-
(0,
|
|
425
|
-
|
|
426
|
-
return this.sendBlobAttachOp(localId, pendingEntry.storageId);
|
|
398
|
+
(0, core_utils_1.assert)(pendingEntry?.opsent === true && !!pendingEntry?.storageId, 0x38d /* blob must be uploaded before resubmitting BlobAttach op */);
|
|
399
|
+
return this.sendBlobAttachOp(localId, pendingEntry?.storageId);
|
|
427
400
|
}
|
|
428
401
|
return this.sendBlobAttachOp(localId, blobId);
|
|
429
402
|
}
|
|
430
403
|
processBlobAttachOp(message, local) {
|
|
431
|
-
|
|
432
|
-
const
|
|
433
|
-
|
|
434
|
-
|
|
404
|
+
const localId = message.metadata?.localId;
|
|
405
|
+
const blobId = message.metadata?.blobId;
|
|
406
|
+
if (localId) {
|
|
407
|
+
const pendingEntry = this.pendingBlobs.get(localId);
|
|
408
|
+
if (pendingEntry?.abortSignal?.aborted) {
|
|
409
|
+
this.deletePendingBlob(localId);
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
(0, core_utils_1.assert)(blobId !== undefined, 0x12a /* "Missing blob id on metadata" */);
|
|
435
414
|
// Set up a mapping from local ID to storage ID. This is crucial since without this the blob cannot be
|
|
436
415
|
// requested from the server.
|
|
437
416
|
// Note: The check for undefined is needed for back-compat when localId was not part of the BlobAttach op that
|
|
@@ -442,7 +421,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
442
421
|
// set identity (id -> id) entry
|
|
443
422
|
this.setRedirection(blobId, blobId);
|
|
444
423
|
if (local) {
|
|
445
|
-
(0,
|
|
424
|
+
(0, core_utils_1.assert)(localId !== undefined, 0x50e /* local ID not present in blob attach message */);
|
|
446
425
|
const waitingBlobs = this.opsInFlight.get(blobId);
|
|
447
426
|
if (waitingBlobs !== undefined) {
|
|
448
427
|
// For each op corresponding to this storage ID that we are waiting for, resolve the pending blob.
|
|
@@ -450,22 +429,18 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
450
429
|
// storage ID is already in flight and any op containing this local ID will be sequenced after that.
|
|
451
430
|
waitingBlobs.forEach((pendingLocalId) => {
|
|
452
431
|
const entry = this.pendingBlobs.get(pendingLocalId);
|
|
453
|
-
(0,
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
|
|
459
|
-
this.deletePendingBlobMaybe(pendingLocalId);
|
|
460
|
-
}
|
|
432
|
+
(0, core_utils_1.assert)(entry !== undefined, 0x38f /* local online BlobAttach op with no pending blob entry */);
|
|
433
|
+
this.setRedirection(pendingLocalId, blobId);
|
|
434
|
+
entry.acked = true;
|
|
435
|
+
entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
|
|
436
|
+
this.deletePendingBlobMaybe(pendingLocalId);
|
|
461
437
|
});
|
|
462
438
|
this.opsInFlight.delete(blobId);
|
|
463
439
|
}
|
|
464
|
-
// offline flow does not resolve the handle (since it was already resolved)
|
|
465
|
-
// but we still need to delete the entry in case is acked and attached.
|
|
466
440
|
const localEntry = this.pendingBlobs.get(localId);
|
|
467
441
|
if (localEntry) {
|
|
468
442
|
localEntry.acked = true;
|
|
443
|
+
localEntry.handleP.resolve(this.getBlobHandle(localId));
|
|
469
444
|
this.deletePendingBlobMaybe(localId);
|
|
470
445
|
}
|
|
471
446
|
}
|
|
@@ -494,11 +469,10 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
494
469
|
* Load a set of previously attached blob IDs and redirect table from a previous snapshot.
|
|
495
470
|
*/
|
|
496
471
|
load(snapshot) {
|
|
497
|
-
var _a, _b, _c;
|
|
498
472
|
this.mc.logger.sendTelemetryEvent({
|
|
499
473
|
eventName: "AttachmentBlobsLoaded",
|
|
500
|
-
count:
|
|
501
|
-
redirectTable:
|
|
474
|
+
count: snapshot.ids?.length ?? 0,
|
|
475
|
+
redirectTable: snapshot.redirectTable?.length,
|
|
502
476
|
});
|
|
503
477
|
const table = new Map(snapshot.redirectTable);
|
|
504
478
|
if (snapshot.ids) {
|
|
@@ -535,7 +509,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
535
509
|
getGCData(fullGC = false) {
|
|
536
510
|
const gcData = { gcNodes: {} };
|
|
537
511
|
for (const [localId, storageId] of this.redirectTable) {
|
|
538
|
-
(0,
|
|
512
|
+
(0, core_utils_1.assert)(!!storageId, 0x390 /* Must be attached to get GC data */);
|
|
539
513
|
// Only return local ids as GC nodes because a blob can only be referenced via its local id. The storage
|
|
540
514
|
// id entries have the same key and value, ignore them.
|
|
541
515
|
// The outbound routes are empty because a blob node cannot reference other nodes. It can only be referenced
|
|
@@ -557,11 +531,11 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
557
531
|
* Delete attachment blobs that are sweep ready.
|
|
558
532
|
* @param sweepReadyBlobRoutes - The routes of blobs that are sweep ready and should be deleted. These routes will
|
|
559
533
|
* be based off of local ids.
|
|
560
|
-
* @returns
|
|
534
|
+
* @returns The routes of blobs that were deleted.
|
|
561
535
|
*/
|
|
562
536
|
deleteSweepReadyNodes(sweepReadyBlobRoutes) {
|
|
563
537
|
// If sweep for attachment blobs is not enabled, return empty list indicating nothing is deleted.
|
|
564
|
-
if (this.mc.config.getBoolean(gc_1.
|
|
538
|
+
if (this.mc.config.getBoolean(gc_1.disableAttachmentBlobSweepKey) === true) {
|
|
565
539
|
return [];
|
|
566
540
|
}
|
|
567
541
|
this.deleteBlobsFromRedirectTable(sweepReadyBlobRoutes);
|
|
@@ -595,14 +569,14 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
595
569
|
continue;
|
|
596
570
|
}
|
|
597
571
|
const storageId = this.redirectTable.get(blobId);
|
|
598
|
-
(0,
|
|
572
|
+
(0, core_utils_1.assert)(!!storageId, 0x5bb /* Must be attached to run GC */);
|
|
599
573
|
maybeUnusedStorageIds.add(storageId);
|
|
600
574
|
this.redirectTable.delete(blobId);
|
|
601
575
|
}
|
|
602
576
|
// Find out storage ids that are in-use and remove them from maybeUnusedStorageIds. A storage id is in-use if
|
|
603
577
|
// the redirect table has a local id -> storage id entry for it.
|
|
604
578
|
for (const [localId, storageId] of this.redirectTable.entries()) {
|
|
605
|
-
(0,
|
|
579
|
+
(0, core_utils_1.assert)(!!storageId, 0x5bc /* Must be attached to run GC */);
|
|
606
580
|
// For every storage id, the redirect table has a id -> id entry. These do not make the storage id in-use.
|
|
607
581
|
if (maybeUnusedStorageIds.has(storageId) && localId !== storageId) {
|
|
608
582
|
maybeUnusedStorageIds.delete(storageId);
|
|
@@ -676,27 +650,65 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
676
650
|
}
|
|
677
651
|
}
|
|
678
652
|
setRedirectTable(table) {
|
|
679
|
-
(0,
|
|
680
|
-
(0,
|
|
653
|
+
(0, core_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Detached, 0x252 /* "redirect table can only be set in detached container" */);
|
|
654
|
+
(0, core_utils_1.assert)(this.redirectTable.size === table.size, 0x391 /* Redirect table size must match BlobManager's local ID count */);
|
|
681
655
|
for (const [localId, storageId] of table) {
|
|
682
|
-
(0,
|
|
656
|
+
(0, core_utils_1.assert)(this.redirectTable.has(localId), 0x254 /* "unrecognized id in redirect table" */);
|
|
683
657
|
this.setRedirection(localId, storageId);
|
|
684
658
|
// set identity (id -> id) entry
|
|
685
659
|
this.setRedirection(storageId, storageId);
|
|
686
660
|
}
|
|
687
661
|
}
|
|
688
|
-
getPendingBlobs() {
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
662
|
+
async getPendingBlobs(waitBlobsToAttach) {
|
|
663
|
+
return telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "GetPendingBlobs" }, async () => {
|
|
664
|
+
if (this.pendingBlobs.size === 0) {
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
const blobs = {};
|
|
668
|
+
const localBlobs = new Set();
|
|
669
|
+
while (localBlobs.size < this.pendingBlobs.size) {
|
|
670
|
+
const attachBlobsP = [];
|
|
671
|
+
for (const [id, entry] of this.pendingBlobs) {
|
|
672
|
+
if (!localBlobs.has(entry)) {
|
|
673
|
+
localBlobs.add(entry);
|
|
674
|
+
if (waitBlobsToAttach) {
|
|
675
|
+
if (!entry.opsent) {
|
|
676
|
+
this.sendBlobAttachOp(id, entry.storageId);
|
|
677
|
+
}
|
|
678
|
+
entry.handleP.resolve(this.getBlobHandle(id));
|
|
679
|
+
attachBlobsP.push(new Promise((resolve) => {
|
|
680
|
+
const onBlobAttached = (attachedEntry) => {
|
|
681
|
+
if (attachedEntry === entry) {
|
|
682
|
+
this.off("blobAttached", onBlobAttached);
|
|
683
|
+
resolve();
|
|
684
|
+
}
|
|
685
|
+
};
|
|
686
|
+
if (!entry.attached) {
|
|
687
|
+
this.on("blobAttached", onBlobAttached);
|
|
688
|
+
}
|
|
689
|
+
else {
|
|
690
|
+
resolve();
|
|
691
|
+
}
|
|
692
|
+
}));
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
await Promise.all(attachBlobsP);
|
|
697
|
+
}
|
|
698
|
+
// another for is needed to correctly mark attach state
|
|
699
|
+
// future optimization won't add unattached blobs to the list
|
|
700
|
+
for (const [id, entry] of this.pendingBlobs) {
|
|
701
|
+
blobs[id] = {
|
|
702
|
+
blob: (0, client_utils_1.bufferToString)(entry.blob, "base64"),
|
|
703
|
+
storageId: entry.storageId,
|
|
704
|
+
attached: entry.attached,
|
|
705
|
+
acked: entry.acked,
|
|
706
|
+
minTTLInSeconds: entry.minTTLInSeconds,
|
|
707
|
+
uploadTime: entry.uploadTime,
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
return blobs;
|
|
711
|
+
});
|
|
700
712
|
}
|
|
701
713
|
}
|
|
702
714
|
exports.BlobManager = BlobManager;
|
|
@@ -715,7 +727,7 @@ function getGCNodePathFromBlobId(blobId) {
|
|
|
715
727
|
*/
|
|
716
728
|
function getBlobIdFromGCNodePath(nodePath) {
|
|
717
729
|
const pathParts = nodePath.split("/");
|
|
718
|
-
(0,
|
|
730
|
+
(0, core_utils_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x5bd /* Invalid blob node path */);
|
|
719
731
|
return pathParts[2];
|
|
720
732
|
}
|
|
721
733
|
//# sourceMappingURL=blobManager.js.map
|