@fluidframework/container-runtime 0.55.2 → 0.56.2
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/containerRuntime.d.ts +3 -12
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +24 -38
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +42 -29
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +27 -49
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +2 -1
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +74 -16
- package/dist/dataStores.js.map +1 -1
- package/dist/garbageCollection.d.ts +22 -9
- package/dist/garbageCollection.d.ts.map +1 -1
- package/dist/garbageCollection.js +55 -35
- package/dist/garbageCollection.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -17
- 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/runningSummarizer.d.ts.map +1 -1
- package/dist/runningSummarizer.js +2 -9
- package/dist/runningSummarizer.js.map +1 -1
- package/dist/summarizerTypes.d.ts +2 -0
- package/dist/summarizerTypes.d.ts.map +1 -1
- package/dist/summarizerTypes.js.map +1 -1
- package/dist/summaryFormat.d.ts.map +1 -1
- package/dist/summaryFormat.js +2 -1
- package/dist/summaryFormat.js.map +1 -1
- package/dist/summaryGenerator.d.ts +0 -5
- package/dist/summaryGenerator.d.ts.map +1 -1
- package/dist/summaryGenerator.js +2 -1
- package/dist/summaryGenerator.js.map +1 -1
- package/garbageCollection.md +33 -0
- package/lib/containerRuntime.d.ts +3 -12
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +25 -39
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +42 -29
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +25 -47
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +2 -1
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +75 -17
- package/lib/dataStores.js.map +1 -1
- package/lib/garbageCollection.d.ts +22 -9
- package/lib/garbageCollection.d.ts.map +1 -1
- package/lib/garbageCollection.js +55 -35
- package/lib/garbageCollection.js.map +1 -1
- package/lib/index.d.ts +6 -6
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -6
- 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/runningSummarizer.d.ts.map +1 -1
- package/lib/runningSummarizer.js +2 -9
- package/lib/runningSummarizer.js.map +1 -1
- package/lib/summarizerTypes.d.ts +2 -0
- package/lib/summarizerTypes.d.ts.map +1 -1
- package/lib/summarizerTypes.js.map +1 -1
- package/lib/summaryFormat.d.ts.map +1 -1
- package/lib/summaryFormat.js +2 -1
- package/lib/summaryFormat.js.map +1 -1
- package/lib/summaryGenerator.d.ts +0 -5
- package/lib/summaryGenerator.d.ts.map +1 -1
- package/lib/summaryGenerator.js +2 -1
- package/lib/summaryGenerator.js.map +1 -1
- package/package.json +14 -14
- package/src/containerRuntime.ts +38 -42
- package/src/dataStoreContext.ts +76 -122
- package/src/dataStores.ts +75 -48
- package/src/garbageCollection.ts +62 -39
- package/src/index.ts +51 -6
- package/src/packageVersion.ts +1 -1
- package/src/runningSummarizer.ts +2 -7
- package/src/summarizerTypes.ts +2 -0
- package/src/summaryFormat.ts +2 -1
- package/src/summaryGenerator.ts +2 -6
package/lib/containerRuntime.js
CHANGED
|
@@ -7,7 +7,7 @@ import { assert, Trace, TypedEventEmitter, unreachableCase, performance, } from
|
|
|
7
7
|
import { ChildLogger, raiseConnectedEvent, PerformanceEvent, normalizeError, TaggedLoggerAdapter, loggerToMonitoringContext, } from "@fluidframework/telemetry-utils";
|
|
8
8
|
import { DriverHeader } from "@fluidframework/driver-definitions";
|
|
9
9
|
import { readAndParse, BlobAggregationStorage } from "@fluidframework/driver-utils";
|
|
10
|
-
import {
|
|
10
|
+
import { DataCorruptionError, GenericError, UsageError, extractSafePropertiesFromMessage, } from "@fluidframework/container-utils";
|
|
11
11
|
import { MessageType, SummaryType, } from "@fluidframework/protocol-definitions";
|
|
12
12
|
import { FlushMode, channelsTreeName, } from "@fluidframework/runtime-definitions";
|
|
13
13
|
import { addBlobToSummary, addTreeToSummary, convertToSummaryTree, createRootSummarizerNodeWithGC, RequestParser, create404Response, exceptionToResponse, requestFluidObject, responseToException, seqFromTree, convertSummaryTreeToITree, } from "@fluidframework/runtime-utils";
|
|
@@ -56,6 +56,7 @@ const DefaultSummaryConfiguration = {
|
|
|
56
56
|
// the min of the two will be chosen
|
|
57
57
|
maxAckWaitTime: 120000,
|
|
58
58
|
};
|
|
59
|
+
;
|
|
59
60
|
// Local storage key to set the default flush mode to TurnBased
|
|
60
61
|
const turnBasedFlushModeKey = "Fluid.ContainerRuntime.FlushModeTurnBased";
|
|
61
62
|
export var RuntimeMessage;
|
|
@@ -346,6 +347,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
346
347
|
this._disposed = false;
|
|
347
348
|
this.dirtyContainer = false;
|
|
348
349
|
this.emitDirtyDocumentEvent = true;
|
|
350
|
+
this.summarizerWarning = (warning) => this.mc.logger.sendTelemetryEvent({ eventName: "summarizerWarning" }, warning);
|
|
349
351
|
/**
|
|
350
352
|
* Used to apply stashed ops at their reference sequence number.
|
|
351
353
|
* Normal op processing is synchronous, but applying stashed ops is async since the
|
|
@@ -367,10 +369,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
367
369
|
this.closeFn(normalizeError(error));
|
|
368
370
|
});
|
|
369
371
|
};
|
|
370
|
-
// @deprecated Needs to become private
|
|
371
|
-
this.raiseContainerWarning = (warning) => {
|
|
372
|
-
this.context.raiseContainerWarning(warning);
|
|
373
|
-
};
|
|
374
372
|
this.summarizeOnDemand = (...args) => {
|
|
375
373
|
if (this.clientDetails.type === summarizerClientType) {
|
|
376
374
|
return this.summarizer.summarizeOnDemand(...args);
|
|
@@ -457,7 +455,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
457
455
|
if (this.context.baseSnapshot) {
|
|
458
456
|
this.summarizerNode.loadBaseSummaryWithoutDifferential(this.context.baseSnapshot);
|
|
459
457
|
}
|
|
460
|
-
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(), (id) => this.garbageCollector.nodeChanged(id), new Map(dataStoreAliasMap));
|
|
458
|
+
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(), (id) => this.garbageCollector.nodeChanged(id), new Map(dataStoreAliasMap), this.garbageCollector.writeDataAtRoot);
|
|
461
459
|
this.blobManager = new BlobManager(this.handleContext, blobManagerSnapshot, () => this.storage, (blobId) => this.submit(ContainerMessageType.BlobAttach, undefined, undefined, { blobId }), this, this.logger);
|
|
462
460
|
this.scheduleManager = new ScheduleManager(context.deltaManager, this, ChildLogger.create(this.logger, "ScheduleManager"));
|
|
463
461
|
this.deltaSender = this.deltaManager;
|
|
@@ -510,7 +508,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
510
508
|
formExponentialFn({ coefficient: 20, initialDelay: 0 })), {
|
|
511
509
|
initialDelayMs: this.runtimeOptions.summaryOptions.initialSummarizerDelayMs,
|
|
512
510
|
}, this.runtimeOptions.summaryOptions.summarizerOptions);
|
|
513
|
-
this.summaryManager.on("summarizerWarning", this.
|
|
511
|
+
this.summaryManager.on("summarizerWarning", this.summarizerWarning);
|
|
514
512
|
this.summaryManager.start();
|
|
515
513
|
}
|
|
516
514
|
}
|
|
@@ -555,6 +553,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
555
553
|
static async load(context, registryEntries, requestHandler, runtimeOptions = {}, containerScope = context.scope, existing) {
|
|
556
554
|
var _a, _b, _c;
|
|
557
555
|
// If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:
|
|
556
|
+
// back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45
|
|
558
557
|
const passLogger = (_a = context.taggedLogger) !== null && _a !== void 0 ? _a : new TaggedLoggerAdapter(context.logger);
|
|
559
558
|
const logger = ChildLogger.create(passLogger, undefined, {
|
|
560
559
|
all: {
|
|
@@ -632,12 +631,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
632
631
|
}, containerScope, logger, loadExisting, blobManagerSnapshot, requestHandler, storage);
|
|
633
632
|
return runtime;
|
|
634
633
|
}
|
|
635
|
-
/**
|
|
636
|
-
* @deprecated This will be removed in a later release. Deprecated in 0.53
|
|
637
|
-
*/
|
|
638
|
-
get id() {
|
|
639
|
-
return this.context.id;
|
|
640
|
-
}
|
|
641
634
|
get options() {
|
|
642
635
|
return this.context.options;
|
|
643
636
|
}
|
|
@@ -701,13 +694,6 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
701
694
|
return Object.assign(Object.assign(Object.assign({}, DefaultSummaryConfiguration), (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.serviceConfiguration) === null || _b === void 0 ? void 0 : _b.summary), (_c = this.runtimeOptions.summaryOptions) === null || _c === void 0 ? void 0 : _c.summaryConfigOverrides);
|
|
702
695
|
}
|
|
703
696
|
get disposed() { return this._disposed; }
|
|
704
|
-
/**
|
|
705
|
-
* True, if GC data should be written at root of the summary tree.
|
|
706
|
-
* False, if data stores should write GC blobs in their summary tree.
|
|
707
|
-
*/
|
|
708
|
-
get writeGCDataAtRoot() {
|
|
709
|
-
return this.garbageCollector.writeDataAtRoot;
|
|
710
|
-
}
|
|
711
697
|
get summarizer() {
|
|
712
698
|
assert(this._summarizer !== undefined, 0x257 /* "This is not summarizing container" */);
|
|
713
699
|
return this._summarizer;
|
|
@@ -730,7 +716,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
730
716
|
attachState: this.attachState,
|
|
731
717
|
}, error);
|
|
732
718
|
if (this.summaryManager !== undefined) {
|
|
733
|
-
this.summaryManager.off("summarizerWarning", this.
|
|
719
|
+
this.summaryManager.off("summarizerWarning", this.summarizerWarning);
|
|
734
720
|
this.summaryManager.dispose();
|
|
735
721
|
}
|
|
736
722
|
this.garbageCollector.dispose();
|
|
@@ -867,7 +853,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
867
853
|
});
|
|
868
854
|
return convertSummaryTreeToITree(summaryResult.summary);
|
|
869
855
|
}
|
|
870
|
-
|
|
856
|
+
addContainerStateToSummary(summaryTree) {
|
|
871
857
|
var _a;
|
|
872
858
|
addBlobToSummary(summaryTree, metadataBlobName, JSON.stringify(this.formMetadata()));
|
|
873
859
|
if (this.chunkMap.size > 0) {
|
|
@@ -889,7 +875,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
889
875
|
const blobsTree = convertToSummaryTree(snapshot, false);
|
|
890
876
|
addTreeToSummary(summaryTree, blobsTreeName, blobsTree);
|
|
891
877
|
}
|
|
892
|
-
if (this.
|
|
878
|
+
if (this.garbageCollector.writeDataAtRoot) {
|
|
893
879
|
const gcSummary = this.garbageCollector.summarize();
|
|
894
880
|
if (gcSummary !== undefined) {
|
|
895
881
|
addTreeToSummary(summaryTree, gcTreeKey, gcSummary);
|
|
@@ -1077,21 +1063,19 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1077
1063
|
}
|
|
1078
1064
|
const savedFlushMode = this.flushMode;
|
|
1079
1065
|
this.setFlushMode(FlushMode.TurnBased);
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
this.setFlushMode(savedFlushMode);
|
|
1084
|
-
}
|
|
1085
|
-
catch (error) {
|
|
1086
|
-
this.closeFn(CreateProcessingError(error, "orderSequentially"));
|
|
1087
|
-
throw error; // throw the original error for the consumer of the runtime
|
|
1088
|
-
}
|
|
1066
|
+
this.trackOrderSequentiallyCalls(callback);
|
|
1067
|
+
this.flush();
|
|
1068
|
+
this.setFlushMode(savedFlushMode);
|
|
1089
1069
|
}
|
|
1090
1070
|
trackOrderSequentiallyCalls(callback) {
|
|
1091
1071
|
try {
|
|
1092
1072
|
this._orderSequentiallyCalls++;
|
|
1093
1073
|
callback();
|
|
1094
1074
|
}
|
|
1075
|
+
catch (error) {
|
|
1076
|
+
this.closeFn(new GenericError("orderSequentiallyCallbackException", error));
|
|
1077
|
+
throw error; // throw the original error for the consumer of the runtime
|
|
1078
|
+
}
|
|
1095
1079
|
finally {
|
|
1096
1080
|
this._orderSequentiallyCalls--;
|
|
1097
1081
|
}
|
|
@@ -1121,7 +1105,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1121
1105
|
return this.dataStores._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id, isRoot).realize();
|
|
1122
1106
|
}
|
|
1123
1107
|
canSendOps() {
|
|
1124
|
-
return this.connected && !this.deltaManager.readonly;
|
|
1108
|
+
return this.connected && !this.deltaManager.readOnlyInfo.readonly;
|
|
1125
1109
|
}
|
|
1126
1110
|
getQuorum() {
|
|
1127
1111
|
return this.context.quorum;
|
|
@@ -1194,7 +1178,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1194
1178
|
// Wrap data store summaries in .channels subtree.
|
|
1195
1179
|
wrapSummaryInChannelsTree(summarizeResult);
|
|
1196
1180
|
}
|
|
1197
|
-
this.
|
|
1181
|
+
this.addContainerStateToSummary(summarizeResult);
|
|
1198
1182
|
return summarizeResult.summary;
|
|
1199
1183
|
}
|
|
1200
1184
|
async getAbsoluteUrl(relativeUrl) {
|
|
@@ -1214,13 +1198,14 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1214
1198
|
wrapSummaryInChannelsTree(summarizeResult);
|
|
1215
1199
|
pathPartsForChildren = [channelsTreeName];
|
|
1216
1200
|
}
|
|
1217
|
-
this.
|
|
1201
|
+
this.addContainerStateToSummary(summarizeResult);
|
|
1218
1202
|
return Object.assign(Object.assign({}, summarizeResult), { id: "", pathPartsForChildren });
|
|
1219
1203
|
}
|
|
1220
1204
|
/**
|
|
1221
1205
|
* Returns a summary of the runtime at the current sequence number.
|
|
1222
1206
|
*/
|
|
1223
1207
|
async summarize(options) {
|
|
1208
|
+
this.verifyNotClosed();
|
|
1224
1209
|
const { summaryLogger, fullTree = false, trackState = true, runGC = true, runSweep, fullGC } = options;
|
|
1225
1210
|
if (runGC) {
|
|
1226
1211
|
await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC });
|
|
@@ -1345,13 +1330,13 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1345
1330
|
}
|
|
1346
1331
|
const trace = Trace.start();
|
|
1347
1332
|
let summarizeResult;
|
|
1333
|
+
// If the GC state needs to be reset, we need to force a full tree summary and update the unreferenced
|
|
1334
|
+
// state of all the nodes.
|
|
1335
|
+
const forcedFullTree = this.garbageCollector.summaryStateNeedsReset;
|
|
1348
1336
|
try {
|
|
1349
1337
|
summarizeResult = await this.summarize({
|
|
1350
1338
|
summaryLogger,
|
|
1351
|
-
|
|
1352
|
-
// running full summary. This is used to handle scenarios where we upgrade the GC version because we
|
|
1353
|
-
// cannot trust the data from the previous GC version anymore.
|
|
1354
|
-
fullTree: fullTree || this.garbageCollector.hasGCVersionChanged,
|
|
1339
|
+
fullTree: fullTree || forcedFullTree,
|
|
1355
1340
|
trackState: true,
|
|
1356
1341
|
runGC: this.garbageCollector.shouldRunGC,
|
|
1357
1342
|
});
|
|
@@ -1372,6 +1357,7 @@ export class ContainerRuntime extends TypedEventEmitter {
|
|
|
1372
1357
|
summaryTree,
|
|
1373
1358
|
summaryStats,
|
|
1374
1359
|
generateDuration: trace.trace().duration,
|
|
1360
|
+
forcedFullTree,
|
|
1375
1361
|
};
|
|
1376
1362
|
continueResult = checkContinue();
|
|
1377
1363
|
if (!continueResult.continue) {
|