@fluidframework/container-runtime 2.0.0-dev.3.1.0.125672 → 2.0.0-dev.4.2.0.153917
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 +58 -0
- package/README.md +69 -0
- package/dist/blobManager.d.ts +29 -24
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +162 -92
- package/dist/blobManager.js.map +1 -1
- package/dist/containerRuntime.d.ts +74 -76
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +328 -264
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +39 -13
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +112 -49
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +28 -4
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +107 -41
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +19 -0
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -0
- package/dist/deltaManagerSummarizerProxy.js +40 -0
- package/dist/deltaManagerSummarizerProxy.js.map +1 -0
- package/dist/gc/garbageCollection.d.ts +204 -0
- package/dist/gc/garbageCollection.d.ts.map +1 -0
- package/dist/{garbageCollection.js → gc/garbageCollection.js} +190 -554
- package/dist/gc/garbageCollection.js.map +1 -0
- package/dist/gc/gcConfigs.d.ts +22 -0
- package/dist/gc/gcConfigs.d.ts.map +1 -0
- package/dist/gc/gcConfigs.js +143 -0
- package/dist/gc/gcConfigs.js.map +1 -0
- package/dist/gc/gcDefinitions.d.ts +320 -0
- package/dist/gc/gcDefinitions.d.ts.map +1 -0
- package/dist/gc/gcDefinitions.js +81 -0
- package/dist/gc/gcDefinitions.js.map +1 -0
- package/dist/gc/gcHelpers.d.ts +86 -0
- package/dist/gc/gcHelpers.d.ts.map +1 -0
- package/dist/gc/gcHelpers.js +268 -0
- package/dist/gc/gcHelpers.js.map +1 -0
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
- package/dist/gc/gcReferenceGraphAlgorithm.js +49 -0
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/dist/gc/gcSummaryDefinitions.d.ts +52 -0
- package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -0
- package/dist/gc/gcSummaryDefinitions.js +7 -0
- package/dist/gc/gcSummaryDefinitions.js.map +1 -0
- package/dist/gc/gcSummaryStateTracker.d.ts +93 -0
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/dist/gc/gcSummaryStateTracker.js +239 -0
- package/dist/gc/gcSummaryStateTracker.js.map +1 -0
- package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
- package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +2 -2
- package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
- package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/dist/gc/gcUnreferencedStateTracker.js +94 -0
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/dist/gc/index.d.ts +13 -0
- package/dist/gc/index.d.ts.map +1 -0
- package/dist/gc/index.js +50 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/index.d.ts +3 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +11 -13
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +26 -38
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +4 -0
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +2 -1
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +4 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +25 -10
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +4 -0
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +43 -4
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +14 -0
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/dist/opLifecycle/opGroupingManager.js +56 -0
- package/dist/opLifecycle/opGroupingManager.js.map +1 -0
- package/dist/opLifecycle/opSplitter.d.ts +16 -4
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +39 -15
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +21 -3
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +90 -51
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -2
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +30 -20
- 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 +3 -3
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +20 -21
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.d.ts +17 -0
- package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -0
- package/dist/storageServiceWithAttachBlobs.js +32 -0
- package/dist/storageServiceWithAttachBlobs.js.map +1 -0
- package/dist/summary/index.d.ts +17 -0
- package/dist/summary/index.d.ts.map +1 -0
- package/dist/summary/index.js +48 -0
- package/dist/summary/index.js.map +1 -0
- package/dist/summary/orderedClientElection.d.ts.map +1 -0
- package/dist/summary/orderedClientElection.js.map +1 -0
- package/dist/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +3 -2
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/{lib → dist/summary}/runningSummarizer.d.ts +23 -20
- package/dist/summary/runningSummarizer.d.ts.map +1 -0
- package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +191 -74
- package/dist/summary/runningSummarizer.js.map +1 -0
- package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +4 -9
- package/dist/summary/summarizer.d.ts.map +1 -0
- package/dist/{summarizer.js → summary/summarizer.js} +10 -79
- package/dist/summary/summarizer.js.map +1 -0
- package/dist/summary/summarizerClientElection.d.ts.map +1 -0
- package/dist/summary/summarizerClientElection.js.map +1 -0
- package/dist/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +2 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
- package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -3
- package/dist/summary/summarizerHeuristics.js.map +1 -0
- package/dist/summary/summarizerNode/index.d.ts +8 -0
- package/dist/summary/summarizerNode/index.d.ts.map +1 -0
- package/dist/summary/summarizerNode/index.js +12 -0
- package/dist/summary/summarizerNode/index.js.map +1 -0
- package/dist/summary/summarizerNode/summarizerNode.d.ts +149 -0
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNode.js +531 -0
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +132 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +148 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +424 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/{lib → dist/summary}/summarizerTypes.d.ts +21 -19
- package/dist/summary/summarizerTypes.d.ts.map +1 -0
- package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -5
- package/dist/summary/summarizerTypes.js.map +1 -0
- package/dist/summary/summaryCollection.d.ts.map +1 -0
- package/dist/summary/summaryCollection.js.map +1 -0
- package/{lib → dist/summary}/summaryFormat.d.ts +3 -21
- package/dist/summary/summaryFormat.d.ts.map +1 -0
- package/dist/{summaryFormat.js → summary/summaryFormat.js} +1 -10
- package/dist/summary/summaryFormat.js.map +1 -0
- package/{lib → dist/summary}/summaryGenerator.d.ts +28 -2
- package/dist/summary/summaryGenerator.d.ts.map +1 -0
- package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +23 -20
- package/dist/summary/summaryGenerator.js.map +1 -0
- package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -0
- package/dist/summary/summaryManager.js.map +1 -0
- package/lib/blobManager.d.ts +29 -24
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +159 -89
- package/lib/blobManager.js.map +1 -1
- package/lib/containerRuntime.d.ts +74 -76
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +301 -237
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +39 -13
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +101 -38
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +28 -4
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +100 -34
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts +19 -0
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -0
- package/lib/deltaManagerSummarizerProxy.js +36 -0
- package/lib/deltaManagerSummarizerProxy.js.map +1 -0
- package/lib/gc/garbageCollection.d.ts +204 -0
- package/lib/gc/garbageCollection.d.ts.map +1 -0
- package/lib/{garbageCollection.js → gc/garbageCollection.js} +172 -535
- package/lib/gc/garbageCollection.js.map +1 -0
- package/lib/gc/gcConfigs.d.ts +22 -0
- package/lib/gc/gcConfigs.d.ts.map +1 -0
- package/lib/gc/gcConfigs.js +139 -0
- package/lib/gc/gcConfigs.js.map +1 -0
- package/lib/gc/gcDefinitions.d.ts +320 -0
- package/lib/gc/gcDefinitions.d.ts.map +1 -0
- package/lib/gc/gcDefinitions.js +78 -0
- package/lib/gc/gcDefinitions.js.map +1 -0
- package/lib/gc/gcHelpers.d.ts +86 -0
- package/lib/gc/gcHelpers.d.ts.map +1 -0
- package/lib/gc/gcHelpers.js +254 -0
- package/lib/gc/gcHelpers.js.map +1 -0
- package/lib/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
- package/lib/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
- package/lib/gc/gcReferenceGraphAlgorithm.js +45 -0
- package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/lib/gc/gcSummaryDefinitions.d.ts +52 -0
- package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -0
- package/lib/gc/gcSummaryDefinitions.js +6 -0
- package/lib/gc/gcSummaryDefinitions.js.map +1 -0
- package/lib/gc/gcSummaryStateTracker.d.ts +93 -0
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/lib/gc/gcSummaryStateTracker.js +235 -0
- package/lib/gc/gcSummaryStateTracker.js.map +1 -0
- package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
- package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +1 -1
- package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
- package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/lib/gc/gcUnreferencedStateTracker.js +90 -0
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/lib/gc/index.d.ts +13 -0
- package/lib/gc/index.d.ts.map +1 -0
- package/lib/gc/index.js +12 -0
- package/lib/gc/index.js.map +1 -0
- package/lib/index.d.ts +3 -7
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -4
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +11 -13
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +24 -37
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +4 -0
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +2 -1
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -1
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +26 -11
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +4 -0
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +43 -4
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +14 -0
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/lib/opLifecycle/opGroupingManager.js +52 -0
- package/lib/opLifecycle/opGroupingManager.js.map +1 -0
- package/lib/opLifecycle/opSplitter.d.ts +16 -4
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +39 -15
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +21 -3
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +92 -53
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +4 -2
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +30 -20
- 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 +3 -3
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +20 -21
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts +17 -0
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -0
- package/lib/storageServiceWithAttachBlobs.js +28 -0
- package/lib/storageServiceWithAttachBlobs.js.map +1 -0
- package/lib/summary/index.d.ts +17 -0
- package/lib/summary/index.d.ts.map +1 -0
- package/lib/summary/index.js +16 -0
- package/lib/summary/index.js.map +1 -0
- package/lib/summary/orderedClientElection.d.ts.map +1 -0
- package/lib/summary/orderedClientElection.js.map +1 -0
- package/lib/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +3 -2
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/{dist → lib/summary}/runningSummarizer.d.ts +23 -20
- package/lib/summary/runningSummarizer.d.ts.map +1 -0
- package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +192 -75
- package/lib/summary/runningSummarizer.js.map +1 -0
- package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +4 -9
- package/lib/summary/summarizer.d.ts.map +1 -0
- package/lib/{summarizer.js → summary/summarizer.js} +12 -81
- package/lib/summary/summarizer.js.map +1 -0
- package/lib/summary/summarizerClientElection.d.ts.map +1 -0
- package/lib/summary/summarizerClientElection.js.map +1 -0
- package/lib/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +2 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
- package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -3
- package/lib/summary/summarizerHeuristics.js.map +1 -0
- package/lib/summary/summarizerNode/index.d.ts +8 -0
- package/lib/summary/summarizerNode/index.d.ts.map +1 -0
- package/lib/summary/summarizerNode/index.js +7 -0
- package/lib/summary/summarizerNode/index.js.map +1 -0
- package/lib/summary/summarizerNode/summarizerNode.d.ts +149 -0
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNode.js +526 -0
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +125 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +148 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +419 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/{dist → lib/summary}/summarizerTypes.d.ts +21 -19
- package/lib/summary/summarizerTypes.d.ts.map +1 -0
- package/lib/summary/summarizerTypes.js +6 -0
- package/lib/summary/summarizerTypes.js.map +1 -0
- package/lib/summary/summaryCollection.d.ts.map +1 -0
- package/lib/summary/summaryCollection.js.map +1 -0
- package/{dist → lib/summary}/summaryFormat.d.ts +3 -21
- package/lib/summary/summaryFormat.d.ts.map +1 -0
- package/lib/{summaryFormat.js → summary/summaryFormat.js} +0 -8
- package/lib/summary/summaryFormat.js.map +1 -0
- package/{dist → lib/summary}/summaryGenerator.d.ts +28 -2
- package/lib/summary/summaryGenerator.d.ts.map +1 -0
- package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +21 -19
- package/lib/summary/summaryGenerator.js.map +1 -0
- package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -0
- package/lib/summary/summaryManager.js.map +1 -0
- package/package.json +66 -60
- package/src/blobManager.ts +196 -110
- package/src/containerRuntime.ts +491 -391
- package/src/dataStoreContext.ts +140 -49
- package/src/dataStores.ts +139 -41
- package/src/deltaManagerSummarizerProxy.ts +46 -0
- package/{garbageCollection.md → src/gc/garbageCollection.md} +2 -2
- package/src/{garbageCollection.ts → gc/garbageCollection.ts} +245 -890
- package/src/gc/gcConfigs.ts +193 -0
- package/src/gc/gcDefinitions.ts +387 -0
- package/src/gc/gcHelpers.ts +335 -0
- package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
- package/src/gc/gcSummaryDefinitions.ts +54 -0
- package/src/gc/gcSummaryStateTracker.ts +329 -0
- package/src/{gcSweepReadyUsageDetection.ts → gc/gcSweepReadyUsageDetection.ts} +1 -1
- package/src/gc/gcUnreferencedStateTracker.ts +114 -0
- package/src/gc/index.ts +65 -0
- package/src/index.ts +10 -22
- package/src/opLifecycle/README.md +263 -0
- package/src/opLifecycle/batchManager.ts +26 -55
- package/src/opLifecycle/definitions.ts +4 -0
- package/src/opLifecycle/index.ts +2 -1
- package/src/opLifecycle/opCompressor.ts +32 -12
- package/src/opLifecycle/opDecompressor.ts +50 -5
- package/src/opLifecycle/opGroupingManager.ts +78 -0
- package/src/opLifecycle/opSplitter.ts +56 -17
- package/src/opLifecycle/outbox.ts +126 -62
- package/src/opLifecycle/remoteMessageProcessor.ts +38 -22
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +34 -27
- package/src/storageServiceWithAttachBlobs.ts +38 -0
- package/src/summary/index.ts +105 -0
- package/src/{runWhileConnectedCoordinator.ts → summary/runWhileConnectedCoordinator.ts} +7 -7
- package/src/{runningSummarizer.ts → summary/runningSummarizer.ts} +318 -156
- package/src/{summarizer.ts → summary/summarizer.ts} +12 -105
- package/src/{summarizerHeuristics.ts → summary/summarizerHeuristics.ts} +13 -4
- package/src/summary/summarizerNode/index.ts +12 -0
- package/src/summary/summarizerNode/summarizerNode.ts +766 -0
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +214 -0
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +644 -0
- package/src/{summarizerTypes.ts → summary/summarizerTypes.ts} +28 -25
- package/src/{summaryFormat.ts → summary/summaryFormat.ts} +3 -29
- package/src/{summaryGenerator.ts → summary/summaryGenerator.ts} +34 -27
- package/src/{summaryManager.ts → summary/summaryManager.ts} +1 -1
- package/dist/garbageCollection.d.ts +0 -411
- package/dist/garbageCollection.d.ts.map +0 -1
- package/dist/garbageCollection.js.map +0 -1
- package/dist/garbageCollectionConstants.d.ts +0 -23
- package/dist/garbageCollectionConstants.d.ts.map +0 -1
- package/dist/garbageCollectionConstants.js +0 -36
- package/dist/garbageCollectionConstants.js.map +0 -1
- package/dist/garbageCollectionHelpers.d.ts +0 -15
- package/dist/garbageCollectionHelpers.d.ts.map +0 -1
- package/dist/garbageCollectionHelpers.js +0 -27
- package/dist/garbageCollectionHelpers.js.map +0 -1
- package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
- package/dist/gcSweepReadyUsageDetection.js.map +0 -1
- package/dist/orderedClientElection.d.ts.map +0 -1
- package/dist/orderedClientElection.js.map +0 -1
- package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/dist/runWhileConnectedCoordinator.js.map +0 -1
- package/dist/runningSummarizer.d.ts.map +0 -1
- package/dist/runningSummarizer.js.map +0 -1
- package/dist/serializedSnapshotStorage.d.ts +0 -58
- package/dist/serializedSnapshotStorage.d.ts.map +0 -1
- package/dist/serializedSnapshotStorage.js +0 -110
- package/dist/serializedSnapshotStorage.js.map +0 -1
- package/dist/summarizer.d.ts.map +0 -1
- package/dist/summarizer.js.map +0 -1
- package/dist/summarizerClientElection.d.ts.map +0 -1
- package/dist/summarizerClientElection.js.map +0 -1
- package/dist/summarizerHandle.d.ts +0 -12
- package/dist/summarizerHandle.d.ts.map +0 -1
- package/dist/summarizerHandle.js +0 -22
- package/dist/summarizerHandle.js.map +0 -1
- package/dist/summarizerHeuristics.d.ts.map +0 -1
- package/dist/summarizerHeuristics.js.map +0 -1
- package/dist/summarizerTypes.d.ts.map +0 -1
- package/dist/summarizerTypes.js.map +0 -1
- package/dist/summaryCollection.d.ts.map +0 -1
- package/dist/summaryCollection.js.map +0 -1
- package/dist/summaryFormat.d.ts.map +0 -1
- package/dist/summaryFormat.js.map +0 -1
- package/dist/summaryGenerator.d.ts.map +0 -1
- package/dist/summaryGenerator.js.map +0 -1
- package/dist/summaryManager.d.ts.map +0 -1
- package/dist/summaryManager.js.map +0 -1
- package/lib/garbageCollection.d.ts +0 -411
- package/lib/garbageCollection.d.ts.map +0 -1
- package/lib/garbageCollection.js.map +0 -1
- package/lib/garbageCollectionConstants.d.ts +0 -23
- package/lib/garbageCollectionConstants.d.ts.map +0 -1
- package/lib/garbageCollectionConstants.js +0 -33
- package/lib/garbageCollectionConstants.js.map +0 -1
- package/lib/garbageCollectionHelpers.d.ts +0 -15
- package/lib/garbageCollectionHelpers.d.ts.map +0 -1
- package/lib/garbageCollectionHelpers.js +0 -23
- package/lib/garbageCollectionHelpers.js.map +0 -1
- package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
- package/lib/gcSweepReadyUsageDetection.js.map +0 -1
- package/lib/orderedClientElection.d.ts.map +0 -1
- package/lib/orderedClientElection.js.map +0 -1
- package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/lib/runWhileConnectedCoordinator.js.map +0 -1
- package/lib/runningSummarizer.d.ts.map +0 -1
- package/lib/runningSummarizer.js.map +0 -1
- package/lib/serializedSnapshotStorage.d.ts +0 -58
- package/lib/serializedSnapshotStorage.d.ts.map +0 -1
- package/lib/serializedSnapshotStorage.js +0 -106
- package/lib/serializedSnapshotStorage.js.map +0 -1
- package/lib/summarizer.d.ts.map +0 -1
- package/lib/summarizer.js.map +0 -1
- package/lib/summarizerClientElection.d.ts.map +0 -1
- package/lib/summarizerClientElection.js.map +0 -1
- package/lib/summarizerHandle.d.ts +0 -12
- package/lib/summarizerHandle.d.ts.map +0 -1
- package/lib/summarizerHandle.js +0 -18
- package/lib/summarizerHandle.js.map +0 -1
- package/lib/summarizerHeuristics.d.ts.map +0 -1
- package/lib/summarizerHeuristics.js.map +0 -1
- package/lib/summarizerTypes.d.ts.map +0 -1
- package/lib/summarizerTypes.js +0 -9
- package/lib/summarizerTypes.js.map +0 -1
- package/lib/summaryCollection.d.ts.map +0 -1
- package/lib/summaryCollection.js.map +0 -1
- package/lib/summaryFormat.d.ts.map +0 -1
- package/lib/summaryFormat.js.map +0 -1
- package/lib/summaryGenerator.d.ts.map +0 -1
- package/lib/summaryGenerator.js.map +0 -1
- package/lib/summaryManager.d.ts.map +0 -1
- package/lib/summaryManager.js.map +0 -1
- package/src/garbageCollectionConstants.ts +0 -38
- package/src/garbageCollectionHelpers.ts +0 -37
- package/src/serializedSnapshotStorage.ts +0 -151
- package/src/summarizerHandle.ts +0 -23
- /package/dist/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
- /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
- /package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
- /package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
- /package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
- /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
- /package/dist/{summaryCollection.js → summary/summaryCollection.js} +0 -0
- /package/dist/{summaryManager.js → summary/summaryManager.js} +0 -0
- /package/lib/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
- /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
- /package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
- /package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
- /package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
- /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
- /package/lib/{summaryCollection.js → summary/summaryCollection.js} +0 -0
- /package/lib/{summaryManager.js → summary/summaryManager.js} +0 -0
- /package/src/{orderedClientElection.ts → summary/orderedClientElection.ts} +0 -0
- /package/src/{summarizerClientElection.ts → summary/summarizerClientElection.ts} +0 -0
- /package/src/{summaryCollection.ts → summary/summaryCollection.ts} +0 -0
package/dist/blobManager.js
CHANGED
|
@@ -10,11 +10,11 @@ const runtime_utils_1 = require("@fluidframework/runtime-utils");
|
|
|
10
10
|
const common_utils_1 = require("@fluidframework/common-utils");
|
|
11
11
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
12
12
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
13
|
+
const container_utils_1 = require("@fluidframework/container-utils");
|
|
13
14
|
const containerRuntime_1 = require("./containerRuntime");
|
|
15
|
+
const gc_1 = require("./gc");
|
|
14
16
|
const throttler_1 = require("./throttler");
|
|
15
|
-
const
|
|
16
|
-
const garbageCollectionConstants_1 = require("./garbageCollectionConstants");
|
|
17
|
-
const garbageCollectionHelpers_1 = require("./garbageCollectionHelpers");
|
|
17
|
+
const summary_1 = require("./summary");
|
|
18
18
|
/**
|
|
19
19
|
* This class represents blob (long string)
|
|
20
20
|
* This object is used only when creating (writing) new blob and serialization purposes.
|
|
@@ -85,22 +85,16 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
85
85
|
// Called when a blob node is requested. blobPath is the path of the blob's node in GC's graph.
|
|
86
86
|
// blobPath's format - `/<BlobManager.basePath>/<blobId>`.
|
|
87
87
|
blobRequested,
|
|
88
|
-
// Called when a reference is added to a blob. For instance, when creating a localId / storageId to storageId
|
|
89
|
-
// mapping in the redirect table.
|
|
90
|
-
// Node path formats - `/<BlobManager.basePath>/<blobId>`.
|
|
91
|
-
addedBlobReference,
|
|
92
88
|
// Called to check if a blob has been deleted by GC.
|
|
93
89
|
// blobPath's format - `/<BlobManager.basePath>/<blobId>`.
|
|
94
|
-
isBlobDeleted, runtime, stashedBlobs = {},
|
|
90
|
+
isBlobDeleted, runtime, stashedBlobs = {}, closeContainer) {
|
|
95
91
|
super();
|
|
96
92
|
this.routeContext = routeContext;
|
|
97
93
|
this.getStorage = getStorage;
|
|
98
|
-
this.sendBlobAttachOp = sendBlobAttachOp;
|
|
99
94
|
this.blobRequested = blobRequested;
|
|
100
|
-
this.addedBlobReference = addedBlobReference;
|
|
101
95
|
this.isBlobDeleted = isBlobDeleted;
|
|
102
96
|
this.runtime = runtime;
|
|
103
|
-
this.
|
|
97
|
+
this.closeContainer = closeContainer;
|
|
104
98
|
/**
|
|
105
99
|
* Blobs which have not been uploaded or for which we have not yet seen a BlobAttach op round-trip.
|
|
106
100
|
* Until we see the op round-trip, there is a possibility we may need to re-upload the blob, so
|
|
@@ -125,13 +119,29 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
125
119
|
this.mc = (0, telemetry_utils_1.loggerToMonitoringContext)(telemetry_utils_1.ChildLogger.create(this.runtime.logger, "BlobManager"));
|
|
126
120
|
// Read the feature flag that tells whether to throw when a tombstone blob is requested.
|
|
127
121
|
this.throwOnTombstoneLoad =
|
|
128
|
-
this.mc.config.getBoolean(
|
|
129
|
-
this.runtime.
|
|
122
|
+
this.mc.config.getBoolean(gc_1.throwOnTombstoneLoadKey) === true &&
|
|
123
|
+
this.runtime.gcTombstoneEnforcementAllowed &&
|
|
124
|
+
this.runtime.clientDetails.type !== summary_1.summarizerClientType;
|
|
130
125
|
this.runtime.on("disconnected", () => this.onDisconnected());
|
|
131
126
|
this.redirectTable = this.load(snapshot);
|
|
132
127
|
// Begin uploading stashed blobs from previous container instance
|
|
133
128
|
Object.entries(stashedBlobs).forEach(([localId, entry]) => {
|
|
134
129
|
const blob = (0, common_utils_1.stringToBuffer)(entry.blob, "base64");
|
|
130
|
+
if (entry.minTTLInSeconds && entry.uploadTime) {
|
|
131
|
+
const timeLapseSinceLocalUpload = (Date.now() - entry.uploadTime) / 1000;
|
|
132
|
+
// stashed entries with more than half-life in storage will not be reuploaded
|
|
133
|
+
if (entry.minTTLInSeconds - timeLapseSinceLocalUpload > entry.minTTLInSeconds / 2) {
|
|
134
|
+
this.pendingBlobs.set(localId, {
|
|
135
|
+
blob,
|
|
136
|
+
status: PendingBlobStatus.OfflinePendingOp,
|
|
137
|
+
handleP: new common_utils_1.Deferred(),
|
|
138
|
+
uploadP: undefined,
|
|
139
|
+
uploadTime: entry.uploadTime,
|
|
140
|
+
minTTLInSeconds: entry.minTTLInSeconds,
|
|
141
|
+
});
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
135
145
|
this.pendingBlobs.set(localId, {
|
|
136
146
|
blob,
|
|
137
147
|
status: PendingBlobStatus.OfflinePendingUpload,
|
|
@@ -139,6 +149,30 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
139
149
|
uploadP: this.uploadBlob(localId, blob),
|
|
140
150
|
});
|
|
141
151
|
});
|
|
152
|
+
this.sendBlobAttachOp = (localId, blobId) => {
|
|
153
|
+
const pendingEntry = this.pendingBlobs.get(localId);
|
|
154
|
+
if ((pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.uploadTime) && (pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.minTTLInSeconds)) {
|
|
155
|
+
const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
|
|
156
|
+
const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
|
|
157
|
+
this.mc.logger.sendTelemetryEvent({
|
|
158
|
+
eventName: "sendBlobAttach",
|
|
159
|
+
entryStatus: pendingEntry.status,
|
|
160
|
+
secondsSinceUpload,
|
|
161
|
+
minTTLInSeconds: pendingEntry.minTTLInSeconds,
|
|
162
|
+
expired,
|
|
163
|
+
});
|
|
164
|
+
if (expired) {
|
|
165
|
+
// we want to avoid submitting ops with broken handles
|
|
166
|
+
this.closeContainer(new container_utils_1.GenericError("Trying to submit a BlobAttach for expired blob", undefined, {
|
|
167
|
+
localId,
|
|
168
|
+
blobId,
|
|
169
|
+
entryStatus: pendingEntry.status,
|
|
170
|
+
secondsSinceUpload,
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return sendBlobAttachOp(localId, blobId);
|
|
175
|
+
};
|
|
142
176
|
}
|
|
143
177
|
get pendingOfflineUploads() {
|
|
144
178
|
return Array.from(this.pendingBlobs.values()).filter((e) => e.status === PendingBlobStatus.OfflinePendingUpload);
|
|
@@ -174,14 +208,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
174
208
|
}
|
|
175
209
|
}
|
|
176
210
|
}
|
|
177
|
-
/**
|
|
178
|
-
* For a blobId, returns its path in GC's graph. The node path is of the format `/<BlobManager.basePath>/<blobId>`
|
|
179
|
-
* This path must match the path of the blob handle returned by the createBlob API because blobs are marked
|
|
180
|
-
* referenced by storing these handles in a referenced DDS.
|
|
181
|
-
*/
|
|
182
|
-
getBlobGCNodePath(blobId) {
|
|
183
|
-
return `/${BlobManager.basePath}/${blobId}`;
|
|
184
|
-
}
|
|
185
211
|
/**
|
|
186
212
|
* Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
|
|
187
213
|
* detached or there are no (non-pending) attachment blobs in the document
|
|
@@ -217,7 +243,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
217
243
|
storageId = attachedStorageId;
|
|
218
244
|
}
|
|
219
245
|
// Let runtime know that the corresponding GC node was requested.
|
|
220
|
-
this.blobRequested(
|
|
246
|
+
this.blobRequested(getGCNodePathFromBlobId(blobId));
|
|
221
247
|
return telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "AttachmentReadBlob", id: storageId }, async () => {
|
|
222
248
|
return this.getStorage().readBlob(storageId);
|
|
223
249
|
}, { end: true, cancel: "error" });
|
|
@@ -264,11 +290,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
264
290
|
*/
|
|
265
291
|
setRedirection(fromId, toId) {
|
|
266
292
|
this.redirectTable.set(fromId, toId);
|
|
267
|
-
// Notify runtime of a reference added if toId is not undefined. It can be undefined when a blob is uploaded in
|
|
268
|
-
// detached mode. In this case, the entry will be updated when the blob is updated.
|
|
269
|
-
if (toId !== undefined) {
|
|
270
|
-
this.addedBlobReference(this.getBlobGCNodePath(fromId), this.getBlobGCNodePath(toId));
|
|
271
|
-
}
|
|
272
293
|
}
|
|
273
294
|
deleteAndEmitsIfEmpty(id) {
|
|
274
295
|
if (this.pendingBlobs.has(id)) {
|
|
@@ -284,9 +305,8 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
284
305
|
(0, common_utils_1.assert)((entry === null || entry === void 0 ? void 0 : entry.status) === PendingBlobStatus.OnlinePendingUpload ||
|
|
285
306
|
(entry === null || entry === void 0 ? void 0 : entry.status) === PendingBlobStatus.OfflinePendingUpload, 0x386 /* Must have pending blob entry for uploaded blob */);
|
|
286
307
|
entry.storageId = response.id;
|
|
287
|
-
entry.
|
|
308
|
+
entry.uploadTime = Date.now();
|
|
288
309
|
entry.minTTLInSeconds = response.minTTLInSeconds;
|
|
289
|
-
entry.serverUploadTime = this.getCurrentReferenceTimestampMs();
|
|
290
310
|
if (this.runtime.connected) {
|
|
291
311
|
if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
|
|
292
312
|
// Send a blob attach op. This serves two purposes:
|
|
@@ -294,7 +314,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
294
314
|
// until its storage ID is added to the next summary.
|
|
295
315
|
// 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
|
|
296
316
|
// blob from the server via the storage ID.
|
|
297
|
-
this.logTimeInfo(entry, "sendBlobAttachResolveTTL");
|
|
298
317
|
this.sendBlobAttachOp(localId, response.id);
|
|
299
318
|
if (this.storageIds.has(response.id)) {
|
|
300
319
|
// The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
|
|
@@ -358,7 +377,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
358
377
|
* is called on reconnection.
|
|
359
378
|
*/
|
|
360
379
|
if (entry.status !== PendingBlobStatus.OnlinePendingOp) {
|
|
361
|
-
this.logTimeInfo(entry, "sendBlobAttachTransitionOfflineTTL");
|
|
362
380
|
this.sendBlobAttachOp(localId, entry.storageId);
|
|
363
381
|
}
|
|
364
382
|
entry.status =
|
|
@@ -377,9 +395,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
377
395
|
const { localId, blobId } = metadata;
|
|
378
396
|
(0, common_utils_1.assert)(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
|
|
379
397
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
380
|
-
if (pendingEntry) {
|
|
381
|
-
this.logTimeInfo(pendingEntry, "sendBlobAttachResubmitTTL");
|
|
382
|
-
}
|
|
383
398
|
if (!blobId) {
|
|
384
399
|
// We submitted this op while offline. The blob should have been uploaded by now.
|
|
385
400
|
(0, common_utils_1.assert)((pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.status) === PendingBlobStatus.OfflinePendingOp &&
|
|
@@ -388,32 +403,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
388
403
|
}
|
|
389
404
|
return this.sendBlobAttachOp(localId, blobId);
|
|
390
405
|
}
|
|
391
|
-
logTimeInfo(pendingEntry, eventName) {
|
|
392
|
-
var _a, _b;
|
|
393
|
-
let timeLapseSinceLocalUpload = 0;
|
|
394
|
-
let timeLapseSinceServerUpload = 0;
|
|
395
|
-
let expiredUsingLocalTime;
|
|
396
|
-
let expiredUsingServerTime;
|
|
397
|
-
if (pendingEntry.localUploadTime) {
|
|
398
|
-
timeLapseSinceLocalUpload = (Date.now() - pendingEntry.localUploadTime) / 1000;
|
|
399
|
-
expiredUsingLocalTime =
|
|
400
|
-
((_a = pendingEntry.minTTLInSeconds) !== null && _a !== void 0 ? _a : 0) - timeLapseSinceLocalUpload < 0 ? true : false;
|
|
401
|
-
}
|
|
402
|
-
if (pendingEntry.serverUploadTime) {
|
|
403
|
-
timeLapseSinceServerUpload = (Date.now() - pendingEntry.serverUploadTime) / 1000;
|
|
404
|
-
expiredUsingServerTime =
|
|
405
|
-
((_b = pendingEntry.minTTLInSeconds) !== null && _b !== void 0 ? _b : 0) - timeLapseSinceServerUpload < 0 ? true : false;
|
|
406
|
-
}
|
|
407
|
-
this.mc.logger.sendTelemetryEvent({
|
|
408
|
-
eventName,
|
|
409
|
-
entryStatus: pendingEntry.status,
|
|
410
|
-
timeLapseSinceLocalUpload,
|
|
411
|
-
timeLapseSinceServerUpload,
|
|
412
|
-
minTTLInSeconds: pendingEntry.minTTLInSeconds,
|
|
413
|
-
expiredUsingLocalTime,
|
|
414
|
-
expiredUsingServerTime,
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
406
|
processBlobAttachOp(message, local) {
|
|
418
407
|
var _a, _b;
|
|
419
408
|
const localId = (_a = message.metadata) === null || _a === void 0 ? void 0 : _a.localId;
|
|
@@ -490,6 +479,23 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
490
479
|
}
|
|
491
480
|
return table;
|
|
492
481
|
}
|
|
482
|
+
summarize(telemetryContext) {
|
|
483
|
+
// if storageIds is empty, it means we are detached and have only local IDs, or that there are no blobs attached
|
|
484
|
+
const blobIds = this.storageIds.size > 0
|
|
485
|
+
? Array.from(this.storageIds)
|
|
486
|
+
: Array.from(this.redirectTable.keys());
|
|
487
|
+
const builder = new runtime_utils_1.SummaryTreeBuilder();
|
|
488
|
+
blobIds.forEach((blobId) => {
|
|
489
|
+
builder.addAttachment(blobId);
|
|
490
|
+
});
|
|
491
|
+
// Any non-identity entries in the table need to be saved in the summary
|
|
492
|
+
if (this.redirectTable.size > blobIds.length) {
|
|
493
|
+
builder.addBlob(BlobManager.redirectTableBlobName,
|
|
494
|
+
// filter out identity entries
|
|
495
|
+
JSON.stringify(Array.from(this.redirectTable.entries()).filter(([localId, storageId]) => localId !== storageId)));
|
|
496
|
+
}
|
|
497
|
+
return builder.getSummaryTree();
|
|
498
|
+
}
|
|
493
499
|
/**
|
|
494
500
|
* Generates data used for garbage collection. Each blob uploaded represents a node in the GC graph as it can be
|
|
495
501
|
* individually referenced by storing its handle in a referenced DDS. Returns the list of blob ids as GC nodes.
|
|
@@ -500,23 +506,83 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
500
506
|
const gcData = { gcNodes: {} };
|
|
501
507
|
for (const [localId, storageId] of this.redirectTable) {
|
|
502
508
|
(0, common_utils_1.assert)(!!storageId, 0x390 /* Must be attached to get GC data */);
|
|
503
|
-
|
|
509
|
+
// Only return local ids as GC nodes because a blob can only be referenced via its local id. The storage
|
|
510
|
+
// id entries have the same key and value, ignore them.
|
|
511
|
+
// The outbound routes are empty because a blob node cannot reference other nodes. It can only be referenced
|
|
512
|
+
// by adding its handle to a referenced DDS.
|
|
513
|
+
if (localId !== storageId) {
|
|
514
|
+
gcData.gcNodes[getGCNodePathFromBlobId(localId)] = [];
|
|
515
|
+
}
|
|
504
516
|
}
|
|
505
517
|
return gcData;
|
|
506
518
|
}
|
|
507
519
|
/**
|
|
508
520
|
* 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.
|
|
521
|
+
* @param unusedRoutes - The routes of the blob nodes that are unused. These routes will be based off of local ids.
|
|
510
522
|
*/
|
|
511
523
|
updateUnusedRoutes(unusedRoutes) {
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
524
|
+
this.deleteBlobsFromRedirectTable(unusedRoutes);
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Delete attachment blobs that are sweep ready.
|
|
528
|
+
* @param sweepReadyBlobRoutes - The routes of blobs that are sweep ready and should be deleted. These routes will
|
|
529
|
+
* be based off of local ids.
|
|
530
|
+
* @returns - The routes of blobs that were deleted.
|
|
531
|
+
*/
|
|
532
|
+
deleteSweepReadyNodes(sweepReadyBlobRoutes) {
|
|
533
|
+
// If sweep for attachment blobs is not enabled, return empty list indicating nothing is deleted.
|
|
534
|
+
if (this.mc.config.getBoolean(gc_1.sweepAttachmentBlobsKey) !== true) {
|
|
535
|
+
return [];
|
|
536
|
+
}
|
|
537
|
+
this.deleteBlobsFromRedirectTable(sweepReadyBlobRoutes);
|
|
538
|
+
return Array.from(sweepReadyBlobRoutes);
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Delete blobs with the given routes from the redirect table.
|
|
542
|
+
* The routes are GC nodes paths of format -`/<BlobManager.basePath>/<blobId>`. The blob ids are all local ids.
|
|
543
|
+
* Deleting the blobs involves 2 steps:
|
|
544
|
+
* 1. The redirect table entry for the local ids are deleted.
|
|
545
|
+
* 2. If the storage ids corresponding to the deleted local ids are not in-use anymore, the redirect table entries
|
|
546
|
+
* for the storage ids are deleted as well.
|
|
547
|
+
*
|
|
548
|
+
* Note that this does not delete the blobs from storage service immediately. Deleting the blobs from redirect table
|
|
549
|
+
* will remove them the next summary. The service would them delete them some time in the future.
|
|
550
|
+
*/
|
|
551
|
+
deleteBlobsFromRedirectTable(blobRoutes) {
|
|
552
|
+
if (blobRoutes.length === 0) {
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
// This tracks the storage ids of local ids that are deleted. After the local ids have been deleted, if any of
|
|
556
|
+
// these storage ids are unused, they will be deleted as well.
|
|
557
|
+
const maybeUnusedStorageIds = new Set();
|
|
558
|
+
for (const route of blobRoutes) {
|
|
559
|
+
const blobId = getBlobIdFromGCNodePath(route);
|
|
560
|
+
if (!this.redirectTable.has(blobId)) {
|
|
561
|
+
this.mc.logger.sendErrorEvent({
|
|
562
|
+
eventName: "DeletedAttachmentBlobNotFound",
|
|
563
|
+
blobId,
|
|
564
|
+
});
|
|
565
|
+
continue;
|
|
566
|
+
}
|
|
567
|
+
const storageId = this.redirectTable.get(blobId);
|
|
568
|
+
(0, common_utils_1.assert)(!!storageId, 0x5bb /* Must be attached to run GC */);
|
|
569
|
+
maybeUnusedStorageIds.add(storageId);
|
|
518
570
|
this.redirectTable.delete(blobId);
|
|
519
571
|
}
|
|
572
|
+
// Find out storage ids that are in-use and remove them from maybeUnusedStorageIds. A storage id is in-use if
|
|
573
|
+
// the redirect table has a local id -> storage id entry for it.
|
|
574
|
+
for (const [localId, storageId] of this.redirectTable.entries()) {
|
|
575
|
+
(0, common_utils_1.assert)(!!storageId, 0x5bc /* Must be attached to run GC */);
|
|
576
|
+
// For every storage id, the redirect table has a id -> id entry. These do not make the storage id in-use.
|
|
577
|
+
if (maybeUnusedStorageIds.has(storageId) && localId !== storageId) {
|
|
578
|
+
maybeUnusedStorageIds.delete(storageId);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
// For unused storage ids, delete their id -> id entries from the redirect table.
|
|
582
|
+
// This way they'll be absent from the next summary, and the service is free to delete them from storage.
|
|
583
|
+
for (const storageId of maybeUnusedStorageIds) {
|
|
584
|
+
this.redirectTable.delete(storageId);
|
|
585
|
+
}
|
|
520
586
|
}
|
|
521
587
|
/**
|
|
522
588
|
* This is called to update blobs whose routes are tombstones. Tombstoned blobs enable testing scenarios with
|
|
@@ -528,9 +594,8 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
528
594
|
// The routes or blob node paths are in the same format as returned in getGCData -
|
|
529
595
|
// `/<BlobManager.basePath>/<blobId>`.
|
|
530
596
|
for (const route of tombstonedRoutes) {
|
|
531
|
-
const
|
|
532
|
-
|
|
533
|
-
tombstonedBlobsSet.add(pathParts[2]);
|
|
597
|
+
const blobId = getBlobIdFromGCNodePath(route);
|
|
598
|
+
tombstonedBlobsSet.add(blobId);
|
|
534
599
|
}
|
|
535
600
|
// Remove blobs from the tombstone list that were tombstoned but aren't anymore as per the tombstoneRoutes.
|
|
536
601
|
for (const blobId of this.tombstonedBlobs) {
|
|
@@ -555,7 +620,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
555
620
|
* 3. "valid" - It has not been deleted or tombstoned.
|
|
556
621
|
*/
|
|
557
622
|
let state = "valid";
|
|
558
|
-
if (this.isBlobDeleted(
|
|
623
|
+
if (this.isBlobDeleted(getGCNodePathFromBlobId(blobId))) {
|
|
559
624
|
state = "deleted";
|
|
560
625
|
}
|
|
561
626
|
else if (this.tombstonedBlobs.has(blobId)) {
|
|
@@ -569,34 +634,17 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
569
634
|
const shouldFail = state === "deleted" || this.throwOnTombstoneLoad;
|
|
570
635
|
const request = { url: blobId };
|
|
571
636
|
const error = (0, runtime_utils_1.responseToException)((0, runtime_utils_1.createResponseError)(404, "Blob was deleted", request, state === "tombstoned" ? { [containerRuntime_1.TombstoneResponseHeaderKey]: true } : undefined), request);
|
|
572
|
-
(0,
|
|
637
|
+
(0, gc_1.sendGCUnexpectedUsageEvent)(this.mc, {
|
|
573
638
|
eventName: state === "tombstoned"
|
|
574
639
|
? "GC_Tombstone_Blob_Requested"
|
|
575
640
|
: "GC_Deleted_Blob_Requested",
|
|
576
641
|
category: shouldFail ? "error" : "generic",
|
|
577
|
-
|
|
642
|
+
gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
|
|
578
643
|
}, [BlobManager.basePath], error);
|
|
579
644
|
if (shouldFail) {
|
|
580
645
|
throw error;
|
|
581
646
|
}
|
|
582
647
|
}
|
|
583
|
-
summarize(telemetryContext) {
|
|
584
|
-
// if storageIds is empty, it means we are detached and have only local IDs, or that there are no blobs attached
|
|
585
|
-
const blobIds = this.storageIds.size > 0
|
|
586
|
-
? Array.from(this.storageIds)
|
|
587
|
-
: Array.from(this.redirectTable.keys());
|
|
588
|
-
const builder = new runtime_utils_1.SummaryTreeBuilder();
|
|
589
|
-
blobIds.forEach((blobId) => {
|
|
590
|
-
builder.addAttachment(blobId);
|
|
591
|
-
});
|
|
592
|
-
// Any non-identity entries in the table need to be saved in the summary
|
|
593
|
-
if (this.redirectTable.size > blobIds.length) {
|
|
594
|
-
builder.addBlob(BlobManager.redirectTableBlobName,
|
|
595
|
-
// filter out identity entries
|
|
596
|
-
JSON.stringify(Array.from(this.redirectTable.entries()).filter(([localId, storageId]) => localId !== storageId)));
|
|
597
|
-
}
|
|
598
|
-
return builder.getSummaryTree();
|
|
599
|
-
}
|
|
600
648
|
setRedirectTable(table) {
|
|
601
649
|
(0, common_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Detached, 0x252 /* "redirect table can only be set in detached container" */);
|
|
602
650
|
(0, common_utils_1.assert)(this.redirectTable.size === table.size, 0x391 /* Redirect table size must match BlobManager's local ID count */);
|
|
@@ -610,7 +658,13 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
610
658
|
getPendingBlobs() {
|
|
611
659
|
const blobs = {};
|
|
612
660
|
for (const [key, entry] of this.pendingBlobs) {
|
|
613
|
-
blobs[key] =
|
|
661
|
+
blobs[key] = entry.minTTLInSeconds
|
|
662
|
+
? {
|
|
663
|
+
blob: (0, common_utils_1.bufferToString)(entry.blob, "base64"),
|
|
664
|
+
uploadTime: entry.uploadTime,
|
|
665
|
+
minTTLInSeconds: entry.minTTLInSeconds,
|
|
666
|
+
}
|
|
667
|
+
: { blob: (0, common_utils_1.bufferToString)(entry.blob, "base64") };
|
|
614
668
|
}
|
|
615
669
|
return blobs;
|
|
616
670
|
}
|
|
@@ -618,4 +672,20 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
618
672
|
exports.BlobManager = BlobManager;
|
|
619
673
|
BlobManager.basePath = "_blobs";
|
|
620
674
|
BlobManager.redirectTableBlobName = ".redirectTable";
|
|
675
|
+
/**
|
|
676
|
+
* For a blobId, returns its path in GC's graph. The node path is of the format `/<BlobManager.basePath>/<blobId>`.
|
|
677
|
+
* This path must match the path of the blob handle returned by the createBlob API because blobs are marked
|
|
678
|
+
* referenced by storing these handles in a referenced DDS.
|
|
679
|
+
*/
|
|
680
|
+
function getGCNodePathFromBlobId(blobId) {
|
|
681
|
+
return `/${BlobManager.basePath}/${blobId}`;
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* For a given GC node path, return the blobId. The node path is of the format `/<BlobManager.basePath>/<blobId>`.
|
|
685
|
+
*/
|
|
686
|
+
function getBlobIdFromGCNodePath(nodePath) {
|
|
687
|
+
const pathParts = nodePath.split("/");
|
|
688
|
+
(0, common_utils_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x5bd /* Invalid blob node path */);
|
|
689
|
+
return pathParts[2];
|
|
690
|
+
}
|
|
621
691
|
//# sourceMappingURL=blobManager.js.map
|