@fluidframework/container-runtime 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.4.1.0.148229
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/.eslintrc.js +21 -10
- package/.mocharc.js +2 -2
- package/api-extractor.json +2 -2
- package/dist/batchTracker.d.ts +1 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +2 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +74 -42
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +321 -152
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +11 -9
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js +3 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +148 -114
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +534 -342
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +11 -9
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +40 -13
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +146 -66
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +7 -3
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +3 -1
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/dataStores.d.ts +39 -12
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +164 -76
- 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/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +8 -3
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +204 -0
- package/dist/gc/garbageCollection.d.ts.map +1 -0
- package/dist/gc/garbageCollection.js +926 -0
- 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/{lib → dist/gc}/gcSweepReadyUsageDetection.d.ts +5 -5
- package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
- package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +15 -11
- 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 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +10 -0
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +37 -8
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +29 -1
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +3 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +46 -17
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +6 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +72 -18
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +46 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +142 -5
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +23 -2
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +101 -51
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +17 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.d.ts.map +1 -1
- package/dist/opProperties.js +1 -3
- 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 +6 -15
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +137 -165
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +0 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +11 -21
- package/dist/scheduleManager.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 +46 -0
- package/dist/summary/index.js.map +1 -0
- package/dist/summary/orderedClientElection.d.ts.map +1 -0
- package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +10 -4
- package/dist/summary/orderedClientElection.js.map +1 -0
- package/{lib → dist/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 +19 -18
- package/dist/summary/runningSummarizer.d.ts.map +1 -0
- package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +191 -77
- package/dist/summary/runningSummarizer.js.map +1 -0
- package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +6 -12
- package/dist/summary/summarizer.d.ts.map +1 -0
- package/dist/{summarizer.js → summary/summarizer.js} +32 -76
- package/dist/summary/summarizer.js.map +1 -0
- package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +1 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -0
- package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +3 -30
- package/dist/summary/summarizerClientElection.js.map +1 -0
- package/dist/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
- package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +9 -12
- 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 +22 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +423 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/{lib → dist/summary}/summarizerTypes.d.ts +29 -42
- 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/{summaryCollection.js → summary/summaryCollection.js} +18 -8
- 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} +19 -21
- package/dist/summary/summaryFormat.js.map +1 -0
- package/dist/summary/summaryGenerator.d.ts.map +1 -0
- package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +34 -16
- 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/{summaryManager.js → summary/summaryManager.js} +21 -9
- package/dist/summary/summaryManager.js.map +1 -0
- package/dist/throttler.d.ts +2 -2
- package/dist/throttler.d.ts.map +1 -1
- package/dist/throttler.js +4 -4
- package/dist/throttler.js.map +1 -1
- package/lib/batchTracker.d.ts +1 -2
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +74 -42
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +322 -153
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +11 -9
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js +3 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +148 -114
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +506 -314
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +11 -9
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +40 -13
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +136 -56
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +7 -3
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js +3 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/dataStores.d.ts +39 -12
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +162 -74
- 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/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +9 -4
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +204 -0
- package/lib/gc/garbageCollection.d.ts.map +1 -0
- package/lib/gc/garbageCollection.js +922 -0
- 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/{dist → lib/gc}/gcSweepReadyUsageDetection.d.ts +5 -5
- package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
- package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +15 -11
- 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 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -6
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +10 -0
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +35 -7
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +29 -1
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +3 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +47 -18
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +6 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +72 -18
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +46 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +141 -5
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +23 -2
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +103 -53
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +17 -2
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.d.ts.map +1 -1
- package/lib/opProperties.js +1 -3
- 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 +6 -15
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +137 -165
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts +0 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +11 -21
- package/lib/scheduleManager.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 +15 -0
- package/lib/summary/index.js.map +1 -0
- package/lib/summary/orderedClientElection.d.ts.map +1 -0
- package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +10 -4
- package/lib/summary/orderedClientElection.js.map +1 -0
- package/{dist → lib/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 +19 -18
- package/lib/summary/runningSummarizer.d.ts.map +1 -0
- package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +193 -79
- package/lib/summary/runningSummarizer.js.map +1 -0
- package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +6 -12
- package/lib/summary/summarizer.d.ts.map +1 -0
- package/lib/{summarizer.js → summary/summarizer.js} +34 -78
- package/lib/summary/summarizer.js.map +1 -0
- package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +1 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -0
- package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +3 -30
- package/lib/summary/summarizerClientElection.js.map +1 -0
- package/lib/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
- package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +9 -12
- 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 +22 -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 +29 -42
- 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/{summaryCollection.js → summary/summaryCollection.js} +18 -8
- 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} +20 -21
- package/lib/summary/summaryFormat.js.map +1 -0
- package/lib/summary/summaryGenerator.d.ts.map +1 -0
- package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +34 -16
- 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/{summaryManager.js → summary/summaryManager.js} +21 -9
- package/lib/summary/summaryManager.js.map +1 -0
- package/lib/throttler.d.ts +2 -2
- package/lib/throttler.d.ts.map +1 -1
- package/lib/throttler.js +4 -4
- package/lib/throttler.js.map +1 -1
- package/package.json +67 -61
- package/prettier.config.cjs +1 -1
- package/src/batchTracker.ts +55 -50
- package/src/blobManager.ts +863 -594
- package/src/connectionTelemetry.ts +280 -249
- package/src/containerHandleContext.ts +27 -29
- package/src/containerRuntime.ts +3174 -2805
- package/src/dataStore.ts +172 -159
- package/src/dataStoreContext.ts +1141 -993
- package/src/dataStoreContexts.ts +178 -161
- package/src/dataStoreRegistry.ts +25 -20
- package/src/dataStores.ts +887 -716
- package/src/deltaManagerSummarizerProxy.ts +46 -0
- package/src/deltaScheduler.ts +158 -150
- package/{garbageCollection.md → src/gc/garbageCollection.md} +16 -3
- package/src/gc/garbageCollection.ts +1250 -0
- package/src/gc/gcConfigs.ts +193 -0
- package/src/gc/gcDefinitions.ts +387 -0
- package/src/gc/gcHelpers.ts +332 -0
- package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
- package/src/gc/gcSummaryDefinitions.ts +54 -0
- package/src/gc/gcSummaryStateTracker.ts +329 -0
- package/src/gc/gcSweepReadyUsageDetection.ts +145 -0
- package/src/gc/gcUnreferencedStateTracker.ts +114 -0
- package/src/gc/index.ts +65 -0
- package/src/index.ts +61 -75
- package/src/opLifecycle/README.md +157 -0
- package/src/opLifecycle/batchManager.ts +119 -86
- package/src/opLifecycle/definitions.ts +49 -19
- package/src/opLifecycle/index.ts +7 -6
- package/src/opLifecycle/opCompressor.ts +78 -40
- package/src/opLifecycle/opDecompressor.ts +148 -64
- package/src/opLifecycle/opSplitter.ts +269 -66
- package/src/opLifecycle/outbox.ts +268 -184
- package/src/opLifecycle/remoteMessageProcessor.ts +63 -47
- package/src/opProperties.ts +11 -9
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +386 -381
- package/src/scheduleManager.ts +299 -280
- package/src/storageServiceWithAttachBlobs.ts +38 -0
- package/src/summary/index.ts +105 -0
- package/src/summary/orderedClientElection.ts +564 -0
- package/src/summary/runWhileConnectedCoordinator.ts +113 -0
- package/src/summary/runningSummarizer.ts +788 -0
- package/src/summary/summarizer.ts +372 -0
- package/src/summary/summarizerClientElection.ts +139 -0
- package/src/summary/summarizerHeuristics.ts +224 -0
- 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/summary/summarizerTypes.ts +507 -0
- package/src/summary/summaryCollection.ts +450 -0
- package/src/summary/summaryFormat.ts +228 -0
- package/src/summary/summaryGenerator.ts +505 -0
- package/src/summary/summaryManager.ts +423 -0
- package/src/throttler.ts +131 -122
- package/tsconfig.esnext.json +6 -6
- package/tsconfig.json +9 -13
- package/dist/garbageCollection.d.ts +0 -387
- package/dist/garbageCollection.d.ts.map +0 -1
- package/dist/garbageCollection.js +0 -1138
- package/dist/garbageCollection.js.map +0 -1
- package/dist/garbageCollectionConstants.d.ts +0 -19
- package/dist/garbageCollectionConstants.d.ts.map +0 -1
- package/dist/garbageCollectionConstants.js +0 -34
- package/dist/garbageCollectionConstants.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 -108
- 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 -387
- package/lib/garbageCollection.d.ts.map +0 -1
- package/lib/garbageCollection.js +0 -1133
- package/lib/garbageCollection.js.map +0 -1
- package/lib/garbageCollectionConstants.d.ts +0 -19
- package/lib/garbageCollectionConstants.d.ts.map +0 -1
- package/lib/garbageCollectionConstants.js +0 -31
- package/lib/garbageCollectionConstants.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 -104
- 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/garbageCollection.ts +0 -1646
- package/src/garbageCollectionConstants.ts +0 -35
- package/src/gcSweepReadyUsageDetection.ts +0 -139
- package/src/orderedClientElection.ts +0 -532
- package/src/runWhileConnectedCoordinator.ts +0 -106
- package/src/runningSummarizer.ts +0 -611
- package/src/serializedSnapshotStorage.ts +0 -146
- package/src/summarizer.ts +0 -421
- package/src/summarizerClientElection.ts +0 -161
- package/src/summarizerHandle.ts +0 -21
- package/src/summarizerHeuristics.ts +0 -222
- package/src/summarizerTypes.ts +0 -510
- package/src/summaryCollection.ts +0 -421
- package/src/summaryFormat.ts +0 -235
- package/src/summaryGenerator.ts +0 -446
- package/src/summaryManager.ts +0 -394
- /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
- /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
- /package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
- /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
- /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
- /package/lib/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
package/lib/dataStores.js
CHANGED
|
@@ -2,35 +2,35 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { DataCorruptionError, extractSafePropertiesFromMessage } from "@fluidframework/container-utils";
|
|
5
|
+
import { DataCorruptionError, extractSafePropertiesFromMessage, } from "@fluidframework/container-utils";
|
|
6
6
|
import { FluidObjectHandle } from "@fluidframework/datastore";
|
|
7
7
|
import { channelsTreeName, CreateSummarizerNodeSource, } from "@fluidframework/runtime-definitions";
|
|
8
|
-
import { convertSnapshotTreeToSummaryTree, convertToSummaryTree, create404Response, createResponseError,
|
|
9
|
-
import { ChildLogger, loggerToMonitoringContext, LoggingError, TelemetryDataTag } from "@fluidframework/telemetry-utils";
|
|
8
|
+
import { convertSnapshotTreeToSummaryTree, convertToSummaryTree, create404Response, createResponseError, GCDataBuilder, responseToException, SummaryTreeBuilder, unpackChildNodesUsedRoutes, } from "@fluidframework/runtime-utils";
|
|
9
|
+
import { ChildLogger, loggerToMonitoringContext, LoggingError, TelemetryDataTag, } from "@fluidframework/telemetry-utils";
|
|
10
10
|
import { AttachState } from "@fluidframework/container-definitions";
|
|
11
|
-
import {
|
|
12
|
-
import { assert, Lazy
|
|
11
|
+
import { buildSnapshotTree } from "@fluidframework/driver-utils";
|
|
12
|
+
import { assert, Lazy } from "@fluidframework/common-utils";
|
|
13
13
|
import { v4 as uuid } from "uuid";
|
|
14
|
-
import { GCDataBuilder, unpackChildNodesUsedRoutes } from "@fluidframework/garbage-collector";
|
|
15
14
|
import { DataStoreContexts } from "./dataStoreContexts";
|
|
15
|
+
import { defaultRuntimeHeaderData, TombstoneResponseHeaderKey, } from "./containerRuntime";
|
|
16
16
|
import { RemoteFluidDataStoreContext, LocalFluidDataStoreContext, createAttributesBlob, LocalDetachedFluidDataStoreContext, } from "./dataStoreContext";
|
|
17
|
-
import {
|
|
17
|
+
import { StorageServiceWithAttachBlobs } from "./storageServiceWithAttachBlobs";
|
|
18
18
|
import { isDataStoreAliasMessage } from "./dataStore";
|
|
19
|
-
import { GCNodeType } from "./
|
|
20
|
-
import {
|
|
21
|
-
import { summarizerClientType } from "./summarizerClientElection";
|
|
19
|
+
import { GCNodeType, sweepDatastoresKey, throwOnTombstoneLoadKey, sendGCUnexpectedUsageEvent, } from "./gc";
|
|
20
|
+
import { summarizerClientType, nonDataStorePaths, rootHasIsolatedChannels, } from "./summary";
|
|
22
21
|
/**
|
|
23
22
|
* This class encapsulates data store handling. Currently it is only used by the container runtime,
|
|
24
23
|
* but eventually could be hosted on any channel once we formalize the channel api boundary.
|
|
25
24
|
*/
|
|
26
25
|
export class DataStores {
|
|
27
|
-
constructor(baseSnapshot, runtime, submitAttachFn, getCreateChildSummarizerNodeFn, deleteChildSummarizerNodeFn, baseLogger,
|
|
26
|
+
constructor(baseSnapshot, runtime, submitAttachFn, getCreateChildSummarizerNodeFn, deleteChildSummarizerNodeFn, baseLogger, gcNodeUpdated, isDataStoreDeleted, aliasMap, contexts = new DataStoreContexts(baseLogger)) {
|
|
28
27
|
this.baseSnapshot = baseSnapshot;
|
|
29
28
|
this.runtime = runtime;
|
|
30
29
|
this.submitAttachFn = submitAttachFn;
|
|
31
30
|
this.getCreateChildSummarizerNodeFn = getCreateChildSummarizerNodeFn;
|
|
32
31
|
this.deleteChildSummarizerNodeFn = deleteChildSummarizerNodeFn;
|
|
33
32
|
this.gcNodeUpdated = gcNodeUpdated;
|
|
33
|
+
this.isDataStoreDeleted = isDataStoreDeleted;
|
|
34
34
|
this.aliasMap = aliasMap;
|
|
35
35
|
this.contexts = contexts;
|
|
36
36
|
// Stores tracked by the Domain
|
|
@@ -45,17 +45,10 @@ export class DataStores {
|
|
|
45
45
|
this.dispose = () => this.disposeOnce.value;
|
|
46
46
|
this.mc = loggerToMonitoringContext(ChildLogger.create(baseLogger));
|
|
47
47
|
this.containerRuntimeHandle = new FluidObjectHandle(this.runtime, "/", this.runtime.IFluidHandleContext);
|
|
48
|
-
const baseGCDetailsP = new LazyPromise(async () => {
|
|
49
|
-
return getBaseGCDetails();
|
|
50
|
-
});
|
|
51
|
-
// Returns the base GC details for the data store with the given id.
|
|
52
|
-
const dataStoreBaseGCDetails = async (dataStoreId) => {
|
|
53
|
-
const baseGCDetails = await baseGCDetailsP;
|
|
54
|
-
return baseGCDetails.get(dataStoreId);
|
|
55
|
-
};
|
|
56
48
|
// Tombstone should only throw when the feature flag is enabled and the client isn't a summarizer
|
|
57
|
-
this.
|
|
58
|
-
this.mc.config.getBoolean(
|
|
49
|
+
this.throwOnTombstoneLoad =
|
|
50
|
+
this.mc.config.getBoolean(throwOnTombstoneLoadKey) === true &&
|
|
51
|
+
this.runtime.gcTombstoneEnforcementAllowed &&
|
|
59
52
|
this.runtime.clientDetails.type !== summarizerClientType;
|
|
60
53
|
// Extract stores stored inside the snapshot
|
|
61
54
|
const fluidDataStores = new Map();
|
|
@@ -77,11 +70,12 @@ export class DataStores {
|
|
|
77
70
|
dataStoreContext = new RemoteFluidDataStoreContext({
|
|
78
71
|
id: key,
|
|
79
72
|
snapshotTree: value,
|
|
80
|
-
getBaseGCDetails: async () => dataStoreBaseGCDetails(key),
|
|
81
73
|
runtime: this.runtime,
|
|
82
74
|
storage: this.runtime.storage,
|
|
83
75
|
scope: this.runtime.scope,
|
|
84
|
-
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {
|
|
76
|
+
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {
|
|
77
|
+
type: CreateSummarizerNodeSource.FromSummary,
|
|
78
|
+
}),
|
|
85
79
|
});
|
|
86
80
|
}
|
|
87
81
|
else {
|
|
@@ -95,7 +89,9 @@ export class DataStores {
|
|
|
95
89
|
runtime: this.runtime,
|
|
96
90
|
storage: this.runtime.storage,
|
|
97
91
|
scope: this.runtime.scope,
|
|
98
|
-
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {
|
|
92
|
+
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {
|
|
93
|
+
type: CreateSummarizerNodeSource.FromSummary,
|
|
94
|
+
}),
|
|
99
95
|
makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(key),
|
|
100
96
|
snapshotTree,
|
|
101
97
|
isRootDataStore: undefined,
|
|
@@ -140,10 +136,10 @@ export class DataStores {
|
|
|
140
136
|
} }));
|
|
141
137
|
throw error;
|
|
142
138
|
}
|
|
143
|
-
const
|
|
139
|
+
const flatAttachBlobs = new Map();
|
|
144
140
|
let snapshotTree;
|
|
145
141
|
if (attachMessage.snapshot) {
|
|
146
|
-
snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries,
|
|
142
|
+
snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatAttachBlobs);
|
|
147
143
|
}
|
|
148
144
|
// Include the type of attach message which is the pkg of the store to be
|
|
149
145
|
// used by RemoteFluidDataStoreContext in case it is not in the snapshot.
|
|
@@ -151,10 +147,8 @@ export class DataStores {
|
|
|
151
147
|
const remoteFluidDataStoreContext = new RemoteFluidDataStoreContext({
|
|
152
148
|
id: attachMessage.id,
|
|
153
149
|
snapshotTree,
|
|
154
|
-
// New data stores begin with empty GC details since GC hasn't run on them yet.
|
|
155
|
-
getBaseGCDetails: async () => { return {}; },
|
|
156
150
|
runtime: this.runtime,
|
|
157
|
-
storage: new
|
|
151
|
+
storage: new StorageServiceWithAttachBlobs(this.runtime.storage, flatAttachBlobs),
|
|
158
152
|
scope: this.runtime.scope,
|
|
159
153
|
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(attachMessage.id, {
|
|
160
154
|
type: CreateSummarizerNodeSource.FromAttach,
|
|
@@ -229,7 +223,9 @@ export class DataStores {
|
|
|
229
223
|
runtime: this.runtime,
|
|
230
224
|
storage: this.runtime.storage,
|
|
231
225
|
scope: this.runtime.scope,
|
|
232
|
-
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {
|
|
226
|
+
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {
|
|
227
|
+
type: CreateSummarizerNodeSource.Local,
|
|
228
|
+
}),
|
|
233
229
|
makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),
|
|
234
230
|
snapshotTree: undefined,
|
|
235
231
|
isRootDataStore: isRoot,
|
|
@@ -245,7 +241,9 @@ export class DataStores {
|
|
|
245
241
|
runtime: this.runtime,
|
|
246
242
|
storage: this.runtime.storage,
|
|
247
243
|
scope: this.runtime.scope,
|
|
248
|
-
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {
|
|
244
|
+
createSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {
|
|
245
|
+
type: CreateSummarizerNodeSource.Local,
|
|
246
|
+
}),
|
|
249
247
|
makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),
|
|
250
248
|
snapshotTree: undefined,
|
|
251
249
|
isRootDataStore: false,
|
|
@@ -254,7 +252,9 @@ export class DataStores {
|
|
|
254
252
|
this.contexts.addUnbound(context);
|
|
255
253
|
return context;
|
|
256
254
|
}
|
|
257
|
-
get disposed() {
|
|
255
|
+
get disposed() {
|
|
256
|
+
return this.disposeOnce.evaluated;
|
|
257
|
+
}
|
|
258
258
|
resubmitDataStoreOp(content, localOpMetadata) {
|
|
259
259
|
const envelope = content;
|
|
260
260
|
const context = this.contexts.get(envelope.address);
|
|
@@ -281,6 +281,8 @@ export class DataStores {
|
|
|
281
281
|
processFluidDataStoreOp(message, local, localMessageMetadata) {
|
|
282
282
|
const envelope = message.contents;
|
|
283
283
|
const transformed = Object.assign(Object.assign({}, message), { contents: envelope.contents });
|
|
284
|
+
const request = { url: envelope.address };
|
|
285
|
+
this.validateNotDeleted(envelope.address, request);
|
|
284
286
|
const context = this.contexts.get(envelope.address);
|
|
285
287
|
assert(!!context, 0x162 /* "There should be a store context for the op" */);
|
|
286
288
|
context.process(transformed, local, localMessageMetadata);
|
|
@@ -288,32 +290,70 @@ export class DataStores {
|
|
|
288
290
|
// being used.
|
|
289
291
|
this.gcNodeUpdated(`/${envelope.address}`, message.timestamp, context.isLoaded ? context.packagePath : undefined);
|
|
290
292
|
}
|
|
291
|
-
async getDataStore(id,
|
|
292
|
-
const
|
|
293
|
+
async getDataStore(id, requestHeaderData) {
|
|
294
|
+
const headerData = Object.assign(Object.assign({}, defaultRuntimeHeaderData), requestHeaderData);
|
|
293
295
|
const request = { url: id };
|
|
296
|
+
this.validateNotDeleted(id, request, headerData);
|
|
297
|
+
const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
|
|
294
298
|
if (context === undefined) {
|
|
295
299
|
// The requested data store does not exits. Throw a 404 response exception.
|
|
296
300
|
throw responseToException(create404Response(request), request);
|
|
297
301
|
}
|
|
302
|
+
this.validateNotTombstoned(context, request, requestHeaderData);
|
|
303
|
+
return context;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Validate that the data store had not been deleted by GC.
|
|
307
|
+
*
|
|
308
|
+
* @param id - data store id
|
|
309
|
+
* @param request - the request information to log if the validation detects the data store has been deleted
|
|
310
|
+
* @param requestHeaderData - the request header information to log if the validation detects the data store has been deleted
|
|
311
|
+
*/
|
|
312
|
+
validateNotDeleted(id, request, requestHeaderData) {
|
|
313
|
+
const dataStoreNodePath = `/${id}`;
|
|
314
|
+
if (this.isDataStoreDeleted(dataStoreNodePath)) {
|
|
315
|
+
assert(!this.contexts.has(id), 0x570 /* Inconsistent state! GC says the data store is deleted, but the data store is not deleted from the runtime. */);
|
|
316
|
+
// The requested data store is removed by gc. Create a 404 gc response exception.
|
|
317
|
+
const error = responseToException(createResponseError(404, "DataStore was deleted", request), request);
|
|
318
|
+
sendGCUnexpectedUsageEvent(this.mc, {
|
|
319
|
+
eventName: "GC_Deleted_DataStore_Requested",
|
|
320
|
+
category: "error",
|
|
321
|
+
isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
|
|
322
|
+
headers: JSON.stringify(requestHeaderData),
|
|
323
|
+
gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
|
|
324
|
+
}, undefined /** packagePath */, error);
|
|
325
|
+
throw error;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Validates that the data store context requested has not been marked as tombstone by GC.
|
|
330
|
+
*
|
|
331
|
+
* @param context - the data store context in question
|
|
332
|
+
* @param request - the request information to log if the validation detects the data store has been tombstoned
|
|
333
|
+
* @param headerData - the request header information to log if the validation detects the data store has been tombstoned
|
|
334
|
+
*/
|
|
335
|
+
validateNotTombstoned(context, request, headerData) {
|
|
298
336
|
if (context.tombstoned) {
|
|
337
|
+
const shouldFail = this.throwOnTombstoneLoad && !headerData.allowTombstone;
|
|
299
338
|
// The requested data store is removed by gc. Create a 404 gc response exception.
|
|
300
|
-
const error = responseToException(createResponseError(404, "
|
|
301
|
-
|
|
302
|
-
|
|
339
|
+
const error = responseToException(createResponseError(404, "DataStore was deleted", request, {
|
|
340
|
+
[TombstoneResponseHeaderKey]: true,
|
|
341
|
+
}), request);
|
|
342
|
+
sendGCUnexpectedUsageEvent(this.mc, {
|
|
303
343
|
eventName: "GC_Tombstone_DataStore_Requested",
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
if (this.throwOnTombstoneUsage) {
|
|
344
|
+
category: shouldFail ? "error" : "generic",
|
|
345
|
+
isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
|
|
346
|
+
headers: JSON.stringify(headerData),
|
|
347
|
+
gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
|
|
348
|
+
}, context.isLoaded ? context.packagePath : undefined, error);
|
|
349
|
+
if (shouldFail) {
|
|
311
350
|
throw error;
|
|
312
351
|
}
|
|
313
352
|
}
|
|
314
|
-
return context;
|
|
315
353
|
}
|
|
316
354
|
processSignal(address, message, local) {
|
|
355
|
+
const request = { url: address };
|
|
356
|
+
this.validateNotDeleted(address, request);
|
|
317
357
|
const context = this.contexts.get(address);
|
|
318
358
|
if (!context) {
|
|
319
359
|
// Attach message may not have been processed yet
|
|
@@ -339,6 +379,10 @@ export class DataStores {
|
|
|
339
379
|
eventName: "SetConnectionStateError",
|
|
340
380
|
clientId,
|
|
341
381
|
fluidDataStore,
|
|
382
|
+
details: JSON.stringify({
|
|
383
|
+
runtimeConnected: this.runtime.connected,
|
|
384
|
+
connected,
|
|
385
|
+
}),
|
|
342
386
|
}, error);
|
|
343
387
|
}
|
|
344
388
|
}
|
|
@@ -360,10 +404,12 @@ export class DataStores {
|
|
|
360
404
|
// Iterate over each store and ask it to snapshot
|
|
361
405
|
await Promise.all(Array.from(this.contexts)
|
|
362
406
|
.filter(([_, context]) => {
|
|
363
|
-
// Summarizer works only with clients with no local changes
|
|
364
|
-
|
|
407
|
+
// Summarizer works only with clients with no local changes. A data store in attaching
|
|
408
|
+
// state indicates an op was sent to attach a local data store.
|
|
409
|
+
assert(context.attachState !== AttachState.Attaching, 0x588 /* Local data store detected in attaching state during summarize */);
|
|
365
410
|
return context.attachState === AttachState.Attached;
|
|
366
|
-
})
|
|
411
|
+
})
|
|
412
|
+
.map(async ([contextId, context]) => {
|
|
367
413
|
const contextSummary = await context.summarize(fullTree, trackState, telemetryContext);
|
|
368
414
|
summaryBuilder.addWithStats(contextId, contextSummary);
|
|
369
415
|
}));
|
|
@@ -383,9 +429,9 @@ export class DataStores {
|
|
|
383
429
|
// Take summary of bounded data stores only, make sure we haven't summarized them already
|
|
384
430
|
// and no attach op has been fired for that data store because for loader versions <= 0.24
|
|
385
431
|
// we set attach state as "attaching" before taking createNew summary.
|
|
386
|
-
!(this.contexts.isNotBound(key)
|
|
387
|
-
|
|
388
|
-
|
|
432
|
+
!(this.contexts.isNotBound(key) ||
|
|
433
|
+
builderTree[key] ||
|
|
434
|
+
this.attachOpFiredForDataStore.has(key)))
|
|
389
435
|
.map(([key, value]) => {
|
|
390
436
|
let dataStoreSummary;
|
|
391
437
|
if (value.isLoaded) {
|
|
@@ -438,10 +484,12 @@ export class DataStores {
|
|
|
438
484
|
// Iterate over each store and get their GC data.
|
|
439
485
|
await Promise.all(Array.from(this.contexts)
|
|
440
486
|
.filter(([_, context]) => {
|
|
441
|
-
//
|
|
442
|
-
//
|
|
487
|
+
// Summarizer client and hence GC works only with clients with no local changes. A data store in
|
|
488
|
+
// attaching state indicates an op was sent to attach a local data store.
|
|
489
|
+
assert(context.attachState !== AttachState.Attaching, 0x589 /* Local data store detected in attaching state while running GC */);
|
|
443
490
|
return context.attachState === AttachState.Attached;
|
|
444
|
-
})
|
|
491
|
+
})
|
|
492
|
+
.map(async ([contextId, context]) => {
|
|
445
493
|
const contextGCData = await context.getGCData(fullGC);
|
|
446
494
|
// Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.
|
|
447
495
|
// This also gradually builds the id of each node to be a path from the root.
|
|
@@ -462,10 +510,6 @@ export class DataStores {
|
|
|
462
510
|
// Verify that the used routes are correct.
|
|
463
511
|
for (const [id] of usedDataStoreRoutes) {
|
|
464
512
|
assert(this.contexts.has(id), 0x167 /* "Used route does not belong to any known data store" */);
|
|
465
|
-
// Revive datastores regardless of whether or not tombstone the tombstone flag is flipped
|
|
466
|
-
const dataStore = this.contexts.get(id);
|
|
467
|
-
assert(dataStore !== undefined, 0x46e /* No data store retrieved with specified id */);
|
|
468
|
-
dataStore.setTombstone(false /* tombstone */);
|
|
469
513
|
}
|
|
470
514
|
// Update the used routes in each data store. Used routes is empty for unused data stores.
|
|
471
515
|
for (const [contextId, context] of this.contexts) {
|
|
@@ -473,13 +517,10 @@ export class DataStores {
|
|
|
473
517
|
}
|
|
474
518
|
}
|
|
475
519
|
/**
|
|
476
|
-
* This is called to update objects whose routes are unused. The unused objects are
|
|
477
|
-
* tombstones.
|
|
520
|
+
* This is called to update objects whose routes are unused. The unused objects are deleted.
|
|
478
521
|
* @param unusedRoutes - The routes that are unused in all data stores in this Container.
|
|
479
|
-
* @param tombstone - if true, the objects corresponding to unused routes are marked tombstones. Otherwise, they
|
|
480
|
-
* are deleted.
|
|
481
522
|
*/
|
|
482
|
-
updateUnusedRoutes(unusedRoutes
|
|
523
|
+
updateUnusedRoutes(unusedRoutes) {
|
|
483
524
|
for (const route of unusedRoutes) {
|
|
484
525
|
const pathParts = route.split("/");
|
|
485
526
|
// Delete data store only if its route (/datastoreId) is in unusedRoutes. We don't want to delete a data
|
|
@@ -489,23 +530,70 @@ export class DataStores {
|
|
|
489
530
|
}
|
|
490
531
|
const dataStoreId = pathParts[1];
|
|
491
532
|
assert(this.contexts.has(dataStoreId), 0x2d7 /* No data store with specified id */);
|
|
492
|
-
/**
|
|
493
|
-
* When running GC in tombstone mode, datastore contexts are tombstoned. Tombstoned datastore contexts
|
|
494
|
-
* enable testing scenarios with accessing deleted content without actually deleting content from
|
|
495
|
-
* summaries.
|
|
496
|
-
*/
|
|
497
|
-
if (tombstone) {
|
|
498
|
-
const dataStore = this.contexts.get(dataStoreId);
|
|
499
|
-
assert(dataStore !== undefined, 0x442 /* No data store retrieved with specified id */);
|
|
500
|
-
dataStore.setTombstone(true /* tombstone */);
|
|
501
|
-
continue;
|
|
502
|
-
}
|
|
503
533
|
// Delete the contexts of unused data stores.
|
|
504
534
|
this.contexts.delete(dataStoreId);
|
|
505
535
|
// Delete the summarizer node of the unused data stores.
|
|
506
536
|
this.deleteChildSummarizerNodeFn(dataStoreId);
|
|
507
537
|
}
|
|
508
538
|
}
|
|
539
|
+
/**
|
|
540
|
+
* Delete data stores and its objects that are sweep ready.
|
|
541
|
+
* @param sweepReadyDataStoreRoutes - The routes of data stores and its objects that are sweep ready and should
|
|
542
|
+
* be deleted.
|
|
543
|
+
* @returns - The routes of data stores and its objects that were deleted.
|
|
544
|
+
*/
|
|
545
|
+
deleteSweepReadyNodes(sweepReadyDataStoreRoutes) {
|
|
546
|
+
// If sweep for data stores is not enabled, return empty list indicating nothing is deleted.
|
|
547
|
+
if (this.mc.config.getBoolean(sweepDatastoresKey) !== true) {
|
|
548
|
+
return [];
|
|
549
|
+
}
|
|
550
|
+
for (const route of sweepReadyDataStoreRoutes) {
|
|
551
|
+
const pathParts = route.split("/");
|
|
552
|
+
const dataStoreId = pathParts[1];
|
|
553
|
+
// TODO: GC:Validation - Skip any routes already deleted
|
|
554
|
+
// Ignore sub-data store routes because a data store and its sub-routes are deleted together, so, we only
|
|
555
|
+
// need to delete the data store.
|
|
556
|
+
if (pathParts.length > 2) {
|
|
557
|
+
continue;
|
|
558
|
+
}
|
|
559
|
+
if (!this.contexts.has(dataStoreId)) {
|
|
560
|
+
this.mc.logger.sendErrorEvent({
|
|
561
|
+
eventName: "DeletedDataStoreNotFound",
|
|
562
|
+
dataStoreId,
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
const dataStore = this.contexts.get(dataStoreId);
|
|
566
|
+
assert(dataStore !== undefined, 0x571 /* Attempting to delete unknown dataStore */);
|
|
567
|
+
dataStore.delete();
|
|
568
|
+
// Delete the contexts of sweep ready data stores.
|
|
569
|
+
this.contexts.delete(dataStoreId);
|
|
570
|
+
// Delete the summarizer node of the sweep ready data stores.
|
|
571
|
+
this.deleteChildSummarizerNodeFn(dataStoreId);
|
|
572
|
+
}
|
|
573
|
+
return Array.from(sweepReadyDataStoreRoutes);
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* This is called to update objects whose routes are tombstones. Tombstoned datastore contexts enable testing
|
|
577
|
+
* scenarios with accessing deleted content without actually deleting content from summaries.
|
|
578
|
+
* @param tombstonedRoutes - The routes that are tombstones in all data stores in this Container.
|
|
579
|
+
*/
|
|
580
|
+
updateTombstonedRoutes(tombstonedRoutes) {
|
|
581
|
+
const tombstonedDataStoresSet = new Set();
|
|
582
|
+
for (const route of tombstonedRoutes) {
|
|
583
|
+
const pathParts = route.split("/");
|
|
584
|
+
// Tombstone data store only if its route (/datastoreId) is directly in tombstoneRoutes.
|
|
585
|
+
if (pathParts.length > 2) {
|
|
586
|
+
continue;
|
|
587
|
+
}
|
|
588
|
+
const dataStoreId = pathParts[1];
|
|
589
|
+
assert(this.contexts.has(dataStoreId), 0x510 /* No data store with specified id */);
|
|
590
|
+
tombstonedDataStoresSet.add(dataStoreId);
|
|
591
|
+
}
|
|
592
|
+
// Update the used routes in each data store. Used routes is empty for unused data stores.
|
|
593
|
+
for (const [contextId, context] of this.contexts) {
|
|
594
|
+
context.setTombstone(tombstonedDataStoresSet.has(contextId));
|
|
595
|
+
}
|
|
596
|
+
}
|
|
509
597
|
/**
|
|
510
598
|
* Returns the outbound routes of this channel. Only root data stores are considered referenced and their paths are
|
|
511
599
|
* part of outbound routes.
|