@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
|
@@ -18,6 +18,7 @@ export declare const neverCancelledSummaryToken: ISummaryCancellationToken;
|
|
|
18
18
|
*/
|
|
19
19
|
export declare class RunWhileConnectedCoordinator implements ICancellableSummarizerController {
|
|
20
20
|
private readonly runtime;
|
|
21
|
+
private readonly active;
|
|
21
22
|
private _cancelled;
|
|
22
23
|
private readonly stopDeferred;
|
|
23
24
|
get cancelled(): boolean;
|
|
@@ -25,8 +26,8 @@ export declare class RunWhileConnectedCoordinator implements ICancellableSummari
|
|
|
25
26
|
* Returns a promise that resolves once stopped either externally or by disconnect.
|
|
26
27
|
*/
|
|
27
28
|
get waitCancelled(): Promise<SummarizerStopReason>;
|
|
28
|
-
static create(runtime: IConnectableRuntime): Promise<RunWhileConnectedCoordinator>;
|
|
29
|
-
protected constructor(runtime: IConnectableRuntime);
|
|
29
|
+
static create(runtime: IConnectableRuntime, active: () => boolean): Promise<RunWhileConnectedCoordinator>;
|
|
30
|
+
protected constructor(runtime: IConnectableRuntime, active: () => boolean);
|
|
30
31
|
/**
|
|
31
32
|
* Starts and waits for a promise which resolves when connected.
|
|
32
33
|
* The promise will also resolve if stopped either externally or by disconnect.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runWhileConnectedCoordinator.d.ts","sourceRoot":"","sources":["../../src/summary/runWhileConnectedCoordinator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACN,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,gCAAiC,SAAQ,yBAAyB;IAClF,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,yBAGxC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,4BAA6B,YAAW,gCAAgC;IAsCnF,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAtCxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IAErE,IAAW,SAAS,YAkBnB;IAED;;OAEG;IACH,IAAW,aAAa,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAExD;WAEmB,MAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO;IAM9E,SAAS,aACS,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,OAAO;IAGvC;;;;;;;;;;;;OAYG;cACa,SAAS;IAiBzB;;OAEG;IACI,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;CAM/C"}
|
|
@@ -17,14 +17,15 @@ export const neverCancelledSummaryToken = {
|
|
|
17
17
|
* when disconnected or if stop() is called.
|
|
18
18
|
*/
|
|
19
19
|
export class RunWhileConnectedCoordinator {
|
|
20
|
-
constructor(runtime) {
|
|
20
|
+
constructor(runtime, active) {
|
|
21
21
|
this.runtime = runtime;
|
|
22
|
+
this.active = active;
|
|
22
23
|
this._cancelled = false;
|
|
23
24
|
this.stopDeferred = new Deferred();
|
|
24
25
|
}
|
|
25
26
|
get cancelled() {
|
|
26
27
|
if (!this._cancelled) {
|
|
27
|
-
assert(this.
|
|
28
|
+
assert(this.active(), 0x25d /* "We should never connect as 'read'" */);
|
|
28
29
|
// This check can't be enabled in current design due to lastSummary flow, where
|
|
29
30
|
// summarizer for closed container stays around and can produce one more summary.
|
|
30
31
|
// Currently we solve the problem of overlapping summarizer by doing wait in
|
|
@@ -45,8 +46,8 @@ export class RunWhileConnectedCoordinator {
|
|
|
45
46
|
get waitCancelled() {
|
|
46
47
|
return this.stopDeferred.promise;
|
|
47
48
|
}
|
|
48
|
-
static async create(runtime) {
|
|
49
|
-
const obj = new RunWhileConnectedCoordinator(runtime);
|
|
49
|
+
static async create(runtime, active) {
|
|
50
|
+
const obj = new RunWhileConnectedCoordinator(runtime, active);
|
|
50
51
|
await obj.waitStart();
|
|
51
52
|
return obj;
|
|
52
53
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runWhileConnectedCoordinator.js","sourceRoot":"","sources":["../../src/summary/runWhileConnectedCoordinator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAYhE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAA8B;IACpE,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IAqCxC,YACkB,OAA4B,EAC5B,MAAqB;QADrB,YAAO,GAAP,OAAO,CAAqB;QAC5B,WAAM,GAAN,MAAM,CAAe;QAtC/B,eAAU,GAAG,KAAK,CAAC;QACV,iBAAY,GAAG,IAAI,QAAQ,EAAwB,CAAC;IAsClE,CAAC;IApCJ,IAAW,SAAS;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACrB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAEvE,+EAA+E;YAC/E,iFAAiF;YACjF,4EAA4E;YAC5E,oCAAoC;YACpC,6CAA6C;YAC7C,mGAAmG;YACnG,yBAAyB;YACzB,oFAAoF;YACpF,EAAE;YACF,wEAAwE;YACxE,uFAAuF;SACvF;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IAClC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAA4B,EAAE,MAAqB;QAC7E,MAAM,GAAG,GAAG,IAAI,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC;IACZ,CAAC;IAOD;;;;;;;;;;;;OAYG;IACO,KAAK,CAAC,SAAS;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC1C,OAAO;SACP;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAE9E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YAC5B,MAAM,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CACvC,CAAC;YACF,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;SACxD;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,MAA4B;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SAClC;IACF,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, Deferred } from \"@fluidframework/common-utils\";\nimport {\n\tSummarizerStopReason,\n\tIConnectableRuntime,\n\tISummaryCancellationToken,\n} from \"./summarizerTypes\";\n\n/* Similar to AbortController, but using promise instead of events */\nexport interface ICancellableSummarizerController extends ISummaryCancellationToken {\n\tstop(reason: SummarizerStopReason): void;\n}\n\n/**\n * Can be useful in testing as well as in places where caller does not use cancellation.\n * This object implements ISummaryCancellationToken interface but cancellation is never leveraged.\n */\nexport const neverCancelledSummaryToken: ISummaryCancellationToken = {\n\tcancelled: false,\n\twaitCancelled: new Promise(() => {}),\n};\n\n/**\n * Helper class to coordinate something that needs to run only while connected.\n * This provides promises that resolve as it starts or stops. Stopping happens\n * when disconnected or if stop() is called.\n */\nexport class RunWhileConnectedCoordinator implements ICancellableSummarizerController {\n\tprivate _cancelled = false;\n\tprivate readonly stopDeferred = new Deferred<SummarizerStopReason>();\n\n\tpublic get cancelled() {\n\t\tif (!this._cancelled) {\n\t\t\tassert(this.active(), 0x25d /* \"We should never connect as 'read'\" */);\n\n\t\t\t// This check can't be enabled in current design due to lastSummary flow, where\n\t\t\t// summarizer for closed container stays around and can produce one more summary.\n\t\t\t// Currently we solve the problem of overlapping summarizer by doing wait in\n\t\t\t// SummaryManager.createSummarizer()\n\t\t\t// Better solution would involve these steps:\n\t\t\t// 1. Summarizer selection logic should chose summarizing client (with clientType === \"summarizer\")\n\t\t\t// if such client exists.\n\t\t\t// 2. Summarizer should be updated about such changes (to update onBehalfOfClientId)\n\t\t\t//\n\t\t\t// assert(this.runtime.summarizerClientId === this.onBehalfOfClientId ||\n\t\t\t// this.runtime.summarizerClientId === this.runtime.clientId, \"onBehalfOfClientId\");\n\t\t}\n\n\t\treturn this._cancelled;\n\t}\n\n\t/**\n\t * Returns a promise that resolves once stopped either externally or by disconnect.\n\t */\n\tpublic get waitCancelled(): Promise<SummarizerStopReason> {\n\t\treturn this.stopDeferred.promise;\n\t}\n\n\tpublic static async create(runtime: IConnectableRuntime, active: () => boolean) {\n\t\tconst obj = new RunWhileConnectedCoordinator(runtime, active);\n\t\tawait obj.waitStart();\n\t\treturn obj;\n\t}\n\n\tprotected constructor(\n\t\tprivate readonly runtime: IConnectableRuntime,\n\t\tprivate readonly active: () => boolean,\n\t) {}\n\n\t/**\n\t * Starts and waits for a promise which resolves when connected.\n\t * The promise will also resolve if stopped either externally or by disconnect.\n\t *\n\t * We only listen on disconnected event for clientType === \"summarizer\" container!\n\t * And only do it here - no other place should check it! That way we have only one place\n\t * that controls policy and it's easy to change policy in the future if we want to!\n\t * We do not listen for \"main\" (aka interactive) container disconnect here, as it's\n\t * responsibility of SummaryManager to decide if that's material or not. There are cases\n\t * like \"lastSummary\", or main client experiencing nacks / disconnects due to hitting limit\n\t * of non-summarized ops, where can make determination to continue with summary even if main\n\t * client is disconnected.\n\t */\n\tprotected async waitStart() {\n\t\tif (this.runtime.disposed) {\n\t\t\tthis.stop(\"summarizerClientDisconnected\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.runtime.once(\"dispose\", () => this.stop(\"summarizerClientDisconnected\"));\n\n\t\tif (!this.runtime.connected) {\n\t\t\tconst waitConnected = new Promise<void>((resolve) =>\n\t\t\t\tthis.runtime.once(\"connected\", resolve),\n\t\t\t);\n\t\t\tawait Promise.race([waitConnected, this.waitCancelled]);\n\t\t}\n\t\tthis.runtime.once(\"disconnected\", () => this.stop(\"summarizerClientDisconnected\"));\n\t}\n\n\t/**\n\t * Stops running.\n\t */\n\tpublic stop(reason: SummarizerStopReason): void {\n\t\tif (!this._cancelled) {\n\t\t\tthis._cancelled = true;\n\t\t\tthis.stopDeferred.resolve(reason);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { IDisposable, ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
6
6
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
7
|
-
import { ISummaryConfiguration } from "
|
|
8
|
-
import { IEnqueueSummarizeOptions, ISummarizeHeuristicData, IOnDemandSummarizeOptions, EnqueueSummarizeResult, SummarizerStopReason, ISubmitSummaryOptions, SubmitSummaryResult, ISummaryCancellationToken, ISummarizeResults, ISummarizerRuntime } from "./summarizerTypes";
|
|
7
|
+
import { ISummaryConfiguration } from "../containerRuntime";
|
|
8
|
+
import { IEnqueueSummarizeOptions, ISummarizeHeuristicData, IOnDemandSummarizeOptions, EnqueueSummarizeResult, SummarizerStopReason, ISubmitSummaryOptions, SubmitSummaryResult, ISummaryCancellationToken, ISummarizeResults, ISummarizerRuntime, IRefreshSummaryAckOptions } from "./summarizerTypes";
|
|
9
9
|
import { IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
|
|
10
10
|
import { SummarizeResultBuilder } from "./summaryGenerator";
|
|
11
11
|
/**
|
|
@@ -19,28 +19,40 @@ export declare class RunningSummarizer implements IDisposable {
|
|
|
19
19
|
private readonly summaryWatcher;
|
|
20
20
|
private readonly configuration;
|
|
21
21
|
private readonly submitSummaryCallback;
|
|
22
|
+
private readonly refreshLatestSummaryAckCallback;
|
|
22
23
|
private readonly heuristicData;
|
|
23
|
-
private readonly raiseSummarizingError;
|
|
24
24
|
private readonly summaryCollection;
|
|
25
25
|
private readonly cancellationToken;
|
|
26
26
|
private readonly stopSummarizerCallback;
|
|
27
27
|
private readonly runtime;
|
|
28
|
-
static start(logger: ITelemetryLogger, summaryWatcher: IClientSummaryWatcher, configuration: ISummaryConfiguration, submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
|
|
28
|
+
static start(logger: ITelemetryLogger, summaryWatcher: IClientSummaryWatcher, configuration: ISummaryConfiguration, submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>, refreshLatestSummaryAckCallback: (options: IRefreshSummaryAckOptions) => Promise<void>, heuristicData: ISummarizeHeuristicData, summaryCollection: SummaryCollection, cancellationToken: ISummaryCancellationToken, stopSummarizerCallback: (reason: SummarizerStopReason) => void, runtime: ISummarizerRuntime): Promise<RunningSummarizer>;
|
|
29
29
|
get disposed(): boolean;
|
|
30
30
|
private stopping;
|
|
31
31
|
private _disposed;
|
|
32
32
|
private summarizingLock;
|
|
33
|
-
private refreshSummaryAckLock;
|
|
34
33
|
private tryWhileSummarizing;
|
|
35
34
|
private readonly pendingAckTimer;
|
|
36
35
|
private heuristicRunner?;
|
|
37
36
|
private readonly generator;
|
|
38
|
-
private readonly
|
|
37
|
+
private readonly mc;
|
|
38
|
+
private readonly shouldAbortOnSummaryFailure;
|
|
39
39
|
private enqueuedSummary;
|
|
40
40
|
private summarizeCount;
|
|
41
41
|
private totalSuccessfulAttempts;
|
|
42
42
|
private initialized;
|
|
43
|
+
private readonly deltaManagerListener;
|
|
44
|
+
private readonly runtimeListener;
|
|
43
45
|
private constructor();
|
|
46
|
+
private handleSummaryAck;
|
|
47
|
+
/**
|
|
48
|
+
* Responsible for receiving and processing all the summaryAcks.
|
|
49
|
+
* In case there was a summary ack processed by the running summarizer before processIncomingSummaryAcks is called,
|
|
50
|
+
* it will wait for the summary ack that is newer than the one indicated by the lastAckRefSeq.
|
|
51
|
+
* @param lastAckRefSeq - Identifies the minimum reference sequence number the summarizer needs to wait for.
|
|
52
|
+
* In case of a negative number, the summarizer will wait for ANY summary ack that is greater than the deltaManager's initial sequence number,
|
|
53
|
+
* and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
|
|
54
|
+
*/
|
|
55
|
+
private processIncomingSummaryAcks;
|
|
44
56
|
dispose(): void;
|
|
45
57
|
/**
|
|
46
58
|
* RunningSummarizer's logger includes the sequenced index of the current summary on each event.
|
|
@@ -51,7 +63,7 @@ export declare class RunningSummarizer implements IDisposable {
|
|
|
51
63
|
tryGetCorrelatedLogger: (summaryOpRefSeq: any) => ITelemetryLogger | undefined;
|
|
52
64
|
/** We only want a single heuristic runner micro-task (will provide better optimized grouping of ops) */
|
|
53
65
|
private heuristicRunnerMicroTaskExists;
|
|
54
|
-
handleOp(op: ISequencedDocumentMessage): void;
|
|
66
|
+
handleOp(op: ISequencedDocumentMessage, runtimeMessage: boolean): void;
|
|
55
67
|
/**
|
|
56
68
|
* Can the given op trigger a summary?
|
|
57
69
|
* # Currently always prevents summaries for Summarize and SummaryAck/Nack ops
|
|
@@ -62,24 +74,15 @@ export declare class RunningSummarizer implements IDisposable {
|
|
|
62
74
|
private nonRuntimeOpCanTriggerSummary;
|
|
63
75
|
waitStop(allowLastSummary: boolean): Promise<void>;
|
|
64
76
|
private waitStart;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
* Assumes that caller checked upfront for lack of concurrent action (this.refreshSummaryAckLock)
|
|
68
|
-
* before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
|
|
69
|
-
* Note: The refreshSummaryAckLock makes sure no summarizer gets enqueued or processed
|
|
70
|
-
* until the refresh has completed. One can't rely uniquely on the summarizingLock as the
|
|
71
|
-
* refreshLatestSummaryAck also happens during the time summarizingLock !== undefined.
|
|
72
|
-
* Ex. Summarizer submits a summay + op and then waits for the Summary Ack to proceed
|
|
73
|
-
* with the refreshLatestSummaryAck and complete the summary.
|
|
74
|
-
* @param action - action to perform.
|
|
75
|
-
* @returns - result of action.
|
|
76
|
-
*/
|
|
77
|
-
lockedRefreshSummaryAckAction<T>(action: () => Promise<T>): Promise<T>;
|
|
77
|
+
private beforeSummaryAction;
|
|
78
|
+
private afterSummaryAction;
|
|
78
79
|
/**
|
|
79
80
|
* Runs single summary action that prevents any other concurrent actions.
|
|
80
81
|
* Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)
|
|
81
82
|
* before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
|
|
83
|
+
* @param before - set of instructions to run before running the action.
|
|
82
84
|
* @param action - action to perform.
|
|
85
|
+
* @param after - set of instructions to run after running the action.
|
|
83
86
|
* @returns - result of action.
|
|
84
87
|
*/
|
|
85
88
|
private lockedSummaryAction;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runningSummarizer.d.ts","sourceRoot":"","sources":["../../src/summary/runningSummarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAKnF,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAO9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EACN,wBAAwB,EAExB,uBAAuB,EAEvB,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EAEjB,kBAAkB,EAElB,yBAAyB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAiB,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAGN,sBAAsB,EAEtB,MAAM,oBAAoB,CAAC;AAO5B;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IAiGnD,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAGtC,OAAO,CAAC,QAAQ,CAAC,+BAA+B;IAGhD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO;WA5GL,KAAK,CACxB,MAAM,EAAE,gBAAgB,EACxB,cAAc,EAAE,qBAAqB,EACrC,aAAa,EAAE,qBAAqB,EACpC,qBAAqB,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,mBAAmB,CAAC,EACvF,+BAA+B,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,EACtF,aAAa,EAAE,uBAAuB,EACtC,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,yBAAyB,EAC5C,sBAAsB,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,EAC9D,OAAO,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,CAAC;IAuD7B,IAAW,QAAQ,YAElB;IACD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,eAAe,CAAC,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAU;IAEtD,OAAO,CAAC,eAAe,CAOV;IACb,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAEjC,OAAO;YA+GO,gBAAgB;IA4D9B;;;;;;;OAOG;YACW,0BAA0B;IAsBjC,OAAO,IAAI,IAAI;IAatB;;;;;OAKG;IACI,sBAAsB,yDAGf;IAEd,wGAAwG;IACxG,OAAO,CAAC,8BAA8B,CAAS;IAExC,QAAQ,CAAC,EAAE,EAAE,yBAAyB,EAAE,cAAc,EAAE,OAAO;IA6BtE;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,6BAA6B;IAWxB,QAAQ,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YA6BjD,SAAS;IAuBvB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,kBAAkB;IAW1B;;;;;;;;OAQG;YACW,mBAAmB;IAsBjC;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAiCxB,oCAAoC;IACpC,OAAO,CAAC,YAAY;IAuIpB,8DAA8D;IACvD,iBAAiB,CACvB,cAAc,oCAAuD,EACrE,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,EAAE,yBAAyB,GAC/C,iBAAiB;IAqBpB,6DAA6D;IACtD,gBAAgB,CAAC,EACvB,MAAM,EACN,mBAAuB,EACvB,QAAgB,EAChB,GAAG,OAAO,EACV,EAAE,wBAAwB,GAAG,sBAAsB;IAgCpD,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,sBAAsB;CAS9B"}
|
|
@@ -15,13 +15,16 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
15
15
|
};
|
|
16
16
|
import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/common-utils";
|
|
17
17
|
import { UsageError } from "@fluidframework/container-utils";
|
|
18
|
+
import { DriverErrorType } from "@fluidframework/driver-definitions";
|
|
18
19
|
import { isRuntimeMessage } from "@fluidframework/driver-utils";
|
|
19
20
|
import { MessageType } from "@fluidframework/protocol-definitions";
|
|
20
|
-
import { ChildLogger } from "@fluidframework/telemetry-utils";
|
|
21
|
-
import { opSize } from "
|
|
21
|
+
import { ChildLogger, isFluidError, loggerToMonitoringContext, } from "@fluidframework/telemetry-utils";
|
|
22
|
+
import { opSize } from "../opProperties";
|
|
22
23
|
import { SummarizeHeuristicRunner } from "./summarizerHeuristics";
|
|
23
24
|
import { raceTimer, SummarizeResultBuilder, SummaryGenerator, } from "./summaryGenerator";
|
|
24
25
|
const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
|
|
26
|
+
const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
|
|
27
|
+
const numberOfAttemptsOnRestartAsRecovery = 1; // Only summarize once
|
|
25
28
|
/**
|
|
26
29
|
* An instance of RunningSummarizer manages the heuristics for summarizing.
|
|
27
30
|
* Until disposed, the instance of RunningSummarizer can assume that it is
|
|
@@ -30,12 +33,13 @@ const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
|
|
|
30
33
|
* This object is created and controlled by Summarizer object.
|
|
31
34
|
*/
|
|
32
35
|
export class RunningSummarizer {
|
|
33
|
-
constructor(baseLogger, summaryWatcher, configuration, submitSummaryCallback,
|
|
36
|
+
constructor(baseLogger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
|
|
37
|
+
var _a, _b;
|
|
34
38
|
this.summaryWatcher = summaryWatcher;
|
|
35
39
|
this.configuration = configuration;
|
|
36
40
|
this.submitSummaryCallback = submitSummaryCallback;
|
|
41
|
+
this.refreshLatestSummaryAckCallback = refreshLatestSummaryAckCallback;
|
|
37
42
|
this.heuristicData = heuristicData;
|
|
38
|
-
this.raiseSummarizingError = raiseSummarizingError;
|
|
39
43
|
this.summaryCollection = summaryCollection;
|
|
40
44
|
this.cancellationToken = cancellationToken;
|
|
41
45
|
this.stopSummarizerCallback = stopSummarizerCallback;
|
|
@@ -53,7 +57,7 @@ export class RunningSummarizer {
|
|
|
53
57
|
* @param summaryOpRefSeq - RefSeq number of the summary op, to ensure the log correlation will be correct
|
|
54
58
|
*/
|
|
55
59
|
this.tryGetCorrelatedLogger = (summaryOpRefSeq) => this.heuristicData.lastAttempt.refSequenceNumber === summaryOpRefSeq
|
|
56
|
-
? this.logger
|
|
60
|
+
? this.mc.logger
|
|
57
61
|
: undefined;
|
|
58
62
|
/** We only want a single heuristic runner micro-task (will provide better optimized grouping of ops) */
|
|
59
63
|
this.heuristicRunnerMicroTaskExists = false;
|
|
@@ -61,25 +65,27 @@ export class RunningSummarizer {
|
|
|
61
65
|
summarizeCount: () => this.summarizeCount,
|
|
62
66
|
summarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,
|
|
63
67
|
};
|
|
64
|
-
this.
|
|
68
|
+
this.mc = loggerToMonitoringContext(ChildLogger.create(baseLogger, "Running", {
|
|
65
69
|
all: telemetryProps,
|
|
66
|
-
});
|
|
70
|
+
}));
|
|
71
|
+
this.shouldAbortOnSummaryFailure =
|
|
72
|
+
this.mc.config.getString("Fluid.ContainerRuntime.Test.SummarizationRecoveryMethod") ===
|
|
73
|
+
"restart";
|
|
67
74
|
if (configuration.state !== "disableHeuristics") {
|
|
68
75
|
assert(this.configuration.state === "enabled", 0x2ea /* "Configuration state should be enabled" */);
|
|
69
|
-
this.heuristicRunner = new SummarizeHeuristicRunner(heuristicData, this.configuration, (reason) => this.trySummarize(reason), this.logger);
|
|
76
|
+
this.heuristicRunner = new SummarizeHeuristicRunner(heuristicData, this.configuration, (reason) => this.trySummarize(reason), this.mc.logger);
|
|
70
77
|
}
|
|
71
78
|
assert(this.configuration.state !== "disabled", 0x2eb /* "Summary not supported with configuration disabled" */);
|
|
72
79
|
// Cap the maximum amount of time client will wait for a summarize op ack to maxSummarizeAckWaitTime
|
|
73
80
|
// configuration.maxAckWaitTime is composed from defaults, server values, and runtime overrides
|
|
74
81
|
const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);
|
|
75
82
|
this.pendingAckTimer = new PromiseTimer(maxAckWaitTime, () => {
|
|
76
|
-
// pre-0.58 error message: summaryAckWaitTimeout
|
|
77
|
-
this.raiseSummarizingError("Pending summary ack not received in time");
|
|
78
83
|
// Note: summarizeCount (from ChildLogger definition) may be 0,
|
|
79
84
|
// since this code path is hit when RunningSummarizer first starts up,
|
|
80
85
|
// before this instance has kicked off a new summarize run.
|
|
81
|
-
this.logger.sendErrorEvent({
|
|
86
|
+
this.mc.logger.sendErrorEvent({
|
|
82
87
|
eventName: "SummaryAckWaitTimeout",
|
|
88
|
+
message: "Pending summary ack not received in time",
|
|
83
89
|
maxAckWaitTime,
|
|
84
90
|
referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,
|
|
85
91
|
summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,
|
|
@@ -89,7 +95,7 @@ export class RunningSummarizer {
|
|
|
89
95
|
// Set up pending ack timeout by op timestamp differences for previous summaries.
|
|
90
96
|
summaryCollection.setPendingAckTimerTimeoutCallback(maxAckWaitTime, () => {
|
|
91
97
|
if (this.pendingAckTimer.hasTimer) {
|
|
92
|
-
this.logger.sendTelemetryEvent({
|
|
98
|
+
this.mc.logger.sendTelemetryEvent({
|
|
93
99
|
eventName: "MissingSummaryAckFoundByOps",
|
|
94
100
|
referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,
|
|
95
101
|
summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,
|
|
@@ -97,18 +103,39 @@ export class RunningSummarizer {
|
|
|
97
103
|
this.pendingAckTimer.clear();
|
|
98
104
|
}
|
|
99
105
|
});
|
|
100
|
-
this.generator = new SummaryGenerator(this.pendingAckTimer, this.heuristicData, this.submitSummaryCallback,
|
|
106
|
+
this.generator = new SummaryGenerator(this.pendingAckTimer, this.heuristicData, this.submitSummaryCallback, () => {
|
|
101
107
|
this.totalSuccessfulAttempts++;
|
|
102
|
-
}, this.summaryWatcher, this.logger);
|
|
103
|
-
// Listen for ops
|
|
104
|
-
this.
|
|
105
|
-
|
|
106
|
-
|
|
108
|
+
}, this.summaryWatcher, this.mc.logger);
|
|
109
|
+
// Listen to deltaManager for non-runtime ops
|
|
110
|
+
this.deltaManagerListener = (op) => {
|
|
111
|
+
if (!isRuntimeMessage(op)) {
|
|
112
|
+
this.handleOp(op, false);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
// Listen to runtime for runtime ops
|
|
116
|
+
this.runtimeListener = (op, runtimeMessage) => {
|
|
117
|
+
if (runtimeMessage) {
|
|
118
|
+
this.handleOp(op, true);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
// Purpose of listening to deltaManager is for back-compat
|
|
122
|
+
// 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)
|
|
123
|
+
// Tracked by AB#3883
|
|
124
|
+
this.runtime.deltaManager.on("op", this.deltaManagerListener);
|
|
125
|
+
(_b = (_a = this.runtime).on) === null || _b === void 0 ? void 0 : _b.call(_a, "op", this.runtimeListener);
|
|
107
126
|
}
|
|
108
|
-
static async start(logger, summaryWatcher, configuration, submitSummaryCallback,
|
|
127
|
+
static async start(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
|
|
109
128
|
var _a, _b;
|
|
110
|
-
const summarizer = new RunningSummarizer(logger, summaryWatcher, configuration, submitSummaryCallback,
|
|
129
|
+
const summarizer = new RunningSummarizer(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime);
|
|
130
|
+
// Before doing any heuristics or proceeding with its refreshing, if there is a summary ack received while
|
|
131
|
+
// this summarizer catches up, let's refresh state before proceeding with the summarization.
|
|
132
|
+
const lastAckRefSeq = await summarizer.handleSummaryAck();
|
|
111
133
|
await summarizer.waitStart();
|
|
134
|
+
// Handle summary acks asynchronously
|
|
135
|
+
// Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
|
|
136
|
+
summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
|
|
137
|
+
logger.sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
|
|
138
|
+
});
|
|
112
139
|
// Update heuristic counts
|
|
113
140
|
// By the time we get here, there are potentially ops missing from the heuristic summary counts
|
|
114
141
|
// Examples of where this could happen:
|
|
@@ -135,13 +162,87 @@ export class RunningSummarizer {
|
|
|
135
162
|
get disposed() {
|
|
136
163
|
return this._disposed;
|
|
137
164
|
}
|
|
138
|
-
|
|
165
|
+
async handleSummaryAck() {
|
|
139
166
|
var _a;
|
|
140
|
-
this.
|
|
141
|
-
|
|
142
|
-
|
|
167
|
+
const lastAck = this.summaryCollection.latestAck;
|
|
168
|
+
let refSequenceNumber = -1;
|
|
169
|
+
// In case we haven't received the lastestAck yet, just return.
|
|
170
|
+
if (lastAck !== undefined) {
|
|
171
|
+
refSequenceNumber = lastAck.summaryOp.referenceSequenceNumber;
|
|
172
|
+
const summaryLogger = (_a = this.tryGetCorrelatedLogger(refSequenceNumber)) !== null && _a !== void 0 ? _a : this.mc.logger;
|
|
173
|
+
const summaryOpHandle = lastAck.summaryOp.contents.handle;
|
|
174
|
+
const summaryAckHandle = lastAck.summaryAck.contents.handle;
|
|
175
|
+
while (this.summarizingLock !== undefined) {
|
|
176
|
+
summaryLogger.sendTelemetryEvent({
|
|
177
|
+
eventName: "RefreshAttemptWithSummarizerRunning",
|
|
178
|
+
referenceSequenceNumber: refSequenceNumber,
|
|
179
|
+
proposalHandle: summaryOpHandle,
|
|
180
|
+
ackHandle: summaryAckHandle,
|
|
181
|
+
});
|
|
182
|
+
await this.summarizingLock;
|
|
183
|
+
}
|
|
184
|
+
// Make sure we block any summarizer from being executed/enqueued while
|
|
185
|
+
// executing the refreshLatestSummaryAck.
|
|
186
|
+
// https://dev.azure.com/fluidframework/internal/_workitems/edit/779
|
|
187
|
+
await this.lockedSummaryAction(() => { }, async () => this.refreshLatestSummaryAckCallback({
|
|
188
|
+
proposalHandle: summaryOpHandle,
|
|
189
|
+
ackHandle: summaryAckHandle,
|
|
190
|
+
summaryRefSeq: refSequenceNumber,
|
|
191
|
+
summaryLogger,
|
|
192
|
+
}).catch(async (error) => {
|
|
193
|
+
// If the error is 404, so maybe the fetched version no longer exists on server. We just
|
|
194
|
+
// ignore this error in that case, as that means we will have another summaryAck for the
|
|
195
|
+
// latest version with which we will refresh the state. However in case of single commit
|
|
196
|
+
// summary, we might me missing a summary ack, so in that case we are still fine as the
|
|
197
|
+
// code in `submitSummary` function in container runtime, will refresh the latest state
|
|
198
|
+
// by calling `refreshLatestSummaryAckFromServer` and we will be fine.
|
|
199
|
+
const isIgnoredError = isFluidError(error) &&
|
|
200
|
+
error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError;
|
|
201
|
+
summaryLogger.sendTelemetryEvent({
|
|
202
|
+
eventName: isIgnoredError
|
|
203
|
+
? "HandleSummaryAckErrorIgnored"
|
|
204
|
+
: "HandleLastSummaryAckError",
|
|
205
|
+
referenceSequenceNumber: refSequenceNumber,
|
|
206
|
+
proposalHandle: summaryOpHandle,
|
|
207
|
+
ackHandle: summaryAckHandle,
|
|
208
|
+
}, error);
|
|
209
|
+
}), () => { });
|
|
210
|
+
refSequenceNumber++;
|
|
211
|
+
}
|
|
212
|
+
return refSequenceNumber;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Responsible for receiving and processing all the summaryAcks.
|
|
216
|
+
* In case there was a summary ack processed by the running summarizer before processIncomingSummaryAcks is called,
|
|
217
|
+
* it will wait for the summary ack that is newer than the one indicated by the lastAckRefSeq.
|
|
218
|
+
* @param lastAckRefSeq - Identifies the minimum reference sequence number the summarizer needs to wait for.
|
|
219
|
+
* In case of a negative number, the summarizer will wait for ANY summary ack that is greater than the deltaManager's initial sequence number,
|
|
220
|
+
* and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
|
|
221
|
+
*/
|
|
222
|
+
async processIncomingSummaryAcks(lastAckRefSeq) {
|
|
223
|
+
var _a;
|
|
224
|
+
let refSequenceNumber = lastAckRefSeq > 0 ? lastAckRefSeq : this.runtime.deltaManager.initialSequenceNumber;
|
|
225
|
+
while (!this.disposed) {
|
|
226
|
+
const summaryLogger = (_a = this.tryGetCorrelatedLogger(refSequenceNumber)) !== null && _a !== void 0 ? _a : this.mc.logger;
|
|
227
|
+
// Initialize ack with undefined if exception happens inside of waitSummaryAck on second iteration,
|
|
228
|
+
// we record undefined, not previous handles.
|
|
229
|
+
await this.summaryCollection.waitSummaryAck(refSequenceNumber);
|
|
230
|
+
summaryLogger.sendTelemetryEvent({
|
|
231
|
+
eventName: "processIncomingSummaryAcks",
|
|
232
|
+
referenceSequenceNumber: refSequenceNumber,
|
|
233
|
+
lastAckRefSeq,
|
|
234
|
+
});
|
|
235
|
+
refSequenceNumber = await this.handleSummaryAck();
|
|
236
|
+
// A valid Summary Ack must have been processed.
|
|
237
|
+
assert(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
dispose() {
|
|
241
|
+
var _a, _b, _c;
|
|
242
|
+
this.runtime.deltaManager.off("op", this.deltaManagerListener);
|
|
243
|
+
(_b = (_a = this.runtime).off) === null || _b === void 0 ? void 0 : _b.call(_a, "op", this.runtimeListener);
|
|
143
244
|
this.summaryWatcher.dispose();
|
|
144
|
-
(
|
|
245
|
+
(_c = this.heuristicRunner) === null || _c === void 0 ? void 0 : _c.dispose();
|
|
145
246
|
this.heuristicRunner = undefined;
|
|
146
247
|
this.generator.dispose();
|
|
147
248
|
this.pendingAckTimer.clear();
|
|
@@ -149,9 +250,9 @@ export class RunningSummarizer {
|
|
|
149
250
|
this._disposed = true;
|
|
150
251
|
this.stopping = true;
|
|
151
252
|
}
|
|
152
|
-
handleOp(op) {
|
|
253
|
+
handleOp(op, runtimeMessage) {
|
|
153
254
|
this.heuristicData.lastOpSequenceNumber = op.sequenceNumber;
|
|
154
|
-
if (
|
|
255
|
+
if (runtimeMessage) {
|
|
155
256
|
this.heuristicData.numRuntimeOps++;
|
|
156
257
|
}
|
|
157
258
|
else {
|
|
@@ -160,7 +261,7 @@ export class RunningSummarizer {
|
|
|
160
261
|
this.heuristicData.totalOpsSize += opSize(op);
|
|
161
262
|
// Check for enqueued on-demand summaries; Intentionally do nothing otherwise
|
|
162
263
|
if (this.initialized &&
|
|
163
|
-
this.opCanTriggerSummary(op) &&
|
|
264
|
+
this.opCanTriggerSummary(op, runtimeMessage) &&
|
|
164
265
|
!this.tryRunEnqueuedSummary() &&
|
|
165
266
|
!this.heuristicRunnerMicroTaskExists) {
|
|
166
267
|
this.heuristicRunnerMicroTaskExists = true;
|
|
@@ -180,14 +281,14 @@ export class RunningSummarizer {
|
|
|
180
281
|
* @param op - op to check
|
|
181
282
|
* @returns true if this op can trigger a summary
|
|
182
283
|
*/
|
|
183
|
-
opCanTriggerSummary(op) {
|
|
284
|
+
opCanTriggerSummary(op, runtimeMessage) {
|
|
184
285
|
switch (op.type) {
|
|
185
286
|
case MessageType.Summarize:
|
|
186
287
|
case MessageType.SummaryAck:
|
|
187
288
|
case MessageType.SummaryNack:
|
|
188
289
|
return false;
|
|
189
290
|
default:
|
|
190
|
-
return
|
|
291
|
+
return runtimeMessage || this.nonRuntimeOpCanTriggerSummary();
|
|
191
292
|
}
|
|
192
293
|
}
|
|
193
294
|
nonRuntimeOpCanTriggerSummary() {
|
|
@@ -238,52 +339,37 @@ export class RunningSummarizer {
|
|
|
238
339
|
}
|
|
239
340
|
this.initialized = true;
|
|
240
341
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
async lockedRefreshSummaryAckAction(action) {
|
|
254
|
-
assert(this.refreshSummaryAckLock === undefined, 0x396 /* Refresh Summary Ack - Caller is responsible for checking lock */);
|
|
255
|
-
const refreshSummaryAckLock = new Deferred();
|
|
256
|
-
this.refreshSummaryAckLock = refreshSummaryAckLock.promise;
|
|
257
|
-
return action().finally(() => {
|
|
258
|
-
refreshSummaryAckLock.resolve();
|
|
259
|
-
this.refreshSummaryAckLock = undefined;
|
|
260
|
-
});
|
|
342
|
+
beforeSummaryAction() {
|
|
343
|
+
this.summarizeCount++;
|
|
344
|
+
}
|
|
345
|
+
afterSummaryAction() {
|
|
346
|
+
var _a;
|
|
347
|
+
const retry = this.tryWhileSummarizing;
|
|
348
|
+
this.tryWhileSummarizing = false;
|
|
349
|
+
// After summarizing, we should check to see if we need to summarize again.
|
|
350
|
+
// Rerun the heuristics and check for enqueued summaries.
|
|
351
|
+
if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
|
|
352
|
+
(_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.run();
|
|
353
|
+
}
|
|
261
354
|
}
|
|
262
355
|
/**
|
|
263
356
|
* Runs single summary action that prevents any other concurrent actions.
|
|
264
357
|
* Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)
|
|
265
358
|
* before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
|
|
359
|
+
* @param before - set of instructions to run before running the action.
|
|
266
360
|
* @param action - action to perform.
|
|
361
|
+
* @param after - set of instructions to run after running the action.
|
|
267
362
|
* @returns - result of action.
|
|
268
363
|
*/
|
|
269
|
-
async lockedSummaryAction(action) {
|
|
364
|
+
async lockedSummaryAction(before, action, after) {
|
|
270
365
|
assert(this.summarizingLock === undefined, 0x25b /* "Caller is responsible for checking lock" */);
|
|
271
366
|
const summarizingLock = new Deferred();
|
|
272
367
|
this.summarizingLock = summarizingLock.promise;
|
|
273
|
-
|
|
274
|
-
// Make sure the RefreshLatestSummaryAck is not being executed.
|
|
275
|
-
await this.refreshSummaryAckLock;
|
|
368
|
+
before();
|
|
276
369
|
return action().finally(() => {
|
|
277
|
-
var _a;
|
|
278
370
|
summarizingLock.resolve();
|
|
279
371
|
this.summarizingLock = undefined;
|
|
280
|
-
|
|
281
|
-
this.tryWhileSummarizing = false;
|
|
282
|
-
// After summarizing, we should check to see if we need to summarize again.
|
|
283
|
-
// Rerun the heuristics and check for enqueued summaries.
|
|
284
|
-
if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
|
|
285
|
-
(_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.run();
|
|
286
|
-
}
|
|
372
|
+
after();
|
|
287
373
|
});
|
|
288
374
|
}
|
|
289
375
|
/**
|
|
@@ -295,10 +381,14 @@ export class RunningSummarizer {
|
|
|
295
381
|
* @returns ISummarizeResult - result of running a summary.
|
|
296
382
|
*/
|
|
297
383
|
trySummarizeOnce(summarizeProps, options, cancellationToken = this.cancellationToken, resultsBuilder = new SummarizeResultBuilder()) {
|
|
298
|
-
this.lockedSummaryAction(
|
|
384
|
+
this.lockedSummaryAction(() => {
|
|
385
|
+
this.beforeSummaryAction();
|
|
386
|
+
}, async () => {
|
|
299
387
|
const summarizeResult = this.generator.summarize(summarizeProps, options, cancellationToken, resultsBuilder);
|
|
300
388
|
// ensure we wait till the end of the process
|
|
301
389
|
return summarizeResult.receivedSummaryAckOrNack;
|
|
390
|
+
}, () => {
|
|
391
|
+
this.afterSummaryAction();
|
|
302
392
|
}).catch((error) => {
|
|
303
393
|
// SummaryGenerator.summarize() does not throw exceptions - it converts them to failed result
|
|
304
394
|
// on resultsBuilder
|
|
@@ -315,7 +405,10 @@ export class RunningSummarizer {
|
|
|
315
405
|
this.tryWhileSummarizing = true;
|
|
316
406
|
return;
|
|
317
407
|
}
|
|
318
|
-
this.lockedSummaryAction(
|
|
408
|
+
this.lockedSummaryAction(() => {
|
|
409
|
+
this.beforeSummaryAction();
|
|
410
|
+
}, async () => {
|
|
411
|
+
var _a;
|
|
319
412
|
const attempts = [
|
|
320
413
|
{ refreshLatestAck: false, fullTree: false },
|
|
321
414
|
{ refreshLatestAck: true, fullTree: false },
|
|
@@ -325,8 +418,22 @@ export class RunningSummarizer {
|
|
|
325
418
|
let overrideDelaySeconds;
|
|
326
419
|
let summaryAttempts = 0;
|
|
327
420
|
let summaryAttemptsPerPhase = 0;
|
|
421
|
+
// Reducing the default number of attempts to defaultNumberofSummarizationAttempts.
|
|
422
|
+
let totalAttempts = this.shouldAbortOnSummaryFailure
|
|
423
|
+
? numberOfAttemptsOnRestartAsRecovery
|
|
424
|
+
: (_a = this.mc.config.getNumber("Fluid.Summarizer.Attempts")) !== null && _a !== void 0 ? _a : defaultNumberSummarizationAttempts;
|
|
425
|
+
if (totalAttempts > attempts.length) {
|
|
426
|
+
this.mc.logger.sendTelemetryEvent({
|
|
427
|
+
eventName: "InvalidSummarizerAttempts",
|
|
428
|
+
attempts: totalAttempts,
|
|
429
|
+
});
|
|
430
|
+
totalAttempts = defaultNumberSummarizationAttempts;
|
|
431
|
+
}
|
|
432
|
+
else if (totalAttempts < 1) {
|
|
433
|
+
throw new UsageError("Invalid number of attempts.");
|
|
434
|
+
}
|
|
328
435
|
let lastResult;
|
|
329
|
-
for (let summaryAttemptPhase = 0; summaryAttemptPhase <
|
|
436
|
+
for (let summaryAttemptPhase = 0; summaryAttemptPhase < totalAttempts;) {
|
|
330
437
|
if (this.cancellationToken.cancelled) {
|
|
331
438
|
return;
|
|
332
439
|
}
|
|
@@ -335,17 +442,10 @@ export class RunningSummarizer {
|
|
|
335
442
|
return;
|
|
336
443
|
}
|
|
337
444
|
summaryAttemptsPerPhase++;
|
|
338
|
-
const
|
|
339
|
-
const delaySeconds = overrideDelaySeconds !== null && overrideDelaySeconds !== void 0 ? overrideDelaySeconds : regularDelaySeconds;
|
|
445
|
+
const _b = attempts[summaryAttemptPhase], { delaySeconds: regularDelaySeconds = 0 } = _b, options = __rest(_b, ["delaySeconds"]);
|
|
340
446
|
const summarizeProps = Object.assign({ reason,
|
|
341
447
|
summaryAttempts,
|
|
342
448
|
summaryAttemptsPerPhase, summaryAttemptPhase: summaryAttemptPhase + 1 }, options);
|
|
343
|
-
if (delaySeconds > 0) {
|
|
344
|
-
this.logger.sendPerformanceEvent(Object.assign({ eventName: "SummarizeAttemptDelay", duration: delaySeconds, summaryNackDelay: overrideDelaySeconds !== undefined }, summarizeProps));
|
|
345
|
-
await delay(delaySeconds * 1000);
|
|
346
|
-
}
|
|
347
|
-
// Make sure the refresh Summary Ack is not being executed.
|
|
348
|
-
await this.refreshSummaryAckLock;
|
|
349
449
|
// Note: no need to account for cancellationToken.waitCancelled here, as
|
|
350
450
|
// this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
|
|
351
451
|
const resultSummarize = this.generator.summarize(summarizeProps, options, cancellationToken);
|
|
@@ -361,16 +461,33 @@ export class RunningSummarizer {
|
|
|
361
461
|
summaryAttemptsPerPhase = 0;
|
|
362
462
|
}
|
|
363
463
|
lastResult = result;
|
|
464
|
+
const delaySeconds = overrideDelaySeconds !== null && overrideDelaySeconds !== void 0 ? overrideDelaySeconds : regularDelaySeconds;
|
|
465
|
+
if (delaySeconds > 0) {
|
|
466
|
+
this.mc.logger.sendPerformanceEvent(Object.assign({ eventName: "SummarizeAttemptDelay", duration: delaySeconds, summaryNackDelay: overrideDelaySeconds !== undefined }, summarizeProps));
|
|
467
|
+
await delay(delaySeconds * 1000);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
if (this.shouldAbortOnSummaryFailure) {
|
|
471
|
+
this.mc.logger.sendTelemetryEvent({
|
|
472
|
+
eventName: "ClosingSummarizerOnSummaryStale",
|
|
473
|
+
reason,
|
|
474
|
+
message: lastResult === null || lastResult === void 0 ? void 0 : lastResult.message,
|
|
475
|
+
}, lastResult === null || lastResult === void 0 ? void 0 : lastResult.error);
|
|
476
|
+
this.stopSummarizerCallback("latestSummaryStateStale");
|
|
477
|
+
this.runtime.closeFn();
|
|
478
|
+
return;
|
|
364
479
|
}
|
|
365
480
|
// If all attempts failed, log error (with last attempt info) and close the summarizer container
|
|
366
|
-
this.logger.sendErrorEvent({
|
|
481
|
+
this.mc.logger.sendErrorEvent({
|
|
367
482
|
eventName: "FailToSummarize",
|
|
368
483
|
reason,
|
|
369
484
|
message: lastResult === null || lastResult === void 0 ? void 0 : lastResult.message,
|
|
370
485
|
}, lastResult === null || lastResult === void 0 ? void 0 : lastResult.error);
|
|
371
486
|
this.stopSummarizerCallback("failToSummarize");
|
|
487
|
+
}, () => {
|
|
488
|
+
this.afterSummaryAction();
|
|
372
489
|
}).catch((error) => {
|
|
373
|
-
this.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
|
|
490
|
+
this.mc.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
|
|
374
491
|
});
|
|
375
492
|
}
|
|
376
493
|
/** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
|