@fluidframework/container-runtime 2.0.0-dev.5.3.2.178189 → 2.0.0-dev.6.4.0.191258
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 +123 -0
- package/README.md +4 -3
- package/dist/batchTracker.d.ts +3 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +6 -5
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +10 -16
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +184 -172
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +25 -16
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +161 -35
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +697 -449
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +15 -7
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +3 -2
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +83 -87
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -2
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +8 -9
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.js +2 -2
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/dataStores.d.ts +22 -6
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +123 -81
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerProxyBase.d.ts +35 -0
- package/dist/deltaManagerProxyBase.d.ts.map +1 -0
- package/dist/deltaManagerProxyBase.js +77 -0
- package/dist/deltaManagerProxyBase.js.map +1 -0
- package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +4 -2
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +10 -10
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/error.d.ts +14 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +21 -0
- package/dist/error.js.map +1 -0
- package/dist/gc/garbageCollection.d.ts +10 -9
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +61 -53
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +18 -14
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +17 -4
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +14 -15
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +0 -8
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +11 -24
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +19 -58
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +45 -35
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +4 -4
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +2 -2
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +3 -5
- package/dist/gc/index.js.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.d.ts +8 -30
- package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.js +26 -68
- package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/finalSpace.d.ts +29 -0
- package/dist/id-compressor/finalSpace.d.ts.map +1 -0
- package/dist/id-compressor/finalSpace.js +62 -0
- package/dist/id-compressor/finalSpace.js.map +1 -0
- package/dist/id-compressor/idCompressor.d.ts +25 -250
- package/dist/id-compressor/idCompressor.d.ts.map +1 -1
- package/dist/id-compressor/idCompressor.js +390 -1153
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/identifiers.d.ts +32 -0
- package/dist/id-compressor/identifiers.d.ts.map +1 -0
- package/dist/id-compressor/identifiers.js +15 -0
- package/dist/id-compressor/identifiers.js.map +1 -0
- package/dist/id-compressor/index.d.ts +5 -6
- package/dist/id-compressor/index.d.ts.map +1 -1
- package/dist/id-compressor/index.js +20 -26
- package/dist/id-compressor/index.js.map +1 -1
- package/dist/id-compressor/persistanceUtilities.d.ts +22 -0
- package/dist/id-compressor/persistanceUtilities.d.ts.map +1 -0
- package/dist/id-compressor/persistanceUtilities.js +43 -0
- package/dist/id-compressor/persistanceUtilities.js.map +1 -0
- package/dist/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
- package/dist/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
- package/dist/id-compressor/sessionSpaceNormalizer.js +80 -0
- package/dist/id-compressor/sessionSpaceNormalizer.js.map +1 -0
- package/dist/id-compressor/sessions.d.ts +115 -0
- package/dist/id-compressor/sessions.d.ts.map +1 -0
- package/dist/id-compressor/sessions.js +305 -0
- package/dist/id-compressor/sessions.js.map +1 -0
- package/dist/id-compressor/utilities.d.ts +49 -0
- package/dist/id-compressor/utilities.d.ts.map +1 -0
- package/dist/id-compressor/utilities.js +166 -0
- package/dist/id-compressor/utilities.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.js +10 -6
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +2 -2
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +12 -7
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +2 -2
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +23 -20
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +19 -9
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +2 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +22 -19
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +7 -5
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +22 -31
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +19 -7
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.js +1 -2
- package/dist/opProperties.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +18 -8
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +73 -51
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +36 -32
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +3 -3
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +2 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +3 -3
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +26 -27
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +31 -10
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +271 -139
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +8 -7
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +79 -78
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js +7 -11
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +10 -14
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts +1 -1
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +10 -19
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +57 -130
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -14
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +15 -101
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +38 -25
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -3
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +12 -13
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +3 -0
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +6 -4
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +10 -4
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +106 -57
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +8 -8
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +38 -28
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +3 -2
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +5 -4
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +10 -16
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +159 -147
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +15 -6
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +161 -35
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +651 -402
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +13 -5
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +3 -2
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +47 -51
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -2
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -4
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.js +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/dataStores.d.ts +22 -6
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +107 -65
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerProxyBase.d.ts +35 -0
- package/lib/deltaManagerProxyBase.d.ts.map +1 -0
- package/lib/deltaManagerProxyBase.js +73 -0
- package/lib/deltaManagerProxyBase.js.map +1 -0
- package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js +3 -1
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +7 -7
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/error.d.ts +14 -0
- package/lib/error.d.ts.map +1 -0
- package/lib/error.js +17 -0
- package/lib/error.js.map +1 -0
- package/lib/gc/garbageCollection.d.ts +10 -9
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +61 -53
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +16 -12
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +17 -4
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +13 -14
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +0 -8
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +5 -17
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +20 -59
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +46 -36
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +2 -2
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +2 -2
- package/lib/gc/index.js.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.d.ts +8 -30
- package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.js +25 -66
- package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/finalSpace.d.ts +29 -0
- package/lib/id-compressor/finalSpace.d.ts.map +1 -0
- package/lib/id-compressor/finalSpace.js +58 -0
- package/lib/id-compressor/finalSpace.js.map +1 -0
- package/lib/id-compressor/idCompressor.d.ts +25 -250
- package/lib/id-compressor/idCompressor.d.ts.map +1 -1
- package/lib/id-compressor/idCompressor.js +385 -1142
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/identifiers.d.ts +32 -0
- package/lib/id-compressor/identifiers.d.ts.map +1 -0
- package/lib/id-compressor/identifiers.js +11 -0
- package/lib/id-compressor/identifiers.js.map +1 -0
- package/lib/id-compressor/index.d.ts +5 -6
- package/lib/id-compressor/index.d.ts.map +1 -1
- package/lib/id-compressor/index.js +5 -6
- package/lib/id-compressor/index.js.map +1 -1
- package/lib/id-compressor/persistanceUtilities.d.ts +22 -0
- package/lib/id-compressor/persistanceUtilities.d.ts.map +1 -0
- package/lib/id-compressor/persistanceUtilities.js +34 -0
- package/lib/id-compressor/persistanceUtilities.js.map +1 -0
- package/lib/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
- package/lib/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
- package/lib/id-compressor/sessionSpaceNormalizer.js +76 -0
- package/lib/id-compressor/sessionSpaceNormalizer.js.map +1 -0
- package/lib/id-compressor/sessions.d.ts +115 -0
- package/lib/id-compressor/sessions.d.ts.map +1 -0
- package/lib/id-compressor/sessions.js +290 -0
- package/lib/id-compressor/sessions.js.map +1 -0
- package/lib/id-compressor/utilities.d.ts +49 -0
- package/lib/id-compressor/utilities.d.ts.map +1 -0
- package/lib/id-compressor/utilities.js +148 -0
- package/lib/id-compressor/utilities.js.map +1 -0
- package/lib/index.d.ts +3 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.js +10 -6
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +10 -5
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +15 -12
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +17 -7
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +13 -10
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +7 -5
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +13 -22
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +20 -8
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.js +1 -2
- package/lib/opProperties.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +18 -8
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +62 -40
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +18 -14
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/index.d.ts +3 -3
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +3 -3
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +21 -22
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +31 -10
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +265 -133
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +8 -7
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +75 -74
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +2 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js +6 -10
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +9 -13
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/index.d.ts +1 -1
- package/lib/summary/summarizerNode/index.d.ts.map +1 -1
- package/lib/summary/summarizerNode/index.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +10 -19
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +42 -115
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -14
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +14 -100
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +38 -25
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -3
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +5 -6
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +3 -0
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +5 -3
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +10 -4
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +100 -51
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +8 -8
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +35 -25
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +28 -31
- package/src/batchTracker.ts +7 -5
- package/src/blobManager.ts +188 -166
- package/src/connectionTelemetry.ts +9 -4
- package/src/containerRuntime.ts +806 -441
- package/src/dataStore.ts +12 -4
- package/src/dataStoreContext.ts +39 -43
- package/src/dataStoreContexts.ts +4 -6
- package/src/dataStoreRegistry.ts +1 -1
- package/src/dataStores.ts +114 -80
- package/src/deltaManagerProxyBase.ts +111 -0
- package/src/deltaManagerSummarizerProxy.ts +4 -1
- package/src/deltaScheduler.ts +7 -11
- package/src/error.ts +18 -0
- package/src/gc/garbageCollection.md +53 -5
- package/src/gc/garbageCollection.ts +58 -52
- package/src/gc/gcConfigs.ts +4 -2
- package/src/gc/gcDefinitions.ts +17 -20
- package/src/gc/gcEarlyAdoption.md +145 -0
- package/src/gc/gcHelpers.ts +1 -12
- package/src/gc/gcSummaryStateTracker.ts +19 -65
- package/src/gc/gcTelemetry.ts +14 -12
- package/src/gc/gcUnreferencedStateTracker.ts +1 -1
- package/src/gc/index.ts +2 -4
- package/src/id-compressor/appendOnlySortedMap.ts +26 -87
- package/src/id-compressor/finalSpace.ts +67 -0
- package/src/id-compressor/idCompressor.ts +458 -1682
- package/src/id-compressor/identifiers.ts +42 -0
- package/src/id-compressor/index.ts +11 -20
- package/src/id-compressor/persistanceUtilities.ts +58 -0
- package/src/id-compressor/sessionSpaceNormalizer.ts +83 -0
- package/src/id-compressor/sessions.ts +405 -0
- package/src/id-compressor/utilities.ts +187 -0
- package/src/index.ts +7 -2
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +6 -4
- package/src/opLifecycle/opGroupingManager.ts +9 -6
- package/src/opLifecycle/opSplitter.ts +7 -6
- package/src/opLifecycle/outbox.ts +23 -32
- package/src/opLifecycle/remoteMessageProcessor.ts +27 -8
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +72 -42
- package/src/scheduleManager.ts +7 -5
- package/src/summary/index.ts +4 -3
- package/src/summary/orderedClientElection.ts +10 -6
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +291 -163
- package/src/summary/summarizer.ts +27 -16
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +1 -1
- package/src/summary/summarizerNode/index.ts +1 -2
- package/src/summary/summarizerNode/summarizerNode.ts +36 -160
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +7 -38
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -130
- package/src/summary/summarizerTypes.ts +40 -25
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +4 -1
- package/src/summary/summaryGenerator.ts +52 -52
- package/src/summary/summaryManager.ts +44 -17
- package/dist/id-compressor/idRange.d.ts +0 -11
- package/dist/id-compressor/idRange.d.ts.map +0 -1
- package/dist/id-compressor/idRange.js +0 -29
- package/dist/id-compressor/idRange.js.map +0 -1
- package/dist/id-compressor/numericUuid.d.ts +0 -59
- package/dist/id-compressor/numericUuid.d.ts.map +0 -1
- package/dist/id-compressor/numericUuid.js +0 -325
- package/dist/id-compressor/numericUuid.js.map +0 -1
- package/dist/id-compressor/sessionIdNormalizer.d.ts +0 -138
- package/dist/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
- package/dist/id-compressor/sessionIdNormalizer.js +0 -488
- package/dist/id-compressor/sessionIdNormalizer.js.map +0 -1
- package/dist/id-compressor/utils.d.ts +0 -57
- package/dist/id-compressor/utils.d.ts.map +0 -1
- package/dist/id-compressor/utils.js +0 -90
- package/dist/id-compressor/utils.js.map +0 -1
- package/dist/id-compressor/uuidUtilities.d.ts +0 -28
- package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
- package/dist/id-compressor/uuidUtilities.js +0 -104
- package/dist/id-compressor/uuidUtilities.js.map +0 -1
- package/lib/id-compressor/idRange.d.ts +0 -11
- package/lib/id-compressor/idRange.d.ts.map +0 -1
- package/lib/id-compressor/idRange.js +0 -25
- package/lib/id-compressor/idRange.js.map +0 -1
- package/lib/id-compressor/numericUuid.d.ts +0 -59
- package/lib/id-compressor/numericUuid.d.ts.map +0 -1
- package/lib/id-compressor/numericUuid.js +0 -315
- package/lib/id-compressor/numericUuid.js.map +0 -1
- package/lib/id-compressor/sessionIdNormalizer.d.ts +0 -138
- package/lib/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
- package/lib/id-compressor/sessionIdNormalizer.js +0 -484
- package/lib/id-compressor/sessionIdNormalizer.js.map +0 -1
- package/lib/id-compressor/utils.d.ts +0 -57
- package/lib/id-compressor/utils.d.ts.map +0 -1
- package/lib/id-compressor/utils.js +0 -79
- package/lib/id-compressor/utils.js.map +0 -1
- package/lib/id-compressor/uuidUtilities.d.ts +0 -28
- package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
- package/lib/id-compressor/uuidUtilities.js +0 -96
- package/lib/id-compressor/uuidUtilities.js.map +0 -1
- package/src/id-compressor/idRange.ts +0 -35
- package/src/id-compressor/numericUuid.ts +0 -383
- package/src/id-compressor/sessionIdNormalizer.ts +0 -609
- package/src/id-compressor/utils.ts +0 -114
- package/src/id-compressor/uuidUtilities.ts +0 -120
|
@@ -3,30 +3,27 @@
|
|
|
3
3
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
7
|
-
var t = {};
|
|
8
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
9
|
-
t[p] = s[p];
|
|
10
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
11
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
12
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
13
|
-
t[p[i]] = s[p[i]];
|
|
14
|
-
}
|
|
15
|
-
return t;
|
|
16
|
-
};
|
|
17
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.RunningSummarizer = void 0;
|
|
7
|
+
exports.RunningSummarizer = exports.defaultMaxAttemptsForSubmitFailures = exports.defaultMaxAttempts = void 0;
|
|
19
8
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
20
|
-
const
|
|
21
|
-
const
|
|
9
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
10
|
+
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
22
11
|
const driver_definitions_1 = require("@fluidframework/driver-definitions");
|
|
23
|
-
const driver_utils_1 = require("@fluidframework/driver-utils");
|
|
24
12
|
const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
|
|
25
13
|
const opProperties_1 = require("../opProperties");
|
|
26
14
|
const summarizerHeuristics_1 = require("./summarizerHeuristics");
|
|
27
15
|
const summaryGenerator_1 = require("./summaryGenerator");
|
|
28
16
|
const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
|
|
29
|
-
|
|
17
|
+
/**
|
|
18
|
+
* The maximum number of summarization attempts that will be done by default in case of failures
|
|
19
|
+
* that can be retried.
|
|
20
|
+
*/
|
|
21
|
+
exports.defaultMaxAttempts = 2;
|
|
22
|
+
/**
|
|
23
|
+
* The default value for maximum number of summarization attempts that will be done for summarization failures where
|
|
24
|
+
* submit fails and the failure can be retried.
|
|
25
|
+
*/
|
|
26
|
+
exports.defaultMaxAttemptsForSubmitFailures = 5;
|
|
30
27
|
/**
|
|
31
28
|
* An instance of RunningSummarizer manages the heuristics for summarizing.
|
|
32
29
|
* Until disposed, the instance of RunningSummarizer can assume that it is
|
|
@@ -34,8 +31,9 @@ const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
|
|
|
34
31
|
* track of summaries that it is generating as they are broadcast and acked/nacked.
|
|
35
32
|
* This object is created and controlled by Summarizer object.
|
|
36
33
|
*/
|
|
37
|
-
class RunningSummarizer {
|
|
34
|
+
class RunningSummarizer extends client_utils_1.TypedEventEmitter {
|
|
38
35
|
constructor(baseLogger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
|
|
36
|
+
super();
|
|
39
37
|
this.summaryWatcher = summaryWatcher;
|
|
40
38
|
this.configuration = configuration;
|
|
41
39
|
this.submitSummaryCallback = submitSummaryCallback;
|
|
@@ -66,18 +64,22 @@ class RunningSummarizer {
|
|
|
66
64
|
summarizeCount: () => this.summarizeCount,
|
|
67
65
|
summarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,
|
|
68
66
|
};
|
|
69
|
-
this.mc = (0, telemetry_utils_1.
|
|
70
|
-
|
|
71
|
-
|
|
67
|
+
this.mc = (0, telemetry_utils_1.createChildMonitoringContext)({
|
|
68
|
+
logger: baseLogger,
|
|
69
|
+
namespace: "Running",
|
|
70
|
+
properties: {
|
|
71
|
+
all: telemetryProps,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
72
74
|
if (configuration.state !== "disableHeuristics") {
|
|
73
|
-
(0,
|
|
75
|
+
(0, core_utils_1.assert)(this.configuration.state === "enabled", 0x2ea /* "Configuration state should be enabled" */);
|
|
74
76
|
this.heuristicRunner = new summarizerHeuristics_1.SummarizeHeuristicRunner(heuristicData, this.configuration, (reason) => this.trySummarize(reason), this.mc.logger);
|
|
75
77
|
}
|
|
76
|
-
(0,
|
|
78
|
+
(0, core_utils_1.assert)(this.configuration.state !== "disabled", 0x2eb /* "Summary not supported with configuration disabled" */);
|
|
77
79
|
// Cap the maximum amount of time client will wait for a summarize op ack to maxSummarizeAckWaitTime
|
|
78
80
|
// configuration.maxAckWaitTime is composed from defaults, server values, and runtime overrides
|
|
79
81
|
const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);
|
|
80
|
-
this.pendingAckTimer = new
|
|
82
|
+
this.pendingAckTimer = new core_utils_1.PromiseTimer(maxAckWaitTime, () => {
|
|
81
83
|
// Note: summarizeCount (from ChildLogger definition) may be 0,
|
|
82
84
|
// since this code path is hit when RunningSummarizer first starts up,
|
|
83
85
|
// before this instance has kicked off a new summarize run.
|
|
@@ -104,26 +106,21 @@ class RunningSummarizer {
|
|
|
104
106
|
this.generator = new summaryGenerator_1.SummaryGenerator(this.pendingAckTimer, this.heuristicData, this.submitSummaryCallback, () => {
|
|
105
107
|
this.totalSuccessfulAttempts++;
|
|
106
108
|
}, this.summaryWatcher, this.mc.logger);
|
|
107
|
-
// Listen to
|
|
108
|
-
this.deltaManagerListener = (op) => {
|
|
109
|
-
if (!(0, driver_utils_1.isRuntimeMessage)(op)) {
|
|
110
|
-
this.handleOp(op, false);
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
// Listen to runtime for runtime ops
|
|
109
|
+
// Listen to runtime for ops
|
|
114
110
|
this.runtimeListener = (op, runtimeMessage) => {
|
|
115
|
-
|
|
116
|
-
this.handleOp(op, true);
|
|
117
|
-
}
|
|
111
|
+
this.handleOp(op, runtimeMessage === true);
|
|
118
112
|
};
|
|
119
|
-
// Purpose of listening to deltaManager is for back-compat
|
|
120
|
-
// 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)
|
|
121
|
-
// Tracked by AB#3883
|
|
122
|
-
this.runtime.deltaManager.on("op", this.deltaManagerListener);
|
|
123
113
|
this.runtime.on("op", this.runtimeListener);
|
|
114
|
+
// The max attempts for submit failures can be overridden via a feature flag. This allows us to
|
|
115
|
+
// tweak this as per telemetry data until we arrive at a stable number.
|
|
116
|
+
// If its set to a number higher than `defaultMaxAttemptsForSubmitFailures`, it will be ignored.
|
|
117
|
+
const overrideMaxAttempts = this.mc.config.getNumber("Fluid.Summarizer.AttemptsForSubmitFailures");
|
|
118
|
+
this.maxAttemptsForSubmitFailures =
|
|
119
|
+
overrideMaxAttempts && overrideMaxAttempts < exports.defaultMaxAttemptsForSubmitFailures
|
|
120
|
+
? overrideMaxAttempts
|
|
121
|
+
: exports.defaultMaxAttemptsForSubmitFailures;
|
|
124
122
|
}
|
|
125
123
|
static async start(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
|
|
126
|
-
var _a, _b;
|
|
127
124
|
const summarizer = new RunningSummarizer(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime);
|
|
128
125
|
// Before doing any heuristics or proceeding with its refreshing, if there is a summary ack received while
|
|
129
126
|
// this summarizer catches up, let's refresh state before proceeding with the summarization.
|
|
@@ -132,7 +129,7 @@ class RunningSummarizer {
|
|
|
132
129
|
// Handle summary acks asynchronously
|
|
133
130
|
// Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
|
|
134
131
|
summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
|
|
135
|
-
logger.sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
|
|
132
|
+
(0, telemetry_utils_1.createChildLogger)({ logger }).sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
|
|
136
133
|
});
|
|
137
134
|
// Update heuristic counts
|
|
138
135
|
// By the time we get here, there are potentially ops missing from the heuristic summary counts
|
|
@@ -153,21 +150,20 @@ class RunningSummarizer {
|
|
|
153
150
|
// Update last seq number (in case the handlers haven't processed anything yet)
|
|
154
151
|
heuristicData.lastOpSequenceNumber = runtime.deltaManager.lastSequenceNumber;
|
|
155
152
|
// Start heuristics
|
|
156
|
-
|
|
157
|
-
|
|
153
|
+
summarizer.heuristicRunner?.start();
|
|
154
|
+
summarizer.heuristicRunner?.run();
|
|
158
155
|
return summarizer;
|
|
159
156
|
}
|
|
160
157
|
get disposed() {
|
|
161
158
|
return this._disposed;
|
|
162
159
|
}
|
|
163
160
|
async handleSummaryAck() {
|
|
164
|
-
var _a;
|
|
165
161
|
const lastAck = this.summaryCollection.latestAck;
|
|
166
162
|
let refSequenceNumber = -1;
|
|
167
163
|
// In case we haven't received the lastestAck yet, just return.
|
|
168
164
|
if (lastAck !== undefined) {
|
|
169
165
|
refSequenceNumber = lastAck.summaryOp.referenceSequenceNumber;
|
|
170
|
-
const summaryLogger =
|
|
166
|
+
const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
|
|
171
167
|
const summaryOpHandle = lastAck.summaryOp.contents.handle;
|
|
172
168
|
const summaryAckHandle = lastAck.summaryAck.contents.handle;
|
|
173
169
|
while (this.summarizingLock !== undefined) {
|
|
@@ -195,7 +191,7 @@ class RunningSummarizer {
|
|
|
195
191
|
// code in `submitSummary` function in container runtime, will refresh the latest state
|
|
196
192
|
// by calling `refreshLatestSummaryAckFromServer` and we will be fine.
|
|
197
193
|
const isIgnoredError = (0, telemetry_utils_1.isFluidError)(error) &&
|
|
198
|
-
error.errorType === driver_definitions_1.
|
|
194
|
+
error.errorType === driver_definitions_1.DriverErrorTypes.fileNotFoundOrAccessDeniedError;
|
|
199
195
|
summaryLogger.sendTelemetryEvent({
|
|
200
196
|
eventName: isIgnoredError
|
|
201
197
|
? "HandleSummaryAckErrorIgnored"
|
|
@@ -218,10 +214,9 @@ class RunningSummarizer {
|
|
|
218
214
|
* and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
|
|
219
215
|
*/
|
|
220
216
|
async processIncomingSummaryAcks(lastAckRefSeq) {
|
|
221
|
-
var _a;
|
|
222
217
|
let refSequenceNumber = lastAckRefSeq > 0 ? lastAckRefSeq : this.runtime.deltaManager.initialSequenceNumber;
|
|
223
218
|
while (!this.disposed) {
|
|
224
|
-
const summaryLogger =
|
|
219
|
+
const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
|
|
225
220
|
// Initialize ack with undefined if exception happens inside of waitSummaryAck on second iteration,
|
|
226
221
|
// we record undefined, not previous handles.
|
|
227
222
|
await this.summaryCollection.waitSummaryAck(refSequenceNumber);
|
|
@@ -232,15 +227,13 @@ class RunningSummarizer {
|
|
|
232
227
|
});
|
|
233
228
|
refSequenceNumber = await this.handleSummaryAck();
|
|
234
229
|
// A valid Summary Ack must have been processed.
|
|
235
|
-
(0,
|
|
230
|
+
(0, core_utils_1.assert)(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
|
|
236
231
|
}
|
|
237
232
|
}
|
|
238
233
|
dispose() {
|
|
239
|
-
var _a;
|
|
240
|
-
this.runtime.deltaManager.off("op", this.deltaManagerListener);
|
|
241
234
|
this.runtime.off("op", this.runtimeListener);
|
|
242
235
|
this.summaryWatcher.dispose();
|
|
243
|
-
|
|
236
|
+
this.heuristicRunner?.dispose();
|
|
244
237
|
this.heuristicRunner = undefined;
|
|
245
238
|
this.generator.dispose();
|
|
246
239
|
this.pendingAckTimer.clear();
|
|
@@ -265,8 +258,7 @@ class RunningSummarizer {
|
|
|
265
258
|
this.heuristicRunnerMicroTaskExists = true;
|
|
266
259
|
Promise.resolve()
|
|
267
260
|
.then(() => {
|
|
268
|
-
|
|
269
|
-
(_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.run();
|
|
261
|
+
this.heuristicRunner?.run();
|
|
270
262
|
})
|
|
271
263
|
.finally(() => {
|
|
272
264
|
this.heuristicRunnerMicroTaskExists = false;
|
|
@@ -297,18 +289,17 @@ class RunningSummarizer {
|
|
|
297
289
|
this.configuration.nonRuntimeHeuristicThreshold <= opsSinceLastAck));
|
|
298
290
|
}
|
|
299
291
|
async waitStop(allowLastSummary) {
|
|
300
|
-
var _a;
|
|
301
292
|
if (this.stopping) {
|
|
302
293
|
return;
|
|
303
294
|
}
|
|
304
295
|
this.stopping = true;
|
|
305
296
|
this.disposeEnqueuedSummary();
|
|
306
297
|
// This will try to run lastSummary if needed.
|
|
307
|
-
if (allowLastSummary &&
|
|
298
|
+
if (allowLastSummary && this.heuristicRunner?.shouldRunLastSummary()) {
|
|
308
299
|
if (this.summarizingLock === undefined) {
|
|
309
300
|
this.trySummarizeOnce(
|
|
310
301
|
// summarizeProps
|
|
311
|
-
{
|
|
302
|
+
{ summarizeReason: "lastSummary" },
|
|
312
303
|
// ISummarizeOptions, using defaults: { refreshLatestAck: false, fullTree: false }
|
|
313
304
|
{});
|
|
314
305
|
}
|
|
@@ -341,13 +332,12 @@ class RunningSummarizer {
|
|
|
341
332
|
this.summarizeCount++;
|
|
342
333
|
}
|
|
343
334
|
afterSummaryAction() {
|
|
344
|
-
var _a;
|
|
345
335
|
const retry = this.tryWhileSummarizing;
|
|
346
336
|
this.tryWhileSummarizing = false;
|
|
347
337
|
// After summarizing, we should check to see if we need to summarize again.
|
|
348
338
|
// Rerun the heuristics and check for enqueued summaries.
|
|
349
339
|
if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
|
|
350
|
-
|
|
340
|
+
this.heuristicRunner?.run();
|
|
351
341
|
}
|
|
352
342
|
}
|
|
353
343
|
/**
|
|
@@ -357,11 +347,11 @@ class RunningSummarizer {
|
|
|
357
347
|
* @param before - set of instructions to run before running the action.
|
|
358
348
|
* @param action - action to perform.
|
|
359
349
|
* @param after - set of instructions to run after running the action.
|
|
360
|
-
* @returns
|
|
350
|
+
* @returns The result of the action.
|
|
361
351
|
*/
|
|
362
352
|
async lockedSummaryAction(before, action, after) {
|
|
363
|
-
(0,
|
|
364
|
-
const summarizingLock = new
|
|
353
|
+
(0, core_utils_1.assert)(this.summarizingLock === undefined, 0x25b /* "Caller is responsible for checking lock" */);
|
|
354
|
+
const summarizingLock = new core_utils_1.Deferred();
|
|
365
355
|
this.summarizingLock = summarizingLock.promise;
|
|
366
356
|
before();
|
|
367
357
|
return action().finally(() => {
|
|
@@ -378,11 +368,20 @@ class RunningSummarizer {
|
|
|
378
368
|
* @param resultsBuilder - optional, result builder to use.
|
|
379
369
|
* @returns ISummarizeResult - result of running a summary.
|
|
380
370
|
*/
|
|
381
|
-
trySummarizeOnce(summarizeProps, options,
|
|
371
|
+
trySummarizeOnce(summarizeProps, options, resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()) {
|
|
382
372
|
this.lockedSummaryAction(() => {
|
|
383
373
|
this.beforeSummaryAction();
|
|
384
374
|
}, async () => {
|
|
385
|
-
const
|
|
375
|
+
const summaryLogger = (0, telemetry_utils_1.createChildLogger)({
|
|
376
|
+
logger: this.mc.logger,
|
|
377
|
+
properties: { all: summarizeProps },
|
|
378
|
+
});
|
|
379
|
+
const summaryOptions = {
|
|
380
|
+
...options,
|
|
381
|
+
summaryLogger,
|
|
382
|
+
cancellationToken: this.cancellationToken,
|
|
383
|
+
};
|
|
384
|
+
const summarizeResult = this.generator.summarize(summaryOptions, resultsBuilder);
|
|
386
385
|
// ensure we wait till the end of the process
|
|
387
386
|
return summarizeResult.receivedSummaryAckOrNack;
|
|
388
387
|
}, () => {
|
|
@@ -396,7 +395,7 @@ class RunningSummarizer {
|
|
|
396
395
|
return resultsBuilder.build();
|
|
397
396
|
}
|
|
398
397
|
/** Heuristics summarize attempt. */
|
|
399
|
-
trySummarize(reason
|
|
398
|
+
trySummarize(reason) {
|
|
400
399
|
if (this.summarizingLock !== undefined) {
|
|
401
400
|
// lockedSummaryAction() will retry heuristic-based summary at the end of current attempt
|
|
402
401
|
// if it's still needed
|
|
@@ -406,79 +405,207 @@ class RunningSummarizer {
|
|
|
406
405
|
this.lockedSummaryAction(() => {
|
|
407
406
|
this.beforeSummaryAction();
|
|
408
407
|
}, async () => {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
{ refreshLatestAck: true, fullTree: false },
|
|
413
|
-
{ refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },
|
|
414
|
-
{ refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },
|
|
415
|
-
];
|
|
416
|
-
let overrideDelaySeconds;
|
|
417
|
-
let summaryAttempts = 0;
|
|
418
|
-
let summaryAttemptsPerPhase = 0;
|
|
419
|
-
// Reducing the default number of attempts to defaultNumberofSummarizationAttempts.
|
|
420
|
-
let totalAttempts = (_a = this.mc.config.getNumber("Fluid.Summarizer.Attempts")) !== null && _a !== void 0 ? _a : defaultNumberSummarizationAttempts;
|
|
421
|
-
if (totalAttempts > attempts.length) {
|
|
422
|
-
this.mc.logger.sendTelemetryEvent({
|
|
423
|
-
eventName: "InvalidSummarizerAttempts",
|
|
424
|
-
attempts: totalAttempts,
|
|
425
|
-
});
|
|
426
|
-
totalAttempts = defaultNumberSummarizationAttempts;
|
|
427
|
-
}
|
|
428
|
-
else if (totalAttempts < 1) {
|
|
429
|
-
throw new container_utils_1.UsageError("Invalid number of attempts.");
|
|
430
|
-
}
|
|
431
|
-
let lastResult;
|
|
432
|
-
for (let summaryAttemptPhase = 0; summaryAttemptPhase < totalAttempts;) {
|
|
433
|
-
if (this.cancellationToken.cancelled) {
|
|
434
|
-
return;
|
|
435
|
-
}
|
|
436
|
-
// We only want to attempt 1 summary when reason is "lastSummary"
|
|
437
|
-
if (++summaryAttempts > 1 && reason === "lastSummary") {
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
summaryAttemptsPerPhase++;
|
|
441
|
-
const _b = attempts[summaryAttemptPhase], { delaySeconds: regularDelaySeconds = 0 } = _b, options = __rest(_b, ["delaySeconds"]);
|
|
442
|
-
const summarizeProps = Object.assign({ reason,
|
|
443
|
-
summaryAttempts,
|
|
444
|
-
summaryAttemptsPerPhase, summaryAttemptPhase: summaryAttemptPhase + 1 }, options);
|
|
445
|
-
// Note: no need to account for cancellationToken.waitCancelled here, as
|
|
446
|
-
// this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
|
|
447
|
-
const resultSummarize = this.generator.summarize(summarizeProps, options, cancellationToken);
|
|
448
|
-
const result = await resultSummarize.receivedSummaryAckOrNack;
|
|
449
|
-
if (result.success) {
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
// Check for retryDelay that can come from summaryNack or upload summary flow.
|
|
453
|
-
// Retry the same step only once per retryAfter response.
|
|
454
|
-
overrideDelaySeconds = result.retryAfterSeconds;
|
|
455
|
-
if (overrideDelaySeconds === undefined || summaryAttemptsPerPhase > 1) {
|
|
456
|
-
summaryAttemptPhase++;
|
|
457
|
-
summaryAttemptsPerPhase = 0;
|
|
458
|
-
}
|
|
459
|
-
lastResult = result;
|
|
460
|
-
const delaySeconds = overrideDelaySeconds !== null && overrideDelaySeconds !== void 0 ? overrideDelaySeconds : regularDelaySeconds;
|
|
461
|
-
if (delaySeconds > 0) {
|
|
462
|
-
this.mc.logger.sendPerformanceEvent(Object.assign({ eventName: "SummarizeAttemptDelay", duration: delaySeconds, summaryNackDelay: overrideDelaySeconds !== undefined }, summarizeProps));
|
|
463
|
-
await (0, common_utils_1.delay)(delaySeconds * 1000);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
// If all attempts failed, log error (with last attempt info) and close the summarizer container
|
|
467
|
-
this.mc.logger.sendErrorEvent({
|
|
468
|
-
eventName: "FailToSummarize",
|
|
469
|
-
reason,
|
|
470
|
-
message: lastResult === null || lastResult === void 0 ? void 0 : lastResult.message,
|
|
471
|
-
}, lastResult === null || lastResult === void 0 ? void 0 : lastResult.error);
|
|
472
|
-
this.stopSummarizerCallback("failToSummarize");
|
|
408
|
+
return this.mc.config.getBoolean("Fluid.Summarizer.UseDynamicRetries")
|
|
409
|
+
? this.trySummarizeWithRetries(reason)
|
|
410
|
+
: this.trySummarizeWithStaticAttempts(reason);
|
|
473
411
|
}, () => {
|
|
474
412
|
this.afterSummaryAction();
|
|
475
413
|
}).catch((error) => {
|
|
476
414
|
this.mc.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
|
|
477
415
|
});
|
|
478
416
|
}
|
|
417
|
+
/**
|
|
418
|
+
* Tries to summarize 2 times with pre-defined summary options. If an attempt fails with "retryAfterSeconds"
|
|
419
|
+
* param, that attempt is tried once more.
|
|
420
|
+
*/
|
|
421
|
+
async trySummarizeWithStaticAttempts(reason) {
|
|
422
|
+
const attemptOptions = [
|
|
423
|
+
{ refreshLatestAck: false, fullTree: false },
|
|
424
|
+
{ refreshLatestAck: true, fullTree: false },
|
|
425
|
+
];
|
|
426
|
+
let summaryAttempts = 0;
|
|
427
|
+
let summaryAttemptsPerPhase = 0;
|
|
428
|
+
let summaryAttemptPhase = 0;
|
|
429
|
+
while (summaryAttemptPhase < attemptOptions.length) {
|
|
430
|
+
if (this.cancellationToken.cancelled) {
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
// We only want to attempt 1 summary when reason is "lastSummary"
|
|
434
|
+
if (++summaryAttempts > 1 && reason === "lastSummary") {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
summaryAttemptsPerPhase++;
|
|
438
|
+
const summarizeOptions = attemptOptions[summaryAttemptPhase];
|
|
439
|
+
const summarizeProps = {
|
|
440
|
+
summarizeReason: reason,
|
|
441
|
+
summaryAttempts,
|
|
442
|
+
summaryAttemptsPerPhase,
|
|
443
|
+
summaryAttemptPhase: summaryAttemptPhase + 1,
|
|
444
|
+
...summarizeOptions,
|
|
445
|
+
};
|
|
446
|
+
const summaryLogger = (0, telemetry_utils_1.createChildLogger)({
|
|
447
|
+
logger: this.mc.logger,
|
|
448
|
+
properties: { all: summarizeProps },
|
|
449
|
+
});
|
|
450
|
+
const summaryOptions = {
|
|
451
|
+
...summarizeOptions,
|
|
452
|
+
summaryLogger,
|
|
453
|
+
cancellationToken: this.cancellationToken,
|
|
454
|
+
};
|
|
455
|
+
// Note: no need to account for cancellationToken.waitCancelled here, as
|
|
456
|
+
// this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
|
|
457
|
+
const resultSummarize = this.generator.summarize(summaryOptions);
|
|
458
|
+
const ackNackResult = await resultSummarize.receivedSummaryAckOrNack;
|
|
459
|
+
if (ackNackResult.success) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
// Check for retryDelay that can come from summaryNack, upload summary or submit summary flows.
|
|
463
|
+
// Retry the same step only once per retryAfter response.
|
|
464
|
+
const submitResult = await resultSummarize.summarySubmitted;
|
|
465
|
+
const delaySeconds = !submitResult.success
|
|
466
|
+
? submitResult.data?.retryAfterSeconds
|
|
467
|
+
: ackNackResult.data?.retryAfterSeconds;
|
|
468
|
+
if (delaySeconds === undefined || summaryAttemptsPerPhase > 1) {
|
|
469
|
+
summaryAttemptPhase++;
|
|
470
|
+
summaryAttemptsPerPhase = 0;
|
|
471
|
+
}
|
|
472
|
+
if (delaySeconds !== undefined) {
|
|
473
|
+
this.mc.logger.sendPerformanceEvent({
|
|
474
|
+
eventName: "SummarizeAttemptDelay",
|
|
475
|
+
duration: delaySeconds,
|
|
476
|
+
summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
|
|
477
|
+
...summarizeProps,
|
|
478
|
+
});
|
|
479
|
+
await (0, core_utils_1.delay)(delaySeconds * 1000);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
this.stopSummarizerCallback("failToSummarize");
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Tries to summarize with retries where retry is based on the failure params.
|
|
486
|
+
* For example, summarization may be retried for failures with "retryAfterSeconds" param.
|
|
487
|
+
*/
|
|
488
|
+
async trySummarizeWithRetries(reason) {
|
|
489
|
+
// Helper to set summarize options, telemetry properties and call summarize.
|
|
490
|
+
const attemptSummarize = (attemptNumber, finalAttempt) => {
|
|
491
|
+
const summarizeOptions = {
|
|
492
|
+
fullTree: false,
|
|
493
|
+
};
|
|
494
|
+
const summarizeProps = {
|
|
495
|
+
summarizeReason: reason,
|
|
496
|
+
summaryAttempts: attemptNumber,
|
|
497
|
+
...summarizeOptions,
|
|
498
|
+
finalAttempt,
|
|
499
|
+
};
|
|
500
|
+
const summaryLogger = (0, telemetry_utils_1.createChildLogger)({
|
|
501
|
+
logger: this.mc.logger,
|
|
502
|
+
properties: { all: summarizeProps },
|
|
503
|
+
});
|
|
504
|
+
const summaryOptions = {
|
|
505
|
+
...summarizeOptions,
|
|
506
|
+
summaryLogger,
|
|
507
|
+
cancellationToken: this.cancellationToken,
|
|
508
|
+
finalAttempt,
|
|
509
|
+
};
|
|
510
|
+
const summarizeResult = this.generator.summarize(summaryOptions);
|
|
511
|
+
return { summarizeProps, summarizeResult };
|
|
512
|
+
};
|
|
513
|
+
// The max number of attempts are based on the stage at which summarization failed. If it fails before it is
|
|
514
|
+
// submitted, a different value is used compared to if it fails after submission. Usually, in the former case,
|
|
515
|
+
// we would retry more often as its cheaper and retries are likely to succeed.
|
|
516
|
+
// This makes it harder to predict how many attempts would actually happen as that depends on how far an attempt
|
|
517
|
+
// made. To keep things simple, the max attempts is reset after every attempt based on where it failed. This may
|
|
518
|
+
// result in some failures not being retried depending on what happened before this attempt. That's fine because
|
|
519
|
+
// such scenarios are very unlikely and even if it happens, it would resolve when a new summarizer starts over.
|
|
520
|
+
// For example - When failure switches from one the submit failures to nack failure, only one more retry will
|
|
521
|
+
// happen irrespective of the value of `defaultMaxAttempts`.
|
|
522
|
+
let maxAttempts = exports.defaultMaxAttempts;
|
|
523
|
+
let currentAttempt = 0;
|
|
524
|
+
let retryAfterSeconds;
|
|
525
|
+
let done = false;
|
|
526
|
+
let result = "success";
|
|
527
|
+
do {
|
|
528
|
+
currentAttempt++;
|
|
529
|
+
if (this.cancellationToken.cancelled) {
|
|
530
|
+
result = "canceled";
|
|
531
|
+
done = true;
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
const { summarizeProps, summarizeResult } = attemptSummarize(currentAttempt, false /* finalAttempt */);
|
|
535
|
+
// Ack / nack is the final step, so if it succeeds we're done.
|
|
536
|
+
const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
|
|
537
|
+
if (ackNackResult.success) {
|
|
538
|
+
result = "success";
|
|
539
|
+
done = true;
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
// Update max attempts and retry params from the failure result.
|
|
543
|
+
// If submit summary failed, use the params from "summarySubmitted" result. Else, use the params
|
|
544
|
+
// from "receivedSummaryAckOrNack" result.
|
|
545
|
+
// Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
|
|
546
|
+
const submitSummaryResult = await summarizeResult.summarySubmitted;
|
|
547
|
+
if (!submitSummaryResult.success) {
|
|
548
|
+
maxAttempts = this.maxAttemptsForSubmitFailures;
|
|
549
|
+
retryAfterSeconds = submitSummaryResult.data?.retryAfterSeconds;
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
maxAttempts = exports.defaultMaxAttempts;
|
|
553
|
+
retryAfterSeconds = ackNackResult.data?.retryAfterSeconds;
|
|
554
|
+
}
|
|
555
|
+
// Emit "summarize" event for this failed attempt.
|
|
556
|
+
result = "failure";
|
|
557
|
+
const eventProps = {
|
|
558
|
+
result,
|
|
559
|
+
currentAttempt,
|
|
560
|
+
maxAttempts,
|
|
561
|
+
error: ackNackResult.error,
|
|
562
|
+
};
|
|
563
|
+
this.emit("summarize", eventProps);
|
|
564
|
+
// If the failure doesn't have "retryAfterSeconds" or the max number of attempts have been done, we're done.
|
|
565
|
+
if (retryAfterSeconds === undefined || currentAttempt >= maxAttempts - 1) {
|
|
566
|
+
done = true;
|
|
567
|
+
}
|
|
568
|
+
// If the failure has "retryAfterSeconds", add a delay of that time. In this case, a final attempt will
|
|
569
|
+
// take place and we need to wait for "retryAfterSeconds" before that.
|
|
570
|
+
if (retryAfterSeconds !== undefined) {
|
|
571
|
+
this.mc.logger.sendPerformanceEvent({
|
|
572
|
+
eventName: "SummarizeAttemptDelay",
|
|
573
|
+
duration: retryAfterSeconds,
|
|
574
|
+
summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
|
|
575
|
+
stage: submitSummaryResult.data?.stage,
|
|
576
|
+
dynamicRetries: true,
|
|
577
|
+
...summarizeProps,
|
|
578
|
+
});
|
|
579
|
+
await (0, core_utils_1.delay)(retryAfterSeconds * 1000);
|
|
580
|
+
}
|
|
581
|
+
} while (!done);
|
|
582
|
+
// If summarize attempt did not fail, emit "summarize" event and return. A failed attempt may be retried below.
|
|
583
|
+
if (result !== "failure") {
|
|
584
|
+
this.emit("summarize", { result, currentAttempt, maxAttempts });
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
// If summarization wasn't successful above and the failure contains "retryAfterSeconds", perform one last
|
|
588
|
+
// attempt. This gives a chance to the runtime to perform additional steps in the last attempt.
|
|
589
|
+
if (retryAfterSeconds !== undefined) {
|
|
590
|
+
const { summarizeResult } = attemptSummarize(++currentAttempt, true /* finalAttempt */);
|
|
591
|
+
// Ack / nack is the final step, so if it succeeds we're done.
|
|
592
|
+
const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
|
|
593
|
+
result = ackNackResult.success ? "success" : "failure";
|
|
594
|
+
const eventProps = {
|
|
595
|
+
result,
|
|
596
|
+
currentAttempt,
|
|
597
|
+
maxAttempts,
|
|
598
|
+
error: ackNackResult.success ? undefined : ackNackResult.error,
|
|
599
|
+
};
|
|
600
|
+
this.emit("summarize", eventProps);
|
|
601
|
+
}
|
|
602
|
+
// If summarization is still unsuccessful, stop the summarizer.
|
|
603
|
+
if (result === "failure") {
|
|
604
|
+
this.stopSummarizerCallback("failToSummarize");
|
|
605
|
+
}
|
|
606
|
+
}
|
|
479
607
|
/** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
|
|
480
|
-
summarizeOnDemand(resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()
|
|
481
|
-
var { reason } = _a, options = __rest(_a, ["reason"]);
|
|
608
|
+
summarizeOnDemand(options, resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()) {
|
|
482
609
|
if (this.stopping) {
|
|
483
610
|
resultsBuilder.fail("RunningSummarizer stopped or disposed", undefined);
|
|
484
611
|
return resultsBuilder.build();
|
|
@@ -487,15 +614,15 @@ class RunningSummarizer {
|
|
|
487
614
|
// return a promise that caller can await before trying again.
|
|
488
615
|
if (this.summarizingLock !== undefined) {
|
|
489
616
|
// The heuristics are blocking concurrent summarize attempts.
|
|
490
|
-
throw new
|
|
617
|
+
throw new telemetry_utils_1.UsageError("Attempted to run an already-running summarizer on demand");
|
|
491
618
|
}
|
|
492
|
-
const
|
|
619
|
+
const { reason, ...summarizeOptions } = options;
|
|
620
|
+
const result = this.trySummarizeOnce({ summarizeReason: `onDemand/${reason}` }, summarizeOptions, resultsBuilder);
|
|
493
621
|
return result;
|
|
494
622
|
}
|
|
495
623
|
/** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
|
|
496
|
-
enqueueSummarize(
|
|
497
|
-
|
|
498
|
-
const onDemandReason = `enqueue;${reason}`;
|
|
624
|
+
enqueueSummarize(options) {
|
|
625
|
+
const { reason, afterSequenceNumber = 0, override = false, ...summarizeOptions } = options;
|
|
499
626
|
let overridden = false;
|
|
500
627
|
if (this.enqueuedSummary !== undefined) {
|
|
501
628
|
if (!override) {
|
|
@@ -507,15 +634,20 @@ class RunningSummarizer {
|
|
|
507
634
|
overridden = true;
|
|
508
635
|
}
|
|
509
636
|
this.enqueuedSummary = {
|
|
510
|
-
reason:
|
|
637
|
+
reason: `enqueue;${reason}`,
|
|
511
638
|
afterSequenceNumber,
|
|
512
|
-
|
|
639
|
+
summarizeOptions,
|
|
513
640
|
resultsBuilder: new summaryGenerator_1.SummarizeResultBuilder(),
|
|
514
641
|
};
|
|
515
642
|
const results = this.enqueuedSummary.resultsBuilder.build();
|
|
516
643
|
this.tryRunEnqueuedSummary();
|
|
517
644
|
return overridden
|
|
518
|
-
?
|
|
645
|
+
? {
|
|
646
|
+
...results,
|
|
647
|
+
alreadyEnqueued: true,
|
|
648
|
+
overridden: true,
|
|
649
|
+
}
|
|
650
|
+
: results;
|
|
519
651
|
}
|
|
520
652
|
tryRunEnqueuedSummary() {
|
|
521
653
|
if (this.stopping) {
|
|
@@ -528,10 +660,10 @@ class RunningSummarizer {
|
|
|
528
660
|
// If no enqueued summary is ready or a summary is already in progress, take no action.
|
|
529
661
|
return false;
|
|
530
662
|
}
|
|
531
|
-
const { reason, resultsBuilder,
|
|
663
|
+
const { reason, resultsBuilder, summarizeOptions } = this.enqueuedSummary;
|
|
532
664
|
// Set to undefined first, so that subsequent enqueue attempt while summarize will occur later.
|
|
533
665
|
this.enqueuedSummary = undefined;
|
|
534
|
-
this.trySummarizeOnce({
|
|
666
|
+
this.trySummarizeOnce({ summarizeReason: `enqueuedSummary/${reason}` }, summarizeOptions, resultsBuilder);
|
|
535
667
|
return true;
|
|
536
668
|
}
|
|
537
669
|
disposeEnqueuedSummary() {
|