@fluidframework/container-runtime 0.57.2 → 0.58.1000
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/dist/batchTracker.d.ts +26 -0
- package/dist/batchTracker.d.ts.map +1 -0
- package/dist/batchTracker.js +59 -0
- package/dist/batchTracker.js.map +1 -0
- package/dist/containerRuntime.d.ts +2 -1
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +63 -27
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.js +1 -1
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.js +1 -1
- package/dist/dataStores.js.map +1 -1
- package/dist/garbageCollection.d.ts +1 -0
- package/dist/garbageCollection.d.ts.map +1 -1
- package/dist/garbageCollection.js +6 -4
- package/dist/garbageCollection.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +1 -6
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/runningSummarizer.d.ts +1 -1
- package/dist/runningSummarizer.d.ts.map +1 -1
- package/dist/runningSummarizer.js +1 -1
- package/dist/runningSummarizer.js.map +1 -1
- package/dist/summarizer.d.ts +3 -4
- package/dist/summarizer.d.ts.map +1 -1
- package/dist/summarizer.js +8 -9
- package/dist/summarizer.js.map +1 -1
- package/dist/summaryGenerator.d.ts +1 -1
- package/dist/summaryGenerator.d.ts.map +1 -1
- package/dist/summaryGenerator.js +1 -1
- package/dist/summaryGenerator.js.map +1 -1
- package/dist/summaryManager.d.ts +2 -6
- package/dist/summaryManager.d.ts.map +1 -1
- package/dist/summaryManager.js +4 -10
- package/dist/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +26 -0
- package/lib/batchTracker.d.ts.map +1 -0
- package/lib/batchTracker.js +54 -0
- package/lib/batchTracker.js.map +1 -0
- package/lib/containerRuntime.d.ts +2 -1
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +63 -27
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.js +2 -2
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.js +1 -1
- package/lib/dataStores.js.map +1 -1
- package/lib/garbageCollection.d.ts +1 -0
- package/lib/garbageCollection.d.ts.map +1 -1
- package/lib/garbageCollection.js +4 -2
- package/lib/garbageCollection.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +1 -6
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/runningSummarizer.d.ts +1 -1
- package/lib/runningSummarizer.d.ts.map +1 -1
- package/lib/runningSummarizer.js +1 -1
- package/lib/runningSummarizer.js.map +1 -1
- package/lib/summarizer.d.ts +3 -4
- package/lib/summarizer.d.ts.map +1 -1
- package/lib/summarizer.js +8 -9
- package/lib/summarizer.js.map +1 -1
- package/lib/summaryGenerator.d.ts +1 -1
- package/lib/summaryGenerator.d.ts.map +1 -1
- package/lib/summaryGenerator.js +1 -1
- package/lib/summaryGenerator.js.map +1 -1
- package/lib/summaryManager.d.ts +2 -6
- package/lib/summaryManager.d.ts.map +1 -1
- package/lib/summaryManager.js +5 -11
- package/lib/summaryManager.js.map +1 -1
- package/package.json +15 -15
- package/src/batchTracker.ts +80 -0
- package/src/containerRuntime.ts +84 -31
- package/src/dataStoreContext.ts +2 -2
- package/src/dataStores.ts +1 -1
- package/src/garbageCollection.ts +11 -10
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +4 -8
- package/src/runningSummarizer.ts +3 -3
- package/src/summarizer.ts +8 -8
- package/src/summaryGenerator.ts +2 -2
- package/src/summaryManager.ts +5 -20
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
/// <reference types="node" />
|
|
6
|
+
import { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
7
|
+
import EventEmitter from "events";
|
|
8
|
+
export declare class BatchTracker {
|
|
9
|
+
private readonly batchEventEmitter;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private startBatchSequenceNumber;
|
|
12
|
+
private trackedBatchCount;
|
|
13
|
+
private batchProcessingStartTimeStamp;
|
|
14
|
+
constructor(batchEventEmitter: EventEmitter, logger: ITelemetryLogger, batchLengthThreshold: number, batchCountSamplingRate: number, dateTimeProvider?: () => number);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Track batch sizes in terms of op counts and processing times
|
|
18
|
+
*
|
|
19
|
+
* @param batchEventEmitter - event emitter which tracks the lifecycle of batch operations
|
|
20
|
+
* @param logger - logger
|
|
21
|
+
* @param batchLengthThreshold - threshold for the length of a batch when to send an error event
|
|
22
|
+
* @param batchCountSamplingRate - rate for batches for which to send an event with its characteristics
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
25
|
+
export declare const BindBatchTracker: (batchEventEmitter: EventEmitter, logger: ITelemetryLogger, batchLengthThreshold?: number, batchCountSamplingRate?: number) => BatchTracker;
|
|
26
|
+
//# sourceMappingURL=batchTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchTracker.d.ts","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAItE,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,qBAAa,YAAY;IAOjB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,6BAA6B,CAAqB;gBAGrC,iBAAiB,EAAE,YAAY,EAChD,MAAM,EAAE,gBAAgB,EACxB,oBAAoB,EAAE,MAAM,EAC5B,sBAAsB,EAAE,MAAM,EAC9B,gBAAgB,GAAE,MAAM,MAAgC;CAyC/D;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,sBACN,YAAY,UACvB,gBAAgB,yBACF,MAAM,2BACJ,MAAM,iBAC4D,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.BindBatchTracker = exports.BatchTracker = void 0;
|
|
8
|
+
const common_utils_1 = require("@fluidframework/common-utils");
|
|
9
|
+
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
10
|
+
class BatchTracker {
|
|
11
|
+
constructor(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate, dateTimeProvider = () => common_utils_1.performance.now()) {
|
|
12
|
+
this.batchEventEmitter = batchEventEmitter;
|
|
13
|
+
this.trackedBatchCount = 0;
|
|
14
|
+
this.logger = telemetry_utils_1.ChildLogger.create(logger, "Batching");
|
|
15
|
+
this.batchEventEmitter.on("batchBegin", (message) => {
|
|
16
|
+
this.startBatchSequenceNumber = message.sequenceNumber;
|
|
17
|
+
this.batchProcessingStartTimeStamp = dateTimeProvider();
|
|
18
|
+
this.trackedBatchCount++;
|
|
19
|
+
});
|
|
20
|
+
this.batchEventEmitter.on("batchEnd", (error, message) => {
|
|
21
|
+
common_utils_1.assert(this.startBatchSequenceNumber !== undefined && this.batchProcessingStartTimeStamp !== undefined, 0x2ba /* "batchBegin must fire before batchEnd" */);
|
|
22
|
+
const length = message.sequenceNumber - this.startBatchSequenceNumber + 1;
|
|
23
|
+
if (length >= batchLengthThreshold) {
|
|
24
|
+
this.logger.sendErrorEvent({
|
|
25
|
+
eventName: "LengthTooBig",
|
|
26
|
+
length,
|
|
27
|
+
threshold: batchLengthThreshold,
|
|
28
|
+
batchEndSequenceNumber: message.sequenceNumber,
|
|
29
|
+
duration: dateTimeProvider() - this.batchProcessingStartTimeStamp,
|
|
30
|
+
batchError: error !== undefined,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (this.trackedBatchCount % batchCountSamplingRate === 0) {
|
|
34
|
+
this.logger.sendPerformanceEvent({
|
|
35
|
+
eventName: "Length",
|
|
36
|
+
length,
|
|
37
|
+
samplingRate: batchCountSamplingRate,
|
|
38
|
+
batchEndSequenceNumber: message.sequenceNumber,
|
|
39
|
+
duration: dateTimeProvider() - this.batchProcessingStartTimeStamp,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
this.startBatchSequenceNumber = undefined;
|
|
43
|
+
this.batchProcessingStartTimeStamp = undefined;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.BatchTracker = BatchTracker;
|
|
48
|
+
/**
|
|
49
|
+
* Track batch sizes in terms of op counts and processing times
|
|
50
|
+
*
|
|
51
|
+
* @param batchEventEmitter - event emitter which tracks the lifecycle of batch operations
|
|
52
|
+
* @param logger - logger
|
|
53
|
+
* @param batchLengthThreshold - threshold for the length of a batch when to send an error event
|
|
54
|
+
* @param batchCountSamplingRate - rate for batches for which to send an event with its characteristics
|
|
55
|
+
* @returns
|
|
56
|
+
*/
|
|
57
|
+
const BindBatchTracker = (batchEventEmitter, logger, batchLengthThreshold = 128, batchCountSamplingRate = 1000) => new BatchTracker(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate);
|
|
58
|
+
exports.BindBatchTracker = BindBatchTracker;
|
|
59
|
+
//# sourceMappingURL=batchTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchTracker.js","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,+DAAmE;AAEnE,qEAA8D;AAG9D,MAAa,YAAY;IAMrB,YACqB,iBAA+B,EAChD,MAAwB,EACxB,oBAA4B,EAC5B,sBAA8B,EAC9B,mBAAiC,GAAG,EAAE,CAAC,0BAAW,CAAC,GAAG,EAAE;QAJvC,sBAAiB,GAAjB,iBAAiB,CAAc;QAJ5C,sBAAiB,GAAW,CAAC,CAAC;QAUlC,IAAI,CAAC,MAAM,GAAG,6BAAW,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAErD,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAkC,EAAE,EAAE;YAC3E,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;YACvD,IAAI,CAAC,6BAA6B,GAAG,gBAAgB,EAAE,CAAC;YACxD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,KAAsB,EAAE,OAAkC,EAAE,EAAE;YACjG,qBAAM,CACF,IAAI,CAAC,wBAAwB,KAAK,SAAS,IAAI,IAAI,CAAC,6BAA6B,KAAK,SAAS,EAC/F,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAExD,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;YAC1E,IAAI,MAAM,IAAI,oBAAoB,EAAE;gBAChC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;oBACvB,SAAS,EAAE,cAAc;oBACzB,MAAM;oBACN,SAAS,EAAE,oBAAoB;oBAC/B,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;oBACjE,UAAU,EAAE,KAAK,KAAK,SAAS;iBAClC,CAAC,CAAC;aACN;YAED,IAAI,IAAI,CAAC,iBAAiB,GAAG,sBAAsB,KAAK,CAAC,EAAE;gBACvD,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAC7B,SAAS,EAAE,QAAQ;oBACnB,MAAM;oBACN,YAAY,EAAE,sBAAsB;oBACpC,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;iBACpE,CAAC,CAAC;aACN;YAED,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,6BAA6B,GAAG,SAAS,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AApDD,oCAoDC;AAED;;;;;;;;GAQG;AACI,MAAM,gBAAgB,GAAG,CAC5B,iBAA+B,EAC/B,MAAwB,EACxB,uBAA+B,GAAG,EAClC,yBAAiC,IAAI,EACvC,EAAE,CAAC,IAAI,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,sBAAsB,CAAC,CAAA;AALjF,QAAA,gBAAgB,oBAKiE","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, performance } from \"@fluidframework/common-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport EventEmitter from \"events\";\n\nexport class BatchTracker {\n private readonly logger: ITelemetryLogger;\n private startBatchSequenceNumber: number | undefined;\n private trackedBatchCount: number = 0;\n private batchProcessingStartTimeStamp: number | undefined;\n\n constructor(\n private readonly batchEventEmitter: EventEmitter,\n logger: ITelemetryLogger,\n batchLengthThreshold: number,\n batchCountSamplingRate: number,\n dateTimeProvider: () => number = () => performance.now(),\n ) {\n this.logger = ChildLogger.create(logger, \"Batching\");\n\n this.batchEventEmitter.on(\"batchBegin\", (message: ISequencedDocumentMessage) => {\n this.startBatchSequenceNumber = message.sequenceNumber;\n this.batchProcessingStartTimeStamp = dateTimeProvider();\n this.trackedBatchCount++;\n });\n\n this.batchEventEmitter.on(\"batchEnd\", (error: any | undefined, message: ISequencedDocumentMessage) => {\n assert(\n this.startBatchSequenceNumber !== undefined && this.batchProcessingStartTimeStamp !== undefined,\n 0x2ba /* \"batchBegin must fire before batchEnd\" */);\n\n const length = message.sequenceNumber - this.startBatchSequenceNumber + 1;\n if (length >= batchLengthThreshold) {\n this.logger.sendErrorEvent({\n eventName: \"LengthTooBig\",\n length,\n threshold: batchLengthThreshold,\n batchEndSequenceNumber: message.sequenceNumber,\n duration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n batchError: error !== undefined,\n });\n }\n\n if (this.trackedBatchCount % batchCountSamplingRate === 0) {\n this.logger.sendPerformanceEvent({\n eventName: \"Length\",\n length,\n samplingRate: batchCountSamplingRate,\n batchEndSequenceNumber: message.sequenceNumber,\n duration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n });\n }\n\n this.startBatchSequenceNumber = undefined;\n this.batchProcessingStartTimeStamp = undefined;\n });\n }\n}\n\n/**\n * Track batch sizes in terms of op counts and processing times\n *\n * @param batchEventEmitter - event emitter which tracks the lifecycle of batch operations\n * @param logger - logger\n * @param batchLengthThreshold - threshold for the length of a batch when to send an error event\n * @param batchCountSamplingRate - rate for batches for which to send an event with its characteristics\n * @returns\n */\nexport const BindBatchTracker = (\n batchEventEmitter: EventEmitter,\n logger: ITelemetryLogger,\n batchLengthThreshold: number = 128,\n batchCountSamplingRate: number = 1000,\n) => new BatchTracker(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate)\n"]}
|
|
@@ -214,6 +214,7 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
214
214
|
private readonly summaryCollection;
|
|
215
215
|
private readonly summarizerNode;
|
|
216
216
|
private readonly _aliasingEnabled;
|
|
217
|
+
private readonly _maxOpSizeInBytes;
|
|
217
218
|
private readonly maxConsecutiveReconnects;
|
|
218
219
|
private readonly defaultMaxConsecutiveReconnects;
|
|
219
220
|
private _orderSequentiallyCalls;
|
|
@@ -231,7 +232,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
231
232
|
get disposed(): boolean;
|
|
232
233
|
private dirtyContainer;
|
|
233
234
|
private emitDirtyDocumentEvent;
|
|
234
|
-
private readonly summarizerWarning;
|
|
235
235
|
/**
|
|
236
236
|
* Summarizer is responsible for coordinating when to send generate and send summaries.
|
|
237
237
|
* It is the main entry point for summary work.
|
|
@@ -428,6 +428,7 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
428
428
|
submitDataStoreAliasOp(contents: any, localOpMetadata: unknown): void;
|
|
429
429
|
uploadBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;
|
|
430
430
|
private submit;
|
|
431
|
+
private submitMaybeChunkedMessages;
|
|
431
432
|
private submitChunkedMessage;
|
|
432
433
|
private submitSystemMessage;
|
|
433
434
|
private submitRuntimeMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerRuntime.d.ts","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":";AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAgD,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACpH,OAAO,EACH,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,SAAS,EACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACH,SAAS,EACT,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EAEb,QAAQ,
|
|
1
|
+
{"version":3,"file":"containerRuntime.d.ts","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":"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"}
|
package/dist/containerRuntime.js
CHANGED
|
@@ -29,6 +29,7 @@ const throttler_1 = require("./throttler");
|
|
|
29
29
|
const runWhileConnectedCoordinator_1 = require("./runWhileConnectedCoordinator");
|
|
30
30
|
const garbageCollection_1 = require("./garbageCollection");
|
|
31
31
|
const dataStore_1 = require("./dataStore");
|
|
32
|
+
const batchTracker_1 = require("./batchTracker");
|
|
32
33
|
var ContainerMessageType;
|
|
33
34
|
(function (ContainerMessageType) {
|
|
34
35
|
// An op to be delivered to store
|
|
@@ -71,10 +72,16 @@ var RuntimeHeaders;
|
|
|
71
72
|
/** True if the request is coming from an IFluidHandle. */
|
|
72
73
|
RuntimeHeaders["viaHandle"] = "viaHandle";
|
|
73
74
|
})(RuntimeHeaders = exports.RuntimeHeaders || (exports.RuntimeHeaders = {}));
|
|
74
|
-
// Local storage key to set the default flush mode to TurnBased
|
|
75
|
-
const turnBasedFlushModeKey = "Fluid.ContainerRuntime.FlushModeTurnBased";
|
|
76
75
|
const useDataStoreAliasingKey = "Fluid.ContainerRuntime.UseDataStoreAliasing";
|
|
77
76
|
const maxConsecutiveReconnectsKey = "Fluid.ContainerRuntime.MaxConsecutiveReconnects";
|
|
77
|
+
// Feature gate for the max op size. If the value is negative, chunking is enabled
|
|
78
|
+
// and all ops over 16k would be chunked. If the value is positive, all ops with
|
|
79
|
+
// a size strictly larger will be rejected and the container closed with an error.
|
|
80
|
+
const maxOpSizeInBytesKey = "Fluid.ContainerRuntime.MaxOpSizeInBytes";
|
|
81
|
+
// By default, we should reject any op larger than 768KB,
|
|
82
|
+
// in order to account for some extra overhead from serialization
|
|
83
|
+
// to not reach the 1MB limits in socket.io and Kafka.
|
|
84
|
+
const defaultMaxOpSizeInBytes = 768000;
|
|
78
85
|
var RuntimeMessage;
|
|
79
86
|
(function (RuntimeMessage) {
|
|
80
87
|
RuntimeMessage["FluidDataStoreOp"] = "component";
|
|
@@ -363,13 +370,13 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
363
370
|
this._storage = _storage;
|
|
364
371
|
this.defaultMaxConsecutiveReconnects = 15;
|
|
365
372
|
this._orderSequentiallyCalls = 0;
|
|
373
|
+
this._flushMode = runtime_definitions_1.FlushMode.TurnBased;
|
|
366
374
|
this.needsFlush = false;
|
|
367
375
|
this.flushTrigger = false;
|
|
368
376
|
this.paused = false;
|
|
369
377
|
this.consecutiveReconnects = 0;
|
|
370
378
|
this._disposed = false;
|
|
371
379
|
this.emitDirtyDocumentEvent = true;
|
|
372
|
-
this.summarizerWarning = (warning) => this.mc.logger.sendTelemetryEvent({ eventName: "summarizerWarning" }, warning);
|
|
373
380
|
/**
|
|
374
381
|
* Used to apply stashed ops at their reference sequence number.
|
|
375
382
|
* Normal op processing is synchronous, but applying stashed ops is async since the
|
|
@@ -441,11 +448,10 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
441
448
|
this.chunkMap = new Map(chunks);
|
|
442
449
|
this.handleContext = new containerHandleContext_1.ContainerFluidHandleContext("", this);
|
|
443
450
|
this.mc = telemetry_utils_1.loggerToMonitoringContext(telemetry_utils_1.ChildLogger.create(this.logger, "ContainerRuntime"));
|
|
444
|
-
this._flushMode =
|
|
445
|
-
((_b = this.mc.config.getBoolean(turnBasedFlushModeKey)) !== null && _b !== void 0 ? _b : false) ? runtime_definitions_1.FlushMode.TurnBased : runtime_definitions_1.FlushMode.Immediate;
|
|
446
451
|
this._aliasingEnabled =
|
|
447
|
-
((
|
|
448
|
-
((
|
|
452
|
+
((_b = this.mc.config.getBoolean(useDataStoreAliasingKey)) !== null && _b !== void 0 ? _b : false) ||
|
|
453
|
+
((_c = runtimeOptions.useDataStoreAliasing) !== null && _c !== void 0 ? _c : false);
|
|
454
|
+
this._maxOpSizeInBytes = ((_d = this.mc.config.getNumber(maxOpSizeInBytesKey)) !== null && _d !== void 0 ? _d : defaultMaxOpSizeInBytes);
|
|
449
455
|
this.maxConsecutiveReconnects = (_e = this.mc.config.getNumber(maxConsecutiveReconnectsKey)) !== null && _e !== void 0 ? _e : this.defaultMaxConsecutiveReconnects;
|
|
450
456
|
this.garbageCollector = garbageCollection_1.GarbageCollector.create(this, this.runtimeOptions.gcOptions, (unusedRoutes) => this.dataStores.deleteUnusedRoutes(unusedRoutes), (nodePath) => this.dataStores.getNodePackagePath(nodePath),
|
|
451
457
|
/**
|
|
@@ -530,7 +536,6 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
530
536
|
throttler_1.formExponentialFn({ coefficient: 20, initialDelay: 0 })), {
|
|
531
537
|
initialDelayMs: this.runtimeOptions.summaryOptions.initialSummarizerDelayMs,
|
|
532
538
|
}, this.runtimeOptions.summaryOptions.summarizerOptions);
|
|
533
|
-
this.summaryManager.on("summarizerWarning", this.summarizerWarning);
|
|
534
539
|
this.summaryManager.start();
|
|
535
540
|
}
|
|
536
541
|
}
|
|
@@ -561,6 +566,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
561
566
|
// logging container load stats
|
|
562
567
|
this.logger.sendTelemetryEvent(Object.assign(Object.assign(Object.assign({ eventName: "ContainerLoadStats" }, this.createContainerMetadata), this.dataStores.containerLoadStats), { summaryCount: this.summaryCount, summaryFormatVersion: metadata === null || metadata === void 0 ? void 0 : metadata.summaryFormatVersion, disableIsolatedChannels: metadata === null || metadata === void 0 ? void 0 : metadata.disableIsolatedChannels, gcVersion: metadata === null || metadata === void 0 ? void 0 : metadata.gcFeature }));
|
|
563
568
|
connectionTelemetry_1.ReportOpPerfTelemetry(this.context.clientId, this.deltaManager, this.logger);
|
|
569
|
+
batchTracker_1.BindBatchTracker(this, this.logger);
|
|
564
570
|
}
|
|
565
571
|
get IContainerRuntime() { return this; }
|
|
566
572
|
get IFluidRouter() { return this; }
|
|
@@ -576,7 +582,8 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
576
582
|
var _a, _b, _c;
|
|
577
583
|
// If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:
|
|
578
584
|
// back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45
|
|
579
|
-
const
|
|
585
|
+
const backCompatContext = context;
|
|
586
|
+
const passLogger = (_a = backCompatContext.taggedLogger) !== null && _a !== void 0 ? _a : new telemetry_utils_1.TaggedLoggerAdapter(backCompatContext.logger);
|
|
580
587
|
const logger = telemetry_utils_1.ChildLogger.create(passLogger, undefined, {
|
|
581
588
|
all: {
|
|
582
589
|
runtimeVersion: packageVersion_1.pkgVersion,
|
|
@@ -637,7 +644,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
637
644
|
// Unless bypass is explicitly set, then take action when sequence numbers mismatch.
|
|
638
645
|
if (loadSequenceNumberVerification !== "bypass" && runtimeSequenceNumber !== protocolSequenceNumber) {
|
|
639
646
|
// "Load from summary, runtime metadata sequenceNumber !== initialSequenceNumber"
|
|
640
|
-
const error = new container_utils_1.DataCorruptionError("
|
|
647
|
+
const error = new container_utils_1.DataCorruptionError("Summary metadata mismatch", { runtimeSequenceNumber, protocolSequenceNumber });
|
|
641
648
|
if (loadSequenceNumberVerification === "log") {
|
|
642
649
|
logger.sendErrorEvent({ eventName: "SequenceNumberMismatch" }, error);
|
|
643
650
|
}
|
|
@@ -739,7 +746,6 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
739
746
|
attachState: this.attachState,
|
|
740
747
|
}, error);
|
|
741
748
|
if (this.summaryManager !== undefined) {
|
|
742
|
-
this.summaryManager.off("summarizerWarning", this.summarizerWarning);
|
|
743
749
|
this.summaryManager.dispose();
|
|
744
750
|
}
|
|
745
751
|
this.garbageCollector.dispose();
|
|
@@ -903,7 +909,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
903
909
|
if (this.consecutiveReconnects === Math.floor(this.maxConsecutiveReconnects / 2)) {
|
|
904
910
|
// If we're halfway through the max reconnects, send an event in order
|
|
905
911
|
// to better identify false positives, if any. If the rate of this event
|
|
906
|
-
// matches
|
|
912
|
+
// matches Container Close count below, we can safely cut down
|
|
907
913
|
// maxConsecutiveReconnects to half.
|
|
908
914
|
this.mc.logger.sendTelemetryEvent({
|
|
909
915
|
eventName: "ReconnectsWithNoProgress",
|
|
@@ -968,7 +974,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
968
974
|
this.deltaManager.off("op", this.onOp);
|
|
969
975
|
this.context.pendingLocalState = undefined;
|
|
970
976
|
if (!this.shouldContinueReconnecting()) {
|
|
971
|
-
this.closeFn(new container_utils_1.GenericError("
|
|
977
|
+
this.closeFn(new container_utils_1.GenericError("Runtime detected too many reconnects with no progress syncing local ops", undefined, // error
|
|
972
978
|
{ attempts: this.consecutiveReconnects }));
|
|
973
979
|
return;
|
|
974
980
|
}
|
|
@@ -1114,7 +1120,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1114
1120
|
callback();
|
|
1115
1121
|
}
|
|
1116
1122
|
catch (error) {
|
|
1117
|
-
this.closeFn(new container_utils_1.GenericError("
|
|
1123
|
+
this.closeFn(new container_utils_1.GenericError("orderSequentially callback exception", error));
|
|
1118
1124
|
throw error; // throw the original error for the consumer of the runtime
|
|
1119
1125
|
}
|
|
1120
1126
|
finally {
|
|
@@ -1371,7 +1377,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1371
1377
|
* @param options - options controlling how the summary is generated or submitted
|
|
1372
1378
|
*/
|
|
1373
1379
|
async submitSummary(options) {
|
|
1374
|
-
var _a, _b;
|
|
1380
|
+
var _a, _b, _c;
|
|
1375
1381
|
const { fullTree, refreshLatestAck, summaryLogger } = options;
|
|
1376
1382
|
if (refreshLatestAck) {
|
|
1377
1383
|
const latestSummaryRefSeq = await this.refreshLatestSummaryAckFromServer(telemetry_utils_1.ChildLogger.create(summaryLogger, undefined, { all: { safeSummary: true } }));
|
|
@@ -1389,6 +1395,14 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1389
1395
|
await this.deltaManager.inbound.pause();
|
|
1390
1396
|
const summaryRefSeqNum = this.deltaManager.lastSequenceNumber;
|
|
1391
1397
|
const message = `Summary @${summaryRefSeqNum}:${this.deltaManager.minimumSequenceNumber}`;
|
|
1398
|
+
// We should be here is we haven't processed be here. If we are of if the last message's sequence number
|
|
1399
|
+
// doesn't match the last processed sequence number, log an error.
|
|
1400
|
+
if (summaryRefSeqNum !== ((_a = this.deltaManager.lastMessage) === null || _a === void 0 ? void 0 : _a.sequenceNumber)) {
|
|
1401
|
+
summaryLogger.sendErrorEvent({
|
|
1402
|
+
eventName: "LastSequenceMismatch",
|
|
1403
|
+
message,
|
|
1404
|
+
});
|
|
1405
|
+
}
|
|
1392
1406
|
this.summarizerNode.startSummary(summaryRefSeqNum, summaryLogger);
|
|
1393
1407
|
// Helper function to check whether we should still continue between each async step.
|
|
1394
1408
|
const checkContinue = () => {
|
|
@@ -1453,7 +1467,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1453
1467
|
const dataStoreTree = this.disableIsolatedChannels ? summaryTree : summaryTree.tree[runtime_definitions_1.channelsTreeName];
|
|
1454
1468
|
common_utils_1.assert(dataStoreTree.type === protocol_definitions_1.SummaryType.Tree, 0x1fc /* "summary is not a tree" */);
|
|
1455
1469
|
const handleCount = Object.values(dataStoreTree.tree).filter((value) => value.type === protocol_definitions_1.SummaryType.Handle).length;
|
|
1456
|
-
const summaryStats = Object.assign({ dataStoreCount: this.dataStores.size, summarizedDataStoreCount: this.dataStores.size - handleCount, gcStateUpdatedDataStoreCount: (
|
|
1470
|
+
const summaryStats = Object.assign({ dataStoreCount: this.dataStores.size, summarizedDataStoreCount: this.dataStores.size - handleCount, gcStateUpdatedDataStoreCount: (_b = summarizeResult.gcStats) === null || _b === void 0 ? void 0 : _b.updatedDataStoreCount }, partialStats);
|
|
1457
1471
|
const generateSummaryData = {
|
|
1458
1472
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
1459
1473
|
summaryTree,
|
|
@@ -1469,7 +1483,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1469
1483
|
const summaryContext = lastAck === undefined
|
|
1470
1484
|
? {
|
|
1471
1485
|
proposalHandle: undefined,
|
|
1472
|
-
ackHandle: (
|
|
1486
|
+
ackHandle: (_c = this.context.getLoadedFromVersion()) === null || _c === void 0 ? void 0 : _c.id,
|
|
1473
1487
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
1474
1488
|
}
|
|
1475
1489
|
: {
|
|
@@ -1600,16 +1614,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1600
1614
|
});
|
|
1601
1615
|
}
|
|
1602
1616
|
}
|
|
1603
|
-
|
|
1604
|
-
// there will be a lot of escape characters that can make it up to 2x bigger!
|
|
1605
|
-
// This is Ok, because DeltaManager.shouldSplit() will have 2 * maxMessageSize limit
|
|
1606
|
-
if (!serializedContent || serializedContent.length <= maxOpSize) {
|
|
1607
|
-
clientSequenceNumber = this.submitRuntimeMessage(type, content,
|
|
1608
|
-
/* batch: */ this._flushMode === runtime_definitions_1.FlushMode.TurnBased, opMetadataInternal);
|
|
1609
|
-
}
|
|
1610
|
-
else {
|
|
1611
|
-
clientSequenceNumber = this.submitChunkedMessage(type, serializedContent, maxOpSize);
|
|
1612
|
-
}
|
|
1617
|
+
clientSequenceNumber = this.submitMaybeChunkedMessages(type, content, serializedContent, maxOpSize, this._flushMode === runtime_definitions_1.FlushMode.TurnBased, opMetadataInternal);
|
|
1613
1618
|
}
|
|
1614
1619
|
// Let the PendingStateManager know that a message was submitted.
|
|
1615
1620
|
this.pendingStateManager.onSubmitMessage(type, clientSequenceNumber, this.deltaManager.lastSequenceNumber, content, localOpMetadata, opMetadataInternal);
|
|
@@ -1617,6 +1622,35 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1617
1622
|
this.updateDocumentDirtyState(true);
|
|
1618
1623
|
}
|
|
1619
1624
|
}
|
|
1625
|
+
submitMaybeChunkedMessages(type, content, serializedContent, serverMaxOpSize, batch, opMetadataInternal = undefined) {
|
|
1626
|
+
if (this._maxOpSizeInBytes >= 0) {
|
|
1627
|
+
// Chunking disabled
|
|
1628
|
+
if (!serializedContent || serializedContent.length <= this._maxOpSizeInBytes) {
|
|
1629
|
+
return this.submitRuntimeMessage(type, content, batch, opMetadataInternal);
|
|
1630
|
+
}
|
|
1631
|
+
// When chunking is disabled, we ignore the server max message size
|
|
1632
|
+
// and if the content length is larger than the client configured message size
|
|
1633
|
+
// instead of splitting the content, we will fail by explicitly close the container
|
|
1634
|
+
this.closeFn(new container_utils_1.GenericError("OpTooLarge",
|
|
1635
|
+
/* error */ undefined, {
|
|
1636
|
+
length: {
|
|
1637
|
+
value: serializedContent.length,
|
|
1638
|
+
tag: telemetry_utils_1.TelemetryDataTag.PackageData,
|
|
1639
|
+
},
|
|
1640
|
+
limit: {
|
|
1641
|
+
value: this._maxOpSizeInBytes,
|
|
1642
|
+
tag: telemetry_utils_1.TelemetryDataTag.PackageData,
|
|
1643
|
+
},
|
|
1644
|
+
}));
|
|
1645
|
+
return -1;
|
|
1646
|
+
}
|
|
1647
|
+
// Chunking enabled, fallback on the server's max message size
|
|
1648
|
+
// and split the content accordingly
|
|
1649
|
+
if (!serializedContent || serializedContent.length <= serverMaxOpSize) {
|
|
1650
|
+
return this.submitRuntimeMessage(type, content, batch, opMetadataInternal);
|
|
1651
|
+
}
|
|
1652
|
+
return this.submitChunkedMessage(type, serializedContent, serverMaxOpSize);
|
|
1653
|
+
}
|
|
1620
1654
|
submitChunkedMessage(type, content, maxOpSize) {
|
|
1621
1655
|
const contentLength = content.length;
|
|
1622
1656
|
const chunkN = Math.floor((contentLength - 1) / maxOpSize) + 1;
|
|
@@ -1695,6 +1729,8 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1695
1729
|
const readAndParseBlob = async (id) => driver_utils_1.readAndParse(this.storage, id);
|
|
1696
1730
|
const result = await this.summarizerNode.refreshLatestSummary(proposalHandle, summaryRefSeq, async () => this.fetchSnapshotFromStorage(ackHandle, summaryLogger, {
|
|
1697
1731
|
eventName: "RefreshLatestSummaryGetSnapshot",
|
|
1732
|
+
ackHandle,
|
|
1733
|
+
summaryRefSeq,
|
|
1698
1734
|
fetchLatest: false,
|
|
1699
1735
|
}), readAndParseBlob, summaryLogger);
|
|
1700
1736
|
// Notify the garbage collector so it can update its latest summary state.
|