@fluidframework/container-runtime 0.57.0-51086 → 0.58.0-55561
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 +12 -7
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +125 -55
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -36
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +5 -27
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +5 -7
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +12 -7
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +1 -1
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +3 -3
- package/dist/dataStores.js.map +1 -1
- package/dist/garbageCollection.d.ts +25 -11
- package/dist/garbageCollection.d.ts.map +1 -1
- package/dist/garbageCollection.js +100 -57
- package/dist/garbageCollection.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.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.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 +12 -7
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +126 -56
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -36
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +4 -26
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +5 -7
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +13 -8
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +1 -1
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +3 -3
- package/lib/dataStores.js.map +1 -1
- package/lib/garbageCollection.d.ts +25 -11
- package/lib/garbageCollection.d.ts.map +1 -1
- package/lib/garbageCollection.js +98 -55
- package/lib/garbageCollection.js.map +1 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +0 -1
- package/lib/index.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.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 +12 -12
- package/src/batchTracker.ts +80 -0
- package/src/containerRuntime.ts +180 -63
- package/src/dataStore.ts +6 -42
- package/src/dataStoreContext.ts +17 -15
- package/src/dataStores.ts +9 -4
- package/src/garbageCollection.ts +125 -67
- package/src/index.ts +0 -1
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerRuntime.d.ts","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":"AAAA;;;GAGG
|
|
1
|
+
{"version":3,"file":"containerRuntime.d.ts","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":"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"}
|
package/lib/containerRuntime.js
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
1
|
import { AttachState, LoaderHeader, } from "@fluidframework/container-definitions";
|
|
6
2
|
import { assert, Trace, TypedEventEmitter, unreachableCase, performance, } from "@fluidframework/common-utils";
|
|
7
3
|
import { ChildLogger, raiseConnectedEvent, PerformanceEvent, normalizeError, TaggedLoggerAdapter, loggerToMonitoringContext, TelemetryDataTag, } from "@fluidframework/telemetry-utils";
|
|
@@ -29,7 +25,8 @@ import { SummarizerClientElection, summarizerClientType } from "./summarizerClie
|
|
|
29
25
|
import { formExponentialFn, Throttler } from "./throttler";
|
|
30
26
|
import { RunWhileConnectedCoordinator } from "./runWhileConnectedCoordinator";
|
|
31
27
|
import { GarbageCollector, gcTreeKey, } from "./garbageCollection";
|
|
32
|
-
import {
|
|
28
|
+
import { channelToDataStore, isDataStoreAliasMessage, } from "./dataStore";
|
|
29
|
+
import { BindBatchTracker } from "./batchTracker";
|
|
33
30
|
export var ContainerMessageType;
|
|
34
31
|
(function (ContainerMessageType) {
|
|
35
32
|
// An op to be delivered to store
|
|
@@ -72,9 +69,16 @@ export var RuntimeHeaders;
|
|
|
72
69
|
/** True if the request is coming from an IFluidHandle. */
|
|
73
70
|
RuntimeHeaders["viaHandle"] = "viaHandle";
|
|
74
71
|
})(RuntimeHeaders || (RuntimeHeaders = {}));
|
|
75
|
-
// Local storage key to set the default flush mode to TurnBased
|
|
76
|
-
const turnBasedFlushModeKey = "Fluid.ContainerRuntime.FlushModeTurnBased";
|
|
77
72
|
const useDataStoreAliasingKey = "Fluid.ContainerRuntime.UseDataStoreAliasing";
|
|
73
|
+
const maxConsecutiveReconnectsKey = "Fluid.ContainerRuntime.MaxConsecutiveReconnects";
|
|
74
|
+
// Feature gate for the max op size. If the value is negative, chunking is enabled
|
|
75
|
+
// and all ops over 16k would be chunked. If the value is positive, all ops with
|
|
76
|
+
// a size strictly larger will be rejected and the container closed with an error.
|
|
77
|
+
const maxOpSizeInBytesKey = "Fluid.ContainerRuntime.MaxOpSizeInBytes";
|
|
78
|
+
// By default, we should reject any op larger than 768KB,
|
|
79
|
+
// in order to account for some extra overhead from serialization
|
|
80
|
+
// to not reach the 1MB limits in socket.io and Kafka.
|
|
81
|
+
const defaultMaxOpSizeInBytes = 768000;
|
|
78
82
|
export var RuntimeMessage;
|
|
79
83
|
(function (RuntimeMessage) {
|
|
80
84
|
RuntimeMessage["FluidDataStoreOp"] = "component";
|
|
@@ -348,7 +352,7 @@ export function getDeviceSpec() {
|
|
|
348
352
|
*/
|
|
349
353
|
export class ContainerRuntime extends TypedEventEmitter {
|
|
350
354
|
constructor(context, registry, metadata, electedSummarizerData, chunks, dataStoreAliasMap, runtimeOptions, containerScope, logger, existing, blobManagerSnapshot, requestHandler, _storage) {
|
|
351
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
355
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
352
356
|
super();
|
|
353
357
|
this.context = context;
|
|
354
358
|
this.registry = registry;
|
|
@@ -357,13 +361,15 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
357
361
|
this.logger = logger;
|
|
358
362
|
this.requestHandler = requestHandler;
|
|
359
363
|
this._storage = _storage;
|
|
364
|
+
this.defaultMaxConsecutiveReconnects = 15;
|
|
360
365
|
this._orderSequentiallyCalls = 0;
|
|
366
|
+
this._flushMode = FlushMode.TurnBased;
|
|
361
367
|
this.needsFlush = false;
|
|
362
368
|
this.flushTrigger = false;
|
|
363
369
|
this.paused = false;
|
|
370
|
+
this.consecutiveReconnects = 0;
|
|
364
371
|
this._disposed = false;
|
|
365
372
|
this.emitDirtyDocumentEvent = true;
|
|
366
|
-
this.summarizerWarning = (warning) => this.mc.logger.sendTelemetryEvent({ eventName: "summarizerWarning" }, warning);
|
|
367
373
|
/**
|
|
368
374
|
* Used to apply stashed ops at their reference sequence number.
|
|
369
375
|
* Normal op processing is synchronous, but applying stashed ops is async since the
|
|
@@ -413,7 +419,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
413
419
|
throw new UsageError(`Can't summarize, disableSummaries: ${this.summariesDisabled}`);
|
|
414
420
|
}
|
|
415
421
|
};
|
|
416
|
-
this.
|
|
422
|
+
this.messageAtLastSummary = metadata === null || metadata === void 0 ? void 0 : metadata.message;
|
|
417
423
|
// If this is an existing container, we get values from metadata.
|
|
418
424
|
// otherwise, we initialize them.
|
|
419
425
|
if (existing) {
|
|
@@ -435,25 +441,17 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
435
441
|
this.chunkMap = new Map(chunks);
|
|
436
442
|
this.handleContext = new ContainerFluidHandleContext("", this);
|
|
437
443
|
this.mc = loggerToMonitoringContext(ChildLogger.create(this.logger, "ContainerRuntime"));
|
|
438
|
-
this._flushMode =
|
|
439
|
-
((_b = this.mc.config.getBoolean(turnBasedFlushModeKey)) !== null && _b !== void 0 ? _b : false) ? FlushMode.TurnBased : FlushMode.Immediate;
|
|
440
444
|
this._aliasingEnabled =
|
|
441
|
-
((
|
|
442
|
-
((
|
|
445
|
+
((_b = this.mc.config.getBoolean(useDataStoreAliasingKey)) !== null && _b !== void 0 ? _b : false) ||
|
|
446
|
+
((_c = runtimeOptions.useDataStoreAliasing) !== null && _c !== void 0 ? _c : false);
|
|
447
|
+
this._maxOpSizeInBytes = ((_d = this.mc.config.getNumber(maxOpSizeInBytesKey)) !== null && _d !== void 0 ? _d : defaultMaxOpSizeInBytes);
|
|
448
|
+
this.maxConsecutiveReconnects = (_e = this.mc.config.getNumber(maxConsecutiveReconnectsKey)) !== null && _e !== void 0 ? _e : this.defaultMaxConsecutiveReconnects;
|
|
449
|
+
this.garbageCollector = GarbageCollector.create(this, this.runtimeOptions.gcOptions, (unusedRoutes) => this.dataStores.deleteUnusedRoutes(unusedRoutes), (nodePath) => this.dataStores.getNodePackagePath(nodePath),
|
|
443
450
|
/**
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
* We use the timestamp of the last op for current timestamp. However, there can be cases where
|
|
447
|
-
* we don't have an op (on demand summaries for instance). In those cases, we will use the timestamp
|
|
448
|
-
* of this client's connection.
|
|
451
|
+
* Returns the timestamp of the last message seen by this client. This is used by garbage collector as
|
|
452
|
+
* the current reference timestamp for tracking unreferenced objects.
|
|
449
453
|
*/
|
|
450
|
-
|
|
451
|
-
var _a, _b, _c;
|
|
452
|
-
const client = this.clientId !== undefined ? this.getAudience().getMember(this.clientId) : undefined;
|
|
453
|
-
const timestamp = client === null || client === void 0 ? void 0 : client.timestamp;
|
|
454
|
-
return (_c = (_b = (_a = this.deltaManager.lastMessage) === null || _a === void 0 ? void 0 : _a.timestamp) !== null && _b !== void 0 ? _b : timestamp) !== null && _c !== void 0 ? _c : Date.now();
|
|
455
|
-
};
|
|
456
|
-
this.garbageCollector = GarbageCollector.create(this, this.runtimeOptions.gcOptions, (unusedRoutes) => this.dataStores.deleteUnusedRoutes(unusedRoutes), (nodePath) => this.dataStores.getNodePackagePath(nodePath), getCurrentTimestamp, this.closeFn, context.baseSnapshot, async (id) => readAndParse(this.storage, id), this.mc.logger, existing, metadata);
|
|
454
|
+
() => { var _a, _b, _c; return (_b = (_a = this.deltaManager.lastMessage) === null || _a === void 0 ? void 0 : _a.timestamp) !== null && _b !== void 0 ? _b : (_c = this.messageAtLastSummary) === null || _c === void 0 ? void 0 : _c.timestamp; }, () => { var _a; return (_a = this.messageAtLastSummary) === null || _a === void 0 ? void 0 : _a.timestamp; }, context.baseSnapshot, async (id) => readAndParse(this.storage, id), this.mc.logger, existing, metadata);
|
|
457
455
|
const loadedFromSequenceNumber = this.deltaManager.initialSequenceNumber;
|
|
458
456
|
this.summarizerNode = createRootSummarizerNodeWithGC(ChildLogger.create(this.logger, "SummarizerNode"),
|
|
459
457
|
// Summarize function to call when summarize is called. Summarizer node always tracks summary state.
|
|
@@ -474,7 +472,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
474
472
|
if (this.context.baseSnapshot) {
|
|
475
473
|
this.summarizerNode.loadBaseSummaryWithoutDifferential(this.context.baseSnapshot);
|
|
476
474
|
}
|
|
477
|
-
this.dataStores = new DataStores(getSummaryForDatastores(context.baseSnapshot, metadata), this, (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg), (id, createParam) => (summarizeInternal, getGCDataFn, getBaseGCDetailsFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam, undefined, getGCDataFn, getBaseGCDetailsFn), (id) => this.summarizerNode.deleteChild(id), this.mc.logger, async () => this.garbageCollector.getDataStoreBaseGCDetails(), (
|
|
475
|
+
this.dataStores = new DataStores(getSummaryForDatastores(context.baseSnapshot, metadata), this, (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg), (id, createParam) => (summarizeInternal, getGCDataFn, getBaseGCDetailsFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam, undefined, getGCDataFn, getBaseGCDetailsFn), (id) => this.summarizerNode.deleteChild(id), this.mc.logger, async () => this.garbageCollector.getDataStoreBaseGCDetails(), (path, timestampMs, packagePath) => this.garbageCollector.nodeUpdated(path, "Changed", timestampMs, packagePath), new Map(dataStoreAliasMap), this.garbageCollector.writeDataAtRoot);
|
|
478
476
|
this.blobManager = new BlobManager(this.handleContext, blobManagerSnapshot, () => this.storage, (blobId) => this.submit(ContainerMessageType.BlobAttach, undefined, undefined, { blobId }), this, this.logger);
|
|
479
477
|
this.scheduleManager = new ScheduleManager(context.deltaManager, this, ChildLogger.create(this.logger, "ScheduleManager"));
|
|
480
478
|
this.deltaSender = this.deltaManager;
|
|
@@ -485,7 +483,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
485
483
|
this.summaryCollection = new SummaryCollection(this.deltaManager, this.logger);
|
|
486
484
|
const { attachState, pendingLocalState } = this.context;
|
|
487
485
|
this.dirtyContainer = attachState !== AttachState.Attached
|
|
488
|
-
|| ((
|
|
486
|
+
|| ((_f = pendingLocalState) === null || _f === void 0 ? void 0 : _f.pendingStates.length) > 0;
|
|
489
487
|
this.context.updateDirtyContainerState(this.dirtyContainer);
|
|
490
488
|
// Map the deprecated generateSummaries flag to disableSummaries.
|
|
491
489
|
if (this.runtimeOptions.summaryOptions.generateSummaries === false) {
|
|
@@ -498,8 +496,8 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
498
496
|
const orderedClientLogger = ChildLogger.create(this.logger, "OrderedClientElection");
|
|
499
497
|
const orderedClientCollection = new OrderedClientCollection(orderedClientLogger, this.context.deltaManager, this.context.quorum);
|
|
500
498
|
const orderedClientElectionForSummarizer = new OrderedClientElection(orderedClientLogger, orderedClientCollection, electedSummarizerData !== null && electedSummarizerData !== void 0 ? electedSummarizerData : this.context.deltaManager.lastSequenceNumber, SummarizerClientElection.isClientEligible);
|
|
501
|
-
const summarizerClientElectionEnabled = (
|
|
502
|
-
const maxOpsSinceLastSummary = (
|
|
499
|
+
const summarizerClientElectionEnabled = (_g = this.mc.config.getBoolean("Fluid.ContainerRuntime.summarizerClientElection")) !== null && _g !== void 0 ? _g : ((_h = this.runtimeOptions.summaryOptions) === null || _h === void 0 ? void 0 : _h.summarizerClientElection) === true;
|
|
500
|
+
const maxOpsSinceLastSummary = (_j = this.runtimeOptions.summaryOptions.maxOpsSinceLastSummary) !== null && _j !== void 0 ? _j : 7000;
|
|
503
501
|
this.summarizerClientElection = new SummarizerClientElection(orderedClientLogger, this.summaryCollection, orderedClientElectionForSummarizer, maxOpsSinceLastSummary, summarizerClientElectionEnabled);
|
|
504
502
|
if (this.context.clientDetails.type === summarizerClientType) {
|
|
505
503
|
this._summarizer = new Summarizer("/_summarizer", this /* ISummarizerRuntime */, () => this.summaryConfiguration, this /* ISummarizerInternalsProvider */, this.handleContext, this.summaryCollection, async (runtime) => RunWhileConnectedCoordinator.create(runtime));
|
|
@@ -531,7 +529,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
531
529
|
formExponentialFn({ coefficient: 20, initialDelay: 0 })), {
|
|
532
530
|
initialDelayMs: this.runtimeOptions.summaryOptions.initialSummarizerDelayMs,
|
|
533
531
|
}, this.runtimeOptions.summaryOptions.summarizerOptions);
|
|
534
|
-
this.summaryManager.on("summarizerWarning", this.summarizerWarning);
|
|
535
532
|
this.summaryManager.start();
|
|
536
533
|
}
|
|
537
534
|
}
|
|
@@ -562,6 +559,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
562
559
|
// logging container load stats
|
|
563
560
|
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 }));
|
|
564
561
|
ReportOpPerfTelemetry(this.context.clientId, this.deltaManager, this.logger);
|
|
562
|
+
BindBatchTracker(this, this.logger);
|
|
565
563
|
}
|
|
566
564
|
get IContainerRuntime() { return this; }
|
|
567
565
|
get IFluidRouter() { return this; }
|
|
@@ -577,7 +575,8 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
577
575
|
var _a, _b, _c;
|
|
578
576
|
// If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:
|
|
579
577
|
// back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45
|
|
580
|
-
const
|
|
578
|
+
const backCompatContext = context;
|
|
579
|
+
const passLogger = (_a = backCompatContext.taggedLogger) !== null && _a !== void 0 ? _a : new TaggedLoggerAdapter(backCompatContext.logger);
|
|
581
580
|
const logger = ChildLogger.create(passLogger, undefined, {
|
|
582
581
|
all: {
|
|
583
582
|
runtimeVersion: pkgVersion,
|
|
@@ -638,7 +637,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
638
637
|
// Unless bypass is explicitly set, then take action when sequence numbers mismatch.
|
|
639
638
|
if (loadSequenceNumberVerification !== "bypass" && runtimeSequenceNumber !== protocolSequenceNumber) {
|
|
640
639
|
// "Load from summary, runtime metadata sequenceNumber !== initialSequenceNumber"
|
|
641
|
-
const error = new DataCorruptionError("
|
|
640
|
+
const error = new DataCorruptionError("Summary metadata mismatch", { runtimeSequenceNumber, protocolSequenceNumber });
|
|
642
641
|
if (loadSequenceNumberVerification === "log") {
|
|
643
642
|
logger.sendErrorEvent({ eventName: "SequenceNumberMismatch" }, error);
|
|
644
643
|
}
|
|
@@ -740,7 +739,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
740
739
|
attachState: this.attachState,
|
|
741
740
|
}, error);
|
|
742
741
|
if (this.summaryManager !== undefined) {
|
|
743
|
-
this.summaryManager.off("summarizerWarning", this.summarizerWarning);
|
|
744
742
|
this.summaryManager.dispose();
|
|
745
743
|
}
|
|
746
744
|
this.garbageCollector.dispose();
|
|
@@ -846,17 +844,15 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
846
844
|
}
|
|
847
845
|
}
|
|
848
846
|
const dataStoreChannel = await dataStoreContext.realize();
|
|
849
|
-
|
|
850
|
-
// that the package path is available.
|
|
851
|
-
this.garbageCollector.nodeUpdated(`/${id}`, "Loaded", dataStoreContext.packagePath, request === null || request === void 0 ? void 0 : request.headers);
|
|
847
|
+
this.garbageCollector.nodeUpdated(`/${id}`, "Loaded", undefined /* timestampMs */, dataStoreContext.packagePath, request === null || request === void 0 ? void 0 : request.headers);
|
|
852
848
|
return dataStoreChannel;
|
|
853
849
|
}
|
|
854
850
|
formMetadata() {
|
|
855
851
|
var _a;
|
|
856
852
|
return Object.assign(Object.assign({}, this.createContainerMetadata), { summaryCount: this.summaryCount, summaryFormatVersion: 1, disableIsolatedChannels: this.disableIsolatedChannels || undefined, gcFeature: this.garbageCollector.gcSummaryFeatureVersion,
|
|
857
|
-
// The last message processed at the time of summary. If there are no messages,
|
|
858
|
-
//
|
|
859
|
-
message: (_a = extractSummaryMetadataMessage(this.deltaManager.lastMessage)) !== null && _a !== void 0 ? _a : this.
|
|
853
|
+
// The last message processed at the time of summary. If there are no new messages, use the message from the
|
|
854
|
+
// last summary.
|
|
855
|
+
message: (_a = extractSummaryMetadataMessage(this.deltaManager.lastMessage)) !== null && _a !== void 0 ? _a : this.messageAtLastSummary, sessionExpiryTimeoutMs: this.garbageCollector.sessionExpiryTimeoutMs });
|
|
860
856
|
}
|
|
861
857
|
addContainerStateToSummary(summaryTree) {
|
|
862
858
|
var _a;
|
|
@@ -887,6 +883,37 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
887
883
|
}
|
|
888
884
|
}
|
|
889
885
|
}
|
|
886
|
+
// Track how many times the container tries to reconnect with pending messages.
|
|
887
|
+
// This happens when the connection state is changed and we reset the counter
|
|
888
|
+
// when we are able to process a local op or when there are no pending messages.
|
|
889
|
+
// If this counter reaches a max, it's a good indicator that the container
|
|
890
|
+
// is not making progress and it is stuck in a retry loop.
|
|
891
|
+
shouldContinueReconnecting() {
|
|
892
|
+
if (this.maxConsecutiveReconnects <= 0) {
|
|
893
|
+
// Feature disabled, we never stop reconnecting
|
|
894
|
+
return true;
|
|
895
|
+
}
|
|
896
|
+
if (!this.pendingStateManager.hasPendingMessages()) {
|
|
897
|
+
// If there are no pending messages, we can always reconnect
|
|
898
|
+
this.resetReconnectCount();
|
|
899
|
+
return true;
|
|
900
|
+
}
|
|
901
|
+
this.consecutiveReconnects++;
|
|
902
|
+
if (this.consecutiveReconnects === Math.floor(this.maxConsecutiveReconnects / 2)) {
|
|
903
|
+
// If we're halfway through the max reconnects, send an event in order
|
|
904
|
+
// to better identify false positives, if any. If the rate of this event
|
|
905
|
+
// matches Container Close count below, we can safely cut down
|
|
906
|
+
// maxConsecutiveReconnects to half.
|
|
907
|
+
this.mc.logger.sendTelemetryEvent({
|
|
908
|
+
eventName: "ReconnectsWithNoProgress",
|
|
909
|
+
attempts: this.consecutiveReconnects,
|
|
910
|
+
});
|
|
911
|
+
}
|
|
912
|
+
return this.consecutiveReconnects < this.maxConsecutiveReconnects;
|
|
913
|
+
}
|
|
914
|
+
resetReconnectCount() {
|
|
915
|
+
this.consecutiveReconnects = 0;
|
|
916
|
+
}
|
|
890
917
|
replayPendingStates() {
|
|
891
918
|
// We need to be able to send ops to replay states
|
|
892
919
|
if (!this.canSendOps()) {
|
|
@@ -939,6 +966,11 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
939
966
|
if (changeOfState) {
|
|
940
967
|
this.deltaManager.off("op", this.onOp);
|
|
941
968
|
this.context.pendingLocalState = undefined;
|
|
969
|
+
if (!this.shouldContinueReconnecting()) {
|
|
970
|
+
this.closeFn(new GenericError("Runtime detected too many reconnects with no progress syncing local ops", undefined, // error
|
|
971
|
+
{ attempts: this.consecutiveReconnects }));
|
|
972
|
+
return;
|
|
973
|
+
}
|
|
942
974
|
this.replayPendingStates();
|
|
943
975
|
}
|
|
944
976
|
this.dataStores.setConnectionState(connected, clientId);
|
|
@@ -991,6 +1023,12 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
991
1023
|
}
|
|
992
1024
|
this.emit("op", message);
|
|
993
1025
|
this.scheduleManager.afterOpProcessing(undefined, message);
|
|
1026
|
+
if (local) {
|
|
1027
|
+
// If we have processed a local op, this means that the container is
|
|
1028
|
+
// making progress and we can reset the counter for how many times
|
|
1029
|
+
// we have consecutively replayed the pending states
|
|
1030
|
+
this.resetReconnectCount();
|
|
1031
|
+
}
|
|
994
1032
|
}
|
|
995
1033
|
catch (e) {
|
|
996
1034
|
this.scheduleManager.afterOpProcessing(e, message);
|
|
@@ -1075,7 +1113,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1075
1113
|
callback();
|
|
1076
1114
|
}
|
|
1077
1115
|
catch (error) {
|
|
1078
|
-
this.closeFn(new GenericError("
|
|
1116
|
+
this.closeFn(new GenericError("orderSequentially callback exception", error));
|
|
1079
1117
|
throw error; // throw the original error for the consumer of the runtime
|
|
1080
1118
|
}
|
|
1081
1119
|
finally {
|
|
@@ -1118,7 +1156,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1118
1156
|
const dataStore = await this._createDataStore(pkg, false /* isRoot */, internalId, props);
|
|
1119
1157
|
const aliasedDataStore = channelToDataStore(dataStore, internalId, this, this.dataStores, this.mc.logger);
|
|
1120
1158
|
const result = await aliasedDataStore.trySetAlias(alias);
|
|
1121
|
-
if (result !==
|
|
1159
|
+
if (result !== "Success") {
|
|
1122
1160
|
throw new GenericError("dataStoreAliasFailure", undefined /* error */, {
|
|
1123
1161
|
alias: {
|
|
1124
1162
|
value: alias,
|
|
@@ -1150,7 +1188,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1150
1188
|
if (isRoot) {
|
|
1151
1189
|
fluidDataStore.bindToContext();
|
|
1152
1190
|
}
|
|
1153
|
-
return fluidDataStore;
|
|
1191
|
+
return channelToDataStore(fluidDataStore, id, this, this.dataStores, this.mc.logger);
|
|
1154
1192
|
}
|
|
1155
1193
|
async _createDataStoreWithProps(pkg, props, id = uuid(), isRoot = false) {
|
|
1156
1194
|
return this._aliasingEnabled === true && isRoot ?
|
|
@@ -1332,7 +1370,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1332
1370
|
* @param options - options controlling how the summary is generated or submitted
|
|
1333
1371
|
*/
|
|
1334
1372
|
async submitSummary(options) {
|
|
1335
|
-
var _a, _b;
|
|
1373
|
+
var _a, _b, _c;
|
|
1336
1374
|
const { fullTree, refreshLatestAck, summaryLogger } = options;
|
|
1337
1375
|
if (refreshLatestAck) {
|
|
1338
1376
|
const latestSummaryRefSeq = await this.refreshLatestSummaryAckFromServer(ChildLogger.create(summaryLogger, undefined, { all: { safeSummary: true } }));
|
|
@@ -1350,6 +1388,14 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1350
1388
|
await this.deltaManager.inbound.pause();
|
|
1351
1389
|
const summaryRefSeqNum = this.deltaManager.lastSequenceNumber;
|
|
1352
1390
|
const message = `Summary @${summaryRefSeqNum}:${this.deltaManager.minimumSequenceNumber}`;
|
|
1391
|
+
// We should be here is we haven't processed be here. If we are of if the last message's sequence number
|
|
1392
|
+
// doesn't match the last processed sequence number, log an error.
|
|
1393
|
+
if (summaryRefSeqNum !== ((_a = this.deltaManager.lastMessage) === null || _a === void 0 ? void 0 : _a.sequenceNumber)) {
|
|
1394
|
+
summaryLogger.sendErrorEvent({
|
|
1395
|
+
eventName: "LastSequenceMismatch",
|
|
1396
|
+
message,
|
|
1397
|
+
});
|
|
1398
|
+
}
|
|
1353
1399
|
this.summarizerNode.startSummary(summaryRefSeqNum, summaryLogger);
|
|
1354
1400
|
// Helper function to check whether we should still continue between each async step.
|
|
1355
1401
|
const checkContinue = () => {
|
|
@@ -1406,13 +1452,15 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1406
1452
|
return { stage: "base", referenceSequenceNumber: summaryRefSeqNum, error };
|
|
1407
1453
|
}
|
|
1408
1454
|
const { summary: summaryTree, stats: partialStats } = summarizeResult;
|
|
1455
|
+
// Now that we have generated the summary, update the message at last summary to the last message processed.
|
|
1456
|
+
this.messageAtLastSummary = this.deltaManager.lastMessage;
|
|
1409
1457
|
// Counting dataStores and handles
|
|
1410
1458
|
// Because handles are unchanged dataStores in the current logic,
|
|
1411
1459
|
// summarized dataStore count is total dataStore count minus handle count
|
|
1412
1460
|
const dataStoreTree = this.disableIsolatedChannels ? summaryTree : summaryTree.tree[channelsTreeName];
|
|
1413
1461
|
assert(dataStoreTree.type === SummaryType.Tree, 0x1fc /* "summary is not a tree" */);
|
|
1414
1462
|
const handleCount = Object.values(dataStoreTree.tree).filter((value) => value.type === SummaryType.Handle).length;
|
|
1415
|
-
const summaryStats = Object.assign({ dataStoreCount: this.dataStores.size, summarizedDataStoreCount: this.dataStores.size - handleCount, gcStateUpdatedDataStoreCount: (
|
|
1463
|
+
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);
|
|
1416
1464
|
const generateSummaryData = {
|
|
1417
1465
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
1418
1466
|
summaryTree,
|
|
@@ -1428,7 +1476,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1428
1476
|
const summaryContext = lastAck === undefined
|
|
1429
1477
|
? {
|
|
1430
1478
|
proposalHandle: undefined,
|
|
1431
|
-
ackHandle: (
|
|
1479
|
+
ackHandle: (_c = this.context.getLoadedFromVersion()) === null || _c === void 0 ? void 0 : _c.id,
|
|
1432
1480
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
1433
1481
|
}
|
|
1434
1482
|
: {
|
|
@@ -1559,16 +1607,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1559
1607
|
});
|
|
1560
1608
|
}
|
|
1561
1609
|
}
|
|
1562
|
-
|
|
1563
|
-
// there will be a lot of escape characters that can make it up to 2x bigger!
|
|
1564
|
-
// This is Ok, because DeltaManager.shouldSplit() will have 2 * maxMessageSize limit
|
|
1565
|
-
if (!serializedContent || serializedContent.length <= maxOpSize) {
|
|
1566
|
-
clientSequenceNumber = this.submitRuntimeMessage(type, content,
|
|
1567
|
-
/* batch: */ this._flushMode === FlushMode.TurnBased, opMetadataInternal);
|
|
1568
|
-
}
|
|
1569
|
-
else {
|
|
1570
|
-
clientSequenceNumber = this.submitChunkedMessage(type, serializedContent, maxOpSize);
|
|
1571
|
-
}
|
|
1610
|
+
clientSequenceNumber = this.submitMaybeChunkedMessages(type, content, serializedContent, maxOpSize, this._flushMode === FlushMode.TurnBased, opMetadataInternal);
|
|
1572
1611
|
}
|
|
1573
1612
|
// Let the PendingStateManager know that a message was submitted.
|
|
1574
1613
|
this.pendingStateManager.onSubmitMessage(type, clientSequenceNumber, this.deltaManager.lastSequenceNumber, content, localOpMetadata, opMetadataInternal);
|
|
@@ -1576,6 +1615,35 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1576
1615
|
this.updateDocumentDirtyState(true);
|
|
1577
1616
|
}
|
|
1578
1617
|
}
|
|
1618
|
+
submitMaybeChunkedMessages(type, content, serializedContent, serverMaxOpSize, batch, opMetadataInternal = undefined) {
|
|
1619
|
+
if (this._maxOpSizeInBytes >= 0) {
|
|
1620
|
+
// Chunking disabled
|
|
1621
|
+
if (!serializedContent || serializedContent.length <= this._maxOpSizeInBytes) {
|
|
1622
|
+
return this.submitRuntimeMessage(type, content, batch, opMetadataInternal);
|
|
1623
|
+
}
|
|
1624
|
+
// When chunking is disabled, we ignore the server max message size
|
|
1625
|
+
// and if the content length is larger than the client configured message size
|
|
1626
|
+
// instead of splitting the content, we will fail by explicitly close the container
|
|
1627
|
+
this.closeFn(new GenericError("OpTooLarge",
|
|
1628
|
+
/* error */ undefined, {
|
|
1629
|
+
length: {
|
|
1630
|
+
value: serializedContent.length,
|
|
1631
|
+
tag: TelemetryDataTag.PackageData,
|
|
1632
|
+
},
|
|
1633
|
+
limit: {
|
|
1634
|
+
value: this._maxOpSizeInBytes,
|
|
1635
|
+
tag: TelemetryDataTag.PackageData,
|
|
1636
|
+
},
|
|
1637
|
+
}));
|
|
1638
|
+
return -1;
|
|
1639
|
+
}
|
|
1640
|
+
// Chunking enabled, fallback on the server's max message size
|
|
1641
|
+
// and split the content accordingly
|
|
1642
|
+
if (!serializedContent || serializedContent.length <= serverMaxOpSize) {
|
|
1643
|
+
return this.submitRuntimeMessage(type, content, batch, opMetadataInternal);
|
|
1644
|
+
}
|
|
1645
|
+
return this.submitChunkedMessage(type, serializedContent, serverMaxOpSize);
|
|
1646
|
+
}
|
|
1579
1647
|
submitChunkedMessage(type, content, maxOpSize) {
|
|
1580
1648
|
const contentLength = content.length;
|
|
1581
1649
|
const chunkN = Math.floor((contentLength - 1) / maxOpSize) + 1;
|
|
@@ -1654,6 +1722,8 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1654
1722
|
const readAndParseBlob = async (id) => readAndParse(this.storage, id);
|
|
1655
1723
|
const result = await this.summarizerNode.refreshLatestSummary(proposalHandle, summaryRefSeq, async () => this.fetchSnapshotFromStorage(ackHandle, summaryLogger, {
|
|
1656
1724
|
eventName: "RefreshLatestSummaryGetSnapshot",
|
|
1725
|
+
ackHandle,
|
|
1726
|
+
summaryRefSeq,
|
|
1657
1727
|
fetchLatest: false,
|
|
1658
1728
|
}), readAndParseBlob, summaryLogger);
|
|
1659
1729
|
// Notify the garbage collector so it can update its latest summary state.
|