@fluidframework/container-runtime 2.0.0-dev.5.2.0.169897 → 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 +147 -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 +15 -18
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +212 -171
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +33 -17
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +172 -35
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +722 -425
- 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 +4 -4
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +87 -90
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +10 -10
- 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 +23 -7
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +125 -82
- 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 +65 -56
- 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 -5
- 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 +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/metadata.d.ts +18 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +7 -0
- package/dist/metadata.js.map +1 -0
- package/dist/opLifecycle/batchManager.d.ts +2 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +15 -7
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +11 -0
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +1 -1
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +2 -1
- package/dist/opLifecycle/index.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 +30 -21
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +19 -13
- 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 +24 -19
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +39 -6
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +138 -61
- 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 +22 -8
- 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 +25 -10
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +101 -64
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +43 -33
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +4 -4
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +3 -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 +40 -23
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +144 -149
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +25 -29
- 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 +21 -16
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +74 -123
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +44 -24
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +16 -13
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +4 -0
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +8 -5
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +21 -6
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +117 -54
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +8 -7
- 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 +15 -18
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +187 -146
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +23 -7
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +172 -35
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +678 -380
- 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 +4 -4
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +49 -52
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +3 -3
- 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 +23 -7
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +107 -64
- 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 -52
- 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 -5
- 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 +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/metadata.d.ts +18 -0
- package/lib/metadata.d.ts.map +1 -0
- package/lib/metadata.js +6 -0
- package/lib/metadata.js.map +1 -0
- package/lib/opLifecycle/batchManager.d.ts +2 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +15 -7
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +11 -0
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +1 -1
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +1 -1
- package/lib/opLifecycle/index.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 +22 -13
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +17 -11
- 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 +15 -10
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +39 -6
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +132 -56
- 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 +23 -9
- 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 +25 -10
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +90 -53
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +25 -15
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/index.d.ts +4 -4
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +2 -2
- 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 +40 -23
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +132 -137
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +25 -29
- 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 +21 -16
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +70 -119
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +44 -24
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +9 -6
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +4 -0
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +7 -4
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +21 -6
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +109 -47
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +8 -7
- 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 +30 -32
- package/src/batchTracker.ts +7 -5
- package/src/blobManager.ts +235 -172
- package/src/connectionTelemetry.ts +19 -5
- package/src/containerRuntime.ts +853 -431
- package/src/dataStore.ts +12 -4
- package/src/dataStoreContext.ts +49 -46
- package/src/dataStoreContexts.ts +4 -4
- package/src/dataStoreRegistry.ts +1 -1
- package/src/dataStores.ts +119 -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 -51
- package/src/gc/gcConfigs.ts +4 -2
- package/src/gc/gcDefinitions.ts +17 -21
- 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 +15 -13
- 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 +9 -2
- package/src/metadata.ts +19 -0
- package/src/opLifecycle/README.md +20 -0
- package/src/opLifecycle/batchManager.ts +9 -1
- package/src/opLifecycle/definitions.ts +11 -0
- package/src/opLifecycle/index.ts +1 -1
- package/src/opLifecycle/opCompressor.ts +6 -5
- package/src/opLifecycle/opDecompressor.ts +47 -17
- package/src/opLifecycle/opGroupingManager.ts +18 -8
- package/src/opLifecycle/opSplitter.ts +10 -7
- package/src/opLifecycle/outbox.ts +177 -72
- package/src/opLifecycle/remoteMessageProcessor.ts +32 -9
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +123 -78
- package/src/scheduleManager.ts +22 -11
- package/src/summary/index.ts +7 -4
- 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 +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +142 -184
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +27 -35
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +72 -148
- package/src/summary/summarizerTypes.ts +49 -24
- package/src/summary/summaryCollection.ts +9 -4
- package/src/summary/summaryFormat.ts +9 -2
- package/src/summary/summaryGenerator.ts +72 -49
- package/src/summary/summaryManager.ts +44 -16
- 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 -30
- package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
- package/dist/id-compressor/uuidUtilities.js +0 -106
- 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 -30
- package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
- package/lib/id-compressor/uuidUtilities.js +0 -98
- 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 -123
|
@@ -3,18 +3,17 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { IDisposable } from "@fluidframework/
|
|
6
|
+
import { IDisposable, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
7
7
|
import {
|
|
8
|
-
ITelemetryLoggerExt,
|
|
9
|
-
ChildLogger,
|
|
10
8
|
isFluidError,
|
|
11
|
-
loggerToMonitoringContext,
|
|
12
9
|
MonitoringContext,
|
|
10
|
+
createChildMonitoringContext,
|
|
11
|
+
createChildLogger,
|
|
12
|
+
UsageError,
|
|
13
13
|
} from "@fluidframework/telemetry-utils";
|
|
14
|
-
import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { isRuntimeMessage } from "@fluidframework/driver-utils";
|
|
14
|
+
import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/core-utils";
|
|
15
|
+
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
16
|
+
import { DriverErrorTypes } from "@fluidframework/driver-definitions";
|
|
18
17
|
import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
|
|
19
18
|
import { ISummaryConfiguration } from "../containerRuntime";
|
|
20
19
|
import { opSize } from "../opProperties";
|
|
@@ -35,6 +34,8 @@ import {
|
|
|
35
34
|
ISummarizerRuntime,
|
|
36
35
|
ISummarizeRunnerTelemetry,
|
|
37
36
|
IRefreshSummaryAckOptions,
|
|
37
|
+
ISummarizerEvents,
|
|
38
|
+
ISummarizeEventProps,
|
|
38
39
|
} from "./summarizerTypes";
|
|
39
40
|
import { IAckedSummary, IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
|
|
40
41
|
import {
|
|
@@ -46,7 +47,16 @@ import {
|
|
|
46
47
|
|
|
47
48
|
const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
/**
|
|
51
|
+
* The maximum number of summarization attempts that will be done by default in case of failures
|
|
52
|
+
* that can be retried.
|
|
53
|
+
*/
|
|
54
|
+
export const defaultMaxAttempts = 2;
|
|
55
|
+
/**
|
|
56
|
+
* The default value for maximum number of summarization attempts that will be done for summarization failures where
|
|
57
|
+
* submit fails and the failure can be retried.
|
|
58
|
+
*/
|
|
59
|
+
export const defaultMaxAttemptsForSubmitFailures = 5;
|
|
50
60
|
|
|
51
61
|
/**
|
|
52
62
|
* An instance of RunningSummarizer manages the heuristics for summarizing.
|
|
@@ -55,9 +65,9 @@ const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
|
|
|
55
65
|
* track of summaries that it is generating as they are broadcast and acked/nacked.
|
|
56
66
|
* This object is created and controlled by Summarizer object.
|
|
57
67
|
*/
|
|
58
|
-
export class RunningSummarizer implements IDisposable {
|
|
68
|
+
export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> implements IDisposable {
|
|
59
69
|
public static async start(
|
|
60
|
-
logger:
|
|
70
|
+
logger: ITelemetryBaseLogger,
|
|
61
71
|
summaryWatcher: IClientSummaryWatcher,
|
|
62
72
|
configuration: ISummaryConfiguration,
|
|
63
73
|
submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
|
|
@@ -90,7 +100,10 @@ export class RunningSummarizer implements IDisposable {
|
|
|
90
100
|
// Handle summary acks asynchronously
|
|
91
101
|
// Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
|
|
92
102
|
summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
|
|
93
|
-
|
|
103
|
+
createChildLogger({ logger }).sendErrorEvent(
|
|
104
|
+
{ eventName: "HandleSummaryAckFatalError" },
|
|
105
|
+
error,
|
|
106
|
+
);
|
|
94
107
|
});
|
|
95
108
|
|
|
96
109
|
// Update heuristic counts
|
|
@@ -138,7 +151,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
138
151
|
| {
|
|
139
152
|
reason: SummarizeReason;
|
|
140
153
|
afterSequenceNumber: number;
|
|
141
|
-
|
|
154
|
+
summarizeOptions: ISummarizeOptions;
|
|
142
155
|
readonly resultsBuilder: SummarizeResultBuilder;
|
|
143
156
|
}
|
|
144
157
|
| undefined;
|
|
@@ -146,11 +159,13 @@ export class RunningSummarizer implements IDisposable {
|
|
|
146
159
|
private totalSuccessfulAttempts = 0;
|
|
147
160
|
private initialized = false;
|
|
148
161
|
|
|
149
|
-
private readonly deltaManagerListener;
|
|
150
162
|
private readonly runtimeListener;
|
|
151
163
|
|
|
164
|
+
/** The maximum number of summary attempts to do when submit summary fails. */
|
|
165
|
+
private readonly maxAttemptsForSubmitFailures: number;
|
|
166
|
+
|
|
152
167
|
private constructor(
|
|
153
|
-
baseLogger:
|
|
168
|
+
baseLogger: ITelemetryBaseLogger,
|
|
154
169
|
private readonly summaryWatcher: IClientSummaryWatcher,
|
|
155
170
|
private readonly configuration: ISummaryConfiguration,
|
|
156
171
|
private readonly submitSummaryCallback: (
|
|
@@ -165,16 +180,20 @@ export class RunningSummarizer implements IDisposable {
|
|
|
165
180
|
private readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,
|
|
166
181
|
private readonly runtime: ISummarizerRuntime,
|
|
167
182
|
) {
|
|
183
|
+
super();
|
|
184
|
+
|
|
168
185
|
const telemetryProps: ISummarizeRunnerTelemetry = {
|
|
169
186
|
summarizeCount: () => this.summarizeCount,
|
|
170
187
|
summarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,
|
|
171
188
|
};
|
|
172
189
|
|
|
173
|
-
this.mc =
|
|
174
|
-
|
|
190
|
+
this.mc = createChildMonitoringContext({
|
|
191
|
+
logger: baseLogger,
|
|
192
|
+
namespace: "Running",
|
|
193
|
+
properties: {
|
|
175
194
|
all: telemetryProps,
|
|
176
|
-
}
|
|
177
|
-
);
|
|
195
|
+
},
|
|
196
|
+
});
|
|
178
197
|
|
|
179
198
|
if (configuration.state !== "disableHeuristics") {
|
|
180
199
|
assert(
|
|
@@ -235,25 +254,22 @@ export class RunningSummarizer implements IDisposable {
|
|
|
235
254
|
this.mc.logger,
|
|
236
255
|
);
|
|
237
256
|
|
|
238
|
-
// Listen to
|
|
239
|
-
this.
|
|
240
|
-
|
|
241
|
-
this.handleOp(op, false);
|
|
242
|
-
}
|
|
243
|
-
};
|
|
244
|
-
|
|
245
|
-
// Listen to runtime for runtime ops
|
|
246
|
-
this.runtimeListener = (op, runtimeMessage) => {
|
|
247
|
-
if (runtimeMessage) {
|
|
248
|
-
this.handleOp(op, true);
|
|
249
|
-
}
|
|
257
|
+
// Listen to runtime for ops
|
|
258
|
+
this.runtimeListener = (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => {
|
|
259
|
+
this.handleOp(op, runtimeMessage === true);
|
|
250
260
|
};
|
|
251
|
-
|
|
252
|
-
// Purpose of listening to deltaManager is for back-compat
|
|
253
|
-
// 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)
|
|
254
|
-
// Tracked by AB#3883
|
|
255
|
-
this.runtime.deltaManager.on("op", this.deltaManagerListener);
|
|
256
261
|
this.runtime.on("op", this.runtimeListener);
|
|
262
|
+
|
|
263
|
+
// The max attempts for submit failures can be overridden via a feature flag. This allows us to
|
|
264
|
+
// tweak this as per telemetry data until we arrive at a stable number.
|
|
265
|
+
// If its set to a number higher than `defaultMaxAttemptsForSubmitFailures`, it will be ignored.
|
|
266
|
+
const overrideMaxAttempts = this.mc.config.getNumber(
|
|
267
|
+
"Fluid.Summarizer.AttemptsForSubmitFailures",
|
|
268
|
+
);
|
|
269
|
+
this.maxAttemptsForSubmitFailures =
|
|
270
|
+
overrideMaxAttempts && overrideMaxAttempts < defaultMaxAttemptsForSubmitFailures
|
|
271
|
+
? overrideMaxAttempts
|
|
272
|
+
: defaultMaxAttemptsForSubmitFailures;
|
|
257
273
|
}
|
|
258
274
|
|
|
259
275
|
private async handleSummaryAck(): Promise<number> {
|
|
@@ -295,7 +311,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
295
311
|
// by calling `refreshLatestSummaryAckFromServer` and we will be fine.
|
|
296
312
|
const isIgnoredError =
|
|
297
313
|
isFluidError(error) &&
|
|
298
|
-
error.errorType ===
|
|
314
|
+
error.errorType === DriverErrorTypes.fileNotFoundOrAccessDeniedError;
|
|
299
315
|
|
|
300
316
|
summaryLogger.sendTelemetryEvent(
|
|
301
317
|
{
|
|
@@ -347,7 +363,6 @@ export class RunningSummarizer implements IDisposable {
|
|
|
347
363
|
}
|
|
348
364
|
|
|
349
365
|
public dispose(): void {
|
|
350
|
-
this.runtime.deltaManager.off("op", this.deltaManagerListener);
|
|
351
366
|
this.runtime.off("op", this.runtimeListener);
|
|
352
367
|
this.summaryWatcher.dispose();
|
|
353
368
|
this.heuristicRunner?.dispose();
|
|
@@ -444,7 +459,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
444
459
|
if (this.summarizingLock === undefined) {
|
|
445
460
|
this.trySummarizeOnce(
|
|
446
461
|
// summarizeProps
|
|
447
|
-
{
|
|
462
|
+
{ summarizeReason: "lastSummary" },
|
|
448
463
|
// ISummarizeOptions, using defaults: { refreshLatestAck: false, fullTree: false }
|
|
449
464
|
{},
|
|
450
465
|
);
|
|
@@ -504,7 +519,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
504
519
|
* @param before - set of instructions to run before running the action.
|
|
505
520
|
* @param action - action to perform.
|
|
506
521
|
* @param after - set of instructions to run after running the action.
|
|
507
|
-
* @returns
|
|
522
|
+
* @returns The result of the action.
|
|
508
523
|
*/
|
|
509
524
|
private async lockedSummaryAction<T>(
|
|
510
525
|
before: () => void,
|
|
@@ -539,7 +554,6 @@ export class RunningSummarizer implements IDisposable {
|
|
|
539
554
|
private trySummarizeOnce(
|
|
540
555
|
summarizeProps: ISummarizeTelemetryProperties,
|
|
541
556
|
options: ISummarizeOptions,
|
|
542
|
-
cancellationToken = this.cancellationToken,
|
|
543
557
|
resultsBuilder = new SummarizeResultBuilder(),
|
|
544
558
|
): ISummarizeResults {
|
|
545
559
|
this.lockedSummaryAction(
|
|
@@ -547,12 +561,16 @@ export class RunningSummarizer implements IDisposable {
|
|
|
547
561
|
this.beforeSummaryAction();
|
|
548
562
|
},
|
|
549
563
|
async () => {
|
|
550
|
-
const
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
564
|
+
const summaryLogger = createChildLogger({
|
|
565
|
+
logger: this.mc.logger,
|
|
566
|
+
properties: { all: summarizeProps },
|
|
567
|
+
});
|
|
568
|
+
const summaryOptions: ISubmitSummaryOptions = {
|
|
569
|
+
...options,
|
|
570
|
+
summaryLogger,
|
|
571
|
+
cancellationToken: this.cancellationToken,
|
|
572
|
+
};
|
|
573
|
+
const summarizeResult = this.generator.summarize(summaryOptions, resultsBuilder);
|
|
556
574
|
// ensure we wait till the end of the process
|
|
557
575
|
return summarizeResult.receivedSummaryAckOrNack;
|
|
558
576
|
},
|
|
@@ -570,10 +588,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
570
588
|
}
|
|
571
589
|
|
|
572
590
|
/** Heuristics summarize attempt. */
|
|
573
|
-
private trySummarize(
|
|
574
|
-
reason: SummarizeReason,
|
|
575
|
-
cancellationToken = this.cancellationToken,
|
|
576
|
-
): void {
|
|
591
|
+
private trySummarize(reason: SummarizeReason): void {
|
|
577
592
|
if (this.summarizingLock !== undefined) {
|
|
578
593
|
// lockedSummaryAction() will retry heuristic-based summary at the end of current attempt
|
|
579
594
|
// if it's still needed
|
|
@@ -586,101 +601,9 @@ export class RunningSummarizer implements IDisposable {
|
|
|
586
601
|
this.beforeSummaryAction();
|
|
587
602
|
},
|
|
588
603
|
async () => {
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
{ refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },
|
|
593
|
-
{ refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },
|
|
594
|
-
];
|
|
595
|
-
let overrideDelaySeconds: number | undefined;
|
|
596
|
-
let summaryAttempts = 0;
|
|
597
|
-
let summaryAttemptsPerPhase = 0;
|
|
598
|
-
// Reducing the default number of attempts to defaultNumberofSummarizationAttempts.
|
|
599
|
-
let totalAttempts =
|
|
600
|
-
this.mc.config.getNumber("Fluid.Summarizer.Attempts") ??
|
|
601
|
-
defaultNumberSummarizationAttempts;
|
|
602
|
-
|
|
603
|
-
if (totalAttempts > attempts.length) {
|
|
604
|
-
this.mc.logger.sendTelemetryEvent({
|
|
605
|
-
eventName: "InvalidSummarizerAttempts",
|
|
606
|
-
attempts: totalAttempts,
|
|
607
|
-
});
|
|
608
|
-
totalAttempts = defaultNumberSummarizationAttempts;
|
|
609
|
-
} else if (totalAttempts < 1) {
|
|
610
|
-
throw new UsageError("Invalid number of attempts.");
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
let lastResult: { message: string; error: any } | undefined;
|
|
614
|
-
|
|
615
|
-
for (let summaryAttemptPhase = 0; summaryAttemptPhase < totalAttempts; ) {
|
|
616
|
-
if (this.cancellationToken.cancelled) {
|
|
617
|
-
return;
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
// We only want to attempt 1 summary when reason is "lastSummary"
|
|
621
|
-
if (++summaryAttempts > 1 && reason === "lastSummary") {
|
|
622
|
-
return;
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
summaryAttemptsPerPhase++;
|
|
626
|
-
|
|
627
|
-
const { delaySeconds: regularDelaySeconds = 0, ...options } =
|
|
628
|
-
attempts[summaryAttemptPhase];
|
|
629
|
-
|
|
630
|
-
const summarizeProps: ISummarizeTelemetryProperties = {
|
|
631
|
-
reason,
|
|
632
|
-
summaryAttempts,
|
|
633
|
-
summaryAttemptsPerPhase,
|
|
634
|
-
summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
|
|
635
|
-
...options,
|
|
636
|
-
};
|
|
637
|
-
|
|
638
|
-
// Note: no need to account for cancellationToken.waitCancelled here, as
|
|
639
|
-
// this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
|
|
640
|
-
const resultSummarize = this.generator.summarize(
|
|
641
|
-
summarizeProps,
|
|
642
|
-
options,
|
|
643
|
-
cancellationToken,
|
|
644
|
-
);
|
|
645
|
-
const result = await resultSummarize.receivedSummaryAckOrNack;
|
|
646
|
-
|
|
647
|
-
if (result.success) {
|
|
648
|
-
return;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
// Check for retryDelay that can come from summaryNack or upload summary flow.
|
|
652
|
-
// Retry the same step only once per retryAfter response.
|
|
653
|
-
overrideDelaySeconds = result.retryAfterSeconds;
|
|
654
|
-
if (overrideDelaySeconds === undefined || summaryAttemptsPerPhase > 1) {
|
|
655
|
-
summaryAttemptPhase++;
|
|
656
|
-
summaryAttemptsPerPhase = 0;
|
|
657
|
-
}
|
|
658
|
-
lastResult = result;
|
|
659
|
-
|
|
660
|
-
const delaySeconds = overrideDelaySeconds ?? regularDelaySeconds;
|
|
661
|
-
|
|
662
|
-
if (delaySeconds > 0) {
|
|
663
|
-
this.mc.logger.sendPerformanceEvent({
|
|
664
|
-
eventName: "SummarizeAttemptDelay",
|
|
665
|
-
duration: delaySeconds,
|
|
666
|
-
summaryNackDelay: overrideDelaySeconds !== undefined,
|
|
667
|
-
...summarizeProps,
|
|
668
|
-
});
|
|
669
|
-
await delay(delaySeconds * 1000);
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
// If all attempts failed, log error (with last attempt info) and close the summarizer container
|
|
674
|
-
this.mc.logger.sendErrorEvent(
|
|
675
|
-
{
|
|
676
|
-
eventName: "FailToSummarize",
|
|
677
|
-
reason,
|
|
678
|
-
message: lastResult?.message,
|
|
679
|
-
},
|
|
680
|
-
lastResult?.error,
|
|
681
|
-
);
|
|
682
|
-
|
|
683
|
-
this.stopSummarizerCallback("failToSummarize");
|
|
604
|
+
return this.mc.config.getBoolean("Fluid.Summarizer.UseDynamicRetries")
|
|
605
|
+
? this.trySummarizeWithRetries(reason)
|
|
606
|
+
: this.trySummarizeWithStaticAttempts(reason);
|
|
684
607
|
},
|
|
685
608
|
() => {
|
|
686
609
|
this.afterSummaryAction();
|
|
@@ -690,10 +613,220 @@ export class RunningSummarizer implements IDisposable {
|
|
|
690
613
|
});
|
|
691
614
|
}
|
|
692
615
|
|
|
616
|
+
/**
|
|
617
|
+
* Tries to summarize 2 times with pre-defined summary options. If an attempt fails with "retryAfterSeconds"
|
|
618
|
+
* param, that attempt is tried once more.
|
|
619
|
+
*/
|
|
620
|
+
private async trySummarizeWithStaticAttempts(reason: SummarizeReason) {
|
|
621
|
+
const attemptOptions: ISummarizeOptions[] = [
|
|
622
|
+
{ refreshLatestAck: false, fullTree: false },
|
|
623
|
+
{ refreshLatestAck: true, fullTree: false },
|
|
624
|
+
];
|
|
625
|
+
let summaryAttempts = 0;
|
|
626
|
+
let summaryAttemptsPerPhase = 0;
|
|
627
|
+
let summaryAttemptPhase = 0;
|
|
628
|
+
while (summaryAttemptPhase < attemptOptions.length) {
|
|
629
|
+
if (this.cancellationToken.cancelled) {
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// We only want to attempt 1 summary when reason is "lastSummary"
|
|
634
|
+
if (++summaryAttempts > 1 && reason === "lastSummary") {
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
summaryAttemptsPerPhase++;
|
|
639
|
+
|
|
640
|
+
const summarizeOptions = attemptOptions[summaryAttemptPhase];
|
|
641
|
+
const summarizeProps: ISummarizeTelemetryProperties = {
|
|
642
|
+
summarizeReason: reason,
|
|
643
|
+
summaryAttempts,
|
|
644
|
+
summaryAttemptsPerPhase,
|
|
645
|
+
summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
|
|
646
|
+
...summarizeOptions,
|
|
647
|
+
};
|
|
648
|
+
const summaryLogger = createChildLogger({
|
|
649
|
+
logger: this.mc.logger,
|
|
650
|
+
properties: { all: summarizeProps },
|
|
651
|
+
});
|
|
652
|
+
const summaryOptions: ISubmitSummaryOptions = {
|
|
653
|
+
...summarizeOptions,
|
|
654
|
+
summaryLogger,
|
|
655
|
+
cancellationToken: this.cancellationToken,
|
|
656
|
+
};
|
|
657
|
+
|
|
658
|
+
// Note: no need to account for cancellationToken.waitCancelled here, as
|
|
659
|
+
// this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
|
|
660
|
+
const resultSummarize = this.generator.summarize(summaryOptions);
|
|
661
|
+
const ackNackResult = await resultSummarize.receivedSummaryAckOrNack;
|
|
662
|
+
if (ackNackResult.success) {
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
// Check for retryDelay that can come from summaryNack, upload summary or submit summary flows.
|
|
667
|
+
// Retry the same step only once per retryAfter response.
|
|
668
|
+
const submitResult = await resultSummarize.summarySubmitted;
|
|
669
|
+
const delaySeconds = !submitResult.success
|
|
670
|
+
? submitResult.data?.retryAfterSeconds
|
|
671
|
+
: ackNackResult.data?.retryAfterSeconds;
|
|
672
|
+
if (delaySeconds === undefined || summaryAttemptsPerPhase > 1) {
|
|
673
|
+
summaryAttemptPhase++;
|
|
674
|
+
summaryAttemptsPerPhase = 0;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
if (delaySeconds !== undefined) {
|
|
678
|
+
this.mc.logger.sendPerformanceEvent({
|
|
679
|
+
eventName: "SummarizeAttemptDelay",
|
|
680
|
+
duration: delaySeconds,
|
|
681
|
+
summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
|
|
682
|
+
...summarizeProps,
|
|
683
|
+
});
|
|
684
|
+
await delay(delaySeconds * 1000);
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
this.stopSummarizerCallback("failToSummarize");
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
/**
|
|
691
|
+
* Tries to summarize with retries where retry is based on the failure params.
|
|
692
|
+
* For example, summarization may be retried for failures with "retryAfterSeconds" param.
|
|
693
|
+
*/
|
|
694
|
+
private async trySummarizeWithRetries(reason: SummarizeReason) {
|
|
695
|
+
// Helper to set summarize options, telemetry properties and call summarize.
|
|
696
|
+
const attemptSummarize = (attemptNumber: number, finalAttempt: boolean) => {
|
|
697
|
+
const summarizeOptions: ISummarizeOptions = {
|
|
698
|
+
fullTree: false,
|
|
699
|
+
};
|
|
700
|
+
const summarizeProps: ISummarizeTelemetryProperties = {
|
|
701
|
+
summarizeReason: reason,
|
|
702
|
+
summaryAttempts: attemptNumber,
|
|
703
|
+
...summarizeOptions,
|
|
704
|
+
finalAttempt,
|
|
705
|
+
};
|
|
706
|
+
const summaryLogger = createChildLogger({
|
|
707
|
+
logger: this.mc.logger,
|
|
708
|
+
properties: { all: summarizeProps },
|
|
709
|
+
});
|
|
710
|
+
const summaryOptions: ISubmitSummaryOptions = {
|
|
711
|
+
...summarizeOptions,
|
|
712
|
+
summaryLogger,
|
|
713
|
+
cancellationToken: this.cancellationToken,
|
|
714
|
+
finalAttempt,
|
|
715
|
+
};
|
|
716
|
+
const summarizeResult = this.generator.summarize(summaryOptions);
|
|
717
|
+
return { summarizeProps, summarizeResult };
|
|
718
|
+
};
|
|
719
|
+
|
|
720
|
+
// The max number of attempts are based on the stage at which summarization failed. If it fails before it is
|
|
721
|
+
// submitted, a different value is used compared to if it fails after submission. Usually, in the former case,
|
|
722
|
+
// we would retry more often as its cheaper and retries are likely to succeed.
|
|
723
|
+
// This makes it harder to predict how many attempts would actually happen as that depends on how far an attempt
|
|
724
|
+
// made. To keep things simple, the max attempts is reset after every attempt based on where it failed. This may
|
|
725
|
+
// result in some failures not being retried depending on what happened before this attempt. That's fine because
|
|
726
|
+
// such scenarios are very unlikely and even if it happens, it would resolve when a new summarizer starts over.
|
|
727
|
+
// For example - When failure switches from one the submit failures to nack failure, only one more retry will
|
|
728
|
+
// happen irrespective of the value of `defaultMaxAttempts`.
|
|
729
|
+
let maxAttempts = defaultMaxAttempts;
|
|
730
|
+
let currentAttempt = 0;
|
|
731
|
+
let retryAfterSeconds: number | undefined;
|
|
732
|
+
let done = false;
|
|
733
|
+
let result: "success" | "failure" | "canceled" = "success";
|
|
734
|
+
do {
|
|
735
|
+
currentAttempt++;
|
|
736
|
+
if (this.cancellationToken.cancelled) {
|
|
737
|
+
result = "canceled";
|
|
738
|
+
done = true;
|
|
739
|
+
break;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
const { summarizeProps, summarizeResult } = attemptSummarize(
|
|
743
|
+
currentAttempt,
|
|
744
|
+
false /* finalAttempt */,
|
|
745
|
+
);
|
|
746
|
+
|
|
747
|
+
// Ack / nack is the final step, so if it succeeds we're done.
|
|
748
|
+
const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
|
|
749
|
+
if (ackNackResult.success) {
|
|
750
|
+
result = "success";
|
|
751
|
+
done = true;
|
|
752
|
+
break;
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
// Update max attempts and retry params from the failure result.
|
|
756
|
+
// If submit summary failed, use the params from "summarySubmitted" result. Else, use the params
|
|
757
|
+
// from "receivedSummaryAckOrNack" result.
|
|
758
|
+
// Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
|
|
759
|
+
const submitSummaryResult = await summarizeResult.summarySubmitted;
|
|
760
|
+
if (!submitSummaryResult.success) {
|
|
761
|
+
maxAttempts = this.maxAttemptsForSubmitFailures;
|
|
762
|
+
retryAfterSeconds = submitSummaryResult.data?.retryAfterSeconds;
|
|
763
|
+
} else {
|
|
764
|
+
maxAttempts = defaultMaxAttempts;
|
|
765
|
+
retryAfterSeconds = ackNackResult.data?.retryAfterSeconds;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// Emit "summarize" event for this failed attempt.
|
|
769
|
+
result = "failure";
|
|
770
|
+
const eventProps: ISummarizeEventProps = {
|
|
771
|
+
result,
|
|
772
|
+
currentAttempt,
|
|
773
|
+
maxAttempts,
|
|
774
|
+
error: ackNackResult.error,
|
|
775
|
+
};
|
|
776
|
+
this.emit("summarize", eventProps);
|
|
777
|
+
|
|
778
|
+
// If the failure doesn't have "retryAfterSeconds" or the max number of attempts have been done, we're done.
|
|
779
|
+
if (retryAfterSeconds === undefined || currentAttempt >= maxAttempts - 1) {
|
|
780
|
+
done = true;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
// If the failure has "retryAfterSeconds", add a delay of that time. In this case, a final attempt will
|
|
784
|
+
// take place and we need to wait for "retryAfterSeconds" before that.
|
|
785
|
+
if (retryAfterSeconds !== undefined) {
|
|
786
|
+
this.mc.logger.sendPerformanceEvent({
|
|
787
|
+
eventName: "SummarizeAttemptDelay",
|
|
788
|
+
duration: retryAfterSeconds,
|
|
789
|
+
summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
|
|
790
|
+
stage: submitSummaryResult.data?.stage,
|
|
791
|
+
dynamicRetries: true, // To differentiate this telemetry from regular retry logic
|
|
792
|
+
...summarizeProps,
|
|
793
|
+
});
|
|
794
|
+
await delay(retryAfterSeconds * 1000);
|
|
795
|
+
}
|
|
796
|
+
} while (!done);
|
|
797
|
+
|
|
798
|
+
// If summarize attempt did not fail, emit "summarize" event and return. A failed attempt may be retried below.
|
|
799
|
+
if (result !== "failure") {
|
|
800
|
+
this.emit("summarize", { result, currentAttempt, maxAttempts });
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
// If summarization wasn't successful above and the failure contains "retryAfterSeconds", perform one last
|
|
805
|
+
// attempt. This gives a chance to the runtime to perform additional steps in the last attempt.
|
|
806
|
+
if (retryAfterSeconds !== undefined) {
|
|
807
|
+
const { summarizeResult } = attemptSummarize(++currentAttempt, true /* finalAttempt */);
|
|
808
|
+
// Ack / nack is the final step, so if it succeeds we're done.
|
|
809
|
+
const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
|
|
810
|
+
result = ackNackResult.success ? "success" : "failure";
|
|
811
|
+
const eventProps: ISummarizeEventProps = {
|
|
812
|
+
result,
|
|
813
|
+
currentAttempt,
|
|
814
|
+
maxAttempts,
|
|
815
|
+
error: ackNackResult.success ? undefined : ackNackResult.error,
|
|
816
|
+
};
|
|
817
|
+
this.emit("summarize", eventProps);
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
// If summarization is still unsuccessful, stop the summarizer.
|
|
821
|
+
if (result === "failure") {
|
|
822
|
+
this.stopSummarizerCallback("failToSummarize");
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
|
|
693
826
|
/** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
|
|
694
827
|
public summarizeOnDemand(
|
|
828
|
+
options: IOnDemandSummarizeOptions,
|
|
695
829
|
resultsBuilder: SummarizeResultBuilder = new SummarizeResultBuilder(),
|
|
696
|
-
{ reason, ...options }: IOnDemandSummarizeOptions,
|
|
697
830
|
): ISummarizeResults {
|
|
698
831
|
if (this.stopping) {
|
|
699
832
|
resultsBuilder.fail("RunningSummarizer stopped or disposed", undefined);
|
|
@@ -706,23 +839,18 @@ export class RunningSummarizer implements IDisposable {
|
|
|
706
839
|
throw new UsageError("Attempted to run an already-running summarizer on demand");
|
|
707
840
|
}
|
|
708
841
|
|
|
842
|
+
const { reason, ...summarizeOptions } = options;
|
|
709
843
|
const result = this.trySummarizeOnce(
|
|
710
|
-
{
|
|
711
|
-
|
|
712
|
-
this.cancellationToken,
|
|
844
|
+
{ summarizeReason: `onDemand/${reason}` },
|
|
845
|
+
summarizeOptions,
|
|
713
846
|
resultsBuilder,
|
|
714
847
|
);
|
|
715
848
|
return result;
|
|
716
849
|
}
|
|
717
850
|
|
|
718
851
|
/** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
|
|
719
|
-
public enqueueSummarize({
|
|
720
|
-
reason,
|
|
721
|
-
afterSequenceNumber = 0,
|
|
722
|
-
override = false,
|
|
723
|
-
...options
|
|
724
|
-
}: IEnqueueSummarizeOptions): EnqueueSummarizeResult {
|
|
725
|
-
const onDemandReason = `enqueue;${reason}` as const;
|
|
852
|
+
public enqueueSummarize(options: IEnqueueSummarizeOptions): EnqueueSummarizeResult {
|
|
853
|
+
const { reason, afterSequenceNumber = 0, override = false, ...summarizeOptions } = options;
|
|
726
854
|
let overridden = false;
|
|
727
855
|
if (this.enqueuedSummary !== undefined) {
|
|
728
856
|
if (!override) {
|
|
@@ -736,10 +864,11 @@ export class RunningSummarizer implements IDisposable {
|
|
|
736
864
|
this.enqueuedSummary = undefined;
|
|
737
865
|
overridden = true;
|
|
738
866
|
}
|
|
867
|
+
|
|
739
868
|
this.enqueuedSummary = {
|
|
740
|
-
reason:
|
|
869
|
+
reason: `enqueue;${reason}`,
|
|
741
870
|
afterSequenceNumber,
|
|
742
|
-
|
|
871
|
+
summarizeOptions,
|
|
743
872
|
resultsBuilder: new SummarizeResultBuilder(),
|
|
744
873
|
};
|
|
745
874
|
const results = this.enqueuedSummary.resultsBuilder.build();
|
|
@@ -766,13 +895,12 @@ export class RunningSummarizer implements IDisposable {
|
|
|
766
895
|
// If no enqueued summary is ready or a summary is already in progress, take no action.
|
|
767
896
|
return false;
|
|
768
897
|
}
|
|
769
|
-
const { reason, resultsBuilder,
|
|
898
|
+
const { reason, resultsBuilder, summarizeOptions } = this.enqueuedSummary;
|
|
770
899
|
// Set to undefined first, so that subsequent enqueue attempt while summarize will occur later.
|
|
771
900
|
this.enqueuedSummary = undefined;
|
|
772
901
|
this.trySummarizeOnce(
|
|
773
|
-
{
|
|
774
|
-
|
|
775
|
-
this.cancellationToken,
|
|
902
|
+
{ summarizeReason: `enqueuedSummary/${reason}` },
|
|
903
|
+
summarizeOptions,
|
|
776
904
|
resultsBuilder,
|
|
777
905
|
);
|
|
778
906
|
return true;
|