@fluidframework/container-runtime 2.0.0-dev-rc.5.0.0.263932 → 2.0.0-dev-rc.5.0.0.267932
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/api-report/container-runtime.api.md +43 -53
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +4 -4
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +1 -1
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +3 -3
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +3 -3
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +2 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +14 -14
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerHandleContext.d.ts +2 -1
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +12 -19
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +74 -120
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +7 -8
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +3 -3
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaManagerProxies.d.ts +4 -3
- package/dist/deltaManagerProxies.d.ts.map +1 -1
- package/dist/deltaManagerProxies.js.map +1 -1
- package/dist/deltaScheduler.d.ts +2 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +1 -3
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +18 -21
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +11 -30
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +3 -30
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +1 -3
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +2 -3
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/dist/gc/gcSummaryDefinitions.d.ts +1 -1
- package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -1
- package/dist/gc/gcSummaryDefinitions.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +2 -35
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +9 -62
- 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 +2 -2
- package/dist/gc/gcTelemetry.js.map +1 -1
- 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/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +1 -1
- package/dist/messageTypes.d.ts +1 -1
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -2
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +11 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +13 -2
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +10 -3
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +7 -0
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +4 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +12 -7
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +10 -0
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +12 -17
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +2 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.d.ts +1 -1
- package/dist/opProperties.d.ts.map +1 -1
- 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.js.map +1 -1
- package/dist/scheduleManager.d.ts +2 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js.map +1 -1
- package/dist/storageServiceWithAttachBlobs.js.map +1 -1
- package/dist/summary/documentSchema.js +1 -1
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/index.d.ts +1 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +4 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +35 -13
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +1 -6
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +22 -108
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +1 -1
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +4 -1
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +1 -1
- 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.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -3
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +16 -16
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- 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 +2 -3
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +17 -29
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -1
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +11 -11
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +3 -3
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +2 -2
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +7 -8
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +26 -22
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/throttler.js.map +1 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +4 -4
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +1 -1
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +3 -3
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +3 -3
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +2 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +2 -2
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerHandleContext.d.ts +2 -1
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +12 -19
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +68 -114
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +7 -8
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +3 -3
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaManagerProxies.d.ts +4 -3
- package/lib/deltaManagerProxies.d.ts.map +1 -1
- package/lib/deltaManagerProxies.js.map +1 -1
- package/lib/deltaScheduler.d.ts +2 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +1 -3
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +18 -21
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +12 -31
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +3 -30
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +0 -2
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +2 -3
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -1
- package/lib/gc/gcSummaryDefinitions.d.ts +1 -1
- package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -1
- package/lib/gc/gcSummaryDefinitions.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +2 -35
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +4 -57
- 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 +2 -2
- package/lib/gc/gcTelemetry.js.map +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/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +1 -1
- package/lib/messageTypes.d.ts +1 -1
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +2 -2
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +11 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +13 -2
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +10 -3
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +7 -0
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +4 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +12 -7
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +10 -0
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +12 -17
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.d.ts +1 -1
- package/lib/opProperties.d.ts.map +1 -1
- 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.js.map +1 -1
- package/lib/scheduleManager.d.ts +2 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js.map +1 -1
- package/lib/storageServiceWithAttachBlobs.js.map +1 -1
- package/lib/summary/documentSchema.js +1 -1
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/index.d.ts +1 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +4 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +35 -13
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +1 -6
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +21 -107
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +1 -1
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +4 -1
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +1 -1
- 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.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -3
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +14 -14
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
- 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 +2 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +17 -29
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +3 -3
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +3 -3
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +2 -2
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +7 -8
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +25 -21
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/throttler.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +72 -24
- package/src/batchTracker.ts +1 -1
- package/src/blobManager.ts +7 -7
- package/src/channelCollection.ts +8 -9
- package/src/connectionTelemetry.ts +14 -6
- package/src/containerHandleContext.ts +2 -1
- package/src/containerRuntime.ts +88 -141
- package/src/dataStore.ts +2 -1
- package/src/dataStoreContext.ts +16 -17
- package/src/deltaManagerProxies.ts +7 -5
- package/src/deltaScheduler.ts +2 -1
- package/src/gc/garbageCollection.md +0 -8
- package/src/gc/garbageCollection.ts +20 -25
- package/src/gc/gcConfigs.ts +8 -34
- package/src/gc/gcDefinitions.ts +4 -31
- package/src/gc/gcHelpers.ts +2 -2
- package/src/gc/gcSummaryDefinitions.ts +1 -1
- package/src/gc/gcSummaryStateTracker.ts +7 -73
- package/src/gc/gcTelemetry.ts +2 -2
- package/src/gc/index.ts +0 -1
- package/src/index.ts +1 -1
- package/src/messageTypes.ts +1 -1
- package/src/opLifecycle/README.md +120 -160
- package/src/opLifecycle/definitions.ts +2 -2
- package/src/opLifecycle/opCompressor.ts +13 -2
- package/src/opLifecycle/opDecompressor.ts +1 -1
- package/src/opLifecycle/opGroupingManager.ts +11 -4
- package/src/opLifecycle/opSplitter.ts +13 -8
- package/src/opLifecycle/outbox.ts +12 -27
- package/src/opLifecycle/remoteMessageProcessor.ts +2 -1
- package/src/opProperties.ts +2 -4
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +1 -1
- package/src/scheduleManager.ts +2 -1
- package/src/summary/index.ts +1 -1
- package/src/summary/orderedClientElection.ts +83 -12
- package/src/summary/runningSummarizer.ts +31 -115
- package/src/summary/summarizer.ts +5 -2
- package/src/summary/summarizerClientElection.ts +2 -1
- package/src/summary/summarizerNode/summarizerNode.ts +19 -31
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +2 -1
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -8
- package/src/summary/summarizerTypes.ts +22 -33
- package/src/summary/summaryCollection.ts +2 -2
- package/src/summary/summaryFormat.ts +9 -7
- package/src/summary/summaryGenerator.ts +51 -29
package/src/summary/index.ts
CHANGED
|
@@ -9,7 +9,7 @@ import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
|
9
9
|
import { IDeltaManager } from "@fluidframework/container-definitions/internal";
|
|
10
10
|
import { IEvent, IEventProvider, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
11
11
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
12
|
-
import { IClient, IQuorumClients, ISequencedClient } from "@fluidframework/
|
|
12
|
+
import { IClient, IQuorumClients, ISequencedClient } from "@fluidframework/driver-definitions";
|
|
13
13
|
import {
|
|
14
14
|
ITelemetryLoggerExt,
|
|
15
15
|
UsageError,
|
|
@@ -351,6 +351,7 @@ export class OrderedClientElection
|
|
|
351
351
|
/** Serialized state from summary or current sequence number at time of load if new. */
|
|
352
352
|
initialState: ISerializedElection | number,
|
|
353
353
|
private readonly isEligibleFn: (c: ITrackedClient) => boolean,
|
|
354
|
+
private readonly recordPerformanceEvents: boolean = false,
|
|
354
355
|
) {
|
|
355
356
|
super();
|
|
356
357
|
let initialClient: ILinkedClient | undefined;
|
|
@@ -410,17 +411,42 @@ export class OrderedClientElection
|
|
|
410
411
|
* Note that this function does no eligibility or suitability checks. If we get here, then
|
|
411
412
|
* we will set _electedClient, and we will set _electedParent if this is an interactive client.
|
|
412
413
|
*/
|
|
413
|
-
private tryElectingClient(
|
|
414
|
+
private tryElectingClient(
|
|
415
|
+
client: ILinkedClient | undefined,
|
|
416
|
+
sequenceNumber: number,
|
|
417
|
+
reason: string,
|
|
418
|
+
): void {
|
|
419
|
+
this.sendPerformanceEvent(
|
|
420
|
+
"TryElectingClient",
|
|
421
|
+
client,
|
|
422
|
+
sequenceNumber,
|
|
423
|
+
false /* forceSend */,
|
|
424
|
+
reason,
|
|
425
|
+
);
|
|
414
426
|
let change = false;
|
|
415
427
|
const isSummarizerClient = client?.client.details.type === summarizerClientType;
|
|
416
428
|
const prevClient = this._electedClient;
|
|
417
429
|
if (this._electedClient !== client) {
|
|
430
|
+
this.sendPerformanceEvent(
|
|
431
|
+
"ClientElected",
|
|
432
|
+
client,
|
|
433
|
+
sequenceNumber,
|
|
434
|
+
true /* forceSend */,
|
|
435
|
+
reason,
|
|
436
|
+
);
|
|
418
437
|
// Changing the elected client. Record the sequence number and note that we have to fire an event.
|
|
419
438
|
this._electionSequenceNumber = sequenceNumber;
|
|
420
439
|
this._electedClient = client;
|
|
421
440
|
change = true;
|
|
422
441
|
}
|
|
423
442
|
if (this._electedParent !== client && !isSummarizerClient) {
|
|
443
|
+
this.sendPerformanceEvent(
|
|
444
|
+
"InteractiveClientElected",
|
|
445
|
+
client,
|
|
446
|
+
sequenceNumber,
|
|
447
|
+
true /* forceSend */,
|
|
448
|
+
reason,
|
|
449
|
+
);
|
|
424
450
|
// Changing the elected parent as well.
|
|
425
451
|
this._electedParent = client;
|
|
426
452
|
change = true;
|
|
@@ -430,8 +456,26 @@ export class OrderedClientElection
|
|
|
430
456
|
}
|
|
431
457
|
}
|
|
432
458
|
|
|
433
|
-
private tryElectingParent(
|
|
459
|
+
private tryElectingParent(
|
|
460
|
+
client: ILinkedClient | undefined,
|
|
461
|
+
sequenceNumber: number,
|
|
462
|
+
reason: string,
|
|
463
|
+
): void {
|
|
464
|
+
this.sendPerformanceEvent(
|
|
465
|
+
"TryElectingParent",
|
|
466
|
+
client,
|
|
467
|
+
sequenceNumber,
|
|
468
|
+
false /* forceSend */,
|
|
469
|
+
reason,
|
|
470
|
+
);
|
|
434
471
|
if (this._electedParent !== client) {
|
|
472
|
+
this.sendPerformanceEvent(
|
|
473
|
+
"ParentElected",
|
|
474
|
+
client,
|
|
475
|
+
sequenceNumber,
|
|
476
|
+
true /* forceSend */,
|
|
477
|
+
reason,
|
|
478
|
+
);
|
|
435
479
|
this._electedParent = client;
|
|
436
480
|
this.emit("election", this._electedClient, sequenceNumber, this._electedClient);
|
|
437
481
|
}
|
|
@@ -462,6 +506,7 @@ export class OrderedClientElection
|
|
|
462
506
|
* @param sequenceNumber - sequence number when client was added
|
|
463
507
|
*/
|
|
464
508
|
private addClient(client: ILinkedClient, sequenceNumber: number): void {
|
|
509
|
+
this.sendPerformanceEvent("AddClient", client, sequenceNumber);
|
|
465
510
|
if (this.isEligibleFn(client)) {
|
|
466
511
|
this._eligibleCount++;
|
|
467
512
|
const newClientIsSummarizer = client.client.details.type === summarizerClientType;
|
|
@@ -472,10 +517,10 @@ export class OrderedClientElection
|
|
|
472
517
|
this._electedClient === undefined ||
|
|
473
518
|
(!electedClientIsSummarizer && newClientIsSummarizer)
|
|
474
519
|
) {
|
|
475
|
-
this.tryElectingClient(client, sequenceNumber);
|
|
520
|
+
this.tryElectingClient(client, sequenceNumber, "AddClient");
|
|
476
521
|
} else if (this._electedParent === undefined && !newClientIsSummarizer) {
|
|
477
522
|
// This is an odd case. If the _electedClient is set, the _electedParent should be as well.
|
|
478
|
-
this.tryElectingParent(client, sequenceNumber);
|
|
523
|
+
this.tryElectingParent(client, sequenceNumber, "AddClient");
|
|
479
524
|
}
|
|
480
525
|
}
|
|
481
526
|
}
|
|
@@ -487,6 +532,7 @@ export class OrderedClientElection
|
|
|
487
532
|
* @param sequenceNumber - sequence number when client was removed
|
|
488
533
|
*/
|
|
489
534
|
private removeClient(client: ILinkedClient, sequenceNumber: number): void {
|
|
535
|
+
this.sendPerformanceEvent("RemoveClient", client, sequenceNumber);
|
|
490
536
|
if (this.isEligibleFn(client)) {
|
|
491
537
|
this._eligibleCount--;
|
|
492
538
|
if (this._electedClient === client) {
|
|
@@ -497,14 +543,18 @@ export class OrderedClientElection
|
|
|
497
543
|
if (this._electedClient.client.details.type !== summarizerClientType) {
|
|
498
544
|
throw new UsageError("Elected client should be a summarizer client 1");
|
|
499
545
|
}
|
|
500
|
-
this.tryElectingClient(
|
|
546
|
+
this.tryElectingClient(
|
|
547
|
+
this._electedParent,
|
|
548
|
+
sequenceNumber,
|
|
549
|
+
"RemoveSummarizerClient",
|
|
550
|
+
);
|
|
501
551
|
} else {
|
|
502
552
|
// 2. The _electedClient is an interactive client that has left the quorum.
|
|
503
553
|
// Automatically shift to next oldest client.
|
|
504
554
|
const nextClient =
|
|
505
555
|
this.findFirstEligibleParent(this._electedParent?.youngerClient) ??
|
|
506
556
|
this.findFirstEligibleParent(this.orderedClientCollection.oldestClient);
|
|
507
|
-
this.tryElectingClient(nextClient, sequenceNumber);
|
|
557
|
+
this.tryElectingClient(nextClient, sequenceNumber, "RemoveClient");
|
|
508
558
|
}
|
|
509
559
|
} else if (this._electedParent === client) {
|
|
510
560
|
// Removing the _electedParent (but not _electedClient).
|
|
@@ -516,7 +566,7 @@ export class OrderedClientElection
|
|
|
516
566
|
const nextParent =
|
|
517
567
|
this.findFirstEligibleParent(this._electedParent?.youngerClient) ??
|
|
518
568
|
this.findFirstEligibleParent(this.orderedClientCollection.oldestClient);
|
|
519
|
-
this.tryElectingParent(nextParent, sequenceNumber);
|
|
569
|
+
this.tryElectingParent(nextParent, sequenceNumber, "RemoveClient");
|
|
520
570
|
}
|
|
521
571
|
}
|
|
522
572
|
}
|
|
@@ -534,11 +584,11 @@ export class OrderedClientElection
|
|
|
534
584
|
this.findFirstEligibleParent(this._electedParent?.youngerClient) ??
|
|
535
585
|
this.findFirstEligibleParent(this.orderedClientCollection.oldestClient);
|
|
536
586
|
if (this._electedClient === undefined || this._electedClient === this._electedParent) {
|
|
537
|
-
this.tryElectingClient(nextClient, sequenceNumber);
|
|
587
|
+
this.tryElectingClient(nextClient, sequenceNumber, "IncrementElectedClient");
|
|
538
588
|
} else {
|
|
539
589
|
// The _electedClient is a summarizer and should not be replaced until it leaves the quorum.
|
|
540
590
|
// Changing the _electedParent will stop the summarizer.
|
|
541
|
-
this.tryElectingParent(nextClient, sequenceNumber);
|
|
591
|
+
this.tryElectingParent(nextClient, sequenceNumber, "IncrementElectedClient");
|
|
542
592
|
}
|
|
543
593
|
}
|
|
544
594
|
|
|
@@ -549,11 +599,11 @@ export class OrderedClientElection
|
|
|
549
599
|
public resetElectedClient(sequenceNumber: number): void {
|
|
550
600
|
const firstClient = this.findFirstEligibleParent(this.orderedClientCollection.oldestClient);
|
|
551
601
|
if (this._electedClient === undefined || this._electedClient === this._electedParent) {
|
|
552
|
-
this.tryElectingClient(firstClient, sequenceNumber);
|
|
602
|
+
this.tryElectingClient(firstClient, sequenceNumber, "ResetElectedClient");
|
|
553
603
|
} else {
|
|
554
604
|
// The _electedClient is a summarizer and should not be replaced until it leaves the quorum.
|
|
555
605
|
// Changing the _electedParent will stop the summarizer.
|
|
556
|
-
this.tryElectingParent(firstClient, sequenceNumber);
|
|
606
|
+
this.tryElectingParent(firstClient, sequenceNumber, "ResetElectedClient");
|
|
557
607
|
}
|
|
558
608
|
}
|
|
559
609
|
|
|
@@ -571,4 +621,25 @@ export class OrderedClientElection
|
|
|
571
621
|
electedParentId: this.electedParent?.clientId,
|
|
572
622
|
};
|
|
573
623
|
}
|
|
624
|
+
|
|
625
|
+
private sendPerformanceEvent(
|
|
626
|
+
eventName: string,
|
|
627
|
+
client: ILinkedClient | undefined,
|
|
628
|
+
sequenceNumber: number,
|
|
629
|
+
forceSend: boolean = false,
|
|
630
|
+
reason?: string,
|
|
631
|
+
) {
|
|
632
|
+
if (this.recordPerformanceEvents || forceSend) {
|
|
633
|
+
this.logger.sendPerformanceEvent({
|
|
634
|
+
eventName,
|
|
635
|
+
clientId: client?.clientId,
|
|
636
|
+
sequenceNumber,
|
|
637
|
+
electedClientId: this.electedClient?.clientId,
|
|
638
|
+
electedParentId: this.electedParent?.clientId,
|
|
639
|
+
isEligible: client !== undefined ? this.isEligibleFn(client) : false,
|
|
640
|
+
isSummarizerClient: client?.client.details.type === summarizerClientType,
|
|
641
|
+
reason,
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
}
|
|
574
645
|
}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
7
|
import { IDisposable, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
8
8
|
import { assert, Deferred, PromiseTimer, delay } from "@fluidframework/core-utils/internal";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions";
|
|
10
|
+
import { DriverErrorTypes, MessageType } from "@fluidframework/driver-definitions/internal";
|
|
11
11
|
import {
|
|
12
12
|
MonitoringContext,
|
|
13
13
|
UsageError,
|
|
@@ -38,9 +38,11 @@ import {
|
|
|
38
38
|
ISummaryCancellationToken,
|
|
39
39
|
SubmitSummaryResult,
|
|
40
40
|
SummarizerStopReason,
|
|
41
|
+
type IRetriableFailureError,
|
|
41
42
|
} from "./summarizerTypes.js";
|
|
42
43
|
import { IAckedSummary, IClientSummaryWatcher, SummaryCollection } from "./summaryCollection.js";
|
|
43
44
|
import {
|
|
45
|
+
RetriableSummaryError,
|
|
44
46
|
SummarizeReason,
|
|
45
47
|
SummarizeResultBuilder,
|
|
46
48
|
SummaryGenerator,
|
|
@@ -474,7 +476,6 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
474
476
|
this.trySummarizeOnce(
|
|
475
477
|
// summarizeProps
|
|
476
478
|
{ summarizeReason: "lastSummary" },
|
|
477
|
-
// ISummarizeOptions, using defaults: { refreshLatestAck: false, fullTree: false }
|
|
478
479
|
{},
|
|
479
480
|
);
|
|
480
481
|
}
|
|
@@ -627,9 +628,7 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
627
628
|
this.beforeSummaryAction();
|
|
628
629
|
},
|
|
629
630
|
async () => {
|
|
630
|
-
return this.
|
|
631
|
-
? this.trySummarizeWithRetries(reason)
|
|
632
|
-
: this.trySummarizeWithStaticAttempts(reason);
|
|
631
|
+
return this.trySummarizeWithRetries(reason);
|
|
633
632
|
},
|
|
634
633
|
() => {
|
|
635
634
|
this.afterSummaryAction();
|
|
@@ -639,92 +638,6 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
639
638
|
});
|
|
640
639
|
}
|
|
641
640
|
|
|
642
|
-
/**
|
|
643
|
-
* Tries to summarize 2 times with pre-defined summary options. If an attempt fails with "retryAfterSeconds"
|
|
644
|
-
* param, that attempt is tried once more.
|
|
645
|
-
*/
|
|
646
|
-
private async trySummarizeWithStaticAttempts(reason: SummarizeReason) {
|
|
647
|
-
const attemptOptions: ISummarizeOptions[] = [
|
|
648
|
-
{ refreshLatestAck: false, fullTree: false },
|
|
649
|
-
{ refreshLatestAck: true, fullTree: false },
|
|
650
|
-
];
|
|
651
|
-
let summaryAttempts = 0;
|
|
652
|
-
let summaryAttemptsPerPhase = 0;
|
|
653
|
-
let summaryAttemptPhase = 0;
|
|
654
|
-
let error: any;
|
|
655
|
-
while (summaryAttemptPhase < attemptOptions.length) {
|
|
656
|
-
if (this.cancellationToken.cancelled) {
|
|
657
|
-
return;
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
// We only want to attempt 1 summary when reason is "lastSummary"
|
|
661
|
-
if (++summaryAttempts > 1 && reason === "lastSummary") {
|
|
662
|
-
return;
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
summaryAttemptsPerPhase++;
|
|
666
|
-
|
|
667
|
-
const summarizeOptions = attemptOptions[summaryAttemptPhase];
|
|
668
|
-
const summarizeProps: ISummarizeTelemetryProperties = {
|
|
669
|
-
summarizeReason: reason,
|
|
670
|
-
summaryAttempts,
|
|
671
|
-
summaryAttemptsPerPhase,
|
|
672
|
-
summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
|
|
673
|
-
...summarizeOptions,
|
|
674
|
-
};
|
|
675
|
-
const summaryLogger = createChildLogger({
|
|
676
|
-
logger: this.mc.logger,
|
|
677
|
-
properties: { all: summarizeProps },
|
|
678
|
-
});
|
|
679
|
-
const summaryOptions: ISubmitSummaryOptions = {
|
|
680
|
-
...summarizeOptions,
|
|
681
|
-
summaryLogger,
|
|
682
|
-
cancellationToken: this.cancellationToken,
|
|
683
|
-
latestSummaryRefSeqNum: this.heuristicData.lastSuccessfulSummary.refSequenceNumber,
|
|
684
|
-
};
|
|
685
|
-
|
|
686
|
-
// Note: no need to account for cancellationToken.waitCancelled here, as
|
|
687
|
-
// this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
|
|
688
|
-
const resultSummarize = this.generator.summarize(summaryOptions);
|
|
689
|
-
const ackNackResult = await resultSummarize.receivedSummaryAckOrNack;
|
|
690
|
-
if (ackNackResult.success) {
|
|
691
|
-
return;
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
error = ackNackResult.error;
|
|
695
|
-
|
|
696
|
-
// Check for retryDelay that can come from summaryNack, upload summary or submit summary flows.
|
|
697
|
-
// Retry the same step only once per retryAfter response.
|
|
698
|
-
const submitResult = await resultSummarize.summarySubmitted;
|
|
699
|
-
const delaySeconds = !submitResult.success
|
|
700
|
-
? submitResult.data?.retryAfterSeconds
|
|
701
|
-
: ackNackResult.data?.retryAfterSeconds;
|
|
702
|
-
if (delaySeconds === undefined || summaryAttemptsPerPhase > 1) {
|
|
703
|
-
summaryAttemptPhase++;
|
|
704
|
-
summaryAttemptsPerPhase = 0;
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
if (delaySeconds !== undefined) {
|
|
708
|
-
this.mc.logger.sendPerformanceEvent({
|
|
709
|
-
eventName: "SummarizeAttemptDelay",
|
|
710
|
-
duration: delaySeconds,
|
|
711
|
-
summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
|
|
712
|
-
...summarizeProps,
|
|
713
|
-
});
|
|
714
|
-
await delay(delaySeconds * 1000);
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
this.mc.logger.sendErrorEvent(
|
|
718
|
-
{
|
|
719
|
-
eventName: "SummarizeFailed",
|
|
720
|
-
maxAttempts: attemptOptions.length,
|
|
721
|
-
summaryAttempts: summaryAttemptPhase,
|
|
722
|
-
},
|
|
723
|
-
error,
|
|
724
|
-
);
|
|
725
|
-
this.stopSummarizerCallback("failToSummarize");
|
|
726
|
-
}
|
|
727
|
-
|
|
728
641
|
/**
|
|
729
642
|
* Tries to summarize with retries where retry is based on the failure params.
|
|
730
643
|
* For example, summarization may be retried for failures with "retryAfterSeconds" param.
|
|
@@ -773,7 +686,7 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
773
686
|
let done = false;
|
|
774
687
|
let status: "success" | "failure" | "canceled" = "success";
|
|
775
688
|
let results: ISummarizeResults | undefined;
|
|
776
|
-
let error:
|
|
689
|
+
let error: IRetriableFailureError | undefined;
|
|
777
690
|
do {
|
|
778
691
|
currentAttempt++;
|
|
779
692
|
if (this.cancellationToken.cancelled) {
|
|
@@ -793,22 +706,18 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
793
706
|
break;
|
|
794
707
|
}
|
|
795
708
|
|
|
796
|
-
// Update max attempts
|
|
797
|
-
// If submit summary failed, use
|
|
798
|
-
// from "receivedSummaryAckOrNack" result.
|
|
709
|
+
// Update max attempts from the failure result.
|
|
710
|
+
// If submit summary failed, use maxAttemptsForSubmitFailures. Else use the defaultMaxAttempts.
|
|
799
711
|
// Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
|
|
800
712
|
const submitSummaryResult = await results.summarySubmitted;
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
} else {
|
|
805
|
-
maxAttempts = defaultMaxAttempts;
|
|
806
|
-
retryAfterSeconds = ackNackResult.data?.retryAfterSeconds;
|
|
807
|
-
}
|
|
713
|
+
maxAttempts = !submitSummaryResult.success
|
|
714
|
+
? this.maxAttemptsForSubmitFailures
|
|
715
|
+
: defaultMaxAttempts;
|
|
808
716
|
|
|
809
717
|
// Emit "summarize" event for this failed attempt.
|
|
810
718
|
status = "failure";
|
|
811
719
|
error = ackNackResult.error;
|
|
720
|
+
retryAfterSeconds = error.retryAfterSeconds;
|
|
812
721
|
const eventProps: ISummarizeEventProps = {
|
|
813
722
|
result: status,
|
|
814
723
|
currentAttempt,
|
|
@@ -817,27 +726,26 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
817
726
|
};
|
|
818
727
|
this.emit("summarize", eventProps);
|
|
819
728
|
|
|
820
|
-
//
|
|
729
|
+
// Break if the failure doesn't have "retryAfterSeconds" or we are one less from max number of attempts.
|
|
730
|
+
// Note that the final attempt if "retryAfterSeconds" does exist happens outside of the do..while loop.
|
|
821
731
|
if (retryAfterSeconds === undefined || currentAttempt >= maxAttempts - 1) {
|
|
822
732
|
done = true;
|
|
823
733
|
}
|
|
824
734
|
|
|
825
|
-
// If the failure has "retryAfterSeconds", add a delay of that time
|
|
826
|
-
|
|
827
|
-
if (retryAfterSeconds !== undefined) {
|
|
735
|
+
// If the failure has "retryAfterSeconds", add a delay of that time before starting the next attempt.
|
|
736
|
+
if (retryAfterSeconds !== undefined && retryAfterSeconds > 0) {
|
|
828
737
|
this.mc.logger.sendPerformanceEvent({
|
|
829
738
|
eventName: "SummarizeAttemptDelay",
|
|
830
|
-
duration: retryAfterSeconds,
|
|
831
|
-
summaryNackDelay: ackNackResult.data
|
|
739
|
+
duration: retryAfterSeconds * 1000,
|
|
740
|
+
summaryNackDelay: ackNackResult.data !== undefined, // This will only be defined only for nack failures.
|
|
832
741
|
stage: submitSummaryResult.data?.stage,
|
|
833
|
-
dynamicRetries: true, // To differentiate this telemetry from regular retry logic
|
|
834
742
|
...attemptResult.summarizeProps,
|
|
835
743
|
});
|
|
836
744
|
await delay(retryAfterSeconds * 1000);
|
|
837
745
|
}
|
|
838
746
|
} while (!done);
|
|
839
747
|
|
|
840
|
-
// If
|
|
748
|
+
// If the attempt was successful, emit "summarize" event and return. A failed attempt may be retried below.
|
|
841
749
|
if (status !== "failure") {
|
|
842
750
|
this.emit("summarize", { result: status, currentAttempt, maxAttempts });
|
|
843
751
|
return results;
|
|
@@ -888,7 +796,10 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
888
796
|
) {
|
|
889
797
|
const results = await this.trySummarizeWithRetries(reason);
|
|
890
798
|
if (results === undefined) {
|
|
891
|
-
resultsBuilder.fail(
|
|
799
|
+
resultsBuilder.fail(
|
|
800
|
+
"Summarization was canceled",
|
|
801
|
+
new RetriableSummaryError("Summarization was canceled"),
|
|
802
|
+
);
|
|
892
803
|
return resultsBuilder.build();
|
|
893
804
|
}
|
|
894
805
|
const submitResult = await results.summarySubmitted;
|
|
@@ -906,7 +817,10 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
906
817
|
resultsBuilder: SummarizeResultBuilder = new SummarizeResultBuilder(),
|
|
907
818
|
): ISummarizeResults {
|
|
908
819
|
if (this.stopping) {
|
|
909
|
-
resultsBuilder.fail(
|
|
820
|
+
resultsBuilder.fail(
|
|
821
|
+
"RunningSummarizer stopped or disposed",
|
|
822
|
+
new RetriableSummaryError("RunningSummarizer stopped or disposed"),
|
|
823
|
+
);
|
|
910
824
|
return resultsBuilder.build();
|
|
911
825
|
}
|
|
912
826
|
// Check for concurrent summary attempts. If one is found,
|
|
@@ -944,7 +858,9 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
944
858
|
// Override existing enqueued summarize attempt.
|
|
945
859
|
this.enqueuedSummary.resultsBuilder.fail(
|
|
946
860
|
"Aborted; overridden by another enqueue summarize attempt",
|
|
947
|
-
|
|
861
|
+
new RetriableSummaryError(
|
|
862
|
+
"Summary was overridden by another enqueue summarize attempt",
|
|
863
|
+
),
|
|
948
864
|
);
|
|
949
865
|
this.enqueuedSummary = undefined;
|
|
950
866
|
overridden = true;
|
|
@@ -995,7 +911,7 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
995
911
|
if (this.enqueuedSummary !== undefined) {
|
|
996
912
|
this.enqueuedSummary.resultsBuilder.fail(
|
|
997
913
|
"RunningSummarizer stopped or disposed",
|
|
998
|
-
|
|
914
|
+
new RetriableSummaryError("RunningSummarizer stopped or disposed"),
|
|
999
915
|
);
|
|
1000
916
|
this.enqueuedSummary = undefined;
|
|
1001
917
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
|
-
import { IFluidHandleContext } from "@fluidframework/core-interfaces";
|
|
7
|
+
import { IFluidHandleContext } from "@fluidframework/core-interfaces/internal";
|
|
8
8
|
import { Deferred } from "@fluidframework/core-utils/internal";
|
|
9
9
|
import {
|
|
10
10
|
IFluidErrorBase,
|
|
@@ -98,7 +98,10 @@ export class Summarizer extends TypedEventEmitter<ISummarizerEvents> implements
|
|
|
98
98
|
) => Promise<ICancellableSummarizerController>,
|
|
99
99
|
) {
|
|
100
100
|
super();
|
|
101
|
-
this.logger = createChildLogger({
|
|
101
|
+
this.logger = createChildLogger({
|
|
102
|
+
logger: this.runtime.baseLogger,
|
|
103
|
+
namespace: "Summarizer",
|
|
104
|
+
});
|
|
102
105
|
}
|
|
103
106
|
|
|
104
107
|
public async run(onBehalfOf: string): Promise<SummarizerStopReason> {
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
7
7
|
import { IEvent, IEventProvider } from "@fluidframework/core-interfaces";
|
|
8
|
-
import { IClientDetails
|
|
8
|
+
import { IClientDetails } from "@fluidframework/driver-definitions";
|
|
9
|
+
import { MessageType } from "@fluidframework/driver-definitions/internal";
|
|
9
10
|
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
|
|
10
11
|
|
|
11
12
|
import {
|
|
@@ -5,16 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
7
7
|
import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
ISnapshotTree,
|
|
11
|
-
SummaryType,
|
|
12
|
-
} from "@fluidframework/protocol-definitions";
|
|
8
|
+
import { ISequencedDocumentMessage, SummaryType } from "@fluidframework/driver-definitions";
|
|
9
|
+
import { ISnapshotTree } from "@fluidframework/driver-definitions/internal";
|
|
13
10
|
import {
|
|
14
11
|
IExperimentalIncrementalSummaryContext,
|
|
15
12
|
ITelemetryContext,
|
|
16
|
-
} from "@fluidframework/runtime-definitions";
|
|
17
|
-
import {
|
|
18
13
|
CreateChildSummarizerNodeParam,
|
|
19
14
|
CreateSummarizerNodeSource,
|
|
20
15
|
ISummarizeResult,
|
|
@@ -167,15 +162,6 @@ export class SummarizerNode implements IRootSummarizerNode {
|
|
|
167
162
|
trackState: boolean = true,
|
|
168
163
|
telemetryContext?: ITelemetryContext,
|
|
169
164
|
): Promise<ISummarizeResult> {
|
|
170
|
-
assert(
|
|
171
|
-
this.isSummaryInProgress(),
|
|
172
|
-
0x1a1 /* "summarize should not be called when not tracking the summary" */,
|
|
173
|
-
);
|
|
174
|
-
assert(
|
|
175
|
-
this.wipSummaryLogger !== undefined,
|
|
176
|
-
0x1a2 /* "wipSummaryLogger should have been set in startSummary or ctor" */,
|
|
177
|
-
);
|
|
178
|
-
|
|
179
165
|
// Try to reuse the tree if unchanged
|
|
180
166
|
if (this.canReuseHandle && !fullTree && !this.hasChanged()) {
|
|
181
167
|
const latestSummary = this._latestSummary;
|
|
@@ -198,21 +184,23 @@ export class SummarizerNode implements IRootSummarizerNode {
|
|
|
198
184
|
}
|
|
199
185
|
}
|
|
200
186
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
187
|
+
let incrementalSummaryContext: IExperimentalIncrementalSummaryContext | undefined;
|
|
188
|
+
if (!fullTree) {
|
|
189
|
+
assert(
|
|
190
|
+
this.wipReferenceSequenceNumber !== undefined,
|
|
191
|
+
0x5df /* Summarize should not be called when not tracking the summary */,
|
|
192
|
+
);
|
|
193
|
+
incrementalSummaryContext =
|
|
194
|
+
this._latestSummary !== undefined
|
|
195
|
+
? {
|
|
196
|
+
summarySequenceNumber: this.wipReferenceSequenceNumber,
|
|
197
|
+
latestSummarySequenceNumber:
|
|
198
|
+
this._latestSummary.referenceSequenceNumber,
|
|
199
|
+
// TODO: remove summaryPath
|
|
200
|
+
summaryPath: this._latestSummary.fullPath.path,
|
|
201
|
+
}
|
|
202
|
+
: undefined;
|
|
203
|
+
}
|
|
216
204
|
|
|
217
205
|
const result = await this.summarizeInternalFn(
|
|
218
206
|
fullTree,
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { SummaryObject } from "@fluidframework/driver-definitions";
|
|
7
|
+
import { ISnapshotTree } from "@fluidframework/driver-definitions/internal";
|
|
7
8
|
import { channelsTreeName } from "@fluidframework/runtime-definitions/internal";
|
|
8
9
|
import { ITelemetryLoggerExt, TelemetryDataTag } from "@fluidframework/telemetry-utils/internal";
|
|
9
10
|
|
|
@@ -7,10 +7,8 @@ import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
|
7
7
|
import { assert, LazyPromise } from "@fluidframework/core-utils/internal";
|
|
8
8
|
import {
|
|
9
9
|
IExperimentalIncrementalSummaryContext,
|
|
10
|
-
IGarbageCollectionData,
|
|
11
10
|
ITelemetryContext,
|
|
12
|
-
|
|
13
|
-
import {
|
|
11
|
+
IGarbageCollectionData,
|
|
14
12
|
CreateChildSummarizerNodeParam,
|
|
15
13
|
IGarbageCollectionDetailsBase,
|
|
16
14
|
ISummarizeInternalResult,
|
|
@@ -78,15 +76,13 @@ export class SummarizerNodeWithGC extends SummarizerNode implements IRootSummari
|
|
|
78
76
|
private referenceUsedRoutes: string[] | undefined;
|
|
79
77
|
|
|
80
78
|
// The base GC details of this node used to initialize the GC state.
|
|
81
|
-
private readonly baseGCDetailsP:
|
|
79
|
+
private readonly baseGCDetailsP: Promise<IGarbageCollectionDetailsBase>;
|
|
82
80
|
|
|
83
81
|
// Keeps track of whether we have loaded the base details to ensure that we only do it once.
|
|
84
82
|
private baseGCDetailsLoaded: boolean = false;
|
|
85
83
|
|
|
86
84
|
// The base GC details for the child nodes. This is passed to child nodes when creating them.
|
|
87
|
-
private readonly childNodesBaseGCDetailsP:
|
|
88
|
-
Map<string, IGarbageCollectionDetailsBase>
|
|
89
|
-
>;
|
|
85
|
+
private readonly childNodesBaseGCDetailsP: Promise<Map<string, IGarbageCollectionDetailsBase>>;
|
|
90
86
|
|
|
91
87
|
private gcData: IGarbageCollectionData | undefined;
|
|
92
88
|
|
|
@@ -517,7 +513,7 @@ export class SummarizerNodeWithGC extends SummarizerNode implements IRootSummari
|
|
|
517
513
|
* was previously used and became unused (or vice versa), its used state has changed.
|
|
518
514
|
*/
|
|
519
515
|
private hasUsedStateChanged(): boolean {
|
|
520
|
-
// If GC is disabled,
|
|
516
|
+
// If GC is disabled, it should not affect summary state, return false.
|
|
521
517
|
if (this.gcDisabled) {
|
|
522
518
|
return false;
|
|
523
519
|
}
|