@fluidframework/container-runtime 2.0.0-dev.4.4.0.162574 → 2.0.0-dev.5.3.2.178189
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 +69 -0
- package/dist/batchTracker.d.ts +4 -4
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +2 -2
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +5 -2
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +53 -24
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +2 -2
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +8 -1
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +19 -7
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +98 -22
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +2 -2
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +1 -1
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +3 -4
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +5 -5
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts +2 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +2 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStores.d.ts +1 -1
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +2 -1
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaScheduler.d.ts +2 -2
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +2 -2
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +4 -3
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +3 -4
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +5 -5
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/id-compressor/idCompressor.d.ts +2 -2
- package/dist/id-compressor/idCompressor.d.ts.map +1 -1
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/uuidUtilities.d.ts +0 -2
- package/dist/id-compressor/uuidUtilities.d.ts.map +1 -1
- package/dist/id-compressor/uuidUtilities.js +1 -3
- package/dist/id-compressor/uuidUtilities.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/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 +5 -1
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +13 -2
- 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 +3 -6
- 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 +14 -8
- 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 +6 -11
- 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 +5 -3
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +35 -4
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +135 -45
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +3 -1
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +24 -15
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +67 -72
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +2 -2
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +8 -2
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +2 -2
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +2 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +4 -3
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +3 -18
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +4 -3
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +5 -6
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +2 -3
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +2 -3
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +3 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +2 -2
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- 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 +41 -14
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +91 -23
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +24 -4
- 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 +23 -8
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +60 -23
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +16 -9
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +4 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +4 -0
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +1 -0
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +2 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +14 -5
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +23 -9
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +4 -2
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/tsdoc-metadata.json +11 -0
- package/lib/batchTracker.d.ts +4 -4
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +5 -2
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +53 -24
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +2 -2
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +8 -1
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +19 -7
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +101 -25
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +2 -2
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +1 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +3 -4
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +5 -5
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts +2 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +2 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStores.d.ts +1 -1
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +2 -1
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaScheduler.d.ts +2 -2
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +2 -2
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +2 -1
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +3 -4
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +5 -5
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +1 -1
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/id-compressor/idCompressor.d.ts +2 -2
- package/lib/id-compressor/idCompressor.d.ts.map +1 -1
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/uuidUtilities.d.ts +0 -2
- package/lib/id-compressor/uuidUtilities.d.ts.map +1 -1
- package/lib/id-compressor/uuidUtilities.js +1 -3
- package/lib/id-compressor/uuidUtilities.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/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 +5 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +13 -2
- 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 +3 -6
- 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 +14 -8
- 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 +6 -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 +5 -3
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +35 -4
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +133 -44
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +3 -1
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +24 -15
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +67 -72
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts +2 -2
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +8 -2
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/index.d.ts +2 -2
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +4 -3
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +3 -18
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +4 -3
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +5 -6
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +2 -3
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +2 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +3 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +2 -2
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/index.d.ts +1 -1
- package/lib/summary/summarizerNode/index.d.ts.map +1 -1
- package/lib/summary/summarizerNode/index.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +41 -14
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +91 -23
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +24 -4
- 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 +23 -8
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +59 -22
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +16 -9
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +4 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +4 -0
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +1 -0
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +2 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +14 -5
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +21 -8
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +4 -2
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +1 -1
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +25 -41
- package/src/batchTracker.ts +5 -6
- package/src/blobManager.ts +70 -29
- package/src/connectionTelemetry.ts +14 -6
- package/src/containerRuntime.ts +124 -38
- package/src/dataStore.ts +3 -4
- package/src/dataStoreContext.ts +12 -9
- package/src/dataStoreContexts.ts +6 -8
- package/src/dataStores.ts +8 -3
- package/src/deltaScheduler.ts +2 -3
- package/src/gc/garbageCollection.ts +7 -6
- package/src/gc/gcDefinitions.ts +3 -4
- package/src/gc/gcTelemetry.ts +9 -5
- package/src/id-compressor/idCompressor.ts +2 -2
- package/src/id-compressor/uuidUtilities.ts +1 -4
- package/src/index.ts +2 -0
- 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 +13 -2
- package/src/opLifecycle/index.ts +1 -1
- package/src/opLifecycle/opCompressor.ts +4 -8
- package/src/opLifecycle/opDecompressor.ts +43 -16
- package/src/opLifecycle/opGroupingManager.ts +19 -13
- package/src/opLifecycle/opSplitter.ts +7 -6
- package/src/opLifecycle/outbox.ts +172 -57
- package/src/opLifecycle/remoteMessageProcessor.ts +5 -1
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +113 -129
- package/src/scheduleManager.ts +18 -10
- package/src/summary/index.ts +3 -1
- package/src/summary/orderedClientElection.ts +7 -20
- package/src/summary/runningSummarizer.ts +11 -10
- package/src/summary/summarizer.ts +8 -8
- package/src/summary/summarizerClientElection.ts +3 -2
- package/src/summary/summarizerHeuristics.ts +2 -2
- package/src/summary/summarizerNode/index.ts +1 -0
- package/src/summary/summarizerNode/summarizerNode.ts +121 -38
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +27 -4
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +73 -27
- package/src/summary/summarizerTypes.ts +19 -14
- package/src/summary/summaryCollection.ts +10 -4
- package/src/summary/summaryFormat.ts +5 -1
- package/src/summary/summaryGenerator.ts +38 -11
- package/src/summary/summaryManager.ts +9 -9
|
@@ -4,19 +4,20 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { IDisposable } from "@fluidframework/common-definitions";
|
|
7
|
-
import { assert
|
|
7
|
+
import { assert } from "@fluidframework/common-utils";
|
|
8
8
|
import { ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
9
9
|
import { DataProcessingError } from "@fluidframework/container-utils";
|
|
10
|
+
import { Lazy } from "@fluidframework/core-utils";
|
|
10
11
|
import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
11
12
|
import Deque from "double-ended-queue";
|
|
12
13
|
import { ContainerMessageType } from "./containerRuntime";
|
|
13
14
|
import { pkgVersion } from "./packageVersion";
|
|
15
|
+
import { IBatchMetadata } from "./metadata";
|
|
14
16
|
|
|
15
17
|
/**
|
|
16
|
-
*
|
|
17
|
-
* ContainerRuntime. This message has either not been ack'd by the server or has not been submitted to the server yet.
|
|
18
|
+
* ! TODO: Remove this interface in "2.0.0-internal.7.0.0" once we only read IPendingMessageNew
|
|
18
19
|
*/
|
|
19
|
-
export interface
|
|
20
|
+
export interface IPendingMessageOld {
|
|
20
21
|
type: "message";
|
|
21
22
|
messageType: ContainerMessageType;
|
|
22
23
|
clientSequenceNumber: number;
|
|
@@ -27,16 +28,22 @@ export interface IPendingMessage {
|
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
/**
|
|
30
|
-
* This represents
|
|
31
|
-
* to
|
|
32
|
-
* ! TODO: Remove in "2.0.0-internal.5.0.0" AB#2496
|
|
31
|
+
* This represents a message that has been submitted and is added to the pending queue when `submit` is called on the
|
|
32
|
+
* ContainerRuntime. This message has either not been ack'd by the server or has not been submitted to the server yet.
|
|
33
33
|
*/
|
|
34
|
-
export interface
|
|
35
|
-
type: "
|
|
34
|
+
export interface IPendingMessageNew {
|
|
35
|
+
type: "message";
|
|
36
|
+
clientSequenceNumber: number;
|
|
37
|
+
referenceSequenceNumber: number;
|
|
38
|
+
content: string;
|
|
39
|
+
localOpMetadata: unknown;
|
|
40
|
+
opMetadata: Record<string, unknown> | undefined;
|
|
36
41
|
}
|
|
37
42
|
|
|
38
|
-
/**
|
|
39
|
-
|
|
43
|
+
/**
|
|
44
|
+
* ! TODO: Remove this type in "2.0.0-internal.7.0.0"
|
|
45
|
+
*/
|
|
46
|
+
export type IPendingState = IPendingMessageOld | IPendingMessageNew;
|
|
40
47
|
|
|
41
48
|
export interface IPendingLocalState {
|
|
42
49
|
/**
|
|
@@ -45,19 +52,19 @@ export interface IPendingLocalState {
|
|
|
45
52
|
pendingStates: IPendingState[];
|
|
46
53
|
}
|
|
47
54
|
|
|
55
|
+
export interface IPendingBatchMessage {
|
|
56
|
+
content: string;
|
|
57
|
+
localOpMetadata: unknown;
|
|
58
|
+
opMetadata: Record<string, unknown> | undefined;
|
|
59
|
+
}
|
|
60
|
+
|
|
48
61
|
export interface IRuntimeStateHandler {
|
|
49
62
|
connected(): boolean;
|
|
50
63
|
clientId(): string | undefined;
|
|
51
64
|
close(error?: ICriticalContainerError): void;
|
|
52
|
-
applyStashedOp
|
|
53
|
-
reSubmit(
|
|
54
|
-
|
|
55
|
-
content: any,
|
|
56
|
-
localOpMetadata: unknown,
|
|
57
|
-
opMetadata: Record<string, unknown> | undefined,
|
|
58
|
-
): void;
|
|
59
|
-
rollback(type: ContainerMessageType, content: any, localOpMetadata: unknown): void;
|
|
60
|
-
orderSequentially(callback: () => void): void;
|
|
65
|
+
applyStashedOp(content: string): Promise<unknown>;
|
|
66
|
+
reSubmit(message: IPendingBatchMessage): void;
|
|
67
|
+
reSubmitBatch(batch: IPendingBatchMessage[]): void;
|
|
61
68
|
}
|
|
62
69
|
|
|
63
70
|
/**
|
|
@@ -70,8 +77,8 @@ export interface IRuntimeStateHandler {
|
|
|
70
77
|
* It verifies that all the ops are acked, are received in the right order and batch information is correct.
|
|
71
78
|
*/
|
|
72
79
|
export class PendingStateManager implements IDisposable {
|
|
73
|
-
private readonly pendingMessages = new Deque<
|
|
74
|
-
private readonly initialMessages = new Deque<
|
|
80
|
+
private readonly pendingMessages = new Deque<IPendingMessageNew>();
|
|
81
|
+
private readonly initialMessages = new Deque<IPendingMessageNew>();
|
|
75
82
|
private readonly disposeOnce = new Lazy<void>(() => {
|
|
76
83
|
this.initialMessages.clear();
|
|
77
84
|
this.pendingMessages.clear();
|
|
@@ -105,22 +112,23 @@ export class PendingStateManager implements IDisposable {
|
|
|
105
112
|
);
|
|
106
113
|
if (!this.pendingMessages.isEmpty()) {
|
|
107
114
|
return {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
115
|
+
pendingStates: this.pendingMessages.toArray().map((message) => {
|
|
116
|
+
// ! TODO: Remove conversion to IPendingMessageOld in "2.0.0-internal.6.0.0" AB#3826
|
|
117
|
+
const content = JSON.parse(message.content);
|
|
111
118
|
// IdAllocations need their localOpMetadata stashed in the contents
|
|
112
119
|
// of the op to correctly resume the session when processing stashed ops
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
if (content.type === ContainerMessageType.IdAllocation) {
|
|
121
|
+
content.contents.stashedState = message.localOpMetadata;
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
...message,
|
|
125
|
+
messageType: content.type,
|
|
126
|
+
content: content.contents,
|
|
127
|
+
// delete localOpMetadata since it may not be serializable
|
|
128
|
+
// and will be regenerated by applyStashedOp()
|
|
129
|
+
localOpMetadata: undefined,
|
|
130
|
+
};
|
|
131
|
+
}),
|
|
124
132
|
};
|
|
125
133
|
}
|
|
126
134
|
}
|
|
@@ -130,34 +138,27 @@ export class PendingStateManager implements IDisposable {
|
|
|
130
138
|
initialLocalState: IPendingLocalState | undefined,
|
|
131
139
|
) {
|
|
132
140
|
/**
|
|
133
|
-
* Convert old local state format to the new format
|
|
134
|
-
*
|
|
135
|
-
* The new format instead uses batch metadata on the last message to indicate batch ends
|
|
136
|
-
* ! TODO: Remove this conversion in "2.0.0-internal.5.0.0" as version from "2.0.0-internal.4.0.0" will be new format
|
|
137
|
-
* AB#2496 tracks removal
|
|
141
|
+
* Convert old local state format to the new format (IPendingMessageOld to IPendingMessageNew)
|
|
142
|
+
* ! TODO: Remove this conversion in "2.0.0-internal.7.0.0"
|
|
138
143
|
*/
|
|
139
144
|
if (initialLocalState?.pendingStates) {
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
} else if (
|
|
152
|
-
// End of batch if we are currently batching and this is last message or next message is flush
|
|
153
|
-
currentlyBatching &&
|
|
154
|
-
(i === pendingStates.length - 1 || pendingStates[i + 1].type === "flush")
|
|
155
|
-
) {
|
|
156
|
-
currentlyBatching = false;
|
|
157
|
-
initialState.opMetadata = { ...initialState.opMetadata, batch: false };
|
|
158
|
-
}
|
|
159
|
-
this.initialMessages.push(initialState);
|
|
145
|
+
for (const initialState of initialLocalState.pendingStates) {
|
|
146
|
+
let messageContent = initialState.content;
|
|
147
|
+
if (
|
|
148
|
+
(initialState as IPendingMessageOld).messageType !== undefined &&
|
|
149
|
+
typeof initialState.content !== "string"
|
|
150
|
+
) {
|
|
151
|
+
// Convert IPendingMessageOld to IPendingMessageNew
|
|
152
|
+
messageContent = JSON.stringify({
|
|
153
|
+
type: (initialState as IPendingMessageOld).messageType,
|
|
154
|
+
contents: initialState.content,
|
|
155
|
+
});
|
|
160
156
|
}
|
|
157
|
+
// Note: this object may contain "messageType" prop, but it should not be easily accesible due to interface being used
|
|
158
|
+
this.initialMessages.push({
|
|
159
|
+
...initialState,
|
|
160
|
+
content: messageContent,
|
|
161
|
+
});
|
|
161
162
|
}
|
|
162
163
|
}
|
|
163
164
|
}
|
|
@@ -175,15 +176,13 @@ export class PendingStateManager implements IDisposable {
|
|
|
175
176
|
* @param localOpMetadata - The local metadata associated with the message.
|
|
176
177
|
*/
|
|
177
178
|
public onSubmitMessage(
|
|
178
|
-
|
|
179
|
+
content: string,
|
|
179
180
|
referenceSequenceNumber: number,
|
|
180
|
-
content: any,
|
|
181
181
|
localOpMetadata: unknown,
|
|
182
182
|
opMetadata: Record<string, unknown> | undefined,
|
|
183
183
|
) {
|
|
184
|
-
const pendingMessage:
|
|
184
|
+
const pendingMessage: IPendingMessageNew = {
|
|
185
185
|
type: "message",
|
|
186
|
-
messageType: type,
|
|
187
186
|
clientSequenceNumber: -1, // dummy value (not to be used anywhere)
|
|
188
187
|
referenceSequenceNumber,
|
|
189
188
|
content,
|
|
@@ -212,17 +211,12 @@ export class PendingStateManager implements IDisposable {
|
|
|
212
211
|
}
|
|
213
212
|
}
|
|
214
213
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
nextMessage.
|
|
218
|
-
nextMessage.
|
|
219
|
-
)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
if (nextMessage.messageType === ContainerMessageType.IdAllocation) {
|
|
223
|
-
// Remove the stashed state from the op
|
|
224
|
-
// so that it doesn't go over the wire
|
|
225
|
-
delete nextMessage.content.stashedState;
|
|
214
|
+
try {
|
|
215
|
+
// applyStashedOp will cause the DDS to behave as if it has sent the op but not actually send it
|
|
216
|
+
const localOpMetadata = await this.stateHandler.applyStashedOp(nextMessage.content);
|
|
217
|
+
nextMessage.localOpMetadata = localOpMetadata;
|
|
218
|
+
} catch (error) {
|
|
219
|
+
throw DataProcessingError.wrapIfUnrecognized(error, "applyStashedOp", nextMessage);
|
|
226
220
|
}
|
|
227
221
|
|
|
228
222
|
// then we push onto pendingMessages which will cause PendingStateManager to resubmit when we connect
|
|
@@ -248,32 +242,17 @@ export class PendingStateManager implements IDisposable {
|
|
|
248
242
|
);
|
|
249
243
|
this.pendingMessages.shift();
|
|
250
244
|
|
|
251
|
-
|
|
252
|
-
// Close the container because this could indicate data corruption.
|
|
253
|
-
this.stateHandler.close(
|
|
254
|
-
DataProcessingError.create(
|
|
255
|
-
"pending local message type mismatch",
|
|
256
|
-
"unexpectedAckReceived",
|
|
257
|
-
message,
|
|
258
|
-
{
|
|
259
|
-
expectedMessageType: pendingMessage.messageType,
|
|
260
|
-
},
|
|
261
|
-
),
|
|
262
|
-
);
|
|
263
|
-
return;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
const pendingMessageContent = JSON.stringify(pendingMessage.content);
|
|
267
|
-
const messageContent = JSON.stringify(message.contents);
|
|
268
|
-
|
|
245
|
+
const messageContent = JSON.stringify({ type: message.type, contents: message.contents });
|
|
269
246
|
// Stringified content does not match
|
|
270
|
-
if (
|
|
271
|
-
// Close the container because this could indicate data corruption.
|
|
247
|
+
if (pendingMessage.content !== messageContent) {
|
|
272
248
|
this.stateHandler.close(
|
|
273
249
|
DataProcessingError.create(
|
|
274
250
|
"pending local message content mismatch",
|
|
275
251
|
"unexpectedAckReceived",
|
|
276
252
|
message,
|
|
253
|
+
{
|
|
254
|
+
expectedMessageType: JSON.parse(pendingMessage.content).type,
|
|
255
|
+
},
|
|
277
256
|
),
|
|
278
257
|
);
|
|
279
258
|
return;
|
|
@@ -291,7 +270,7 @@ export class PendingStateManager implements IDisposable {
|
|
|
291
270
|
*/
|
|
292
271
|
private maybeProcessBatchBegin(message: ISequencedDocumentMessage) {
|
|
293
272
|
// This message is the first in a batch if the "batch" property on the metadata is set to true
|
|
294
|
-
if (message.metadata?.batch) {
|
|
273
|
+
if ((message.metadata as IBatchMetadata | undefined)?.batch) {
|
|
295
274
|
// We should not already be processing a batch and there should be no pending batch begin message.
|
|
296
275
|
assert(
|
|
297
276
|
!this.isProcessingBatch && this.pendingBatchBeginMessage === undefined,
|
|
@@ -319,10 +298,12 @@ export class PendingStateManager implements IDisposable {
|
|
|
319
298
|
0x16d /* "There is no pending batch begin message" */,
|
|
320
299
|
);
|
|
321
300
|
|
|
322
|
-
const batchEndMetadata = message.metadata?.batch;
|
|
301
|
+
const batchEndMetadata = (message.metadata as IBatchMetadata | undefined)?.batch;
|
|
323
302
|
if (this.pendingMessages.isEmpty() || batchEndMetadata === false) {
|
|
324
303
|
// Get the batch begin metadata from the first message in the batch.
|
|
325
|
-
const batchBeginMetadata =
|
|
304
|
+
const batchBeginMetadata = (
|
|
305
|
+
this.pendingBatchBeginMessage.metadata as IBatchMetadata | undefined
|
|
306
|
+
)?.batch;
|
|
326
307
|
|
|
327
308
|
// There could be just a single message in the batch. If so, it should not have any batch metadata. If there
|
|
328
309
|
// are multiple messages in the batch, verify that we got the correct batch begin and end metadata.
|
|
@@ -340,7 +321,10 @@ export class PendingStateManager implements IDisposable {
|
|
|
340
321
|
message,
|
|
341
322
|
{
|
|
342
323
|
runtimeVersion: pkgVersion,
|
|
343
|
-
batchClientId:
|
|
324
|
+
batchClientId:
|
|
325
|
+
this.pendingBatchBeginMessage.clientId === null
|
|
326
|
+
? "null"
|
|
327
|
+
: this.pendingBatchBeginMessage.clientId,
|
|
344
328
|
clientId: this.stateHandler.clientId(),
|
|
345
329
|
hasBatchStart: batchBeginMetadata === true,
|
|
346
330
|
hasBatchEnd: batchEndMetadata === false,
|
|
@@ -408,37 +392,37 @@ export class PendingStateManager implements IDisposable {
|
|
|
408
392
|
0x554 /* Last pending message cannot be a batch begin */,
|
|
409
393
|
);
|
|
410
394
|
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
}
|
|
424
|
-
assert(pendingMessagesCount > 0, 0x555 /* No batch end found */);
|
|
425
|
-
|
|
426
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
427
|
-
pendingMessage = this.pendingMessages.shift()!;
|
|
428
|
-
pendingMessagesCount--;
|
|
429
|
-
assert(
|
|
430
|
-
pendingMessage.opMetadata?.batch !== true,
|
|
431
|
-
0x556 /* Batch start needs a corresponding batch end */,
|
|
432
|
-
);
|
|
395
|
+
const batch: IPendingBatchMessage[] = [];
|
|
396
|
+
|
|
397
|
+
// check is >= because batch end may be last pending message
|
|
398
|
+
while (pendingMessagesCount >= 0) {
|
|
399
|
+
batch.push({
|
|
400
|
+
content: pendingMessage.content,
|
|
401
|
+
localOpMetadata: pendingMessage.localOpMetadata,
|
|
402
|
+
opMetadata: pendingMessage.opMetadata,
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
if (pendingMessage.opMetadata?.batch === false) {
|
|
406
|
+
break;
|
|
433
407
|
}
|
|
434
|
-
|
|
408
|
+
assert(pendingMessagesCount > 0, 0x555 /* No batch end found */);
|
|
409
|
+
|
|
410
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
411
|
+
pendingMessage = this.pendingMessages.shift()!;
|
|
412
|
+
pendingMessagesCount--;
|
|
413
|
+
assert(
|
|
414
|
+
pendingMessage.opMetadata?.batch !== true,
|
|
415
|
+
0x556 /* Batch start needs a corresponding batch end */,
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
this.stateHandler.reSubmitBatch(batch);
|
|
435
420
|
} else {
|
|
436
|
-
this.stateHandler.reSubmit(
|
|
437
|
-
pendingMessage.
|
|
438
|
-
pendingMessage.
|
|
439
|
-
pendingMessage.
|
|
440
|
-
|
|
441
|
-
);
|
|
421
|
+
this.stateHandler.reSubmit({
|
|
422
|
+
content: pendingMessage.content,
|
|
423
|
+
localOpMetadata: pendingMessage.localOpMetadata,
|
|
424
|
+
opMetadata: pendingMessage.opMetadata,
|
|
425
|
+
});
|
|
442
426
|
}
|
|
443
427
|
}
|
|
444
428
|
}
|
package/src/scheduleManager.ts
CHANGED
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
import { EventEmitter } from "events";
|
|
6
6
|
import { IDeltaManager } from "@fluidframework/container-definitions";
|
|
7
7
|
import { IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
8
|
-
import {
|
|
9
|
-
import { ChildLogger } from "@fluidframework/telemetry-utils";
|
|
8
|
+
import { ITelemetryLoggerExt, ChildLogger } from "@fluidframework/telemetry-utils";
|
|
10
9
|
import { assert, performance } from "@fluidframework/common-utils";
|
|
11
10
|
import { isRuntimeMessage } from "@fluidframework/driver-utils";
|
|
12
11
|
import {
|
|
@@ -16,6 +15,7 @@ import {
|
|
|
16
15
|
} from "@fluidframework/container-utils";
|
|
17
16
|
import { DeltaScheduler } from "./deltaScheduler";
|
|
18
17
|
import { pkgVersion } from "./packageVersion";
|
|
18
|
+
import { IBatchMetadata } from "./metadata";
|
|
19
19
|
|
|
20
20
|
type IRuntimeMessageMetadata =
|
|
21
21
|
| undefined
|
|
@@ -41,7 +41,7 @@ export class ScheduleManager {
|
|
|
41
41
|
private readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,
|
|
42
42
|
private readonly emitter: EventEmitter,
|
|
43
43
|
readonly getClientId: () => string | undefined,
|
|
44
|
-
private readonly logger:
|
|
44
|
+
private readonly logger: ITelemetryLoggerExt,
|
|
45
45
|
) {
|
|
46
46
|
this.deltaScheduler = new DeltaScheduler(
|
|
47
47
|
this.deltaManager,
|
|
@@ -62,7 +62,9 @@ export class ScheduleManager {
|
|
|
62
62
|
this.deltaScheduler.batchBegin(message);
|
|
63
63
|
|
|
64
64
|
const batch = (message?.metadata as IRuntimeMessageMetadata)?.batch;
|
|
65
|
-
this
|
|
65
|
+
// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
67
|
+
this.batchClientId = batch ? (message.clientId as string) : undefined;
|
|
66
68
|
}
|
|
67
69
|
}
|
|
68
70
|
|
|
@@ -106,7 +108,7 @@ class ScheduleManagerCore {
|
|
|
106
108
|
constructor(
|
|
107
109
|
private readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,
|
|
108
110
|
private readonly getClientId: () => string | undefined,
|
|
109
|
-
private readonly logger:
|
|
111
|
+
private readonly logger: ITelemetryLoggerExt,
|
|
110
112
|
) {
|
|
111
113
|
// Listen for delta manager sends and add batch metadata to messages
|
|
112
114
|
this.deltaManager.on("prepareSend", (messages: IDocumentMessage[]) => {
|
|
@@ -128,7 +130,9 @@ class ScheduleManagerCore {
|
|
|
128
130
|
|
|
129
131
|
// Set the batch flag to false on the last message to indicate the end of the send batch
|
|
130
132
|
const lastMessage = messages[messages.length - 1];
|
|
131
|
-
|
|
133
|
+
// TODO: It's not clear if this shallow clone is required, as opposed to just setting "batch" to false.
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
135
|
+
lastMessage.metadata = { ...(lastMessage.metadata as any), batch: false };
|
|
132
136
|
});
|
|
133
137
|
|
|
134
138
|
// Listen for updates and peek at the inbound
|
|
@@ -186,7 +190,7 @@ class ScheduleManagerCore {
|
|
|
186
190
|
{
|
|
187
191
|
type: message.type,
|
|
188
192
|
contentType: typeof message.contents,
|
|
189
|
-
batch: message.metadata?.batch,
|
|
193
|
+
batch: (message.metadata as IBatchMetadata | undefined)?.batch,
|
|
190
194
|
compression: message.compression,
|
|
191
195
|
pauseSeqNum: this.pauseSequenceNumber,
|
|
192
196
|
},
|
|
@@ -264,7 +268,8 @@ class ScheduleManagerCore {
|
|
|
264
268
|
message,
|
|
265
269
|
{
|
|
266
270
|
runtimeVersion: pkgVersion,
|
|
267
|
-
batchClientId:
|
|
271
|
+
batchClientId:
|
|
272
|
+
this.currentBatchClientId === null ? "null" : this.currentBatchClientId,
|
|
268
273
|
pauseSequenceNumber: this.pauseSequenceNumber,
|
|
269
274
|
localBatch: this.currentBatchClientId === this.getClientId(),
|
|
270
275
|
messageType: message.type,
|
|
@@ -298,7 +303,8 @@ class ScheduleManagerCore {
|
|
|
298
303
|
) {
|
|
299
304
|
throw new DataCorruptionError("OpBatchIncomplete", {
|
|
300
305
|
runtimeVersion: pkgVersion,
|
|
301
|
-
batchClientId:
|
|
306
|
+
batchClientId:
|
|
307
|
+
this.currentBatchClientId === null ? "null" : this.currentBatchClientId,
|
|
302
308
|
pauseSequenceNumber: this.pauseSequenceNumber,
|
|
303
309
|
localBatch: this.currentBatchClientId === this.getClientId(),
|
|
304
310
|
localMessage: message.clientId === this.getClientId(),
|
|
@@ -322,7 +328,9 @@ class ScheduleManagerCore {
|
|
|
322
328
|
0x29f /* "we should be processing ops when there is no active batch" */,
|
|
323
329
|
);
|
|
324
330
|
this.pauseSequenceNumber = message.sequenceNumber;
|
|
325
|
-
this
|
|
331
|
+
// TODO: Verify whether this should be able to handle server-generated ops (with null clientId)
|
|
332
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
333
|
+
this.currentBatchClientId = message.clientId as string;
|
|
326
334
|
// Start of the batch
|
|
327
335
|
// Only pause processing if queue has no other ops!
|
|
328
336
|
// If there are any other ops in the queue, processing will be stopped when they are processed!
|
package/src/summary/index.ts
CHANGED
|
@@ -62,6 +62,8 @@ export {
|
|
|
62
62
|
ISummarizingWarning,
|
|
63
63
|
IUploadSummaryResult,
|
|
64
64
|
SummarizeResultPart,
|
|
65
|
+
SubmitSummaryFailureData,
|
|
66
|
+
SummaryStage,
|
|
65
67
|
} from "./summarizerTypes";
|
|
66
68
|
export {
|
|
67
69
|
IAckedSummary,
|
|
@@ -96,7 +98,7 @@ export {
|
|
|
96
98
|
wrapSummaryInChannelsTree,
|
|
97
99
|
idCompressorBlobName,
|
|
98
100
|
} from "./summaryFormat";
|
|
99
|
-
export { getFailMessage, SummarizeReason } from "./summaryGenerator";
|
|
101
|
+
export { getFailMessage, RetriableSummaryError, SummarizeReason } from "./summaryGenerator";
|
|
100
102
|
export {
|
|
101
103
|
IConnectedEvents,
|
|
102
104
|
IConnectedState,
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
/* eslint-disable @rushstack/no-new-null */
|
|
6
|
-
import { IEvent, IEventProvider
|
|
6
|
+
import { IEvent, IEventProvider } from "@fluidframework/common-definitions";
|
|
7
|
+
import { ITelemetryLoggerExt, ChildLogger } from "@fluidframework/telemetry-utils";
|
|
7
8
|
import { assert, TypedEventEmitter } from "@fluidframework/common-utils";
|
|
8
9
|
import { IDeltaManager } from "@fluidframework/container-definitions";
|
|
9
10
|
import { UsageError } from "@fluidframework/container-utils";
|
|
10
11
|
import { IClient, IQuorumClients, ISequencedClient } from "@fluidframework/protocol-definitions";
|
|
11
|
-
import { ChildLogger } from "@fluidframework/telemetry-utils";
|
|
12
12
|
import { summarizerClientType } from "./summarizerClientElection";
|
|
13
13
|
|
|
14
14
|
// helper types for recursive readonly.
|
|
@@ -91,7 +91,7 @@ export class OrderedClientCollection
|
|
|
91
91
|
};
|
|
92
92
|
/** Pointer to end of linked list, for optimized client adds. */
|
|
93
93
|
private _youngestClient: LinkNode = this.rootNode;
|
|
94
|
-
private readonly logger:
|
|
94
|
+
private readonly logger: ITelemetryLoggerExt;
|
|
95
95
|
|
|
96
96
|
public get count() {
|
|
97
97
|
return this.clientMap.size;
|
|
@@ -101,7 +101,7 @@ export class OrderedClientCollection
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
constructor(
|
|
104
|
-
logger:
|
|
104
|
+
logger: ITelemetryLoggerExt,
|
|
105
105
|
deltaManager: Pick<IDeltaManager<unknown, unknown>, "lastSequenceNumber">,
|
|
106
106
|
quorum: Pick<IQuorumClients, "getMembers" | "on">,
|
|
107
107
|
) {
|
|
@@ -336,7 +336,7 @@ export class OrderedClientElection
|
|
|
336
336
|
}
|
|
337
337
|
|
|
338
338
|
constructor(
|
|
339
|
-
private readonly logger:
|
|
339
|
+
private readonly logger: ITelemetryLoggerExt,
|
|
340
340
|
private readonly orderedClientCollection: IOrderedClientCollection,
|
|
341
341
|
/** Serialized state from summary or current sequence number at time of load if new. */
|
|
342
342
|
initialState: ISerializedElection | number,
|
|
@@ -372,7 +372,7 @@ export class OrderedClientElection
|
|
|
372
372
|
// Override the initially elected client with the initial state.
|
|
373
373
|
if (initialClient?.clientId !== initialState.electedClientId) {
|
|
374
374
|
// Cannot find initially elected client, so elect undefined.
|
|
375
|
-
logger.sendErrorEvent({
|
|
375
|
+
this.logger.sendErrorEvent({
|
|
376
376
|
eventName: "InitialElectedClientNotFound",
|
|
377
377
|
electionSequenceNumber: initialState.electionSequenceNumber,
|
|
378
378
|
expectedClientId: initialState.electedClientId,
|
|
@@ -382,7 +382,7 @@ export class OrderedClientElection
|
|
|
382
382
|
} else if (initialClient !== undefined && !isEligibleFn(initialClient)) {
|
|
383
383
|
// Initially elected client is ineligible, so elect next eligible client.
|
|
384
384
|
initialClient = initialParent = this.findFirstEligibleParent(initialParent);
|
|
385
|
-
logger.sendErrorEvent({
|
|
385
|
+
this.logger.sendErrorEvent({
|
|
386
386
|
eventName: "InitialElectedClientIneligible",
|
|
387
387
|
electionSequenceNumber: initialState.electionSequenceNumber,
|
|
388
388
|
expectedClientId: initialState.electedClientId,
|
|
@@ -416,13 +416,6 @@ export class OrderedClientElection
|
|
|
416
416
|
change = true;
|
|
417
417
|
}
|
|
418
418
|
if (change) {
|
|
419
|
-
this.logger.sendTelemetryEvent({
|
|
420
|
-
eventName: "SummarizerClientElected",
|
|
421
|
-
electedClientId: this._electedClient?.clientId,
|
|
422
|
-
electedParentId: this._electedParent?.clientId,
|
|
423
|
-
electionSequenceNumber: sequenceNumber,
|
|
424
|
-
isSummarizerClient,
|
|
425
|
-
});
|
|
426
419
|
this.emit("election", client, sequenceNumber, prevClient);
|
|
427
420
|
}
|
|
428
421
|
}
|
|
@@ -430,12 +423,6 @@ export class OrderedClientElection
|
|
|
430
423
|
private tryElectingParent(client: ILinkedClient | undefined, sequenceNumber: number): void {
|
|
431
424
|
if (this._electedParent !== client) {
|
|
432
425
|
this._electedParent = client;
|
|
433
|
-
this.logger.sendTelemetryEvent({
|
|
434
|
-
eventName: "SummarizerParentElected",
|
|
435
|
-
electedClientId: this._electedClient?.clientId,
|
|
436
|
-
electedParentId: this._electedParent?.clientId,
|
|
437
|
-
electionSequenceNumber: sequenceNumber,
|
|
438
|
-
});
|
|
439
426
|
this.emit("election", this._electedClient, sequenceNumber, this._electedClient);
|
|
440
427
|
}
|
|
441
428
|
}
|
|
@@ -3,18 +3,19 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { IDisposable
|
|
7
|
-
import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/common-utils";
|
|
8
|
-
import { UsageError } from "@fluidframework/container-utils";
|
|
9
|
-
import { DriverErrorType } from "@fluidframework/driver-definitions";
|
|
10
|
-
import { isRuntimeMessage } from "@fluidframework/driver-utils";
|
|
11
|
-
import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
|
|
6
|
+
import { IDisposable } from "@fluidframework/core-interfaces";
|
|
12
7
|
import {
|
|
8
|
+
ITelemetryLoggerExt,
|
|
13
9
|
ChildLogger,
|
|
14
10
|
isFluidError,
|
|
15
11
|
loggerToMonitoringContext,
|
|
16
12
|
MonitoringContext,
|
|
17
13
|
} from "@fluidframework/telemetry-utils";
|
|
14
|
+
import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/common-utils";
|
|
15
|
+
import { UsageError } from "@fluidframework/container-utils";
|
|
16
|
+
import { DriverErrorType } from "@fluidframework/driver-definitions";
|
|
17
|
+
import { isRuntimeMessage } from "@fluidframework/driver-utils";
|
|
18
|
+
import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
|
|
18
19
|
import { ISummaryConfiguration } from "../containerRuntime";
|
|
19
20
|
import { opSize } from "../opProperties";
|
|
20
21
|
import { SummarizeHeuristicRunner } from "./summarizerHeuristics";
|
|
@@ -56,7 +57,7 @@ const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
|
|
|
56
57
|
*/
|
|
57
58
|
export class RunningSummarizer implements IDisposable {
|
|
58
59
|
public static async start(
|
|
59
|
-
logger:
|
|
60
|
+
logger: ITelemetryLoggerExt,
|
|
60
61
|
summaryWatcher: IClientSummaryWatcher,
|
|
61
62
|
configuration: ISummaryConfiguration,
|
|
62
63
|
submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
|
|
@@ -149,7 +150,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
149
150
|
private readonly runtimeListener;
|
|
150
151
|
|
|
151
152
|
private constructor(
|
|
152
|
-
baseLogger:
|
|
153
|
+
baseLogger: ITelemetryLoggerExt,
|
|
153
154
|
private readonly summaryWatcher: IClientSummaryWatcher,
|
|
154
155
|
private readonly configuration: ISummaryConfiguration,
|
|
155
156
|
private readonly submitSummaryCallback: (
|
|
@@ -252,7 +253,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
252
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)
|
|
253
254
|
// Tracked by AB#3883
|
|
254
255
|
this.runtime.deltaManager.on("op", this.deltaManagerListener);
|
|
255
|
-
this.runtime.on
|
|
256
|
+
this.runtime.on("op", this.runtimeListener);
|
|
256
257
|
}
|
|
257
258
|
|
|
258
259
|
private async handleSummaryAck(): Promise<number> {
|
|
@@ -347,7 +348,7 @@ export class RunningSummarizer implements IDisposable {
|
|
|
347
348
|
|
|
348
349
|
public dispose(): void {
|
|
349
350
|
this.runtime.deltaManager.off("op", this.deltaManagerListener);
|
|
350
|
-
this.runtime.off
|
|
351
|
+
this.runtime.off("op", this.runtimeListener);
|
|
351
352
|
this.summaryWatcher.dispose();
|
|
352
353
|
this.heuristicRunner?.dispose();
|
|
353
354
|
this.heuristicRunner = undefined;
|