@fluidframework/container-runtime 2.0.0-internal.3.1.0 → 2.0.0-internal.3.2.1
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/dist/blobManager.d.ts +6 -0
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +31 -6
- package/dist/blobManager.js.map +1 -1
- package/dist/containerRuntime.d.ts +17 -15
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +158 -121
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +21 -12
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +76 -50
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +9 -10
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +42 -49
- package/dist/dataStores.js.map +1 -1
- package/dist/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +5 -200
- package/dist/gc/garbageCollection.d.ts.map +1 -0
- package/dist/{garbageCollection.js → gc/garbageCollection.js} +77 -353
- package/dist/gc/garbageCollection.js.map +1 -0
- package/dist/gc/gcDefinitions.d.ts +189 -0
- package/dist/gc/gcDefinitions.d.ts.map +1 -0
- package/dist/{garbageCollectionConstants.js → gc/gcDefinitions.js} +24 -2
- package/dist/gc/gcDefinitions.js.map +1 -0
- package/{lib/garbageCollectionHelpers.d.ts → dist/gc/gcHelpers.d.ts} +5 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -0
- package/dist/{garbageCollectionHelpers.js → gc/gcHelpers.js} +27 -7
- package/dist/gc/gcHelpers.js.map +1 -0
- package/dist/gc/gcSummaryStateTracker.d.ts +86 -0
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/dist/gc/gcSummaryStateTracker.js +246 -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 +11 -0
- package/dist/gc/index.d.ts.map +1 -0
- package/dist/gc/index.js +40 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -9
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +2 -13
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +7 -36
- 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/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +1 -0
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +20 -12
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +19 -3
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +59 -28
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +1 -2
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +14 -9
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/summary/index.d.ts +17 -0
- package/dist/summary/index.d.ts.map +1 -0
- package/dist/summary/index.js +47 -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/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- 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} +158 -56
- package/dist/summary/runningSummarizer.js.map +1 -0
- package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +2 -4
- package/dist/summary/summarizer.d.ts.map +1 -0
- package/dist/{summarizer.js → summary/summarizer.js} +1 -61
- 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/summary/summarizerHandle.d.ts.map +1 -0
- package/dist/summary/summarizerHandle.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/summary/summarizerHeuristics.js.map +1 -0
- package/{lib → dist/summary}/summarizerTypes.d.ts +1 -1
- package/dist/summary/summarizerTypes.d.ts.map +1 -0
- 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 +1 -43
- 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/dist/summary/summaryGenerator.d.ts.map +1 -0
- package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +1 -2
- 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 +6 -0
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +28 -3
- package/lib/blobManager.js.map +1 -1
- package/lib/containerRuntime.d.ts +17 -15
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +127 -90
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +21 -12
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +64 -38
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +9 -10
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +33 -40
- package/lib/dataStores.js.map +1 -1
- package/lib/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +5 -200
- package/lib/gc/garbageCollection.d.ts.map +1 -0
- package/lib/{garbageCollection.js → gc/garbageCollection.js} +44 -319
- package/lib/gc/garbageCollection.js.map +1 -0
- package/lib/gc/gcDefinitions.d.ts +189 -0
- package/lib/gc/gcDefinitions.d.ts.map +1 -0
- package/lib/{garbageCollectionConstants.js → gc/gcDefinitions.js} +23 -1
- package/lib/gc/gcDefinitions.js.map +1 -0
- package/{dist/garbageCollectionHelpers.d.ts → lib/gc/gcHelpers.d.ts} +5 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -0
- package/lib/{garbageCollectionHelpers.js → gc/gcHelpers.js} +20 -2
- package/lib/gc/gcHelpers.js.map +1 -0
- package/lib/gc/gcSummaryStateTracker.d.ts +86 -0
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/lib/gc/gcSummaryStateTracker.js +242 -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 +11 -0
- package/lib/gc/index.d.ts.map +1 -0
- package/lib/gc/index.js +11 -0
- package/lib/gc/index.js.map +1 -0
- package/lib/index.d.ts +2 -5
- 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 +2 -13
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +7 -36
- 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/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +1 -0
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +1 -1
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +20 -12
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +19 -3
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +60 -29
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +1 -2
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +14 -9
- package/lib/pendingStateManager.js.map +1 -1
- 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/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- 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} +159 -57
- package/lib/summary/runningSummarizer.js.map +1 -0
- package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +2 -4
- package/lib/summary/summarizer.d.ts.map +1 -0
- package/lib/{summarizer.js → summary/summarizer.js} +3 -63
- 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/summary/summarizerHandle.d.ts.map +1 -0
- package/lib/summary/summarizerHandle.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/summary/summarizerHeuristics.js.map +1 -0
- package/{dist → lib/summary}/summarizerTypes.d.ts +1 -1
- package/lib/summary/summarizerTypes.d.ts.map +1 -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 +1 -43
- 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/lib/summary/summaryGenerator.d.ts.map +1 -0
- package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +1 -2
- 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 +125 -122
- package/src/blobManager.ts +33 -3
- package/src/containerRuntime.ts +178 -106
- package/src/dataStoreContext.ts +90 -49
- package/src/dataStores.ts +44 -51
- package/{garbageCollection.md → src/gc/garbageCollection.md} +2 -2
- package/src/{garbageCollection.ts → gc/garbageCollection.ts} +90 -560
- package/src/gc/gcDefinitions.ts +244 -0
- package/src/{garbageCollectionHelpers.ts → gc/gcHelpers.ts} +26 -1
- package/src/gc/gcSummaryStateTracker.ts +339 -0
- package/src/{gcSweepReadyUsageDetection.ts → gc/gcSweepReadyUsageDetection.ts} +1 -1
- package/src/gc/gcUnreferencedStateTracker.ts +114 -0
- package/src/gc/index.ts +40 -0
- package/src/index.ts +10 -14
- package/src/opLifecycle/batchManager.ts +7 -54
- package/src/opLifecycle/definitions.ts +4 -0
- package/src/opLifecycle/opCompressor.ts +1 -0
- package/src/opLifecycle/opSplitter.ts +33 -14
- package/src/opLifecycle/outbox.ts +84 -38
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +26 -14
- package/src/summary/index.ts +99 -0
- package/src/{runningSummarizer.ts → summary/runningSummarizer.ts} +279 -139
- package/src/{summarizer.ts → summary/summarizer.ts} +5 -76
- package/src/{summarizerHeuristics.ts → summary/summarizerHeuristics.ts} +1 -1
- package/src/{summarizerTypes.ts → summary/summarizerTypes.ts} +1 -1
- package/src/{summaryFormat.ts → summary/summaryFormat.ts} +1 -53
- package/src/{summaryGenerator.ts → summary/summaryGenerator.ts} +9 -9
- package/src/{summaryManager.ts → summary/summaryManager.ts} +1 -1
- package/dist/garbageCollection.d.ts.map +0 -1
- package/dist/garbageCollection.js.map +0 -1
- package/dist/garbageCollectionConstants.d.ts +0 -26
- package/dist/garbageCollectionConstants.d.ts.map +0 -1
- package/dist/garbageCollectionConstants.js.map +0 -1
- package/dist/garbageCollectionHelpers.d.ts.map +0 -1
- 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/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.map +0 -1
- 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.map +0 -1
- package/lib/garbageCollection.js.map +0 -1
- package/lib/garbageCollectionConstants.d.ts +0 -26
- package/lib/garbageCollectionConstants.d.ts.map +0 -1
- package/lib/garbageCollectionConstants.js.map +0 -1
- package/lib/garbageCollectionHelpers.d.ts.map +0 -1
- 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/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.map +0 -1
- 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.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 -44
- /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/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
- /package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.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/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
- /package/dist/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
- /package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +0 -0
- /package/dist/{summarizerTypes.js → summary/summarizerTypes.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/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +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/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
- /package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.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/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
- /package/lib/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
- /package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +0 -0
- /package/lib/{summarizerTypes.js → summary/summarizerTypes.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/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
- /package/lib/{summaryManager.js → summary/summaryManager.js} +0 -0
- /package/src/{orderedClientElection.ts → summary/orderedClientElection.ts} +0 -0
- /package/src/{runWhileConnectedCoordinator.ts → summary/runWhileConnectedCoordinator.ts} +0 -0
- /package/src/{summarizerClientElection.ts → summary/summarizerClientElection.ts} +0 -0
- /package/src/{summarizerHandle.ts → summary/summarizerHandle.ts} +0 -0
- /package/src/{summaryCollection.ts → summary/summaryCollection.ts} +0 -0
package/src/containerRuntime.ts
CHANGED
|
@@ -68,13 +68,13 @@ import {
|
|
|
68
68
|
} from "@fluidframework/protocol-definitions";
|
|
69
69
|
import {
|
|
70
70
|
FlushMode,
|
|
71
|
+
FlushModeExperimental,
|
|
71
72
|
gcTreeKey,
|
|
72
73
|
InboundAttachMessage,
|
|
73
74
|
IFluidDataStoreContextDetached,
|
|
74
75
|
IFluidDataStoreRegistry,
|
|
75
76
|
IFluidDataStoreChannel,
|
|
76
77
|
IGarbageCollectionData,
|
|
77
|
-
IGarbageCollectionDetailsBase,
|
|
78
78
|
IEnvelope,
|
|
79
79
|
IInboundSignalMessage,
|
|
80
80
|
ISignalEnvelope,
|
|
@@ -99,7 +99,6 @@ import {
|
|
|
99
99
|
create404Response,
|
|
100
100
|
exceptionToResponse,
|
|
101
101
|
requestFluidObject,
|
|
102
|
-
responseToException,
|
|
103
102
|
seqFromTree,
|
|
104
103
|
calculateStats,
|
|
105
104
|
TelemetryContext,
|
|
@@ -109,8 +108,6 @@ import { GCDataBuilder, trimLeadingAndTrailingSlashes } from "@fluidframework/ga
|
|
|
109
108
|
import { v4 as uuid } from "uuid";
|
|
110
109
|
import { ContainerFluidHandleContext } from "./containerHandleContext";
|
|
111
110
|
import { FluidDataStoreRegistry } from "./dataStoreRegistry";
|
|
112
|
-
import { Summarizer } from "./summarizer";
|
|
113
|
-
import { SummaryManager } from "./summaryManager";
|
|
114
111
|
import { ReportOpPerfTelemetry, IPerfSignalReport } from "./connectionTelemetry";
|
|
115
112
|
import { IPendingLocalState, PendingStateManager } from "./pendingStateManager";
|
|
116
113
|
import { pkgVersion } from "./packageVersion";
|
|
@@ -126,16 +123,15 @@ import {
|
|
|
126
123
|
ICreateContainerMetadata,
|
|
127
124
|
ISummaryMetadataMessage,
|
|
128
125
|
metadataBlobName,
|
|
126
|
+
Summarizer,
|
|
127
|
+
SummaryManager,
|
|
129
128
|
wrapSummaryInChannelsTree,
|
|
130
|
-
|
|
131
|
-
import { SummaryCollection } from "./summaryCollection";
|
|
132
|
-
import {
|
|
129
|
+
SummaryCollection,
|
|
133
130
|
ISerializedElection,
|
|
134
131
|
OrderedClientCollection,
|
|
135
132
|
OrderedClientElection,
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
import {
|
|
133
|
+
SummarizerClientElection,
|
|
134
|
+
summarizerClientType,
|
|
139
135
|
SubmitSummaryResult,
|
|
140
136
|
IConnectableRuntime,
|
|
141
137
|
IGeneratedSummaryStats,
|
|
@@ -144,16 +140,18 @@ import {
|
|
|
144
140
|
ISummarizerInternalsProvider,
|
|
145
141
|
ISummarizerRuntime,
|
|
146
142
|
IRefreshSummaryAckOptions,
|
|
147
|
-
|
|
143
|
+
RunWhileConnectedCoordinator,
|
|
144
|
+
} from "./summary";
|
|
148
145
|
import { formExponentialFn, Throttler } from "./throttler";
|
|
149
|
-
import { RunWhileConnectedCoordinator } from "./runWhileConnectedCoordinator";
|
|
150
146
|
import {
|
|
151
147
|
GarbageCollector,
|
|
152
148
|
GCNodeType,
|
|
149
|
+
gcTombstoneGenerationOptionName,
|
|
153
150
|
IGarbageCollectionRuntime,
|
|
154
151
|
IGarbageCollector,
|
|
155
152
|
IGCStats,
|
|
156
|
-
|
|
153
|
+
shouldAllowGcTombstoneEnforcement,
|
|
154
|
+
} from "./gc";
|
|
157
155
|
import { channelToDataStore, IDataStoreAliasMessage, isDataStoreAliasMessage } from "./dataStore";
|
|
158
156
|
import { BindBatchTracker } from "./batchTracker";
|
|
159
157
|
import {
|
|
@@ -170,8 +168,6 @@ import {
|
|
|
170
168
|
OpSplitter,
|
|
171
169
|
RemoteMessageProcessor,
|
|
172
170
|
} from "./opLifecycle";
|
|
173
|
-
import { shouldAllowGcTombstoneEnforcement } from "./garbageCollectionHelpers";
|
|
174
|
-
import { gcTombstoneGenerationOptionName } from "./garbageCollectionConstants";
|
|
175
171
|
|
|
176
172
|
export enum ContainerMessageType {
|
|
177
173
|
// An op to be delivered to store
|
|
@@ -471,11 +467,6 @@ export interface IRootSummaryTreeWithStats extends ISummaryTreeWithStats {
|
|
|
471
467
|
export enum RuntimeHeaders {
|
|
472
468
|
/** True to wait for a data store to be created and loaded before returning it. */
|
|
473
469
|
wait = "wait",
|
|
474
|
-
/**
|
|
475
|
-
* True if the request is from an external app. Used for GC to handle scenarios where a data store
|
|
476
|
-
* is deleted and requested via an external app.
|
|
477
|
-
*/
|
|
478
|
-
externalRequest = "externalRequest",
|
|
479
470
|
/** True if the request is coming from an IFluidHandle. */
|
|
480
471
|
viaHandle = "viaHandle",
|
|
481
472
|
}
|
|
@@ -491,7 +482,6 @@ export const TombstoneResponseHeaderKey = "isTombstoned";
|
|
|
491
482
|
*/
|
|
492
483
|
export interface RuntimeHeaderData {
|
|
493
484
|
wait?: boolean;
|
|
494
|
-
externalRequest?: boolean;
|
|
495
485
|
viaHandle?: boolean;
|
|
496
486
|
allowTombstone?: boolean;
|
|
497
487
|
}
|
|
@@ -499,7 +489,6 @@ export interface RuntimeHeaderData {
|
|
|
499
489
|
/** Default values for Runtime Headers */
|
|
500
490
|
export const defaultRuntimeHeaderData: Required<RuntimeHeaderData> = {
|
|
501
491
|
wait: true,
|
|
502
|
-
externalRequest: false,
|
|
503
492
|
viaHandle: false,
|
|
504
493
|
allowTombstone: false,
|
|
505
494
|
};
|
|
@@ -908,7 +897,7 @@ export class ContainerRuntime
|
|
|
908
897
|
|
|
909
898
|
private _orderSequentiallyCalls: number = 0;
|
|
910
899
|
private readonly _flushMode: FlushMode;
|
|
911
|
-
private
|
|
900
|
+
private flushTaskExists = false;
|
|
912
901
|
|
|
913
902
|
private _connected: boolean;
|
|
914
903
|
|
|
@@ -967,6 +956,7 @@ export class ContainerRuntime
|
|
|
967
956
|
private dirtyContainer: boolean;
|
|
968
957
|
private emitDirtyDocumentEvent = true;
|
|
969
958
|
private readonly enableOpReentryCheck: boolean;
|
|
959
|
+
private readonly disableAttachReorder: boolean | undefined;
|
|
970
960
|
|
|
971
961
|
private readonly defaultTelemetrySignalSampleCount = 100;
|
|
972
962
|
private _perfSignalData: IPerfSignalReport = {
|
|
@@ -1110,12 +1100,16 @@ export class ContainerRuntime
|
|
|
1110
1100
|
}),
|
|
1111
1101
|
});
|
|
1112
1102
|
|
|
1103
|
+
this.disableAttachReorder = this.mc.config.getBoolean(
|
|
1104
|
+
"Fluid.ContainerRuntime.disableAttachOpReorder",
|
|
1105
|
+
);
|
|
1106
|
+
const disableChunking = this.mc.config.getBoolean(
|
|
1107
|
+
"Fluid.ContainerRuntime.DisableCompressionChunking",
|
|
1108
|
+
);
|
|
1113
1109
|
const opSplitter = new OpSplitter(
|
|
1114
1110
|
chunks,
|
|
1115
1111
|
this.context.submitBatchFn,
|
|
1116
|
-
|
|
1117
|
-
? Number.POSITIVE_INFINITY
|
|
1118
|
-
: runtimeOptions.chunkSizeInBytes,
|
|
1112
|
+
disableChunking === true ? Number.POSITIVE_INFINITY : runtimeOptions.chunkSizeInBytes,
|
|
1119
1113
|
runtimeOptions.maxBatchSizeInBytes,
|
|
1120
1114
|
this.mc.logger,
|
|
1121
1115
|
);
|
|
@@ -1127,10 +1121,13 @@ export class ContainerRuntime
|
|
|
1127
1121
|
this.validateSummaryHeuristicConfiguration(this.summaryConfiguration);
|
|
1128
1122
|
}
|
|
1129
1123
|
|
|
1124
|
+
const disableOpReentryCheck = this.mc.config.getBoolean(
|
|
1125
|
+
"Fluid.ContainerRuntime.DisableOpReentryCheck",
|
|
1126
|
+
);
|
|
1130
1127
|
this.enableOpReentryCheck =
|
|
1131
1128
|
runtimeOptions.enableOpReentryCheck === true &&
|
|
1132
1129
|
// Allow for a break-glass config to override the options
|
|
1133
|
-
|
|
1130
|
+
disableOpReentryCheck !== true;
|
|
1134
1131
|
|
|
1135
1132
|
this.summariesDisabled = this.isSummariesDisabled();
|
|
1136
1133
|
this.heuristicsDisabled = this.isHeuristicsDisabled();
|
|
@@ -1141,7 +1138,16 @@ export class ContainerRuntime
|
|
|
1141
1138
|
this.mc.config.getNumber(maxConsecutiveReconnectsKey) ??
|
|
1142
1139
|
this.defaultMaxConsecutiveReconnects;
|
|
1143
1140
|
|
|
1144
|
-
|
|
1141
|
+
if (
|
|
1142
|
+
runtimeOptions.flushMode === (FlushModeExperimental.Async as unknown as FlushMode) &&
|
|
1143
|
+
context.supportedFeatures?.get("referenceSequenceNumbers") !== true
|
|
1144
|
+
) {
|
|
1145
|
+
// The loader does not support reference sequence numbers, falling back on FlushMode.TurnBased
|
|
1146
|
+
this.mc.logger.sendErrorEvent({ eventName: "FlushModeFallback" });
|
|
1147
|
+
this._flushMode = FlushMode.TurnBased;
|
|
1148
|
+
} else {
|
|
1149
|
+
this._flushMode = runtimeOptions.flushMode;
|
|
1150
|
+
}
|
|
1145
1151
|
|
|
1146
1152
|
const pendingRuntimeState = context.pendingLocalState as IPendingRuntimeState | undefined;
|
|
1147
1153
|
const baseSnapshot: ISnapshotTree | undefined =
|
|
@@ -1212,7 +1218,6 @@ export class ContainerRuntime
|
|
|
1212
1218
|
(
|
|
1213
1219
|
summarizeInternal: SummarizeInternalFn,
|
|
1214
1220
|
getGCDataFn: (fullGC?: boolean) => Promise<IGarbageCollectionData>,
|
|
1215
|
-
getBaseGCDetailsFn?: () => Promise<IGarbageCollectionDetailsBase>,
|
|
1216
1221
|
) =>
|
|
1217
1222
|
this.summarizerNode.createChild(
|
|
1218
1223
|
summarizeInternal,
|
|
@@ -1220,11 +1225,9 @@ export class ContainerRuntime
|
|
|
1220
1225
|
createParam,
|
|
1221
1226
|
undefined,
|
|
1222
1227
|
getGCDataFn,
|
|
1223
|
-
getBaseGCDetailsFn,
|
|
1224
1228
|
),
|
|
1225
1229
|
(id: string) => this.summarizerNode.deleteChild(id),
|
|
1226
1230
|
this.mc.logger,
|
|
1227
|
-
async () => this.garbageCollector.getBaseGCDetails(),
|
|
1228
1231
|
(path: string, timestampMs: number, packagePath?: readonly string[]) =>
|
|
1229
1232
|
this.garbageCollector.nodeUpdated(path, "Changed", timestampMs, packagePath),
|
|
1230
1233
|
(path: string) => this.garbageCollector.isNodeDeleted(path),
|
|
@@ -1272,14 +1275,20 @@ export class ContainerRuntime
|
|
|
1272
1275
|
pendingRuntimeState?.pending,
|
|
1273
1276
|
);
|
|
1274
1277
|
|
|
1278
|
+
const disableCompression = this.mc.config.getBoolean(
|
|
1279
|
+
"Fluid.ContainerRuntime.DisableCompression",
|
|
1280
|
+
);
|
|
1275
1281
|
const compressionOptions =
|
|
1276
|
-
|
|
1282
|
+
disableCompression === true
|
|
1277
1283
|
? {
|
|
1278
1284
|
minimumBatchSizeInBytes: Number.POSITIVE_INFINITY,
|
|
1279
1285
|
compressionAlgorithm: CompressionAlgorithms.lz4,
|
|
1280
1286
|
}
|
|
1281
1287
|
: runtimeOptions.compressionOptions;
|
|
1282
1288
|
|
|
1289
|
+
const disablePartialFlush = this.mc.config.getBoolean(
|
|
1290
|
+
"Fluid.ContainerRuntime.DisablePartialFlush",
|
|
1291
|
+
);
|
|
1283
1292
|
this.outbox = new Outbox({
|
|
1284
1293
|
shouldSend: () => this.canSendOps(),
|
|
1285
1294
|
pendingStateManager: this.pendingStateManager,
|
|
@@ -1289,7 +1298,7 @@ export class ContainerRuntime
|
|
|
1289
1298
|
config: {
|
|
1290
1299
|
compressionOptions,
|
|
1291
1300
|
maxBatchSizeInBytes: runtimeOptions.maxBatchSizeInBytes,
|
|
1292
|
-
|
|
1301
|
+
disablePartialFlush: disablePartialFlush === true,
|
|
1293
1302
|
},
|
|
1294
1303
|
logger: this.mc.logger,
|
|
1295
1304
|
});
|
|
@@ -1426,6 +1435,14 @@ export class ContainerRuntime
|
|
|
1426
1435
|
summaryFormatVersion: metadata?.summaryFormatVersion,
|
|
1427
1436
|
disableIsolatedChannels: metadata?.disableIsolatedChannels,
|
|
1428
1437
|
gcVersion: metadata?.gcFeature,
|
|
1438
|
+
options: JSON.stringify(runtimeOptions),
|
|
1439
|
+
featureGates: JSON.stringify({
|
|
1440
|
+
disableCompression,
|
|
1441
|
+
disableOpReentryCheck,
|
|
1442
|
+
disableChunking,
|
|
1443
|
+
disableAttachReorder: this.disableAttachReorder,
|
|
1444
|
+
disablePartialFlush,
|
|
1445
|
+
}),
|
|
1429
1446
|
});
|
|
1430
1447
|
|
|
1431
1448
|
ReportOpPerfTelemetry(this.context.clientId, this.deltaManager, this.logger);
|
|
@@ -1467,6 +1484,9 @@ export class ContainerRuntime
|
|
|
1467
1484
|
this.removeAllListeners();
|
|
1468
1485
|
}
|
|
1469
1486
|
|
|
1487
|
+
/**
|
|
1488
|
+
* @deprecated 2.0.0-internal.3.2.0 ContainerRuntime is not an IFluidTokenProvider. Token providers should be accessed using normal provider patterns.
|
|
1489
|
+
*/
|
|
1470
1490
|
public get IFluidTokenProvider() {
|
|
1471
1491
|
if (this.options?.intelligence) {
|
|
1472
1492
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
@@ -1565,29 +1585,6 @@ export class ContainerRuntime
|
|
|
1565
1585
|
await this.dataStores.waitIfPendingAlias(id);
|
|
1566
1586
|
const internalId = this.internalId(id);
|
|
1567
1587
|
const dataStoreContext = await this.dataStores.getDataStore(internalId, headerData);
|
|
1568
|
-
|
|
1569
|
-
/**
|
|
1570
|
-
* If GC should run and this an external app request with "externalRequest" header, we need to return
|
|
1571
|
-
* an error if the data store being requested is marked as unreferenced as per the data store's base
|
|
1572
|
-
* GC data.
|
|
1573
|
-
*
|
|
1574
|
-
* This is a workaround to handle scenarios where a data store shared with an external app is deleted
|
|
1575
|
-
* and marked as unreferenced by GC. Returning an error will fail to load the data store for the app.
|
|
1576
|
-
*/
|
|
1577
|
-
if (
|
|
1578
|
-
request.headers?.[RuntimeHeaders.externalRequest] &&
|
|
1579
|
-
this.garbageCollector.shouldRunGC
|
|
1580
|
-
) {
|
|
1581
|
-
// The data store is referenced if used routes in the base summary has a route to self.
|
|
1582
|
-
// Older documents may not have used routes in the summary. They are considered referenced.
|
|
1583
|
-
const usedRoutes = (await dataStoreContext.getBaseGCDetails()).usedRoutes;
|
|
1584
|
-
if (
|
|
1585
|
-
!(usedRoutes === undefined || usedRoutes.includes("") || usedRoutes.includes("/"))
|
|
1586
|
-
) {
|
|
1587
|
-
throw responseToException(create404Response(request), request);
|
|
1588
|
-
}
|
|
1589
|
-
}
|
|
1590
|
-
|
|
1591
1588
|
const dataStoreChannel = await dataStoreContext.realize();
|
|
1592
1589
|
|
|
1593
1590
|
// Remove query params, leading and trailing slashes from the url. This is done to make sure the format is
|
|
@@ -1965,9 +1962,11 @@ export class ContainerRuntime
|
|
|
1965
1962
|
clientSignalSequenceNumber: envelope.clientSignalSequenceNumber,
|
|
1966
1963
|
});
|
|
1967
1964
|
} else if (
|
|
1965
|
+
this.consecutiveReconnects === 0 &&
|
|
1968
1966
|
envelope.clientSignalSequenceNumber ===
|
|
1969
|
-
|
|
1967
|
+
this._perfSignalData.trackingSignalSequenceNumber
|
|
1970
1968
|
) {
|
|
1969
|
+
// only logging for the first connection and the trackingSignalSequenceNUmber.
|
|
1971
1970
|
this.sendSignalTelemetryEvent(envelope.clientSignalSequenceNumber);
|
|
1972
1971
|
this._perfSignalData.trackingSignalSequenceNumber = undefined;
|
|
1973
1972
|
}
|
|
@@ -2115,7 +2114,7 @@ export class ContainerRuntime
|
|
|
2115
2114
|
* Are we in the middle of batching ops together?
|
|
2116
2115
|
*/
|
|
2117
2116
|
private currentlyBatching() {
|
|
2118
|
-
return this.flushMode
|
|
2117
|
+
return this.flushMode !== FlushMode.Immediate || this._orderSequentiallyCalls !== 0;
|
|
2119
2118
|
}
|
|
2120
2119
|
|
|
2121
2120
|
public getQuorum(): IQuorumClients {
|
|
@@ -2302,12 +2301,24 @@ export class ContainerRuntime
|
|
|
2302
2301
|
fullGC,
|
|
2303
2302
|
} = options;
|
|
2304
2303
|
|
|
2304
|
+
const telemetryContext = new TelemetryContext();
|
|
2305
|
+
// Add the options that are used to generate this summary to the telemetry context.
|
|
2306
|
+
telemetryContext.setMultiple("fluid_Summarize", "Options", {
|
|
2307
|
+
fullTree,
|
|
2308
|
+
trackState,
|
|
2309
|
+
runGC,
|
|
2310
|
+
fullGC,
|
|
2311
|
+
runSweep,
|
|
2312
|
+
});
|
|
2313
|
+
|
|
2305
2314
|
let gcStats: IGCStats | undefined;
|
|
2306
2315
|
if (runGC) {
|
|
2307
|
-
gcStats = await this.collectGarbage(
|
|
2316
|
+
gcStats = await this.collectGarbage(
|
|
2317
|
+
{ logger: summaryLogger, runSweep, fullGC },
|
|
2318
|
+
telemetryContext,
|
|
2319
|
+
);
|
|
2308
2320
|
}
|
|
2309
2321
|
|
|
2310
|
-
const telemetryContext = new TelemetryContext();
|
|
2311
2322
|
const { stats, summary } = await this.summarizerNode.summarize(
|
|
2312
2323
|
fullTree,
|
|
2313
2324
|
trackState,
|
|
@@ -2383,18 +2394,23 @@ export class ContainerRuntime
|
|
|
2383
2394
|
}
|
|
2384
2395
|
|
|
2385
2396
|
/**
|
|
2386
|
-
*
|
|
2387
|
-
* @param unusedRoutes - object routes and sub routes that can be deleted
|
|
2388
|
-
* @returns - routes of objects deleted from the runtime
|
|
2397
|
+
* @deprecated - Replaced by deleteSweepReadyNodes.
|
|
2389
2398
|
*/
|
|
2390
2399
|
public deleteUnusedNodes(unusedRoutes: string[]): string[] {
|
|
2391
|
-
|
|
2392
|
-
|
|
2400
|
+
throw new Error("deleteUnusedRoutes should not be called");
|
|
2401
|
+
}
|
|
2393
2402
|
|
|
2394
|
-
|
|
2395
|
-
|
|
2403
|
+
/**
|
|
2404
|
+
* After GC has run and identified nodes that are sweep ready, this is called to delete the sweep ready nodes.
|
|
2405
|
+
* @param sweepReadyRoutes - The routes of nodes that are sweep ready and should be deleted.
|
|
2406
|
+
* @returns - The routes of nodes that were deleted.
|
|
2407
|
+
*/
|
|
2408
|
+
public deleteSweepReadyNodes(sweepReadyRoutes: string[]): string[] {
|
|
2409
|
+
const { dataStoreRoutes, blobManagerRoutes } =
|
|
2410
|
+
this.getDataStoreAndBlobManagerRoutes(sweepReadyRoutes);
|
|
2396
2411
|
|
|
2397
|
-
|
|
2412
|
+
const deletedRoutes = this.dataStores.deleteSweepReadyNodes(dataStoreRoutes);
|
|
2413
|
+
return deletedRoutes.concat(this.blobManager.deleteSweepReadyNodes(blobManagerRoutes));
|
|
2398
2414
|
}
|
|
2399
2415
|
|
|
2400
2416
|
/**
|
|
@@ -2478,15 +2494,18 @@ export class ContainerRuntime
|
|
|
2478
2494
|
* Runs garbage collection and updates the reference / used state of the nodes in the container.
|
|
2479
2495
|
* @returns the statistics of the garbage collection run; undefined if GC did not run.
|
|
2480
2496
|
*/
|
|
2481
|
-
public async collectGarbage(
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2497
|
+
public async collectGarbage(
|
|
2498
|
+
options: {
|
|
2499
|
+
/** Logger to use for logging GC events */
|
|
2500
|
+
logger?: ITelemetryLogger;
|
|
2501
|
+
/** True to run GC sweep phase after the mark phase */
|
|
2502
|
+
runSweep?: boolean;
|
|
2503
|
+
/** True to generate full GC data */
|
|
2504
|
+
fullGC?: boolean;
|
|
2505
|
+
},
|
|
2506
|
+
telemetryContext?: ITelemetryContext,
|
|
2507
|
+
): Promise<IGCStats | undefined> {
|
|
2508
|
+
return this.garbageCollector.collectGarbage(options, telemetryContext);
|
|
2490
2509
|
}
|
|
2491
2510
|
|
|
2492
2511
|
/**
|
|
@@ -2720,7 +2739,7 @@ export class ContainerRuntime
|
|
|
2720
2739
|
|
|
2721
2740
|
let clientSequenceNumber: number;
|
|
2722
2741
|
try {
|
|
2723
|
-
clientSequenceNumber = this.submitSummaryMessage(summaryMessage);
|
|
2742
|
+
clientSequenceNumber = this.submitSummaryMessage(summaryMessage, summaryRefSeqNum);
|
|
2724
2743
|
} catch (error) {
|
|
2725
2744
|
return { stage: "upload", ...uploadData, error };
|
|
2726
2745
|
}
|
|
@@ -2813,8 +2832,7 @@ export class ContainerRuntime
|
|
|
2813
2832
|
0x132 /* "sending ops in detached container" */,
|
|
2814
2833
|
);
|
|
2815
2834
|
|
|
2816
|
-
const
|
|
2817
|
-
const serializedContent = JSON.stringify(deserializedContent);
|
|
2835
|
+
const serializedContent = JSON.stringify({ type, contents });
|
|
2818
2836
|
|
|
2819
2837
|
if (this.deltaManager.readOnlyInfo.readonly) {
|
|
2820
2838
|
this.logger.sendTelemetryEvent({
|
|
@@ -2825,7 +2843,7 @@ export class ContainerRuntime
|
|
|
2825
2843
|
|
|
2826
2844
|
const message: BatchMessage = {
|
|
2827
2845
|
contents: serializedContent,
|
|
2828
|
-
deserializedContent,
|
|
2846
|
+
deserializedContent: JSON.parse(serializedContent), // Deep copy in case caller changes reference object
|
|
2829
2847
|
metadata,
|
|
2830
2848
|
localOpMetadata,
|
|
2831
2849
|
referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
|
|
@@ -2855,7 +2873,7 @@ export class ContainerRuntime
|
|
|
2855
2873
|
if (
|
|
2856
2874
|
this.currentlyBatching() &&
|
|
2857
2875
|
type === ContainerMessageType.Attach &&
|
|
2858
|
-
this.
|
|
2876
|
+
this.disableAttachReorder !== true
|
|
2859
2877
|
) {
|
|
2860
2878
|
this.outbox.submitAttach(message);
|
|
2861
2879
|
} else {
|
|
@@ -2864,17 +2882,8 @@ export class ContainerRuntime
|
|
|
2864
2882
|
|
|
2865
2883
|
if (!this.currentlyBatching()) {
|
|
2866
2884
|
this.flush();
|
|
2867
|
-
} else
|
|
2868
|
-
this.
|
|
2869
|
-
// Queue a microtask to detect the end of the turn and force a flush.
|
|
2870
|
-
Promise.resolve()
|
|
2871
|
-
.then(() => {
|
|
2872
|
-
this.flushMicroTaskExists = false;
|
|
2873
|
-
this.flush();
|
|
2874
|
-
})
|
|
2875
|
-
.catch((error) => {
|
|
2876
|
-
this.closeFn(error as GenericError);
|
|
2877
|
-
});
|
|
2885
|
+
} else {
|
|
2886
|
+
this.scheduleFlush();
|
|
2878
2887
|
}
|
|
2879
2888
|
} catch (error) {
|
|
2880
2889
|
this.closeFn(error as GenericError);
|
|
@@ -2886,7 +2895,47 @@ export class ContainerRuntime
|
|
|
2886
2895
|
}
|
|
2887
2896
|
}
|
|
2888
2897
|
|
|
2889
|
-
private
|
|
2898
|
+
private scheduleFlush() {
|
|
2899
|
+
if (this.flushTaskExists) {
|
|
2900
|
+
return;
|
|
2901
|
+
}
|
|
2902
|
+
|
|
2903
|
+
this.flushTaskExists = true;
|
|
2904
|
+
const flush = () => {
|
|
2905
|
+
this.flushTaskExists = false;
|
|
2906
|
+
try {
|
|
2907
|
+
this.flush();
|
|
2908
|
+
} catch (error) {
|
|
2909
|
+
this.closeFn(error as GenericError);
|
|
2910
|
+
}
|
|
2911
|
+
};
|
|
2912
|
+
|
|
2913
|
+
switch (this.flushMode) {
|
|
2914
|
+
case FlushMode.TurnBased:
|
|
2915
|
+
// When in TurnBased flush mode the runtime will buffer operations in the current turn and send them as a single
|
|
2916
|
+
// batch at the end of the turn
|
|
2917
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
2918
|
+
Promise.resolve().then(flush);
|
|
2919
|
+
break;
|
|
2920
|
+
|
|
2921
|
+
// FlushModeExperimental is experimental and not exposed directly in the runtime APIs
|
|
2922
|
+
case FlushModeExperimental.Async as unknown as FlushMode:
|
|
2923
|
+
// When in Async flush mode, the runtime will accumulate all operations across JS turns and send them as a single
|
|
2924
|
+
// batch when all micro-tasks are complete.
|
|
2925
|
+
// Compared to TurnBased, this flush mode will capture more ops into the same batch.
|
|
2926
|
+
setTimeout(flush, 0);
|
|
2927
|
+
break;
|
|
2928
|
+
|
|
2929
|
+
default:
|
|
2930
|
+
assert(
|
|
2931
|
+
this._orderSequentiallyCalls > 0,
|
|
2932
|
+
0x587 /* Unreachable unless running under orderSequentially */,
|
|
2933
|
+
);
|
|
2934
|
+
break;
|
|
2935
|
+
}
|
|
2936
|
+
}
|
|
2937
|
+
|
|
2938
|
+
private submitSummaryMessage(contents: ISummaryContent, referenceSequenceNumber: number) {
|
|
2890
2939
|
this.verifyNotClosed();
|
|
2891
2940
|
assert(
|
|
2892
2941
|
this.connected,
|
|
@@ -2898,7 +2947,7 @@ export class ContainerRuntime
|
|
|
2898
2947
|
|
|
2899
2948
|
// back-compat: ADO #1385: Make this call unconditional in the future
|
|
2900
2949
|
return this.context.submitSummaryFn !== undefined
|
|
2901
|
-
? this.context.submitSummaryFn(contents)
|
|
2950
|
+
? this.context.submitSummaryFn(contents, referenceSequenceNumber)
|
|
2902
2951
|
: this.context.submitFn(MessageType.Summarize, contents, false);
|
|
2903
2952
|
}
|
|
2904
2953
|
|
|
@@ -3018,7 +3067,7 @@ export class ContainerRuntime
|
|
|
3018
3067
|
// It should only be done by the summarizerNode, if required.
|
|
3019
3068
|
// When fetching from storage we will always get the latest version and do not use the ackHandle.
|
|
3020
3069
|
const fetchLatestSnapshot: () => Promise<IFetchSnapshotResult> = async () => {
|
|
3021
|
-
|
|
3070
|
+
let fetchResult = await this.fetchLatestSnapshotFromStorage(
|
|
3022
3071
|
summaryLogger,
|
|
3023
3072
|
{
|
|
3024
3073
|
eventName: "RefreshLatestSummaryAckFetch",
|
|
@@ -3039,18 +3088,32 @@ export class ContainerRuntime
|
|
|
3039
3088
|
* state.
|
|
3040
3089
|
*/
|
|
3041
3090
|
if (fetchResult.latestSnapshotRefSeq < summaryRefSeq) {
|
|
3042
|
-
|
|
3043
|
-
|
|
3044
|
-
|
|
3045
|
-
undefined /* sequencedMessage */,
|
|
3091
|
+
/* before failing, let's try to retrieve the latest snapshot for that specific ackHandle */
|
|
3092
|
+
fetchResult = await this.fetchSnapshotFromStorage(
|
|
3093
|
+
summaryLogger,
|
|
3046
3094
|
{
|
|
3095
|
+
eventName: "RefreshLatestSummaryAckFetch",
|
|
3047
3096
|
ackHandle,
|
|
3048
|
-
summaryRefSeq,
|
|
3049
|
-
latestSnapshotRefSeq: fetchResult.latestSnapshotRefSeq,
|
|
3097
|
+
targetSequenceNumber: summaryRefSeq,
|
|
3050
3098
|
},
|
|
3099
|
+
readAndParseBlob,
|
|
3100
|
+
ackHandle,
|
|
3051
3101
|
);
|
|
3052
|
-
|
|
3053
|
-
|
|
3102
|
+
|
|
3103
|
+
if (fetchResult.latestSnapshotRefSeq < summaryRefSeq) {
|
|
3104
|
+
const error = DataProcessingError.create(
|
|
3105
|
+
"Fetched snapshot is older than the received ack",
|
|
3106
|
+
"RefreshLatestSummaryAck",
|
|
3107
|
+
undefined /* sequencedMessage */,
|
|
3108
|
+
{
|
|
3109
|
+
ackHandle,
|
|
3110
|
+
summaryRefSeq,
|
|
3111
|
+
fetchedSnapshotRefSeq: fetchResult.latestSnapshotRefSeq,
|
|
3112
|
+
},
|
|
3113
|
+
);
|
|
3114
|
+
this.closeFn(error);
|
|
3115
|
+
throw error;
|
|
3116
|
+
}
|
|
3054
3117
|
}
|
|
3055
3118
|
|
|
3056
3119
|
// In case we had to retrieve the latest snapshot and it is different than summaryRefSeq,
|
|
@@ -3122,6 +3185,15 @@ export class ContainerRuntime
|
|
|
3122
3185
|
logger: ITelemetryLogger,
|
|
3123
3186
|
event: ITelemetryGenericEvent,
|
|
3124
3187
|
readAndParseBlob: ReadAndParseBlob,
|
|
3188
|
+
): Promise<{ snapshotTree: ISnapshotTree; versionId: string; latestSnapshotRefSeq: number }> {
|
|
3189
|
+
return this.fetchSnapshotFromStorage(logger, event, readAndParseBlob, null /* latest */);
|
|
3190
|
+
}
|
|
3191
|
+
|
|
3192
|
+
private async fetchSnapshotFromStorage(
|
|
3193
|
+
logger: ITelemetryLogger,
|
|
3194
|
+
event: ITelemetryGenericEvent,
|
|
3195
|
+
readAndParseBlob: ReadAndParseBlob,
|
|
3196
|
+
versionId: string | null,
|
|
3125
3197
|
): Promise<{ snapshotTree: ISnapshotTree; versionId: string; latestSnapshotRefSeq: number }> {
|
|
3126
3198
|
return PerformanceEvent.timedExecAsync(
|
|
3127
3199
|
logger,
|
|
@@ -3143,10 +3215,10 @@ export class ContainerRuntime
|
|
|
3143
3215
|
const trace = Trace.start();
|
|
3144
3216
|
|
|
3145
3217
|
const versions = await this.storage.getVersions(
|
|
3146
|
-
|
|
3218
|
+
versionId,
|
|
3147
3219
|
1,
|
|
3148
3220
|
"refreshLatestSummaryAckFromServer",
|
|
3149
|
-
FetchSource.noCache,
|
|
3221
|
+
versionId === null ? FetchSource.noCache : undefined,
|
|
3150
3222
|
);
|
|
3151
3223
|
assert(
|
|
3152
3224
|
!!versions && !!versions[0],
|