@fluidframework/container-runtime 2.0.0-dev-rc.5.0.0.272251 → 2.0.0-dev-rc.5.0.0.272889
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api-extractor.json +1 -1
- package/container-runtime.test-files.tar +0 -0
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +1 -3
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +4 -5
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +2 -1
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/deltaManagerProxies.d.ts.map +1 -1
- package/dist/deltaManagerProxies.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +1 -3
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +2 -2
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.js +1 -1
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +1 -2
- package/dist/gc/gcTelemetry.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/messageTypes.d.ts +5 -21
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.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.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +1 -2
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +1 -1
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.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 -1
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +1 -2
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/index.d.ts +1 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +1 -2
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +4 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +1 -2
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +1 -2
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/throttler.d.ts.map +1 -1
- package/dist/throttler.js +3 -1
- package/dist/throttler.js.map +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +1 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +1 -1
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +1 -3
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +6 -7
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +2 -1
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/deltaManagerProxies.d.ts.map +1 -1
- package/lib/deltaManagerProxies.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -3
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +3 -3
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.js +1 -1
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +1 -2
- package/lib/gc/gcTelemetry.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/messageTypes.d.ts +5 -21
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.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/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +1 -2
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +1 -1
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.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 -1
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +1 -2
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/index.d.ts +1 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +1 -2
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +4 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +1 -2
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +1 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/throttler.d.ts.map +1 -1
- package/lib/throttler.js +3 -1
- package/lib/throttler.js.map +1 -1
- package/package.json +23 -19
- package/src/batchTracker.ts +4 -1
- package/src/blobManager.ts +14 -16
- package/src/channelCollection.ts +17 -20
- package/src/connectionTelemetry.ts +3 -8
- package/src/containerRuntime.ts +41 -40
- package/src/dataStoreContext.ts +31 -9
- package/src/dataStoreContexts.ts +7 -2
- package/src/deltaManagerProxies.ts +12 -3
- package/src/deltaScheduler.ts +1 -3
- package/src/gc/garbageCollection.ts +23 -24
- package/src/gc/gcConfigs.ts +7 -3
- package/src/gc/gcHelpers.ts +6 -2
- package/src/gc/gcSummaryStateTracker.ts +4 -1
- package/src/gc/gcTelemetry.ts +1 -2
- package/src/index.ts +0 -1
- package/src/messageTypes.ts +7 -23
- package/src/opLifecycle/index.ts +5 -1
- package/src/opLifecycle/opDecompressor.ts +2 -6
- package/src/opLifecycle/opGroupingManager.ts +1 -4
- package/src/opLifecycle/opSplitter.ts +9 -3
- package/src/opLifecycle/outbox.ts +1 -4
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +4 -2
- package/src/summary/documentSchema.ts +4 -7
- package/src/summary/index.ts +4 -1
- package/src/summary/orderedClientElection.ts +17 -10
- package/src/summary/runningSummarizer.ts +20 -9
- package/src/summary/summarizerClientElection.ts +2 -1
- package/src/summary/summarizerNode/summarizerNode.ts +6 -4
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +7 -2
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +10 -6
- package/src/summary/summarizerTypes.ts +9 -2
- package/src/summary/summaryCollection.ts +4 -1
- package/src/summary/summaryFormat.ts +8 -3
- package/src/summary/summaryGenerator.ts +4 -9
- package/src/summary/summaryManager.ts +6 -9
- package/src/throttler.ts +3 -1
package/src/blobManager.ts
CHANGED
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
TypedEventEmitter,
|
|
8
|
+
bufferToString,
|
|
9
|
+
stringToBuffer,
|
|
10
|
+
} from "@fluid-internal/client-utils";
|
|
7
11
|
import { AttachState, ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
8
12
|
import {
|
|
9
13
|
IContainerRuntime,
|
|
@@ -100,7 +104,8 @@ export type IBlobManagerRuntime = Pick<
|
|
|
100
104
|
> &
|
|
101
105
|
TypedEventEmitter<IContainerRuntimeEvents>;
|
|
102
106
|
|
|
103
|
-
type ICreateBlobResponseWithTTL = ICreateBlobResponse &
|
|
107
|
+
type ICreateBlobResponseWithTTL = ICreateBlobResponse &
|
|
108
|
+
Partial<Record<"minTTLInSeconds", number>>;
|
|
104
109
|
|
|
105
110
|
interface PendingBlob {
|
|
106
111
|
blob: ArrayBufferLike;
|
|
@@ -281,15 +286,11 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
281
286
|
if (expired) {
|
|
282
287
|
// we want to avoid submitting ops with broken handles
|
|
283
288
|
this.closeContainer(
|
|
284
|
-
new GenericError(
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
blobId,
|
|
290
|
-
secondsSinceUpload,
|
|
291
|
-
},
|
|
292
|
-
),
|
|
289
|
+
new GenericError("Trying to submit a BlobAttach for expired blob", undefined, {
|
|
290
|
+
localId,
|
|
291
|
+
blobId,
|
|
292
|
+
secondsSinceUpload,
|
|
293
|
+
}),
|
|
293
294
|
);
|
|
294
295
|
}
|
|
295
296
|
}
|
|
@@ -414,7 +415,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
414
415
|
pending.attached = true;
|
|
415
416
|
this.emit("blobAttached", pending);
|
|
416
417
|
this.deletePendingBlobMaybe(id);
|
|
417
|
-
|
|
418
|
+
}
|
|
418
419
|
: undefined;
|
|
419
420
|
return new BlobHandle(
|
|
420
421
|
`${BlobManager.basePath}/${id}`,
|
|
@@ -854,10 +855,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
854
855
|
0x391 /* Redirect table size must match BlobManager's local ID count */,
|
|
855
856
|
);
|
|
856
857
|
for (const [localId, storageId] of table) {
|
|
857
|
-
assert(
|
|
858
|
-
this.redirectTable.has(localId),
|
|
859
|
-
0x254 /* "unrecognized id in redirect table" */,
|
|
860
|
-
);
|
|
858
|
+
assert(this.redirectTable.has(localId), 0x254 /* "unrecognized id in redirect table" */);
|
|
861
859
|
this.setRedirection(localId, storageId);
|
|
862
860
|
// set identity (id -> id) entry
|
|
863
861
|
this.setRedirection(storageId, storageId);
|
package/src/channelCollection.ts
CHANGED
|
@@ -397,11 +397,14 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
397
397
|
const attachMessage = message.contents as InboundAttachMessage;
|
|
398
398
|
|
|
399
399
|
// We need to process the GC Data for both local and remote attach messages
|
|
400
|
-
const foundGCData = processAttachMessageGCData(
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
400
|
+
const foundGCData = processAttachMessageGCData(
|
|
401
|
+
attachMessage.snapshot,
|
|
402
|
+
(nodeId, toPath) => {
|
|
403
|
+
// nodeId is the relative path under the node being attached. Always starts with "/", but no trailing "/" after an id
|
|
404
|
+
const fromPath = `/${attachMessage.id}${nodeId === "/" ? "" : nodeId}`;
|
|
405
|
+
this.parentContext.addedGCOutboundRoute(fromPath, toPath, message.timestamp);
|
|
406
|
+
},
|
|
407
|
+
);
|
|
405
408
|
|
|
406
409
|
// Only log once per container to avoid noise/cost.
|
|
407
410
|
// Allows longitudinal tracking of various state (e.g. foundGCData), and some sampled details
|
|
@@ -838,11 +841,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
838
841
|
envelope.address,
|
|
839
842
|
transformed.contents,
|
|
840
843
|
(fromPath: string, toPath: string) =>
|
|
841
|
-
this.parentContext.addedGCOutboundRoute(
|
|
842
|
-
fromPath,
|
|
843
|
-
toPath,
|
|
844
|
-
message.timestamp,
|
|
845
|
-
),
|
|
844
|
+
this.parentContext.addedGCOutboundRoute(fromPath, toPath, message.timestamp),
|
|
846
845
|
);
|
|
847
846
|
break;
|
|
848
847
|
}
|
|
@@ -979,9 +978,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
979
978
|
}
|
|
980
979
|
|
|
981
980
|
const idToLog =
|
|
982
|
-
originalRequest !== undefined
|
|
983
|
-
? urlToGCNodePath(originalRequest.url)
|
|
984
|
-
: dataStoreNodePath;
|
|
981
|
+
originalRequest !== undefined ? urlToGCNodePath(originalRequest.url) : dataStoreNodePath;
|
|
985
982
|
|
|
986
983
|
// Log the package details asynchronously since getInitialSnapshotDetails is async
|
|
987
984
|
const recentlyDeletedContext = this.contexts.getRecentlyDeletedContext(id);
|
|
@@ -1203,11 +1200,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1203
1200
|
const summaryBuilder = new SummaryTreeBuilder();
|
|
1204
1201
|
await this.visitContextsDuringSummary(
|
|
1205
1202
|
async (contextId: string, context: FluidDataStoreContext) => {
|
|
1206
|
-
const contextSummary = await context.summarize(
|
|
1207
|
-
fullTree,
|
|
1208
|
-
trackState,
|
|
1209
|
-
telemetryContext,
|
|
1210
|
-
);
|
|
1203
|
+
const contextSummary = await context.summarize(fullTree, trackState, telemetryContext);
|
|
1211
1204
|
summaryBuilder.addWithStats(contextId, contextSummary);
|
|
1212
1205
|
},
|
|
1213
1206
|
);
|
|
@@ -1292,7 +1285,9 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1292
1285
|
* be deleted.
|
|
1293
1286
|
* @returns The routes of data stores and its objects that were deleted.
|
|
1294
1287
|
*/
|
|
1295
|
-
public deleteSweepReadyNodes(
|
|
1288
|
+
public deleteSweepReadyNodes(
|
|
1289
|
+
sweepReadyDataStoreRoutes: readonly string[],
|
|
1290
|
+
): readonly string[] {
|
|
1296
1291
|
for (const route of sweepReadyDataStoreRoutes) {
|
|
1297
1292
|
const pathParts = route.split("/");
|
|
1298
1293
|
const dataStoreId = pathParts[1];
|
|
@@ -1370,7 +1365,9 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1370
1365
|
/**
|
|
1371
1366
|
* Called by GC to retrieve the package path of a data store node with the given path.
|
|
1372
1367
|
*/
|
|
1373
|
-
public async getDataStorePackagePath(
|
|
1368
|
+
public async getDataStorePackagePath(
|
|
1369
|
+
nodePath: string,
|
|
1370
|
+
): Promise<readonly string[] | undefined> {
|
|
1374
1371
|
// If the node belongs to a data store, return its package path. For DDSes, we return the package path of the
|
|
1375
1372
|
// data store that contains it.
|
|
1376
1373
|
const context = this.contexts.get(nodePath.split("/")[1]);
|
|
@@ -141,8 +141,7 @@ class OpPerfTelemetry {
|
|
|
141
141
|
return {
|
|
142
142
|
sample: () => {
|
|
143
143
|
eventCount++;
|
|
144
|
-
const shouldSample =
|
|
145
|
-
eventCount % OpPerfTelemetry.DELTA_LATENCY_SAMPLE_RATE === 0;
|
|
144
|
+
const shouldSample = eventCount % OpPerfTelemetry.DELTA_LATENCY_SAMPLE_RATE === 0;
|
|
146
145
|
if (shouldSample) {
|
|
147
146
|
eventCount = 0;
|
|
148
147
|
}
|
|
@@ -163,8 +162,7 @@ class OpPerfTelemetry {
|
|
|
163
162
|
return {
|
|
164
163
|
sample: () => {
|
|
165
164
|
eventCount++;
|
|
166
|
-
const shouldSample =
|
|
167
|
-
eventCount % OpPerfTelemetry.PROCESSED_OPS_SAMPLE_RATE === 0;
|
|
165
|
+
const shouldSample = eventCount % OpPerfTelemetry.PROCESSED_OPS_SAMPLE_RATE === 0;
|
|
168
166
|
if (shouldSample) {
|
|
169
167
|
eventCount = 0;
|
|
170
168
|
this.noOpCountForTelemetry = 0;
|
|
@@ -212,10 +210,7 @@ class OpPerfTelemetry {
|
|
|
212
210
|
) {
|
|
213
211
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
214
212
|
const latencyStats = this.latencyStatistics.get(msg.clientSequenceNumber)!;
|
|
215
|
-
assert(
|
|
216
|
-
latencyStats !== undefined,
|
|
217
|
-
0x7c2 /* Latency stats for op should exist */,
|
|
218
|
-
);
|
|
213
|
+
assert(latencyStats !== undefined, 0x7c2 /* Latency stats for op should exist */);
|
|
219
214
|
assert(
|
|
220
215
|
latencyStats.opProcessingTimes.outboundPushEventTime === undefined,
|
|
221
216
|
0x2c8 /* "outboundPushEventTime should be undefined" */,
|
package/src/containerRuntime.ts
CHANGED
|
@@ -127,12 +127,19 @@ import { v4 as uuid } from "uuid";
|
|
|
127
127
|
|
|
128
128
|
import { BindBatchTracker } from "./batchTracker.js";
|
|
129
129
|
import { BlobManager, IBlobManagerLoadInfo, IPendingBlobs } from "./blobManager.js";
|
|
130
|
-
import {
|
|
130
|
+
import {
|
|
131
|
+
ChannelCollection,
|
|
132
|
+
getSummaryForDatastores,
|
|
133
|
+
wrapContext,
|
|
134
|
+
} from "./channelCollection.js";
|
|
131
135
|
import { IPerfSignalReport, ReportOpPerfTelemetry } from "./connectionTelemetry.js";
|
|
132
136
|
import { ContainerFluidHandleContext } from "./containerHandleContext.js";
|
|
133
137
|
import { channelToDataStore } from "./dataStore.js";
|
|
134
138
|
import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
|
|
135
|
-
import {
|
|
139
|
+
import {
|
|
140
|
+
DeltaManagerPendingOpsProxy,
|
|
141
|
+
DeltaManagerSummarizerProxy,
|
|
142
|
+
} from "./deltaManagerProxies.js";
|
|
136
143
|
import {
|
|
137
144
|
GCNodeType,
|
|
138
145
|
GarbageCollector,
|
|
@@ -1136,10 +1143,7 @@ export class ContainerRuntime
|
|
|
1136
1143
|
// That's because any other usage will require immidiate loading of ID Compressor in next sessions in order
|
|
1137
1144
|
// to reason over such things as session ID space.
|
|
1138
1145
|
if (this.idCompressorMode === "on") {
|
|
1139
|
-
assert(
|
|
1140
|
-
this._idCompressor !== undefined,
|
|
1141
|
-
0x8ea /* compressor should have been loaded */,
|
|
1142
|
-
);
|
|
1146
|
+
assert(this._idCompressor !== undefined, 0x8ea /* compressor should have been loaded */);
|
|
1143
1147
|
return this._idCompressor;
|
|
1144
1148
|
}
|
|
1145
1149
|
}
|
|
@@ -1173,7 +1177,10 @@ export class ContainerRuntime
|
|
|
1173
1177
|
* should be sufficient. This should be used only if necessary. For example, for validating and propagating connected
|
|
1174
1178
|
* events which requires access to the actual real only info, this is needed.
|
|
1175
1179
|
*/
|
|
1176
|
-
private readonly innerDeltaManager: IDeltaManager<
|
|
1180
|
+
private readonly innerDeltaManager: IDeltaManager<
|
|
1181
|
+
ISequencedDocumentMessage,
|
|
1182
|
+
IDocumentMessage
|
|
1183
|
+
>;
|
|
1177
1184
|
|
|
1178
1185
|
// internal logger for ContainerRuntime. Use this.logger for stores, summaries, etc.
|
|
1179
1186
|
private readonly mc: MonitoringContext;
|
|
@@ -1538,7 +1545,9 @@ export class ContainerRuntime
|
|
|
1538
1545
|
const useDeltaManagerOpsProxy =
|
|
1539
1546
|
this.mc.config.getBoolean("Fluid.ContainerRuntime.DeltaManagerOpsProxy") !== false;
|
|
1540
1547
|
// The summarizerDeltaManager Proxy is used to lie to the summarizer to convince it is in the right state as a summarizer client.
|
|
1541
|
-
const summarizerDeltaManagerProxy = new DeltaManagerSummarizerProxy(
|
|
1548
|
+
const summarizerDeltaManagerProxy = new DeltaManagerSummarizerProxy(
|
|
1549
|
+
this.innerDeltaManager,
|
|
1550
|
+
);
|
|
1542
1551
|
outerDeltaManager = summarizerDeltaManagerProxy;
|
|
1543
1552
|
|
|
1544
1553
|
// The DeltaManagerPendingOpsProxy is used to control the minimum sequence number
|
|
@@ -1754,7 +1763,7 @@ export class ContainerRuntime
|
|
|
1754
1763
|
: ({
|
|
1755
1764
|
clientId,
|
|
1756
1765
|
client: audience.getMember(clientId),
|
|
1757
|
-
|
|
1766
|
+
} satisfies ISelf);
|
|
1758
1767
|
};
|
|
1759
1768
|
|
|
1760
1769
|
let oldClientId = this.clientId;
|
|
@@ -1773,7 +1782,8 @@ export class ContainerRuntime
|
|
|
1773
1782
|
const closeSummarizerDelayOverride = this.mc.config.getNumber(
|
|
1774
1783
|
"Fluid.ContainerRuntime.Test.CloseSummarizerDelayOverrideMs",
|
|
1775
1784
|
);
|
|
1776
|
-
this.closeSummarizerDelayMs =
|
|
1785
|
+
this.closeSummarizerDelayMs =
|
|
1786
|
+
closeSummarizerDelayOverride ?? defaultCloseSummarizerDelayMs;
|
|
1777
1787
|
this.summaryCollection = new SummaryCollection(this.deltaManager, this.logger);
|
|
1778
1788
|
|
|
1779
1789
|
this.dirtyContainer =
|
|
@@ -1940,7 +1950,10 @@ export class ContainerRuntime
|
|
|
1940
1950
|
}
|
|
1941
1951
|
}
|
|
1942
1952
|
|
|
1943
|
-
public getCreateChildSummarizerNodeFn(
|
|
1953
|
+
public getCreateChildSummarizerNodeFn(
|
|
1954
|
+
id: string,
|
|
1955
|
+
createParam: CreateChildSummarizerNodeParam,
|
|
1956
|
+
) {
|
|
1944
1957
|
return (
|
|
1945
1958
|
summarizeInternal: SummarizeInternalFn,
|
|
1946
1959
|
getGCDataFn: (fullGC?: boolean) => Promise<IGarbageCollectionData>,
|
|
@@ -2087,9 +2100,7 @@ export class ContainerRuntime
|
|
|
2087
2100
|
// the summarizer state is not up to date.
|
|
2088
2101
|
// This should be a recoverable scenario and shouldn't happen as we should process the ack first.
|
|
2089
2102
|
if (this.isSummarizerClient) {
|
|
2090
|
-
throw new Error(
|
|
2091
|
-
"Summarizer client behind, loaded newer snapshot with loadingGroupId",
|
|
2092
|
-
);
|
|
2103
|
+
throw new Error("Summarizer client behind, loaded newer snapshot with loadingGroupId");
|
|
2093
2104
|
}
|
|
2094
2105
|
|
|
2095
2106
|
// We want to catchup from sequenceNumber to targetSequenceNumber
|
|
@@ -2196,7 +2207,7 @@ export class ContainerRuntime
|
|
|
2196
2207
|
status: 200,
|
|
2197
2208
|
mimeType: "fluid/object",
|
|
2198
2209
|
value: blob,
|
|
2199
|
-
|
|
2210
|
+
}
|
|
2200
2211
|
: create404Response(request);
|
|
2201
2212
|
} else if (requestParser.pathParts.length > 0) {
|
|
2202
2213
|
return await this.channelCollection.request(request);
|
|
@@ -2597,13 +2608,13 @@ export class ContainerRuntime
|
|
|
2597
2608
|
message: message as InboundSequencedContainerRuntimeMessage,
|
|
2598
2609
|
local,
|
|
2599
2610
|
modernRuntimeMessage,
|
|
2600
|
-
|
|
2611
|
+
}
|
|
2601
2612
|
: // Unrecognized message will be ignored.
|
|
2602
|
-
|
|
2613
|
+
{
|
|
2603
2614
|
message,
|
|
2604
2615
|
local,
|
|
2605
2616
|
modernRuntimeMessage,
|
|
2606
|
-
|
|
2617
|
+
};
|
|
2607
2618
|
msg.savedOp = savedOp;
|
|
2608
2619
|
|
|
2609
2620
|
// ensure that we observe any re-entrancy, and if needed, rebase ops
|
|
@@ -2749,10 +2760,7 @@ export class ContainerRuntime
|
|
|
2749
2760
|
|
|
2750
2761
|
const compatBehavior = messageWithContext.message.compatDetails?.behavior;
|
|
2751
2762
|
if (
|
|
2752
|
-
!compatBehaviorAllowsMessageType(
|
|
2753
|
-
messageWithContext.message.type,
|
|
2754
|
-
compatBehavior,
|
|
2755
|
-
)
|
|
2763
|
+
!compatBehaviorAllowsMessageType(messageWithContext.message.type, compatBehavior)
|
|
2756
2764
|
) {
|
|
2757
2765
|
const { message } = messageWithContext;
|
|
2758
2766
|
const error = DataProcessingError.create(
|
|
@@ -2807,8 +2815,7 @@ export class ContainerRuntime
|
|
|
2807
2815
|
// Check to see if the signal was lost.
|
|
2808
2816
|
if (
|
|
2809
2817
|
this._perfSignalData.trackingSignalSequenceNumber !== undefined &&
|
|
2810
|
-
envelope.clientSignalSequenceNumber >
|
|
2811
|
-
this._perfSignalData.trackingSignalSequenceNumber
|
|
2818
|
+
envelope.clientSignalSequenceNumber > this._perfSignalData.trackingSignalSequenceNumber
|
|
2812
2819
|
) {
|
|
2813
2820
|
this._perfSignalData.signalsLost++;
|
|
2814
2821
|
this._perfSignalData.trackingSignalSequenceNumber = undefined;
|
|
@@ -3543,10 +3550,7 @@ export class ContainerRuntime
|
|
|
3543
3550
|
* Generally the validate sequence number comes from the running summarizer and the node sequence number comes from the
|
|
3544
3551
|
* summarizer nodes.
|
|
3545
3552
|
*/
|
|
3546
|
-
if (
|
|
3547
|
-
startSummaryResult.invalidNodes > 0 ||
|
|
3548
|
-
startSummaryResult.mismatchNumbers.size > 0
|
|
3549
|
-
) {
|
|
3553
|
+
if (startSummaryResult.invalidNodes > 0 || startSummaryResult.mismatchNumbers.size > 0) {
|
|
3550
3554
|
summaryLogger.sendTelemetryEvent({
|
|
3551
3555
|
eventName: "LatestSummaryRefSeqNumMismatch",
|
|
3552
3556
|
details: {
|
|
@@ -3714,12 +3718,12 @@ export class ContainerRuntime
|
|
|
3714
3718
|
proposalHandle: undefined,
|
|
3715
3719
|
ackHandle: this.loadedFromVersionId,
|
|
3716
3720
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
3717
|
-
|
|
3721
|
+
}
|
|
3718
3722
|
: {
|
|
3719
3723
|
proposalHandle: lastAck.summaryOp.contents.handle,
|
|
3720
3724
|
ackHandle: lastAck.summaryAck.contents.handle,
|
|
3721
3725
|
referenceSequenceNumber: summaryRefSeqNum,
|
|
3722
|
-
|
|
3726
|
+
};
|
|
3723
3727
|
|
|
3724
3728
|
let handle: string;
|
|
3725
3729
|
try {
|
|
@@ -4267,10 +4271,7 @@ export class ContainerRuntime
|
|
|
4267
4271
|
"prefetchLatestSummaryBeforeClose",
|
|
4268
4272
|
FetchSource.noCache,
|
|
4269
4273
|
);
|
|
4270
|
-
assert(
|
|
4271
|
-
!!versions && !!versions[0],
|
|
4272
|
-
0x137 /* "Failed to get version from storage" */,
|
|
4273
|
-
);
|
|
4274
|
+
assert(!!versions && !!versions[0], 0x137 /* "Failed to get version from storage" */);
|
|
4274
4275
|
stats.getVersionDuration = trace.trace().duration;
|
|
4275
4276
|
|
|
4276
4277
|
const maybeSnapshot = await this.storage.getSnapshotTree(versions[0]);
|
|
@@ -4338,15 +4339,13 @@ export class ContainerRuntime
|
|
|
4338
4339
|
logAndReturnPendingState(
|
|
4339
4340
|
event,
|
|
4340
4341
|
getSyncState(
|
|
4341
|
-
await this.blobManager.attachAndGetPendingBlobs(
|
|
4342
|
-
props?.stopBlobAttachingSignal,
|
|
4343
|
-
),
|
|
4342
|
+
await this.blobManager.attachAndGetPendingBlobs(props?.stopBlobAttachingSignal),
|
|
4344
4343
|
),
|
|
4345
4344
|
),
|
|
4346
|
-
|
|
4345
|
+
)
|
|
4347
4346
|
: PerformanceEvent.timedExec(this.mc.logger, perfEvent, (event) =>
|
|
4348
4347
|
logAndReturnPendingState(event, getSyncState()),
|
|
4349
|
-
|
|
4348
|
+
);
|
|
4350
4349
|
}
|
|
4351
4350
|
|
|
4352
4351
|
public summarizeOnDemand(options: IOnDemandSummarizeOptions): ISummarizeResults {
|
|
@@ -4384,7 +4383,9 @@ export class ContainerRuntime
|
|
|
4384
4383
|
};
|
|
4385
4384
|
}
|
|
4386
4385
|
|
|
4387
|
-
private validateSummaryHeuristicConfiguration(
|
|
4386
|
+
private validateSummaryHeuristicConfiguration(
|
|
4387
|
+
configuration: ISummaryConfigurationHeuristics,
|
|
4388
|
+
) {
|
|
4388
4389
|
// eslint-disable-next-line no-restricted-syntax
|
|
4389
4390
|
for (const prop in configuration) {
|
|
4390
4391
|
if (typeof configuration[prop] === "number" && configuration[prop] < 0) {
|
package/src/dataStoreContext.ts
CHANGED
|
@@ -94,7 +94,10 @@ function createAttributes(
|
|
|
94
94
|
isRootDataStore,
|
|
95
95
|
};
|
|
96
96
|
}
|
|
97
|
-
export function createAttributesBlob(
|
|
97
|
+
export function createAttributesBlob(
|
|
98
|
+
pkg: readonly string[],
|
|
99
|
+
isRootDataStore: boolean,
|
|
100
|
+
): ITreeEntry {
|
|
98
101
|
const attributes = createAttributes(pkg, isRootDataStore);
|
|
99
102
|
return new BlobTreeEntry(dataStoreAttributesBlobName, JSON.stringify(attributes));
|
|
100
103
|
}
|
|
@@ -157,7 +160,8 @@ export interface ILocalFluidDataStoreContextProps extends IFluidDataStoreContext
|
|
|
157
160
|
* Properties necessary for creating a local FluidDataStoreContext
|
|
158
161
|
* @internal
|
|
159
162
|
*/
|
|
160
|
-
export interface ILocalDetachedFluidDataStoreContextProps
|
|
163
|
+
export interface ILocalDetachedFluidDataStoreContextProps
|
|
164
|
+
extends ILocalFluidDataStoreContextProps {
|
|
161
165
|
readonly channelToDataStoreFn: (channel: IFluidDataStoreChannel) => IDataStore;
|
|
162
166
|
}
|
|
163
167
|
|
|
@@ -431,7 +435,9 @@ export abstract class FluidDataStoreContext
|
|
|
431
435
|
this._tombstoned = tombstone;
|
|
432
436
|
}
|
|
433
437
|
|
|
434
|
-
public abstract setAttachState(
|
|
438
|
+
public abstract setAttachState(
|
|
439
|
+
attachState: AttachState.Attaching | AttachState.Attached,
|
|
440
|
+
): void;
|
|
435
441
|
|
|
436
442
|
private rejectDeferredRealize(
|
|
437
443
|
reason: string,
|
|
@@ -448,7 +454,10 @@ export abstract class FluidDataStoreContext
|
|
|
448
454
|
}
|
|
449
455
|
|
|
450
456
|
public async realize(): Promise<IFluidDataStoreChannel> {
|
|
451
|
-
assert(
|
|
457
|
+
assert(
|
|
458
|
+
!this.detachedRuntimeCreation,
|
|
459
|
+
0x13d /* "Detached runtime creation on realize()" */,
|
|
460
|
+
);
|
|
452
461
|
if (!this.channelP) {
|
|
453
462
|
this.channelP = this.realizeCore(this.existing).catch((error) => {
|
|
454
463
|
const errorWrapped = DataProcessingError.wrapIfUnrecognized(
|
|
@@ -892,13 +901,17 @@ export abstract class FluidDataStoreContext
|
|
|
892
901
|
* Get the summary required when attaching this context's DataStore.
|
|
893
902
|
* Used for both Container Attach and DataStore Attach.
|
|
894
903
|
*/
|
|
895
|
-
public abstract getAttachSummary(
|
|
904
|
+
public abstract getAttachSummary(
|
|
905
|
+
telemetryContext?: ITelemetryContext,
|
|
906
|
+
): ISummaryTreeWithStats;
|
|
896
907
|
|
|
897
908
|
/**
|
|
898
909
|
* Get the GC Data for the initial state being attached so remote clients can learn of this DataStore's
|
|
899
910
|
* outbound routes.
|
|
900
911
|
*/
|
|
901
|
-
public abstract getAttachGCData(
|
|
912
|
+
public abstract getAttachGCData(
|
|
913
|
+
telemetryContext?: ITelemetryContext,
|
|
914
|
+
): IGarbageCollectionData;
|
|
902
915
|
|
|
903
916
|
public abstract getInitialSnapshotDetails(): Promise<ISnapshotDetails>;
|
|
904
917
|
|
|
@@ -1010,7 +1023,10 @@ export abstract class FluidDataStoreContext
|
|
|
1010
1023
|
this.localChangesTelemetryCount--;
|
|
1011
1024
|
}
|
|
1012
1025
|
|
|
1013
|
-
public getCreateChildSummarizerNodeFn(
|
|
1026
|
+
public getCreateChildSummarizerNodeFn(
|
|
1027
|
+
id: string,
|
|
1028
|
+
createParam: CreateChildSummarizerNodeParam,
|
|
1029
|
+
) {
|
|
1014
1030
|
return (
|
|
1015
1031
|
summarizeInternal: SummarizeInternalFn,
|
|
1016
1032
|
getGCDataFn: (fullGC?: boolean) => Promise<IGarbageCollectionData>,
|
|
@@ -1076,7 +1092,10 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
|
|
|
1076
1092
|
// Sequence number of the snapshot.
|
|
1077
1093
|
let sequenceNumber: number | undefined;
|
|
1078
1094
|
// Check whether we need to fetch the snapshot first to load.
|
|
1079
|
-
if (
|
|
1095
|
+
if (
|
|
1096
|
+
this.snapshotFetchRequired === undefined &&
|
|
1097
|
+
this._baseSnapshot?.groupId !== undefined
|
|
1098
|
+
) {
|
|
1080
1099
|
assert(
|
|
1081
1100
|
this.blobContents !== undefined,
|
|
1082
1101
|
0x97a /* Blob contents should be present to evaluate */,
|
|
@@ -1144,7 +1163,10 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
|
|
|
1144
1163
|
}
|
|
1145
1164
|
}
|
|
1146
1165
|
|
|
1147
|
-
assert(
|
|
1166
|
+
assert(
|
|
1167
|
+
this.pkg !== undefined,
|
|
1168
|
+
0x8f6 /* The datastore context package should be defined */,
|
|
1169
|
+
);
|
|
1148
1170
|
return {
|
|
1149
1171
|
pkg: this.pkg,
|
|
1150
1172
|
isRootDataStore,
|
package/src/dataStoreContexts.ts
CHANGED
|
@@ -5,12 +5,17 @@
|
|
|
5
5
|
|
|
6
6
|
import { IDisposable, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
7
7
|
import { assert, Deferred, Lazy } from "@fluidframework/core-utils/internal";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
ITelemetryLoggerExt,
|
|
10
|
+
createChildLogger,
|
|
11
|
+
} from "@fluidframework/telemetry-utils/internal";
|
|
9
12
|
|
|
10
13
|
import { FluidDataStoreContext, LocalFluidDataStoreContext } from "./dataStoreContext.js";
|
|
11
14
|
|
|
12
15
|
/** @internal */
|
|
13
|
-
export class DataStoreContexts
|
|
16
|
+
export class DataStoreContexts
|
|
17
|
+
implements Iterable<[string, FluidDataStoreContext]>, IDisposable
|
|
18
|
+
{
|
|
14
19
|
private readonly notBoundContexts = new Set<string>();
|
|
15
20
|
|
|
16
21
|
/** Attached and loaded context proxies */
|
|
@@ -100,7 +100,10 @@ export abstract class BaseDeltaManagerProxy
|
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
constructor(
|
|
103
|
-
protected readonly deltaManager: IDeltaManager<
|
|
103
|
+
protected readonly deltaManager: IDeltaManager<
|
|
104
|
+
ISequencedDocumentMessage,
|
|
105
|
+
IDocumentMessage
|
|
106
|
+
>,
|
|
104
107
|
) {
|
|
105
108
|
super();
|
|
106
109
|
|
|
@@ -192,7 +195,10 @@ export class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {
|
|
|
192
195
|
private readonly isSummarizerClient: boolean;
|
|
193
196
|
|
|
194
197
|
constructor(
|
|
195
|
-
protected readonly deltaManager: IDeltaManager<
|
|
198
|
+
protected readonly deltaManager: IDeltaManager<
|
|
199
|
+
ISequencedDocumentMessage,
|
|
200
|
+
IDocumentMessage
|
|
201
|
+
>,
|
|
196
202
|
) {
|
|
197
203
|
super(deltaManager);
|
|
198
204
|
this.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;
|
|
@@ -237,7 +243,10 @@ export class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {
|
|
|
237
243
|
};
|
|
238
244
|
|
|
239
245
|
constructor(
|
|
240
|
-
protected readonly deltaManager: IDeltaManager<
|
|
246
|
+
protected readonly deltaManager: IDeltaManager<
|
|
247
|
+
ISequencedDocumentMessage,
|
|
248
|
+
IDocumentMessage
|
|
249
|
+
>,
|
|
241
250
|
private readonly pendingStateManager: Pick<
|
|
242
251
|
PendingStateManager,
|
|
243
252
|
"minimumPendingMessageSequenceNumber"
|
package/src/deltaScheduler.ts
CHANGED
|
@@ -148,9 +148,7 @@ export class DeltaScheduler {
|
|
|
148
148
|
numberOfTurns: this.schedulingLog.numberOfTurns,
|
|
149
149
|
processingTime: formatTick(this.schedulingLog.totalProcessingTime),
|
|
150
150
|
opsProcessed:
|
|
151
|
-
this.schedulingLog.lastSequenceNumber -
|
|
152
|
-
this.schedulingLog.firstSequenceNumber +
|
|
153
|
-
1,
|
|
151
|
+
this.schedulingLog.lastSequenceNumber - this.schedulingLog.firstSequenceNumber + 1,
|
|
154
152
|
batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
|
|
155
153
|
duration: formatTick(currentTime - this.schedulingLog.startTime),
|
|
156
154
|
schedulingCount: this.schedulingCount,
|
|
@@ -12,7 +12,10 @@ import {
|
|
|
12
12
|
type IGarbageCollectionData,
|
|
13
13
|
type ITelemetryContext,
|
|
14
14
|
} from "@fluidframework/runtime-definitions/internal";
|
|
15
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
createResponseError,
|
|
17
|
+
responseToException,
|
|
18
|
+
} from "@fluidframework/runtime-utils/internal";
|
|
16
19
|
import {
|
|
17
20
|
ITelemetryLoggerExt,
|
|
18
21
|
DataProcessingError,
|
|
@@ -56,7 +59,10 @@ import {
|
|
|
56
59
|
urlToGCNodePath,
|
|
57
60
|
} from "./gcHelpers.js";
|
|
58
61
|
import { runGarbageCollection } from "./gcReferenceGraphAlgorithm.js";
|
|
59
|
-
import {
|
|
62
|
+
import {
|
|
63
|
+
IGarbageCollectionSnapshotData,
|
|
64
|
+
IGarbageCollectionState,
|
|
65
|
+
} from "./gcSummaryDefinitions.js";
|
|
60
66
|
import { GCSummaryStateTracker } from "./gcSummaryStateTracker.js";
|
|
61
67
|
import { GCTelemetryTracker } from "./gcTelemetry.js";
|
|
62
68
|
import {
|
|
@@ -242,10 +248,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
242
248
|
return undefined;
|
|
243
249
|
}
|
|
244
250
|
|
|
245
|
-
const snapshotData = await getGCDataFromSnapshot(
|
|
246
|
-
gcSnapshotTree,
|
|
247
|
-
readAndParseBlob,
|
|
248
|
-
);
|
|
251
|
+
const snapshotData = await getGCDataFromSnapshot(gcSnapshotTree, readAndParseBlob);
|
|
249
252
|
|
|
250
253
|
// If the GC version in base snapshot does not match the GC version currently in effect, the GC data
|
|
251
254
|
// in the snapshot cannot be interpreted correctly. Set everything to undefined except for
|
|
@@ -260,10 +263,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
260
263
|
}
|
|
261
264
|
return snapshotData;
|
|
262
265
|
} catch (error) {
|
|
263
|
-
const dpe = DataProcessingError.wrapIfUnrecognized(
|
|
264
|
-
error,
|
|
265
|
-
"FailedToInitializeGC",
|
|
266
|
-
);
|
|
266
|
+
const dpe = DataProcessingError.wrapIfUnrecognized(error, "FailedToInitializeGC");
|
|
267
267
|
dpe.addTelemetryProperties({
|
|
268
268
|
gcConfigs: JSON.stringify(this.configs),
|
|
269
269
|
});
|
|
@@ -746,7 +746,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
746
746
|
const containerGCMessage: ContainerRuntimeGCMessage = {
|
|
747
747
|
type: ContainerMessageType.GC,
|
|
748
748
|
contents,
|
|
749
|
-
compatDetails: { behavior: "Ignore" },
|
|
749
|
+
compatDetails: { behavior: "Ignore" }, // DEPRECATED: For temporary back compat only
|
|
750
750
|
};
|
|
751
751
|
this.submitMessage(containerGCMessage);
|
|
752
752
|
return;
|
|
@@ -814,14 +814,16 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
814
814
|
*/
|
|
815
815
|
const gcDataSuperSet = concatGarbageCollectionData(previousGCData, currentGCData);
|
|
816
816
|
const newOutboundRoutesSinceLastRun: string[] = [];
|
|
817
|
-
this.newReferencesSinceLastRun.forEach(
|
|
818
|
-
|
|
819
|
-
gcDataSuperSet.gcNodes[sourceNodeId]
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
817
|
+
this.newReferencesSinceLastRun.forEach(
|
|
818
|
+
(outboundRoutes: string[], sourceNodeId: string) => {
|
|
819
|
+
if (gcDataSuperSet.gcNodes[sourceNodeId] === undefined) {
|
|
820
|
+
gcDataSuperSet.gcNodes[sourceNodeId] = outboundRoutes;
|
|
821
|
+
} else {
|
|
822
|
+
gcDataSuperSet.gcNodes[sourceNodeId].push(...outboundRoutes);
|
|
823
|
+
}
|
|
824
|
+
newOutboundRoutesSinceLastRun.push(...outboundRoutes);
|
|
825
|
+
},
|
|
826
|
+
);
|
|
825
827
|
|
|
826
828
|
/**
|
|
827
829
|
* Run GC on the above reference graph starting with root and all new outbound routes. This will generate a
|
|
@@ -929,10 +931,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
929
931
|
}
|
|
930
932
|
default: {
|
|
931
933
|
if (
|
|
932
|
-
!compatBehaviorAllowsGCMessageType(
|
|
933
|
-
gcMessageType,
|
|
934
|
-
message.compatDetails?.behavior,
|
|
935
|
-
)
|
|
934
|
+
!compatBehaviorAllowsGCMessageType(gcMessageType, message.compatDetails?.behavior)
|
|
936
935
|
) {
|
|
937
936
|
const error = DataProcessingError.create(
|
|
938
937
|
`Garbage collection message of unknown type ${gcMessageType}`,
|
|
@@ -1096,7 +1095,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1096
1095
|
type: GarbageCollectionMessageType.TombstoneLoaded,
|
|
1097
1096
|
nodePath,
|
|
1098
1097
|
},
|
|
1099
|
-
compatDetails: { behavior: "Ignore" },
|
|
1098
|
+
compatDetails: { behavior: "Ignore" }, // DEPRECATED: For temporary back compat only
|
|
1100
1099
|
};
|
|
1101
1100
|
this.submitMessage(containerGCMessage);
|
|
1102
1101
|
}
|
package/src/gc/gcConfigs.ts
CHANGED
|
@@ -122,7 +122,7 @@ export function generateGCConfigs(
|
|
|
122
122
|
!gcEnabled || tombstoneTimeoutMs === undefined
|
|
123
123
|
? false
|
|
124
124
|
: mc.config.getBoolean(runSweepKey) ??
|
|
125
|
-
|
|
125
|
+
(sweepAllowed && createParams.gcOptions.enableGCSweep === true);
|
|
126
126
|
const disableDatastoreSweep =
|
|
127
127
|
mc.config.getBoolean(disableDatastoreSweepKey) === true ||
|
|
128
128
|
createParams.gcOptions[gcDisableDataStoreSweepOptionName] === true;
|
|
@@ -199,7 +199,11 @@ export function generateGCConfigs(
|
|
|
199
199
|
*
|
|
200
200
|
* If there is no Session Expiry timeout, GC can never guarantee an object won't be revived, so return undefined.
|
|
201
201
|
*/
|
|
202
|
-
function computeTombstoneTimeout(
|
|
202
|
+
function computeTombstoneTimeout(
|
|
203
|
+
sessionExpiryTimeoutMs: number | undefined,
|
|
204
|
+
): number | undefined {
|
|
203
205
|
const bufferMs = oneDayMs;
|
|
204
|
-
return
|
|
206
|
+
return (
|
|
207
|
+
sessionExpiryTimeoutMs && sessionExpiryTimeoutMs + maxSnapshotCacheExpiryMs + bufferMs
|
|
208
|
+
);
|
|
205
209
|
}
|