@fluidframework/container-runtime 2.0.0-internal.6.1.1 → 2.0.0-internal.6.3.0
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 +39 -0
- package/README.md +4 -3
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +5 -4
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +4 -21
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +119 -185
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +13 -12
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +99 -16
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +380 -242
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +4 -5
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +2 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +40 -41
- 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 +7 -8
- 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.map +1 -1
- package/dist/dataStores.js +23 -25
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerProxyBase.d.ts +1 -1
- package/dist/deltaManagerProxyBase.js +2 -2
- package/dist/deltaManagerProxyBase.js.map +1 -1
- package/dist/deltaScheduler.js +6 -6
- 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 +4 -6
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +26 -25
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +5 -3
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +4 -2
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.js +7 -7
- 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 +15 -52
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +2 -0
- 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 +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +1 -2
- 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 +387 -1150
- 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/opCompressor.js +5 -5
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +11 -10
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +3 -3
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +14 -15
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +1 -0
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +16 -17
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +11 -5
- 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 +12 -5
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +36 -23
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +23 -23
- 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 +2 -3
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +8 -8
- 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 +27 -4
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +246 -74
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +6 -5
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +73 -69
- 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 +2 -2
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +2 -2
- 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 +5 -14
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +32 -109
- 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.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +0 -11
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +5 -88
- 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 +9 -8
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.js +2 -2
- 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 +52 -48
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +7 -6
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +30 -22
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +3 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +4 -21
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +91 -157
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +2 -1
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +99 -16
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +332 -192
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +2 -3
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +2 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +3 -4
- 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 +1 -2
- 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.map +1 -1
- package/lib/dataStores.js +2 -4
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerProxyBase.d.ts +1 -1
- package/lib/deltaManagerProxyBase.js +1 -1
- package/lib/deltaManagerProxyBase.js.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- 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 +4 -6
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +26 -25
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +3 -1
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +4 -2
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.js +1 -1
- 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 +16 -53
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +2 -0
- 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 +1 -1
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- 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 +382 -1139
- 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/opCompressor.js +3 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +2 -1
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +1 -1
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +2 -3
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +1 -0
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +7 -8
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +12 -6
- 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 +12 -5
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +21 -8
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +3 -3
- 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 +2 -3
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +3 -3
- 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 +27 -4
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +240 -68
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +6 -5
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +69 -65
- 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 +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +1 -1
- 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 +5 -14
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +16 -93
- 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.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +0 -11
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -86
- 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 +2 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.js +1 -1
- 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 +46 -42
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +7 -6
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +26 -18
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +30 -29
- package/src/batchTracker.ts +3 -2
- package/src/blobManager.ts +105 -185
- package/src/connectionTelemetry.ts +2 -1
- package/src/containerRuntime.ts +481 -267
- package/src/dataStore.ts +2 -3
- package/src/dataStoreContext.ts +5 -8
- package/src/dataStoreContexts.ts +2 -4
- package/src/dataStoreRegistry.ts +1 -1
- package/src/dataStores.ts +4 -7
- package/src/deltaManagerProxyBase.ts +1 -1
- package/src/deltaScheduler.ts +1 -1
- package/src/error.ts +18 -0
- package/src/gc/garbageCollection.ts +39 -41
- package/src/gc/gcConfigs.ts +4 -2
- package/src/gc/gcDefinitions.ts +4 -6
- package/src/gc/gcHelpers.ts +1 -1
- package/src/gc/gcSummaryStateTracker.ts +19 -65
- package/src/gc/gcTelemetry.ts +2 -0
- package/src/gc/gcUnreferencedStateTracker.ts +1 -1
- package/src/gc/index.ts +0 -1
- package/src/id-compressor/appendOnlySortedMap.ts +26 -87
- package/src/id-compressor/finalSpace.ts +67 -0
- package/src/id-compressor/idCompressor.ts +456 -1681
- 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 -1
- package/src/opLifecycle/opCompressor.ts +3 -3
- package/src/opLifecycle/opDecompressor.ts +2 -1
- package/src/opLifecycle/opGroupingManager.ts +1 -1
- package/src/opLifecycle/opSplitter.ts +4 -4
- package/src/opLifecycle/outbox.ts +14 -11
- package/src/opLifecycle/remoteMessageProcessor.ts +19 -6
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +50 -29
- package/src/scheduleManager.ts +6 -4
- package/src/summary/index.ts +4 -3
- package/src/summary/orderedClientElection.ts +8 -5
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +273 -97
- package/src/summary/summarizer.ts +23 -12
- 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 +23 -145
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +7 -38
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +3 -123
- package/src/summary/summarizerTypes.ts +40 -25
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +1 -1
- package/src/summary/summaryGenerator.ts +52 -55
- package/src/summary/summaryManager.ts +36 -13
- 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 -483
- 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 -479
- 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
|
@@ -4,16 +4,26 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.RunningSummarizer = void 0;
|
|
7
|
+
exports.RunningSummarizer = exports.defaultMaxAttemptsForSubmitFailures = exports.defaultMaxAttempts = void 0;
|
|
8
8
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
9
|
-
const
|
|
10
|
-
const
|
|
9
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
10
|
+
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
11
11
|
const driver_definitions_1 = require("@fluidframework/driver-definitions");
|
|
12
12
|
const protocol_definitions_1 = require("@fluidframework/protocol-definitions");
|
|
13
13
|
const opProperties_1 = require("../opProperties");
|
|
14
14
|
const summarizerHeuristics_1 = require("./summarizerHeuristics");
|
|
15
15
|
const summaryGenerator_1 = require("./summaryGenerator");
|
|
16
16
|
const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
|
|
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;
|
|
17
27
|
/**
|
|
18
28
|
* An instance of RunningSummarizer manages the heuristics for summarizing.
|
|
19
29
|
* Until disposed, the instance of RunningSummarizer can assume that it is
|
|
@@ -21,8 +31,9 @@ const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
|
|
|
21
31
|
* track of summaries that it is generating as they are broadcast and acked/nacked.
|
|
22
32
|
* This object is created and controlled by Summarizer object.
|
|
23
33
|
*/
|
|
24
|
-
class RunningSummarizer {
|
|
34
|
+
class RunningSummarizer extends client_utils_1.TypedEventEmitter {
|
|
25
35
|
constructor(baseLogger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
|
|
36
|
+
super();
|
|
26
37
|
this.summaryWatcher = summaryWatcher;
|
|
27
38
|
this.configuration = configuration;
|
|
28
39
|
this.submitSummaryCallback = submitSummaryCallback;
|
|
@@ -61,14 +72,14 @@ class RunningSummarizer {
|
|
|
61
72
|
},
|
|
62
73
|
});
|
|
63
74
|
if (configuration.state !== "disableHeuristics") {
|
|
64
|
-
(0,
|
|
75
|
+
(0, core_utils_1.assert)(this.configuration.state === "enabled", 0x2ea /* "Configuration state should be enabled" */);
|
|
65
76
|
this.heuristicRunner = new summarizerHeuristics_1.SummarizeHeuristicRunner(heuristicData, this.configuration, (reason) => this.trySummarize(reason), this.mc.logger);
|
|
66
77
|
}
|
|
67
|
-
(0,
|
|
78
|
+
(0, core_utils_1.assert)(this.configuration.state !== "disabled", 0x2eb /* "Summary not supported with configuration disabled" */);
|
|
68
79
|
// Cap the maximum amount of time client will wait for a summarize op ack to maxSummarizeAckWaitTime
|
|
69
80
|
// configuration.maxAckWaitTime is composed from defaults, server values, and runtime overrides
|
|
70
81
|
const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);
|
|
71
|
-
this.pendingAckTimer = new
|
|
82
|
+
this.pendingAckTimer = new core_utils_1.PromiseTimer(maxAckWaitTime, () => {
|
|
72
83
|
// Note: summarizeCount (from ChildLogger definition) may be 0,
|
|
73
84
|
// since this code path is hit when RunningSummarizer first starts up,
|
|
74
85
|
// before this instance has kicked off a new summarize run.
|
|
@@ -100,6 +111,14 @@ class RunningSummarizer {
|
|
|
100
111
|
this.handleOp(op, runtimeMessage === true);
|
|
101
112
|
};
|
|
102
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;
|
|
103
122
|
}
|
|
104
123
|
static async start(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
|
|
105
124
|
const summarizer = new RunningSummarizer(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime);
|
|
@@ -172,7 +191,7 @@ class RunningSummarizer {
|
|
|
172
191
|
// code in `submitSummary` function in container runtime, will refresh the latest state
|
|
173
192
|
// by calling `refreshLatestSummaryAckFromServer` and we will be fine.
|
|
174
193
|
const isIgnoredError = (0, telemetry_utils_1.isFluidError)(error) &&
|
|
175
|
-
error.errorType === driver_definitions_1.
|
|
194
|
+
error.errorType === driver_definitions_1.DriverErrorTypes.fileNotFoundOrAccessDeniedError;
|
|
176
195
|
summaryLogger.sendTelemetryEvent({
|
|
177
196
|
eventName: isIgnoredError
|
|
178
197
|
? "HandleSummaryAckErrorIgnored"
|
|
@@ -208,7 +227,7 @@ class RunningSummarizer {
|
|
|
208
227
|
});
|
|
209
228
|
refSequenceNumber = await this.handleSummaryAck();
|
|
210
229
|
// A valid Summary Ack must have been processed.
|
|
211
|
-
(0,
|
|
230
|
+
(0, core_utils_1.assert)(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
|
|
212
231
|
}
|
|
213
232
|
}
|
|
214
233
|
dispose() {
|
|
@@ -280,7 +299,7 @@ class RunningSummarizer {
|
|
|
280
299
|
if (this.summarizingLock === undefined) {
|
|
281
300
|
this.trySummarizeOnce(
|
|
282
301
|
// summarizeProps
|
|
283
|
-
{
|
|
302
|
+
{ summarizeReason: "lastSummary" },
|
|
284
303
|
// ISummarizeOptions, using defaults: { refreshLatestAck: false, fullTree: false }
|
|
285
304
|
{});
|
|
286
305
|
}
|
|
@@ -331,8 +350,8 @@ class RunningSummarizer {
|
|
|
331
350
|
* @returns - result of action.
|
|
332
351
|
*/
|
|
333
352
|
async lockedSummaryAction(before, action, after) {
|
|
334
|
-
(0,
|
|
335
|
-
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();
|
|
336
355
|
this.summarizingLock = summarizingLock.promise;
|
|
337
356
|
before();
|
|
338
357
|
return action().finally(() => {
|
|
@@ -349,11 +368,20 @@ class RunningSummarizer {
|
|
|
349
368
|
* @param resultsBuilder - optional, result builder to use.
|
|
350
369
|
* @returns ISummarizeResult - result of running a summary.
|
|
351
370
|
*/
|
|
352
|
-
trySummarizeOnce(summarizeProps, options,
|
|
371
|
+
trySummarizeOnce(summarizeProps, options, resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()) {
|
|
353
372
|
this.lockedSummaryAction(() => {
|
|
354
373
|
this.beforeSummaryAction();
|
|
355
374
|
}, async () => {
|
|
356
|
-
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);
|
|
357
385
|
// ensure we wait till the end of the process
|
|
358
386
|
return summarizeResult.receivedSummaryAckOrNack;
|
|
359
387
|
}, () => {
|
|
@@ -367,7 +395,7 @@ class RunningSummarizer {
|
|
|
367
395
|
return resultsBuilder.build();
|
|
368
396
|
}
|
|
369
397
|
/** Heuristics summarize attempt. */
|
|
370
|
-
trySummarize(reason
|
|
398
|
+
trySummarize(reason) {
|
|
371
399
|
if (this.summarizingLock !== undefined) {
|
|
372
400
|
// lockedSummaryAction() will retry heuristic-based summary at the end of current attempt
|
|
373
401
|
// if it's still needed
|
|
@@ -377,64 +405,207 @@ class RunningSummarizer {
|
|
|
377
405
|
this.lockedSummaryAction(() => {
|
|
378
406
|
this.beforeSummaryAction();
|
|
379
407
|
}, async () => {
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
];
|
|
384
|
-
let overrideDelaySeconds;
|
|
385
|
-
let summaryAttempts = 0;
|
|
386
|
-
let summaryAttemptsPerPhase = 0;
|
|
387
|
-
let summaryAttemptPhase = 0;
|
|
388
|
-
while (summaryAttemptPhase < attempts.length) {
|
|
389
|
-
if (this.cancellationToken.cancelled) {
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
// We only want to attempt 1 summary when reason is "lastSummary"
|
|
393
|
-
if (++summaryAttempts > 1 && reason === "lastSummary") {
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
summaryAttemptsPerPhase++;
|
|
397
|
-
const summarizeOptions = attempts[summaryAttemptPhase];
|
|
398
|
-
const summarizeProps = {
|
|
399
|
-
reason,
|
|
400
|
-
summaryAttempts,
|
|
401
|
-
summaryAttemptsPerPhase,
|
|
402
|
-
summaryAttemptPhase: summaryAttemptPhase + 1,
|
|
403
|
-
...summarizeOptions,
|
|
404
|
-
};
|
|
405
|
-
// Note: no need to account for cancellationToken.waitCancelled here, as
|
|
406
|
-
// this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
|
|
407
|
-
const resultSummarize = this.generator.summarize(summarizeProps, summarizeOptions, cancellationToken);
|
|
408
|
-
const result = await resultSummarize.receivedSummaryAckOrNack;
|
|
409
|
-
if (result.success) {
|
|
410
|
-
return;
|
|
411
|
-
}
|
|
412
|
-
// Check for retryDelay that can come from summaryNack or upload summary flow.
|
|
413
|
-
// Retry the same step only once per retryAfter response.
|
|
414
|
-
const delaySeconds = result.retryAfterSeconds;
|
|
415
|
-
if (delaySeconds === undefined || summaryAttemptsPerPhase > 1) {
|
|
416
|
-
summaryAttemptPhase++;
|
|
417
|
-
summaryAttemptsPerPhase = 0;
|
|
418
|
-
}
|
|
419
|
-
if (delaySeconds !== undefined) {
|
|
420
|
-
this.mc.logger.sendPerformanceEvent({
|
|
421
|
-
eventName: "SummarizeAttemptDelay",
|
|
422
|
-
duration: delaySeconds,
|
|
423
|
-
summaryNackDelay: overrideDelaySeconds !== undefined,
|
|
424
|
-
...summarizeProps,
|
|
425
|
-
});
|
|
426
|
-
await (0, common_utils_1.delay)(delaySeconds * 1000);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
this.stopSummarizerCallback("failToSummarize");
|
|
408
|
+
return this.mc.config.getBoolean("Fluid.Summarizer.UseDynamicRetries")
|
|
409
|
+
? this.trySummarizeWithRetries(reason)
|
|
410
|
+
: this.trySummarizeWithStaticAttempts(reason);
|
|
430
411
|
}, () => {
|
|
431
412
|
this.afterSummaryAction();
|
|
432
413
|
}).catch((error) => {
|
|
433
414
|
this.mc.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
|
|
434
415
|
});
|
|
435
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
|
+
}
|
|
436
607
|
/** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
|
|
437
|
-
summarizeOnDemand(resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()
|
|
608
|
+
summarizeOnDemand(options, resultsBuilder = new summaryGenerator_1.SummarizeResultBuilder()) {
|
|
438
609
|
if (this.stopping) {
|
|
439
610
|
resultsBuilder.fail("RunningSummarizer stopped or disposed", undefined);
|
|
440
611
|
return resultsBuilder.build();
|
|
@@ -443,14 +614,15 @@ class RunningSummarizer {
|
|
|
443
614
|
// return a promise that caller can await before trying again.
|
|
444
615
|
if (this.summarizingLock !== undefined) {
|
|
445
616
|
// The heuristics are blocking concurrent summarize attempts.
|
|
446
|
-
throw new
|
|
617
|
+
throw new telemetry_utils_1.UsageError("Attempted to run an already-running summarizer on demand");
|
|
447
618
|
}
|
|
448
|
-
const
|
|
619
|
+
const { reason, ...summarizeOptions } = options;
|
|
620
|
+
const result = this.trySummarizeOnce({ summarizeReason: `onDemand/${reason}` }, summarizeOptions, resultsBuilder);
|
|
449
621
|
return result;
|
|
450
622
|
}
|
|
451
623
|
/** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
|
|
452
|
-
enqueueSummarize(
|
|
453
|
-
const
|
|
624
|
+
enqueueSummarize(options) {
|
|
625
|
+
const { reason, afterSequenceNumber = 0, override = false, ...summarizeOptions } = options;
|
|
454
626
|
let overridden = false;
|
|
455
627
|
if (this.enqueuedSummary !== undefined) {
|
|
456
628
|
if (!override) {
|
|
@@ -462,9 +634,9 @@ class RunningSummarizer {
|
|
|
462
634
|
overridden = true;
|
|
463
635
|
}
|
|
464
636
|
this.enqueuedSummary = {
|
|
465
|
-
reason:
|
|
637
|
+
reason: `enqueue;${reason}`,
|
|
466
638
|
afterSequenceNumber,
|
|
467
|
-
|
|
639
|
+
summarizeOptions,
|
|
468
640
|
resultsBuilder: new summaryGenerator_1.SummarizeResultBuilder(),
|
|
469
641
|
};
|
|
470
642
|
const results = this.enqueuedSummary.resultsBuilder.build();
|
|
@@ -488,10 +660,10 @@ class RunningSummarizer {
|
|
|
488
660
|
// If no enqueued summary is ready or a summary is already in progress, take no action.
|
|
489
661
|
return false;
|
|
490
662
|
}
|
|
491
|
-
const { reason, resultsBuilder,
|
|
663
|
+
const { reason, resultsBuilder, summarizeOptions } = this.enqueuedSummary;
|
|
492
664
|
// Set to undefined first, so that subsequent enqueue attempt while summarize will occur later.
|
|
493
665
|
this.enqueuedSummary = undefined;
|
|
494
|
-
this.trySummarizeOnce({
|
|
666
|
+
this.trySummarizeOnce({ summarizeReason: `enqueuedSummary/${reason}` }, summarizeOptions, resultsBuilder);
|
|
495
667
|
return true;
|
|
496
668
|
}
|
|
497
669
|
disposeEnqueuedSummary() {
|