@fluidframework/container-runtime 2.0.0-dev.3.1.0.125672 → 2.0.0-dev.4.2.0.153917
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +69 -0
- package/dist/blobManager.d.ts +29 -24
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +162 -92
- package/dist/blobManager.js.map +1 -1
- package/dist/containerRuntime.d.ts +74 -76
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +328 -264
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +39 -13
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +112 -49
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +28 -4
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +107 -41
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts +19 -0
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -0
- package/dist/deltaManagerSummarizerProxy.js +40 -0
- package/dist/deltaManagerSummarizerProxy.js.map +1 -0
- package/dist/gc/garbageCollection.d.ts +204 -0
- package/dist/gc/garbageCollection.d.ts.map +1 -0
- package/dist/{garbageCollection.js → gc/garbageCollection.js} +190 -554
- package/dist/gc/garbageCollection.js.map +1 -0
- package/dist/gc/gcConfigs.d.ts +22 -0
- package/dist/gc/gcConfigs.d.ts.map +1 -0
- package/dist/gc/gcConfigs.js +143 -0
- package/dist/gc/gcConfigs.js.map +1 -0
- package/dist/gc/gcDefinitions.d.ts +320 -0
- package/dist/gc/gcDefinitions.d.ts.map +1 -0
- package/dist/gc/gcDefinitions.js +81 -0
- package/dist/gc/gcDefinitions.js.map +1 -0
- package/dist/gc/gcHelpers.d.ts +86 -0
- package/dist/gc/gcHelpers.d.ts.map +1 -0
- package/dist/gc/gcHelpers.js +268 -0
- package/dist/gc/gcHelpers.js.map +1 -0
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
- package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
- package/dist/gc/gcReferenceGraphAlgorithm.js +49 -0
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/dist/gc/gcSummaryDefinitions.d.ts +52 -0
- package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -0
- package/dist/gc/gcSummaryDefinitions.js +7 -0
- package/dist/gc/gcSummaryDefinitions.js.map +1 -0
- package/dist/gc/gcSummaryStateTracker.d.ts +93 -0
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/dist/gc/gcSummaryStateTracker.js +239 -0
- package/dist/gc/gcSummaryStateTracker.js.map +1 -0
- package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
- package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +2 -2
- package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
- package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
- package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/dist/gc/gcUnreferencedStateTracker.js +94 -0
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/dist/gc/index.d.ts +13 -0
- package/dist/gc/index.d.ts.map +1 -0
- package/dist/gc/index.js +50 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/index.d.ts +3 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +11 -13
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +26 -38
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +4 -0
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +2 -1
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +4 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +25 -10
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +4 -0
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +43 -4
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +14 -0
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/dist/opLifecycle/opGroupingManager.js +56 -0
- package/dist/opLifecycle/opGroupingManager.js.map +1 -0
- package/dist/opLifecycle/opSplitter.d.ts +16 -4
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +39 -15
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +21 -3
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +90 -51
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -2
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +30 -20
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +3 -3
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +20 -21
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.d.ts +17 -0
- package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -0
- package/dist/storageServiceWithAttachBlobs.js +32 -0
- package/dist/storageServiceWithAttachBlobs.js.map +1 -0
- package/dist/summary/index.d.ts +17 -0
- package/dist/summary/index.d.ts.map +1 -0
- package/dist/summary/index.js +48 -0
- package/dist/summary/index.js.map +1 -0
- package/dist/summary/orderedClientElection.d.ts.map +1 -0
- package/dist/summary/orderedClientElection.js.map +1 -0
- package/dist/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +3 -2
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/{lib → dist/summary}/runningSummarizer.d.ts +23 -20
- package/dist/summary/runningSummarizer.d.ts.map +1 -0
- package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +191 -74
- package/dist/summary/runningSummarizer.js.map +1 -0
- package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +4 -9
- package/dist/summary/summarizer.d.ts.map +1 -0
- package/dist/{summarizer.js → summary/summarizer.js} +10 -79
- package/dist/summary/summarizer.js.map +1 -0
- package/dist/summary/summarizerClientElection.d.ts.map +1 -0
- package/dist/summary/summarizerClientElection.js.map +1 -0
- package/dist/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +2 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
- package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -3
- package/dist/summary/summarizerHeuristics.js.map +1 -0
- package/dist/summary/summarizerNode/index.d.ts +8 -0
- package/dist/summary/summarizerNode/index.d.ts.map +1 -0
- package/dist/summary/summarizerNode/index.js +12 -0
- package/dist/summary/summarizerNode/index.js.map +1 -0
- package/dist/summary/summarizerNode/summarizerNode.d.ts +149 -0
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNode.js +531 -0
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +132 -0
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +148 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +424 -0
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/{lib → dist/summary}/summarizerTypes.d.ts +21 -19
- package/dist/summary/summarizerTypes.d.ts.map +1 -0
- package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -5
- package/dist/summary/summarizerTypes.js.map +1 -0
- package/dist/summary/summaryCollection.d.ts.map +1 -0
- package/dist/summary/summaryCollection.js.map +1 -0
- package/{lib → dist/summary}/summaryFormat.d.ts +3 -21
- package/dist/summary/summaryFormat.d.ts.map +1 -0
- package/dist/{summaryFormat.js → summary/summaryFormat.js} +1 -10
- package/dist/summary/summaryFormat.js.map +1 -0
- package/{lib → dist/summary}/summaryGenerator.d.ts +28 -2
- package/dist/summary/summaryGenerator.d.ts.map +1 -0
- package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +23 -20
- package/dist/summary/summaryGenerator.js.map +1 -0
- package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -0
- package/dist/summary/summaryManager.js.map +1 -0
- package/lib/blobManager.d.ts +29 -24
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +159 -89
- package/lib/blobManager.js.map +1 -1
- package/lib/containerRuntime.d.ts +74 -76
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +301 -237
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +39 -13
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +101 -38
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +28 -4
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +100 -34
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts +19 -0
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -0
- package/lib/deltaManagerSummarizerProxy.js +36 -0
- package/lib/deltaManagerSummarizerProxy.js.map +1 -0
- package/lib/gc/garbageCollection.d.ts +204 -0
- package/lib/gc/garbageCollection.d.ts.map +1 -0
- package/lib/{garbageCollection.js → gc/garbageCollection.js} +172 -535
- package/lib/gc/garbageCollection.js.map +1 -0
- package/lib/gc/gcConfigs.d.ts +22 -0
- package/lib/gc/gcConfigs.d.ts.map +1 -0
- package/lib/gc/gcConfigs.js +139 -0
- package/lib/gc/gcConfigs.js.map +1 -0
- package/lib/gc/gcDefinitions.d.ts +320 -0
- package/lib/gc/gcDefinitions.d.ts.map +1 -0
- package/lib/gc/gcDefinitions.js +78 -0
- package/lib/gc/gcDefinitions.js.map +1 -0
- package/lib/gc/gcHelpers.d.ts +86 -0
- package/lib/gc/gcHelpers.d.ts.map +1 -0
- package/lib/gc/gcHelpers.js +254 -0
- package/lib/gc/gcHelpers.js.map +1 -0
- package/lib/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
- package/lib/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
- package/lib/gc/gcReferenceGraphAlgorithm.js +45 -0
- package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/lib/gc/gcSummaryDefinitions.d.ts +52 -0
- package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -0
- package/lib/gc/gcSummaryDefinitions.js +6 -0
- package/lib/gc/gcSummaryDefinitions.js.map +1 -0
- package/lib/gc/gcSummaryStateTracker.d.ts +93 -0
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
- package/lib/gc/gcSummaryStateTracker.js +235 -0
- package/lib/gc/gcSummaryStateTracker.js.map +1 -0
- package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
- package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +1 -1
- package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
- package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
- package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
- package/lib/gc/gcUnreferencedStateTracker.js +90 -0
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/lib/gc/index.d.ts +13 -0
- package/lib/gc/index.d.ts.map +1 -0
- package/lib/gc/index.js +12 -0
- package/lib/gc/index.js.map +1 -0
- package/lib/index.d.ts +3 -7
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -4
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +11 -13
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +24 -37
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +4 -0
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +2 -1
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -1
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +26 -11
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +4 -0
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +43 -4
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +14 -0
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/lib/opLifecycle/opGroupingManager.js +52 -0
- package/lib/opLifecycle/opGroupingManager.js.map +1 -0
- package/lib/opLifecycle/opSplitter.d.ts +16 -4
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +39 -15
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +21 -3
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +92 -53
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +4 -2
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +30 -20
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +3 -3
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +20 -21
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.d.ts +17 -0
- package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -0
- package/lib/storageServiceWithAttachBlobs.js +28 -0
- package/lib/storageServiceWithAttachBlobs.js.map +1 -0
- package/lib/summary/index.d.ts +17 -0
- package/lib/summary/index.d.ts.map +1 -0
- package/lib/summary/index.js +16 -0
- package/lib/summary/index.js.map +1 -0
- package/lib/summary/orderedClientElection.d.ts.map +1 -0
- package/lib/summary/orderedClientElection.js.map +1 -0
- package/lib/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +3 -2
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
- package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/{dist → lib/summary}/runningSummarizer.d.ts +23 -20
- package/lib/summary/runningSummarizer.d.ts.map +1 -0
- package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +192 -75
- package/lib/summary/runningSummarizer.js.map +1 -0
- package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +4 -9
- package/lib/summary/summarizer.d.ts.map +1 -0
- package/lib/{summarizer.js → summary/summarizer.js} +12 -81
- package/lib/summary/summarizer.js.map +1 -0
- package/lib/summary/summarizerClientElection.d.ts.map +1 -0
- package/lib/summary/summarizerClientElection.js.map +1 -0
- package/lib/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +2 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
- package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -3
- package/lib/summary/summarizerHeuristics.js.map +1 -0
- package/lib/summary/summarizerNode/index.d.ts +8 -0
- package/lib/summary/summarizerNode/index.d.ts.map +1 -0
- package/lib/summary/summarizerNode/index.js +7 -0
- package/lib/summary/summarizerNode/index.js.map +1 -0
- package/lib/summary/summarizerNode/summarizerNode.d.ts +149 -0
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNode.js +526 -0
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +125 -0
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +148 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +419 -0
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/{dist → lib/summary}/summarizerTypes.d.ts +21 -19
- package/lib/summary/summarizerTypes.d.ts.map +1 -0
- package/lib/summary/summarizerTypes.js +6 -0
- package/lib/summary/summarizerTypes.js.map +1 -0
- package/lib/summary/summaryCollection.d.ts.map +1 -0
- package/lib/summary/summaryCollection.js.map +1 -0
- package/{dist → lib/summary}/summaryFormat.d.ts +3 -21
- package/lib/summary/summaryFormat.d.ts.map +1 -0
- package/lib/{summaryFormat.js → summary/summaryFormat.js} +0 -8
- package/lib/summary/summaryFormat.js.map +1 -0
- package/{dist → lib/summary}/summaryGenerator.d.ts +28 -2
- package/lib/summary/summaryGenerator.d.ts.map +1 -0
- package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +21 -19
- package/lib/summary/summaryGenerator.js.map +1 -0
- package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -0
- package/lib/summary/summaryManager.js.map +1 -0
- package/package.json +66 -60
- package/src/blobManager.ts +196 -110
- package/src/containerRuntime.ts +491 -391
- package/src/dataStoreContext.ts +140 -49
- package/src/dataStores.ts +139 -41
- package/src/deltaManagerSummarizerProxy.ts +46 -0
- package/{garbageCollection.md → src/gc/garbageCollection.md} +2 -2
- package/src/{garbageCollection.ts → gc/garbageCollection.ts} +245 -890
- package/src/gc/gcConfigs.ts +193 -0
- package/src/gc/gcDefinitions.ts +387 -0
- package/src/gc/gcHelpers.ts +335 -0
- package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
- package/src/gc/gcSummaryDefinitions.ts +54 -0
- package/src/gc/gcSummaryStateTracker.ts +329 -0
- package/src/{gcSweepReadyUsageDetection.ts → gc/gcSweepReadyUsageDetection.ts} +1 -1
- package/src/gc/gcUnreferencedStateTracker.ts +114 -0
- package/src/gc/index.ts +65 -0
- package/src/index.ts +10 -22
- package/src/opLifecycle/README.md +263 -0
- package/src/opLifecycle/batchManager.ts +26 -55
- package/src/opLifecycle/definitions.ts +4 -0
- package/src/opLifecycle/index.ts +2 -1
- package/src/opLifecycle/opCompressor.ts +32 -12
- package/src/opLifecycle/opDecompressor.ts +50 -5
- package/src/opLifecycle/opGroupingManager.ts +78 -0
- package/src/opLifecycle/opSplitter.ts +56 -17
- package/src/opLifecycle/outbox.ts +126 -62
- package/src/opLifecycle/remoteMessageProcessor.ts +38 -22
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +34 -27
- package/src/storageServiceWithAttachBlobs.ts +38 -0
- package/src/summary/index.ts +105 -0
- package/src/{runWhileConnectedCoordinator.ts → summary/runWhileConnectedCoordinator.ts} +7 -7
- package/src/{runningSummarizer.ts → summary/runningSummarizer.ts} +318 -156
- package/src/{summarizer.ts → summary/summarizer.ts} +12 -105
- package/src/{summarizerHeuristics.ts → summary/summarizerHeuristics.ts} +13 -4
- package/src/summary/summarizerNode/index.ts +12 -0
- package/src/summary/summarizerNode/summarizerNode.ts +766 -0
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +214 -0
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +644 -0
- package/src/{summarizerTypes.ts → summary/summarizerTypes.ts} +28 -25
- package/src/{summaryFormat.ts → summary/summaryFormat.ts} +3 -29
- package/src/{summaryGenerator.ts → summary/summaryGenerator.ts} +34 -27
- package/src/{summaryManager.ts → summary/summaryManager.ts} +1 -1
- package/dist/garbageCollection.d.ts +0 -411
- package/dist/garbageCollection.d.ts.map +0 -1
- package/dist/garbageCollection.js.map +0 -1
- package/dist/garbageCollectionConstants.d.ts +0 -23
- package/dist/garbageCollectionConstants.d.ts.map +0 -1
- package/dist/garbageCollectionConstants.js +0 -36
- package/dist/garbageCollectionConstants.js.map +0 -1
- package/dist/garbageCollectionHelpers.d.ts +0 -15
- package/dist/garbageCollectionHelpers.d.ts.map +0 -1
- package/dist/garbageCollectionHelpers.js +0 -27
- package/dist/garbageCollectionHelpers.js.map +0 -1
- package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
- package/dist/gcSweepReadyUsageDetection.js.map +0 -1
- package/dist/orderedClientElection.d.ts.map +0 -1
- package/dist/orderedClientElection.js.map +0 -1
- package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/dist/runWhileConnectedCoordinator.js.map +0 -1
- package/dist/runningSummarizer.d.ts.map +0 -1
- package/dist/runningSummarizer.js.map +0 -1
- package/dist/serializedSnapshotStorage.d.ts +0 -58
- package/dist/serializedSnapshotStorage.d.ts.map +0 -1
- package/dist/serializedSnapshotStorage.js +0 -110
- package/dist/serializedSnapshotStorage.js.map +0 -1
- package/dist/summarizer.d.ts.map +0 -1
- package/dist/summarizer.js.map +0 -1
- package/dist/summarizerClientElection.d.ts.map +0 -1
- package/dist/summarizerClientElection.js.map +0 -1
- package/dist/summarizerHandle.d.ts +0 -12
- package/dist/summarizerHandle.d.ts.map +0 -1
- package/dist/summarizerHandle.js +0 -22
- package/dist/summarizerHandle.js.map +0 -1
- package/dist/summarizerHeuristics.d.ts.map +0 -1
- package/dist/summarizerHeuristics.js.map +0 -1
- package/dist/summarizerTypes.d.ts.map +0 -1
- package/dist/summarizerTypes.js.map +0 -1
- package/dist/summaryCollection.d.ts.map +0 -1
- package/dist/summaryCollection.js.map +0 -1
- package/dist/summaryFormat.d.ts.map +0 -1
- package/dist/summaryFormat.js.map +0 -1
- package/dist/summaryGenerator.d.ts.map +0 -1
- package/dist/summaryGenerator.js.map +0 -1
- package/dist/summaryManager.d.ts.map +0 -1
- package/dist/summaryManager.js.map +0 -1
- package/lib/garbageCollection.d.ts +0 -411
- package/lib/garbageCollection.d.ts.map +0 -1
- package/lib/garbageCollection.js.map +0 -1
- package/lib/garbageCollectionConstants.d.ts +0 -23
- package/lib/garbageCollectionConstants.d.ts.map +0 -1
- package/lib/garbageCollectionConstants.js +0 -33
- package/lib/garbageCollectionConstants.js.map +0 -1
- package/lib/garbageCollectionHelpers.d.ts +0 -15
- package/lib/garbageCollectionHelpers.d.ts.map +0 -1
- package/lib/garbageCollectionHelpers.js +0 -23
- package/lib/garbageCollectionHelpers.js.map +0 -1
- package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
- package/lib/gcSweepReadyUsageDetection.js.map +0 -1
- package/lib/orderedClientElection.d.ts.map +0 -1
- package/lib/orderedClientElection.js.map +0 -1
- package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
- package/lib/runWhileConnectedCoordinator.js.map +0 -1
- package/lib/runningSummarizer.d.ts.map +0 -1
- package/lib/runningSummarizer.js.map +0 -1
- package/lib/serializedSnapshotStorage.d.ts +0 -58
- package/lib/serializedSnapshotStorage.d.ts.map +0 -1
- package/lib/serializedSnapshotStorage.js +0 -106
- package/lib/serializedSnapshotStorage.js.map +0 -1
- package/lib/summarizer.d.ts.map +0 -1
- package/lib/summarizer.js.map +0 -1
- package/lib/summarizerClientElection.d.ts.map +0 -1
- package/lib/summarizerClientElection.js.map +0 -1
- package/lib/summarizerHandle.d.ts +0 -12
- package/lib/summarizerHandle.d.ts.map +0 -1
- package/lib/summarizerHandle.js +0 -18
- package/lib/summarizerHandle.js.map +0 -1
- package/lib/summarizerHeuristics.d.ts.map +0 -1
- package/lib/summarizerHeuristics.js.map +0 -1
- package/lib/summarizerTypes.d.ts.map +0 -1
- package/lib/summarizerTypes.js +0 -9
- package/lib/summarizerTypes.js.map +0 -1
- package/lib/summaryCollection.d.ts.map +0 -1
- package/lib/summaryCollection.js.map +0 -1
- package/lib/summaryFormat.d.ts.map +0 -1
- package/lib/summaryFormat.js.map +0 -1
- package/lib/summaryGenerator.d.ts.map +0 -1
- package/lib/summaryGenerator.js.map +0 -1
- package/lib/summaryManager.d.ts.map +0 -1
- package/lib/summaryManager.js.map +0 -1
- package/src/garbageCollectionConstants.ts +0 -38
- package/src/garbageCollectionHelpers.ts +0 -37
- package/src/serializedSnapshotStorage.ts +0 -151
- package/src/summarizerHandle.ts +0 -23
- /package/dist/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
- /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
- /package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
- /package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
- /package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
- /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
- /package/dist/{summaryCollection.js → summary/summaryCollection.js} +0 -0
- /package/dist/{summaryManager.js → summary/summaryManager.js} +0 -0
- /package/lib/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
- /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
- /package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
- /package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
- /package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
- /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
- /package/lib/{summaryCollection.js → summary/summaryCollection.js} +0 -0
- /package/lib/{summaryManager.js → summary/summaryManager.js} +0 -0
- /package/src/{orderedClientElection.ts → summary/orderedClientElection.ts} +0 -0
- /package/src/{summarizerClientElection.ts → summary/summarizerClientElection.ts} +0 -0
- /package/src/{summaryCollection.ts → summary/summaryCollection.ts} +0 -0
|
@@ -6,11 +6,17 @@
|
|
|
6
6
|
import { IDisposable, ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
7
7
|
import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/common-utils";
|
|
8
8
|
import { UsageError } from "@fluidframework/container-utils";
|
|
9
|
+
import { DriverErrorType } from "@fluidframework/driver-definitions";
|
|
9
10
|
import { isRuntimeMessage } from "@fluidframework/driver-utils";
|
|
10
11
|
import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
import {
|
|
13
|
+
ChildLogger,
|
|
14
|
+
isFluidError,
|
|
15
|
+
loggerToMonitoringContext,
|
|
16
|
+
MonitoringContext,
|
|
17
|
+
} from "@fluidframework/telemetry-utils";
|
|
18
|
+
import { ISummaryConfiguration } from "../containerRuntime";
|
|
19
|
+
import { opSize } from "../opProperties";
|
|
14
20
|
import { SummarizeHeuristicRunner } from "./summarizerHeuristics";
|
|
15
21
|
import {
|
|
16
22
|
IEnqueueSummarizeOptions,
|
|
@@ -27,8 +33,9 @@ import {
|
|
|
27
33
|
ISummarizeTelemetryProperties,
|
|
28
34
|
ISummarizerRuntime,
|
|
29
35
|
ISummarizeRunnerTelemetry,
|
|
36
|
+
IRefreshSummaryAckOptions,
|
|
30
37
|
} from "./summarizerTypes";
|
|
31
|
-
import { IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
|
|
38
|
+
import { IAckedSummary, IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
|
|
32
39
|
import {
|
|
33
40
|
raceTimer,
|
|
34
41
|
SummarizeReason,
|
|
@@ -38,6 +45,9 @@ import {
|
|
|
38
45
|
|
|
39
46
|
const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
|
|
40
47
|
|
|
48
|
+
const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
|
|
49
|
+
const numberOfAttemptsOnRestartAsRecovery = 1; // Only summarize once
|
|
50
|
+
|
|
41
51
|
/**
|
|
42
52
|
* An instance of RunningSummarizer manages the heuristics for summarizing.
|
|
43
53
|
* Until disposed, the instance of RunningSummarizer can assume that it is
|
|
@@ -51,8 +61,8 @@ export class RunningSummarizer implements IDisposable {
|
|
|
51
61
|
summaryWatcher: IClientSummaryWatcher,
|
|
52
62
|
configuration: ISummaryConfiguration,
|
|
53
63
|
submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
|
|
64
|
+
refreshLatestSummaryAckCallback: (options: IRefreshSummaryAckOptions) => Promise<void>,
|
|
54
65
|
heuristicData: ISummarizeHeuristicData,
|
|
55
|
-
raiseSummarizingError: (errorMessage: string) => void,
|
|
56
66
|
summaryCollection: SummaryCollection,
|
|
57
67
|
cancellationToken: ISummaryCancellationToken,
|
|
58
68
|
stopSummarizerCallback: (reason: SummarizerStopReason) => void,
|
|
@@ -63,16 +73,26 @@ export class RunningSummarizer implements IDisposable {
|
|
|
63
73
|
summaryWatcher,
|
|
64
74
|
configuration,
|
|
65
75
|
submitSummaryCallback,
|
|
76
|
+
refreshLatestSummaryAckCallback,
|
|
66
77
|
heuristicData,
|
|
67
|
-
raiseSummarizingError,
|
|
68
78
|
summaryCollection,
|
|
69
79
|
cancellationToken,
|
|
70
80
|
stopSummarizerCallback,
|
|
71
81
|
runtime,
|
|
72
82
|
);
|
|
73
83
|
|
|
84
|
+
// Before doing any heuristics or proceeding with its refreshing, if there is a summary ack received while
|
|
85
|
+
// this summarizer catches up, let's refresh state before proceeding with the summarization.
|
|
86
|
+
const lastAckRefSeq = await summarizer.handleSummaryAck();
|
|
87
|
+
|
|
74
88
|
await summarizer.waitStart();
|
|
75
89
|
|
|
90
|
+
// Handle summary acks asynchronously
|
|
91
|
+
// Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
|
|
92
|
+
summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
|
|
93
|
+
logger.sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
|
|
94
|
+
});
|
|
95
|
+
|
|
76
96
|
// Update heuristic counts
|
|
77
97
|
// By the time we get here, there are potentially ops missing from the heuristic summary counts
|
|
78
98
|
// Examples of where this could happen:
|
|
@@ -108,12 +128,13 @@ export class RunningSummarizer implements IDisposable {
|
|
|
108
128
|
private stopping = false;
|
|
109
129
|
private _disposed = false;
|
|
110
130
|
private summarizingLock: Promise<void> | undefined;
|
|
111
|
-
private refreshSummaryAckLock: Promise<void> | undefined;
|
|
112
131
|
private tryWhileSummarizing = false;
|
|
113
132
|
private readonly pendingAckTimer: PromiseTimer;
|
|
114
133
|
private heuristicRunner?: ISummarizeHeuristicRunner;
|
|
115
134
|
private readonly generator: SummaryGenerator;
|
|
116
|
-
private readonly
|
|
135
|
+
private readonly mc: MonitoringContext;
|
|
136
|
+
private readonly shouldAbortOnSummaryFailure: boolean;
|
|
137
|
+
|
|
117
138
|
private enqueuedSummary:
|
|
118
139
|
| {
|
|
119
140
|
reason: SummarizeReason;
|
|
@@ -126,6 +147,9 @@ export class RunningSummarizer implements IDisposable {
|
|
|
126
147
|
private totalSuccessfulAttempts = 0;
|
|
127
148
|
private initialized = false;
|
|
128
149
|
|
|
150
|
+
private readonly deltaManagerListener;
|
|
151
|
+
private readonly runtimeListener;
|
|
152
|
+
|
|
129
153
|
private constructor(
|
|
130
154
|
baseLogger: ITelemetryLogger,
|
|
131
155
|
private readonly summaryWatcher: IClientSummaryWatcher,
|
|
@@ -133,8 +157,10 @@ export class RunningSummarizer implements IDisposable {
|
|
|
133
157
|
private readonly submitSummaryCallback: (
|
|
134
158
|
options: ISubmitSummaryOptions,
|
|
135
159
|
) => Promise<SubmitSummaryResult>,
|
|
160
|
+
private readonly refreshLatestSummaryAckCallback: (
|
|
161
|
+
options: IRefreshSummaryAckOptions,
|
|
162
|
+
) => Promise<void>,
|
|
136
163
|
private readonly heuristicData: ISummarizeHeuristicData,
|
|
137
|
-
private readonly raiseSummarizingError: (errorMessage: string) => void,
|
|
138
164
|
private readonly summaryCollection: SummaryCollection,
|
|
139
165
|
private readonly cancellationToken: ISummaryCancellationToken,
|
|
140
166
|
private readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,
|
|
@@ -145,9 +171,15 @@ export class RunningSummarizer implements IDisposable {
|
|
|
145
171
|
summarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,
|
|
146
172
|
};
|
|
147
173
|
|
|
148
|
-
this.
|
|
149
|
-
|
|
150
|
-
|
|
174
|
+
this.mc = loggerToMonitoringContext(
|
|
175
|
+
ChildLogger.create(baseLogger, "Running", {
|
|
176
|
+
all: telemetryProps,
|
|
177
|
+
}),
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
this.shouldAbortOnSummaryFailure =
|
|
181
|
+
this.mc.config.getString("Fluid.ContainerRuntime.Test.SummarizationRecoveryMethod") ===
|
|
182
|
+
"restart";
|
|
151
183
|
|
|
152
184
|
if (configuration.state !== "disableHeuristics") {
|
|
153
185
|
assert(
|
|
@@ -158,7 +190,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
158
190
|
heuristicData,
|
|
159
191
|
this.configuration,
|
|
160
192
|
(reason) => this.trySummarize(reason),
|
|
161
|
-
this.logger,
|
|
193
|
+
this.mc.logger,
|
|
162
194
|
);
|
|
163
195
|
}
|
|
164
196
|
|
|
@@ -173,13 +205,12 @@ export class RunningSummarizer implements IDisposable {
|
|
|
173
205
|
const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);
|
|
174
206
|
|
|
175
207
|
this.pendingAckTimer = new PromiseTimer(maxAckWaitTime, () => {
|
|
176
|
-
// pre-0.58 error message: summaryAckWaitTimeout
|
|
177
|
-
this.raiseSummarizingError("Pending summary ack not received in time");
|
|
178
208
|
// Note: summarizeCount (from ChildLogger definition) may be 0,
|
|
179
209
|
// since this code path is hit when RunningSummarizer first starts up,
|
|
180
210
|
// before this instance has kicked off a new summarize run.
|
|
181
|
-
this.logger.sendErrorEvent({
|
|
211
|
+
this.mc.logger.sendErrorEvent({
|
|
182
212
|
eventName: "SummaryAckWaitTimeout",
|
|
213
|
+
message: "Pending summary ack not received in time",
|
|
183
214
|
maxAckWaitTime,
|
|
184
215
|
referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,
|
|
185
216
|
summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,
|
|
@@ -189,7 +220,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
189
220
|
// Set up pending ack timeout by op timestamp differences for previous summaries.
|
|
190
221
|
summaryCollection.setPendingAckTimerTimeoutCallback(maxAckWaitTime, () => {
|
|
191
222
|
if (this.pendingAckTimer.hasTimer) {
|
|
192
|
-
this.logger.sendTelemetryEvent({
|
|
223
|
+
this.mc.logger.sendTelemetryEvent({
|
|
193
224
|
eventName: "MissingSummaryAckFoundByOps",
|
|
194
225
|
referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,
|
|
195
226
|
summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,
|
|
@@ -202,24 +233,127 @@ export class RunningSummarizer implements IDisposable {
|
|
|
202
233
|
this.pendingAckTimer,
|
|
203
234
|
this.heuristicData,
|
|
204
235
|
this.submitSummaryCallback,
|
|
205
|
-
this.raiseSummarizingError,
|
|
206
236
|
() => {
|
|
207
237
|
this.totalSuccessfulAttempts++;
|
|
208
238
|
},
|
|
209
239
|
this.summaryWatcher,
|
|
210
|
-
this.logger,
|
|
240
|
+
this.mc.logger,
|
|
211
241
|
);
|
|
212
242
|
|
|
213
|
-
// Listen for ops
|
|
214
|
-
this.
|
|
215
|
-
|
|
216
|
-
|
|
243
|
+
// Listen to deltaManager for non-runtime ops
|
|
244
|
+
this.deltaManagerListener = (op) => {
|
|
245
|
+
if (!isRuntimeMessage(op)) {
|
|
246
|
+
this.handleOp(op, false);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
// Listen to runtime for runtime ops
|
|
251
|
+
this.runtimeListener = (op, runtimeMessage) => {
|
|
252
|
+
if (runtimeMessage) {
|
|
253
|
+
this.handleOp(op, true);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// Purpose of listening to deltaManager is for back-compat
|
|
258
|
+
// Can remove and only listen to runtime once loader version is past 2.0.0-internal.1.2.0 (https://github.com/microsoft/FluidFramework/pull/11832)
|
|
259
|
+
// Tracked by AB#3883
|
|
260
|
+
this.runtime.deltaManager.on("op", this.deltaManagerListener);
|
|
261
|
+
this.runtime.on?.("op", this.runtimeListener);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private async handleSummaryAck(): Promise<number> {
|
|
265
|
+
const lastAck: IAckedSummary | undefined = this.summaryCollection.latestAck;
|
|
266
|
+
let refSequenceNumber = -1;
|
|
267
|
+
// In case we haven't received the lastestAck yet, just return.
|
|
268
|
+
if (lastAck !== undefined) {
|
|
269
|
+
refSequenceNumber = lastAck.summaryOp.referenceSequenceNumber;
|
|
270
|
+
const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
|
|
271
|
+
const summaryOpHandle = lastAck.summaryOp.contents.handle;
|
|
272
|
+
const summaryAckHandle = lastAck.summaryAck.contents.handle;
|
|
273
|
+
while (this.summarizingLock !== undefined) {
|
|
274
|
+
summaryLogger.sendTelemetryEvent({
|
|
275
|
+
eventName: "RefreshAttemptWithSummarizerRunning",
|
|
276
|
+
referenceSequenceNumber: refSequenceNumber,
|
|
277
|
+
proposalHandle: summaryOpHandle,
|
|
278
|
+
ackHandle: summaryAckHandle,
|
|
279
|
+
});
|
|
280
|
+
await this.summarizingLock;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Make sure we block any summarizer from being executed/enqueued while
|
|
284
|
+
// executing the refreshLatestSummaryAck.
|
|
285
|
+
// https://dev.azure.com/fluidframework/internal/_workitems/edit/779
|
|
286
|
+
await this.lockedSummaryAction(
|
|
287
|
+
() => {},
|
|
288
|
+
async () =>
|
|
289
|
+
this.refreshLatestSummaryAckCallback({
|
|
290
|
+
proposalHandle: summaryOpHandle,
|
|
291
|
+
ackHandle: summaryAckHandle,
|
|
292
|
+
summaryRefSeq: refSequenceNumber,
|
|
293
|
+
summaryLogger,
|
|
294
|
+
}).catch(async (error) => {
|
|
295
|
+
// If the error is 404, so maybe the fetched version no longer exists on server. We just
|
|
296
|
+
// ignore this error in that case, as that means we will have another summaryAck for the
|
|
297
|
+
// latest version with which we will refresh the state. However in case of single commit
|
|
298
|
+
// summary, we might me missing a summary ack, so in that case we are still fine as the
|
|
299
|
+
// code in `submitSummary` function in container runtime, will refresh the latest state
|
|
300
|
+
// by calling `refreshLatestSummaryAckFromServer` and we will be fine.
|
|
301
|
+
const isIgnoredError =
|
|
302
|
+
isFluidError(error) &&
|
|
303
|
+
error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError;
|
|
304
|
+
|
|
305
|
+
summaryLogger.sendTelemetryEvent(
|
|
306
|
+
{
|
|
307
|
+
eventName: isIgnoredError
|
|
308
|
+
? "HandleSummaryAckErrorIgnored"
|
|
309
|
+
: "HandleLastSummaryAckError",
|
|
310
|
+
referenceSequenceNumber: refSequenceNumber,
|
|
311
|
+
proposalHandle: summaryOpHandle,
|
|
312
|
+
ackHandle: summaryAckHandle,
|
|
313
|
+
},
|
|
314
|
+
error,
|
|
315
|
+
);
|
|
316
|
+
}),
|
|
317
|
+
() => {},
|
|
318
|
+
);
|
|
319
|
+
refSequenceNumber++;
|
|
320
|
+
}
|
|
321
|
+
return refSequenceNumber;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Responsible for receiving and processing all the summaryAcks.
|
|
326
|
+
* In case there was a summary ack processed by the running summarizer before processIncomingSummaryAcks is called,
|
|
327
|
+
* it will wait for the summary ack that is newer than the one indicated by the lastAckRefSeq.
|
|
328
|
+
* @param lastAckRefSeq - Identifies the minimum reference sequence number the summarizer needs to wait for.
|
|
329
|
+
* In case of a negative number, the summarizer will wait for ANY summary ack that is greater than the deltaManager's initial sequence number,
|
|
330
|
+
* and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
|
|
331
|
+
*/
|
|
332
|
+
private async processIncomingSummaryAcks(lastAckRefSeq: number) {
|
|
333
|
+
let refSequenceNumber =
|
|
334
|
+
lastAckRefSeq > 0 ? lastAckRefSeq : this.runtime.deltaManager.initialSequenceNumber;
|
|
335
|
+
while (!this.disposed) {
|
|
336
|
+
const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
|
|
337
|
+
|
|
338
|
+
// Initialize ack with undefined if exception happens inside of waitSummaryAck on second iteration,
|
|
339
|
+
// we record undefined, not previous handles.
|
|
340
|
+
await this.summaryCollection.waitSummaryAck(refSequenceNumber);
|
|
341
|
+
|
|
342
|
+
summaryLogger.sendTelemetryEvent({
|
|
343
|
+
eventName: "processIncomingSummaryAcks",
|
|
344
|
+
referenceSequenceNumber: refSequenceNumber,
|
|
345
|
+
lastAckRefSeq,
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
refSequenceNumber = await this.handleSummaryAck();
|
|
349
|
+
// A valid Summary Ack must have been processed.
|
|
350
|
+
assert(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
|
|
351
|
+
}
|
|
217
352
|
}
|
|
218
353
|
|
|
219
354
|
public dispose(): void {
|
|
220
|
-
this.runtime.deltaManager.off("op",
|
|
221
|
-
|
|
222
|
-
});
|
|
355
|
+
this.runtime.deltaManager.off("op", this.deltaManagerListener);
|
|
356
|
+
this.runtime.off?.("op", this.runtimeListener);
|
|
223
357
|
this.summaryWatcher.dispose();
|
|
224
358
|
this.heuristicRunner?.dispose();
|
|
225
359
|
this.heuristicRunner = undefined;
|
|
@@ -238,16 +372,16 @@ export class RunningSummarizer implements IDisposable {
|
|
|
238
372
|
*/
|
|
239
373
|
public tryGetCorrelatedLogger = (summaryOpRefSeq) =>
|
|
240
374
|
this.heuristicData.lastAttempt.refSequenceNumber === summaryOpRefSeq
|
|
241
|
-
? this.logger
|
|
375
|
+
? this.mc.logger
|
|
242
376
|
: undefined;
|
|
243
377
|
|
|
244
378
|
/** We only want a single heuristic runner micro-task (will provide better optimized grouping of ops) */
|
|
245
379
|
private heuristicRunnerMicroTaskExists = false;
|
|
246
380
|
|
|
247
|
-
public handleOp(op: ISequencedDocumentMessage) {
|
|
381
|
+
public handleOp(op: ISequencedDocumentMessage, runtimeMessage: boolean) {
|
|
248
382
|
this.heuristicData.lastOpSequenceNumber = op.sequenceNumber;
|
|
249
383
|
|
|
250
|
-
if (
|
|
384
|
+
if (runtimeMessage) {
|
|
251
385
|
this.heuristicData.numRuntimeOps++;
|
|
252
386
|
} else {
|
|
253
387
|
this.heuristicData.numNonRuntimeOps++;
|
|
@@ -258,7 +392,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
258
392
|
// Check for enqueued on-demand summaries; Intentionally do nothing otherwise
|
|
259
393
|
if (
|
|
260
394
|
this.initialized &&
|
|
261
|
-
this.opCanTriggerSummary(op) &&
|
|
395
|
+
this.opCanTriggerSummary(op, runtimeMessage) &&
|
|
262
396
|
!this.tryRunEnqueuedSummary() &&
|
|
263
397
|
!this.heuristicRunnerMicroTaskExists
|
|
264
398
|
) {
|
|
@@ -279,14 +413,14 @@ export class RunningSummarizer implements IDisposable {
|
|
|
279
413
|
* @param op - op to check
|
|
280
414
|
* @returns true if this op can trigger a summary
|
|
281
415
|
*/
|
|
282
|
-
private opCanTriggerSummary(op: ISequencedDocumentMessage): boolean {
|
|
416
|
+
private opCanTriggerSummary(op: ISequencedDocumentMessage, runtimeMessage: boolean): boolean {
|
|
283
417
|
switch (op.type) {
|
|
284
418
|
case MessageType.Summarize:
|
|
285
419
|
case MessageType.SummaryAck:
|
|
286
420
|
case MessageType.SummaryNack:
|
|
287
421
|
return false;
|
|
288
422
|
default:
|
|
289
|
-
return
|
|
423
|
+
return runtimeMessage || this.nonRuntimeOpCanTriggerSummary();
|
|
290
424
|
}
|
|
291
425
|
}
|
|
292
426
|
|
|
@@ -353,41 +487,35 @@ export class RunningSummarizer implements IDisposable {
|
|
|
353
487
|
this.initialized = true;
|
|
354
488
|
}
|
|
355
489
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
* before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
|
|
360
|
-
* Note: The refreshSummaryAckLock makes sure no summarizer gets enqueued or processed
|
|
361
|
-
* until the refresh has completed. One can't rely uniquely on the summarizingLock as the
|
|
362
|
-
* refreshLatestSummaryAck also happens during the time summarizingLock !== undefined.
|
|
363
|
-
* Ex. Summarizer submits a summay + op and then waits for the Summary Ack to proceed
|
|
364
|
-
* with the refreshLatestSummaryAck and complete the summary.
|
|
365
|
-
* @param action - action to perform.
|
|
366
|
-
* @returns - result of action.
|
|
367
|
-
*/
|
|
368
|
-
public async lockedRefreshSummaryAckAction<T>(action: () => Promise<T>) {
|
|
369
|
-
assert(
|
|
370
|
-
this.refreshSummaryAckLock === undefined,
|
|
371
|
-
0x396 /* Refresh Summary Ack - Caller is responsible for checking lock */,
|
|
372
|
-
);
|
|
490
|
+
private beforeSummaryAction() {
|
|
491
|
+
this.summarizeCount++;
|
|
492
|
+
}
|
|
373
493
|
|
|
374
|
-
|
|
375
|
-
|
|
494
|
+
private afterSummaryAction() {
|
|
495
|
+
const retry = this.tryWhileSummarizing;
|
|
496
|
+
this.tryWhileSummarizing = false;
|
|
376
497
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
498
|
+
// After summarizing, we should check to see if we need to summarize again.
|
|
499
|
+
// Rerun the heuristics and check for enqueued summaries.
|
|
500
|
+
if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
|
|
501
|
+
this.heuristicRunner?.run();
|
|
502
|
+
}
|
|
381
503
|
}
|
|
382
504
|
|
|
383
505
|
/**
|
|
384
506
|
* Runs single summary action that prevents any other concurrent actions.
|
|
385
507
|
* Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)
|
|
386
508
|
* before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
|
|
509
|
+
* @param before - set of instructions to run before running the action.
|
|
387
510
|
* @param action - action to perform.
|
|
511
|
+
* @param after - set of instructions to run after running the action.
|
|
388
512
|
* @returns - result of action.
|
|
389
513
|
*/
|
|
390
|
-
private async lockedSummaryAction<T>(
|
|
514
|
+
private async lockedSummaryAction<T>(
|
|
515
|
+
before: () => void,
|
|
516
|
+
action: () => Promise<T>,
|
|
517
|
+
after: () => void,
|
|
518
|
+
) {
|
|
391
519
|
assert(
|
|
392
520
|
this.summarizingLock === undefined,
|
|
393
521
|
0x25b /* "Caller is responsible for checking lock" */,
|
|
@@ -396,22 +524,12 @@ export class RunningSummarizer implements IDisposable {
|
|
|
396
524
|
const summarizingLock = new Deferred<void>();
|
|
397
525
|
this.summarizingLock = summarizingLock.promise;
|
|
398
526
|
|
|
399
|
-
|
|
400
|
-
// Make sure the RefreshLatestSummaryAck is not being executed.
|
|
401
|
-
await this.refreshSummaryAckLock;
|
|
527
|
+
before();
|
|
402
528
|
|
|
403
529
|
return action().finally(() => {
|
|
404
530
|
summarizingLock.resolve();
|
|
405
531
|
this.summarizingLock = undefined;
|
|
406
|
-
|
|
407
|
-
const retry = this.tryWhileSummarizing;
|
|
408
|
-
this.tryWhileSummarizing = false;
|
|
409
|
-
|
|
410
|
-
// After summarizing, we should check to see if we need to summarize again.
|
|
411
|
-
// Rerun the heuristics and check for enqueued summaries.
|
|
412
|
-
if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
|
|
413
|
-
this.heuristicRunner?.run();
|
|
414
|
-
}
|
|
532
|
+
after();
|
|
415
533
|
});
|
|
416
534
|
}
|
|
417
535
|
|
|
@@ -429,16 +547,24 @@ export class RunningSummarizer implements IDisposable {
|
|
|
429
547
|
cancellationToken = this.cancellationToken,
|
|
430
548
|
resultsBuilder = new SummarizeResultBuilder(),
|
|
431
549
|
): ISummarizeResults {
|
|
432
|
-
this.lockedSummaryAction(
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
550
|
+
this.lockedSummaryAction(
|
|
551
|
+
() => {
|
|
552
|
+
this.beforeSummaryAction();
|
|
553
|
+
},
|
|
554
|
+
async () => {
|
|
555
|
+
const summarizeResult = this.generator.summarize(
|
|
556
|
+
summarizeProps,
|
|
557
|
+
options,
|
|
558
|
+
cancellationToken,
|
|
559
|
+
resultsBuilder,
|
|
560
|
+
);
|
|
561
|
+
// ensure we wait till the end of the process
|
|
562
|
+
return summarizeResult.receivedSummaryAckOrNack;
|
|
563
|
+
},
|
|
564
|
+
() => {
|
|
565
|
+
this.afterSummaryAction();
|
|
566
|
+
},
|
|
567
|
+
).catch((error) => {
|
|
442
568
|
// SummaryGenerator.summarize() does not throw exceptions - it converts them to failed result
|
|
443
569
|
// on resultsBuilder
|
|
444
570
|
// We do not care about exceptions on receivedSummaryAckOrNack - caller should check results
|
|
@@ -460,91 +586,127 @@ export class RunningSummarizer implements IDisposable {
|
|
|
460
586
|
return;
|
|
461
587
|
}
|
|
462
588
|
|
|
463
|
-
this.lockedSummaryAction(
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
const { delaySeconds: regularDelaySeconds = 0, ...options } =
|
|
489
|
-
attempts[summaryAttemptPhase];
|
|
490
|
-
const delaySeconds = overrideDelaySeconds ?? regularDelaySeconds;
|
|
491
|
-
|
|
492
|
-
const summarizeProps: ISummarizeTelemetryProperties = {
|
|
493
|
-
reason,
|
|
494
|
-
summaryAttempts,
|
|
495
|
-
summaryAttemptsPerPhase,
|
|
496
|
-
summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
|
|
497
|
-
...options,
|
|
498
|
-
};
|
|
499
|
-
|
|
500
|
-
if (delaySeconds > 0) {
|
|
501
|
-
this.logger.sendPerformanceEvent({
|
|
502
|
-
eventName: "SummarizeAttemptDelay",
|
|
503
|
-
duration: delaySeconds,
|
|
504
|
-
summaryNackDelay: overrideDelaySeconds !== undefined,
|
|
505
|
-
...summarizeProps,
|
|
589
|
+
this.lockedSummaryAction(
|
|
590
|
+
() => {
|
|
591
|
+
this.beforeSummaryAction();
|
|
592
|
+
},
|
|
593
|
+
async () => {
|
|
594
|
+
const attempts: (ISummarizeOptions & { delaySeconds?: number })[] = [
|
|
595
|
+
{ refreshLatestAck: false, fullTree: false },
|
|
596
|
+
{ refreshLatestAck: true, fullTree: false },
|
|
597
|
+
{ refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },
|
|
598
|
+
{ refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },
|
|
599
|
+
];
|
|
600
|
+
let overrideDelaySeconds: number | undefined;
|
|
601
|
+
let summaryAttempts = 0;
|
|
602
|
+
let summaryAttemptsPerPhase = 0;
|
|
603
|
+
// Reducing the default number of attempts to defaultNumberofSummarizationAttempts.
|
|
604
|
+
let totalAttempts = this.shouldAbortOnSummaryFailure
|
|
605
|
+
? numberOfAttemptsOnRestartAsRecovery
|
|
606
|
+
: this.mc.config.getNumber("Fluid.Summarizer.Attempts") ??
|
|
607
|
+
defaultNumberSummarizationAttempts;
|
|
608
|
+
|
|
609
|
+
if (totalAttempts > attempts.length) {
|
|
610
|
+
this.mc.logger.sendTelemetryEvent({
|
|
611
|
+
eventName: "InvalidSummarizerAttempts",
|
|
612
|
+
attempts: totalAttempts,
|
|
506
613
|
});
|
|
507
|
-
|
|
614
|
+
totalAttempts = defaultNumberSummarizationAttempts;
|
|
615
|
+
} else if (totalAttempts < 1) {
|
|
616
|
+
throw new UsageError("Invalid number of attempts.");
|
|
508
617
|
}
|
|
509
618
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
619
|
+
let lastResult: { message: string; error: any } | undefined;
|
|
620
|
+
|
|
621
|
+
for (let summaryAttemptPhase = 0; summaryAttemptPhase < totalAttempts; ) {
|
|
622
|
+
if (this.cancellationToken.cancelled) {
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// We only want to attempt 1 summary when reason is "lastSummary"
|
|
627
|
+
if (++summaryAttempts > 1 && reason === "lastSummary") {
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
summaryAttemptsPerPhase++;
|
|
632
|
+
|
|
633
|
+
const { delaySeconds: regularDelaySeconds = 0, ...options } =
|
|
634
|
+
attempts[summaryAttemptPhase];
|
|
635
|
+
|
|
636
|
+
const summarizeProps: ISummarizeTelemetryProperties = {
|
|
637
|
+
reason,
|
|
638
|
+
summaryAttempts,
|
|
639
|
+
summaryAttemptsPerPhase,
|
|
640
|
+
summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
|
|
641
|
+
...options,
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
// Note: no need to account for cancellationToken.waitCancelled here, as
|
|
645
|
+
// this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
|
|
646
|
+
const resultSummarize = this.generator.summarize(
|
|
647
|
+
summarizeProps,
|
|
648
|
+
options,
|
|
649
|
+
cancellationToken,
|
|
650
|
+
);
|
|
651
|
+
const result = await resultSummarize.receivedSummaryAckOrNack;
|
|
652
|
+
|
|
653
|
+
if (result.success) {
|
|
654
|
+
return;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// Check for retryDelay that can come from summaryNack or upload summary flow.
|
|
658
|
+
// Retry the same step only once per retryAfter response.
|
|
659
|
+
overrideDelaySeconds = result.retryAfterSeconds;
|
|
660
|
+
if (overrideDelaySeconds === undefined || summaryAttemptsPerPhase > 1) {
|
|
661
|
+
summaryAttemptPhase++;
|
|
662
|
+
summaryAttemptsPerPhase = 0;
|
|
663
|
+
}
|
|
664
|
+
lastResult = result;
|
|
665
|
+
|
|
666
|
+
const delaySeconds = overrideDelaySeconds ?? regularDelaySeconds;
|
|
667
|
+
|
|
668
|
+
if (delaySeconds > 0) {
|
|
669
|
+
this.mc.logger.sendPerformanceEvent({
|
|
670
|
+
eventName: "SummarizeAttemptDelay",
|
|
671
|
+
duration: delaySeconds,
|
|
672
|
+
summaryNackDelay: overrideDelaySeconds !== undefined,
|
|
673
|
+
...summarizeProps,
|
|
674
|
+
});
|
|
675
|
+
await delay(delaySeconds * 1000);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
521
678
|
|
|
522
|
-
if (
|
|
679
|
+
if (this.shouldAbortOnSummaryFailure) {
|
|
680
|
+
this.mc.logger.sendTelemetryEvent(
|
|
681
|
+
{
|
|
682
|
+
eventName: "ClosingSummarizerOnSummaryStale",
|
|
683
|
+
reason,
|
|
684
|
+
message: lastResult?.message,
|
|
685
|
+
},
|
|
686
|
+
lastResult?.error,
|
|
687
|
+
);
|
|
688
|
+
|
|
689
|
+
this.stopSummarizerCallback("latestSummaryStateStale");
|
|
690
|
+
this.runtime.closeFn();
|
|
523
691
|
return;
|
|
524
692
|
}
|
|
525
|
-
//
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
// If all attempts failed, log error (with last attempt info) and close the summarizer container
|
|
536
|
-
this.logger.sendErrorEvent(
|
|
537
|
-
{
|
|
538
|
-
eventName: "FailToSummarize",
|
|
539
|
-
reason,
|
|
540
|
-
message: lastResult?.message,
|
|
541
|
-
},
|
|
542
|
-
lastResult?.error,
|
|
543
|
-
);
|
|
693
|
+
// If all attempts failed, log error (with last attempt info) and close the summarizer container
|
|
694
|
+
this.mc.logger.sendErrorEvent(
|
|
695
|
+
{
|
|
696
|
+
eventName: "FailToSummarize",
|
|
697
|
+
reason,
|
|
698
|
+
message: lastResult?.message,
|
|
699
|
+
},
|
|
700
|
+
lastResult?.error,
|
|
701
|
+
);
|
|
544
702
|
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
703
|
+
this.stopSummarizerCallback("failToSummarize");
|
|
704
|
+
},
|
|
705
|
+
() => {
|
|
706
|
+
this.afterSummaryAction();
|
|
707
|
+
},
|
|
708
|
+
).catch((error) => {
|
|
709
|
+
this.mc.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
|
|
548
710
|
});
|
|
549
711
|
}
|
|
550
712
|
|