@fluidframework/container-runtime 2.20.0 → 2.21.0
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/.eslintrc.cjs +36 -6
- package/CHANGELOG.md +38 -0
- package/api-report/container-runtime.legacy.alpha.api.md +31 -31
- package/dist/batchTracker.d.ts +1 -2
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager/blobManager.d.ts.map +1 -1
- package/dist/blobManager/blobManager.js +14 -11
- package/dist/blobManager/blobManager.js.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.d.ts +1 -0
- package/dist/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/dist/blobManager/blobManagerSnapSum.js +7 -5
- package/dist/blobManager/blobManagerSnapSum.js.map +1 -1
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +63 -41
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +2 -2
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +4 -4
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +14 -30
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +264 -194
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +6 -3
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +16 -11
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +1 -0
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +5 -5
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +36 -14
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +2 -0
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +8 -0
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js +1 -0
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +8 -5
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +2 -1
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +29 -15
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/inboundBatchAggregator.js +3 -3
- package/dist/inboundBatchAggregator.js.map +1 -1
- package/dist/layerCompatState.d.ts +19 -0
- package/dist/layerCompatState.d.ts.map +1 -0
- package/dist/layerCompatState.js +64 -0
- package/dist/layerCompatState.js.map +1 -0
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/duplicateBatchDetector.js +2 -2
- package/dist/opLifecycle/duplicateBatchDetector.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +3 -2
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +13 -19
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +3 -0
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +4 -1
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +5 -3
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +13 -10
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +14 -11
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +3 -3
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +11 -15
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +3 -1
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +3 -4
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +11 -10
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +7 -0
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +6 -4
- package/dist/summary/documentSchema.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +1 -0
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +13 -11
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -0
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +7 -2
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +2 -2
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +38 -17
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +1 -0
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +18 -9
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js +1 -0
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +30 -31
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +7 -0
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +3 -4
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +9 -6
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +4 -1
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +3 -2
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +19 -8
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +12 -9
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +1 -2
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager/blobManager.d.ts.map +1 -1
- package/lib/blobManager/blobManager.js +14 -11
- package/lib/blobManager/blobManager.js.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.d.ts +1 -0
- package/lib/blobManager/blobManagerSnapSum.d.ts.map +1 -1
- package/lib/blobManager/blobManagerSnapSum.js +7 -5
- package/lib/blobManager/blobManagerSnapSum.js.map +1 -1
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +66 -42
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +2 -2
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +5 -5
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +14 -30
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +271 -196
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +6 -3
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +16 -11
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +1 -0
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +6 -6
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +39 -15
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +2 -0
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +8 -0
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js +1 -0
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +8 -5
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +2 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +32 -16
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/inboundBatchAggregator.js +4 -4
- package/lib/inboundBatchAggregator.js.map +1 -1
- package/lib/layerCompatState.d.ts +19 -0
- package/lib/layerCompatState.d.ts.map +1 -0
- package/lib/layerCompatState.js +60 -0
- package/lib/layerCompatState.js.map +1 -0
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/duplicateBatchDetector.js +2 -2
- package/lib/opLifecycle/duplicateBatchDetector.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +3 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +13 -19
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +3 -0
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +4 -1
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +5 -3
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +13 -10
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +14 -11
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +3 -3
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +11 -15
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +3 -1
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +3 -4
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +12 -11
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +7 -0
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +6 -4
- package/lib/summary/documentSchema.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +1 -0
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +13 -11
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -0
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +7 -2
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +2 -2
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +38 -17
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +1 -0
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +18 -9
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js +1 -0
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/index.d.ts.map +1 -1
- package/lib/summary/summarizerNode/index.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +30 -31
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +7 -0
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +3 -4
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +9 -6
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +4 -1
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +2 -2
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +19 -8
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +12 -9
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +21 -43
- package/src/batchTracker.ts +3 -3
- package/src/blobManager/blobManager.ts +16 -14
- package/src/blobManager/blobManagerSnapSum.ts +8 -8
- package/src/channelCollection.ts +63 -44
- package/src/connectionTelemetry.ts +12 -6
- package/src/containerRuntime.ts +306 -235
- package/src/dataStore.ts +6 -3
- package/src/dataStoreContext.ts +16 -16
- package/src/dataStoreContexts.ts +1 -0
- package/src/deltaScheduler.ts +6 -6
- package/src/gc/garbageCollection.ts +47 -20
- package/src/gc/gcConfigs.ts +9 -1
- package/src/gc/gcDefinitions.ts +12 -0
- package/src/gc/gcHelpers.ts +9 -4
- package/src/gc/gcSummaryStateTracker.ts +3 -1
- package/src/gc/gcTelemetry.ts +26 -11
- package/src/inboundBatchAggregator.ts +4 -4
- package/src/layerCompatState.ts +75 -0
- package/src/messageTypes.ts +2 -0
- package/src/opLifecycle/README.md +43 -34
- package/src/opLifecycle/duplicateBatchDetector.ts +2 -2
- package/src/opLifecycle/opCompressor.ts +16 -23
- package/src/opLifecycle/opDecompressor.ts +4 -1
- package/src/opLifecycle/opGroupingManager.ts +5 -4
- package/src/opLifecycle/opSplitter.ts +14 -11
- package/src/opLifecycle/outbox.ts +13 -20
- package/src/opLifecycle/remoteMessageProcessor.ts +3 -1
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +15 -10
- package/src/summary/documentSchema.ts +11 -4
- package/src/summary/orderedClientElection.ts +14 -11
- package/src/summary/runWhileConnectedCoordinator.ts +6 -0
- package/src/summary/runningSummarizer.ts +43 -19
- package/src/summary/summarizer.ts +24 -11
- package/src/summary/summarizerClientElection.ts +2 -0
- package/src/summary/summarizerHeuristics.ts +1 -1
- package/src/summary/summarizerNode/index.ts +1 -0
- package/src/summary/summarizerNode/summarizerNode.ts +32 -31
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
- package/src/summary/summarizerTypes.ts +7 -0
- package/src/summary/summaryCollection.ts +19 -8
- package/src/summary/summaryFormat.ts +10 -5
- package/src/summary/summaryGenerator.ts +25 -10
- package/src/summary/summaryManager.ts +14 -12
- package/container-runtime.test-files.tar +0 -0
|
@@ -51,6 +51,7 @@ import {
|
|
|
51
51
|
getStorageIds,
|
|
52
52
|
summarizeBlobManagerState,
|
|
53
53
|
toRedirectTable,
|
|
54
|
+
// eslint-disable-next-line import/no-deprecated
|
|
54
55
|
type IBlobManagerLoadInfo,
|
|
55
56
|
} from "./blobManagerSnapSum.js";
|
|
56
57
|
|
|
@@ -187,6 +188,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
187
188
|
|
|
188
189
|
constructor(props: {
|
|
189
190
|
readonly routeContext: IFluidHandleContext;
|
|
191
|
+
// eslint-disable-next-line import/no-deprecated
|
|
190
192
|
snapshot: IBlobManagerLoadInfo;
|
|
191
193
|
readonly getStorage: () => IDocumentStorageService;
|
|
192
194
|
/**
|
|
@@ -240,7 +242,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
240
242
|
this.redirectTable = toRedirectTable(snapshot, this.mc.logger, this.runtime.attachState);
|
|
241
243
|
|
|
242
244
|
// Begin uploading stashed blobs from previous container instance
|
|
243
|
-
Object.entries(stashedBlobs ?? {})
|
|
245
|
+
for (const [localId, entry] of Object.entries(stashedBlobs ?? {})) {
|
|
244
246
|
const { acked, storageId, minTTLInSeconds, uploadTime } = entry;
|
|
245
247
|
const blob = stringToBuffer(entry.blob, "base64");
|
|
246
248
|
const pendingEntry: PendingBlob = {
|
|
@@ -260,7 +262,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
260
262
|
const timeLapseSinceLocalUpload = (Date.now() - uploadTime) / 1000;
|
|
261
263
|
// stashed entries with more than half-life in storage will not be reuploaded
|
|
262
264
|
if (minTTLInSeconds - timeLapseSinceLocalUpload > minTTLInSeconds / 2) {
|
|
263
|
-
|
|
265
|
+
continue;
|
|
264
266
|
}
|
|
265
267
|
}
|
|
266
268
|
this.pendingStashedBlobs.set(localId, this.uploadBlob(localId, blob));
|
|
@@ -269,7 +271,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
269
271
|
...stashedPendingBlobOverrides,
|
|
270
272
|
uploadP: this.pendingStashedBlobs.get(localId),
|
|
271
273
|
});
|
|
272
|
-
}
|
|
274
|
+
}
|
|
273
275
|
|
|
274
276
|
this.stashedBlobsUploadP = new LazyPromise(async () =>
|
|
275
277
|
PerformanceEvent.timedExecAsync(
|
|
@@ -337,7 +339,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
337
339
|
}
|
|
338
340
|
|
|
339
341
|
public hasPendingStashedUploads(): boolean {
|
|
340
|
-
return
|
|
342
|
+
return [...this.pendingBlobs.values()].some((e) => e.stashedUpload === true);
|
|
341
343
|
}
|
|
342
344
|
|
|
343
345
|
public async getBlob(blobId: string): Promise<ArrayBufferLike> {
|
|
@@ -588,10 +590,10 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
588
590
|
// If there is already an op for this storage ID, append the local ID to the list. Once any op for
|
|
589
591
|
// this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
|
|
590
592
|
// blob alive in storage.
|
|
591
|
-
this.opsInFlight.set(
|
|
592
|
-
response.id,
|
|
593
|
-
|
|
594
|
-
);
|
|
593
|
+
this.opsInFlight.set(response.id, [
|
|
594
|
+
...(this.opsInFlight.get(response.id) ?? []),
|
|
595
|
+
localId,
|
|
596
|
+
]);
|
|
595
597
|
}
|
|
596
598
|
return response;
|
|
597
599
|
}
|
|
@@ -648,7 +650,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
648
650
|
// For each op corresponding to this storage ID that we are waiting for, resolve the pending blob.
|
|
649
651
|
// This is safe because the server will keep the blob alive and the op containing the local ID to
|
|
650
652
|
// storage ID is already in flight and any op containing this local ID will be sequenced after that.
|
|
651
|
-
|
|
653
|
+
for (const pendingLocalId of waitingBlobs) {
|
|
652
654
|
const entry = this.pendingBlobs.get(pendingLocalId);
|
|
653
655
|
assert(
|
|
654
656
|
entry !== undefined,
|
|
@@ -658,7 +660,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
658
660
|
entry.acked = true;
|
|
659
661
|
entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
|
|
660
662
|
this.deletePendingBlobMaybe(pendingLocalId);
|
|
661
|
-
}
|
|
663
|
+
}
|
|
662
664
|
this.opsInFlight.delete(blobId);
|
|
663
665
|
}
|
|
664
666
|
const localEntry = this.pendingBlobs.get(localId);
|
|
@@ -703,7 +705,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
703
705
|
*/
|
|
704
706
|
public deleteSweepReadyNodes(sweepReadyBlobRoutes: readonly string[]): readonly string[] {
|
|
705
707
|
this.deleteBlobsFromRedirectTable(sweepReadyBlobRoutes);
|
|
706
|
-
return
|
|
708
|
+
return [...sweepReadyBlobRoutes];
|
|
707
709
|
}
|
|
708
710
|
|
|
709
711
|
/**
|
|
@@ -865,10 +867,10 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
865
867
|
resolve();
|
|
866
868
|
}
|
|
867
869
|
};
|
|
868
|
-
if (
|
|
869
|
-
this.on("blobAttached", onBlobAttached);
|
|
870
|
-
} else {
|
|
870
|
+
if (entry.attached) {
|
|
871
871
|
resolve();
|
|
872
|
+
} else {
|
|
873
|
+
this.on("blobAttached", onBlobAttached);
|
|
872
874
|
}
|
|
873
875
|
}),
|
|
874
876
|
);
|
|
@@ -17,6 +17,7 @@ import type { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/intern
|
|
|
17
17
|
* Information from a snapshot needed to load BlobManager
|
|
18
18
|
* @legacy
|
|
19
19
|
* @alpha
|
|
20
|
+
* @deprecated This type will be moved to internal in 2.30. External usage is not necessary or supported.
|
|
20
21
|
*/
|
|
21
22
|
export interface IBlobManagerLoadInfo {
|
|
22
23
|
ids?: string[];
|
|
@@ -73,7 +74,9 @@ export const toRedirectTable = (
|
|
|
73
74
|
if (snapshot.ids) {
|
|
74
75
|
// If we are detached, we don't have storage IDs yet, so set to undefined
|
|
75
76
|
// Otherwise, set identity (id -> id) entries.
|
|
76
|
-
|
|
77
|
+
for (const entry of snapshot.ids) {
|
|
78
|
+
redirectTable.set(entry, detached ? undefined : entry);
|
|
79
|
+
}
|
|
77
80
|
}
|
|
78
81
|
return redirectTable;
|
|
79
82
|
};
|
|
@@ -90,12 +93,11 @@ const summarizeV1 = (
|
|
|
90
93
|
const storageIds = getStorageIds(redirectTable, attachState);
|
|
91
94
|
|
|
92
95
|
// if storageIds is empty, it means we are detached and have only local IDs, or that there are no blobs attached
|
|
93
|
-
const blobIds =
|
|
94
|
-
storageIds.size > 0 ? Array.from(storageIds) : Array.from(redirectTable.keys());
|
|
96
|
+
const blobIds = storageIds.size > 0 ? [...storageIds] : [...redirectTable.keys()];
|
|
95
97
|
const builder = new SummaryTreeBuilder();
|
|
96
|
-
|
|
98
|
+
for (const blobId of blobIds) {
|
|
97
99
|
builder.addAttachment(blobId);
|
|
98
|
-
}
|
|
100
|
+
}
|
|
99
101
|
|
|
100
102
|
// Any non-identity entries in the table need to be saved in the summary
|
|
101
103
|
if (redirectTable.size > blobIds.length) {
|
|
@@ -103,9 +105,7 @@ const summarizeV1 = (
|
|
|
103
105
|
redirectTableBlobName,
|
|
104
106
|
// filter out identity entries
|
|
105
107
|
JSON.stringify(
|
|
106
|
-
|
|
107
|
-
([localId, storageId]) => localId !== storageId,
|
|
108
|
-
),
|
|
108
|
+
[...redirectTable.entries()].filter(([localId, storageId]) => localId !== storageId),
|
|
109
109
|
),
|
|
110
110
|
);
|
|
111
111
|
}
|
package/src/channelCollection.ts
CHANGED
|
@@ -76,6 +76,7 @@ import {
|
|
|
76
76
|
import { v4 as uuid } from "uuid";
|
|
77
77
|
|
|
78
78
|
import {
|
|
79
|
+
// eslint-disable-next-line import/no-deprecated
|
|
79
80
|
DeletedResponseHeaderKey,
|
|
80
81
|
RuntimeHeaderData,
|
|
81
82
|
defaultRuntimeHeaderData,
|
|
@@ -96,10 +97,12 @@ import {
|
|
|
96
97
|
} from "./dataStoreContext.js";
|
|
97
98
|
import { DataStoreContexts } from "./dataStoreContexts.js";
|
|
98
99
|
import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
|
|
100
|
+
// eslint-disable-next-line import/no-deprecated
|
|
99
101
|
import { GCNodeType, IGCNodeUpdatedProps, urlToGCNodePath } from "./gc/index.js";
|
|
100
102
|
import { ContainerMessageType, LocalContainerRuntimeMessage } from "./messageTypes.js";
|
|
101
103
|
import { StorageServiceWithAttachBlobs } from "./storageServiceWithAttachBlobs.js";
|
|
102
104
|
import {
|
|
105
|
+
// eslint-disable-next-line import/no-deprecated
|
|
103
106
|
IContainerRuntimeMetadata,
|
|
104
107
|
nonDataStorePaths,
|
|
105
108
|
rootHasIsolatedChannels,
|
|
@@ -264,6 +267,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
264
267
|
|
|
265
268
|
protected readonly mc: MonitoringContext;
|
|
266
269
|
|
|
270
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping -- Property is defined once; no need to extract inner lambda
|
|
267
271
|
private readonly disposeOnce = new Lazy<void>(() => this.contexts.dispose());
|
|
268
272
|
|
|
269
273
|
public readonly entryPoint: IFluidHandleInternal<FluidObject>;
|
|
@@ -320,41 +324,41 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
320
324
|
unreferencedDataStoreCount++;
|
|
321
325
|
}
|
|
322
326
|
// If we have a detached container, then create local data store contexts.
|
|
323
|
-
if (this.parentContext.attachState
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
snapshotForRemoteFluidDatastoreContext = {
|
|
327
|
-
...baseSnapshot,
|
|
328
|
-
snapshotTree: value,
|
|
329
|
-
};
|
|
327
|
+
if (this.parentContext.attachState === AttachState.Detached) {
|
|
328
|
+
if (typeof value !== "object") {
|
|
329
|
+
throw new LoggingError("Snapshot should be there to load from!!");
|
|
330
330
|
}
|
|
331
|
-
|
|
331
|
+
const snapshotTree = value;
|
|
332
|
+
dataStoreContext = new LocalFluidDataStoreContext({
|
|
332
333
|
id: key,
|
|
333
|
-
|
|
334
|
+
pkg: undefined,
|
|
334
335
|
parentContext: this.wrapContextForInnerChannel(key),
|
|
335
336
|
storage: this.parentContext.storage,
|
|
336
337
|
scope: this.parentContext.scope,
|
|
337
338
|
createSummarizerNodeFn: this.parentContext.getCreateChildSummarizerNodeFn(key, {
|
|
338
339
|
type: CreateSummarizerNodeSource.FromSummary,
|
|
339
340
|
}),
|
|
340
|
-
|
|
341
|
+
makeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(key),
|
|
342
|
+
snapshotTree,
|
|
341
343
|
});
|
|
342
344
|
} else {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
+
let snapshotForRemoteFluidDatastoreContext: ISnapshot | ISnapshotTree = value;
|
|
346
|
+
if (isInstanceOfISnapshot(baseSnapshot)) {
|
|
347
|
+
snapshotForRemoteFluidDatastoreContext = {
|
|
348
|
+
...baseSnapshot,
|
|
349
|
+
snapshotTree: value,
|
|
350
|
+
};
|
|
345
351
|
}
|
|
346
|
-
|
|
347
|
-
dataStoreContext = new LocalFluidDataStoreContext({
|
|
352
|
+
dataStoreContext = new RemoteFluidDataStoreContext({
|
|
348
353
|
id: key,
|
|
349
|
-
|
|
354
|
+
snapshot: snapshotForRemoteFluidDatastoreContext,
|
|
350
355
|
parentContext: this.wrapContextForInnerChannel(key),
|
|
351
356
|
storage: this.parentContext.storage,
|
|
352
357
|
scope: this.parentContext.scope,
|
|
353
358
|
createSummarizerNodeFn: this.parentContext.getCreateChildSummarizerNodeFn(key, {
|
|
354
359
|
type: CreateSummarizerNodeSource.FromSummary,
|
|
355
360
|
}),
|
|
356
|
-
|
|
357
|
-
snapshotTree,
|
|
361
|
+
loadingGroupId: value.groupId,
|
|
358
362
|
});
|
|
359
363
|
}
|
|
360
364
|
this.contexts.addBoundOrRemoted(dataStoreContext);
|
|
@@ -707,13 +711,16 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
707
711
|
public reSubmit(type: string, content: unknown, localOpMetadata: unknown): void {
|
|
708
712
|
switch (type) {
|
|
709
713
|
case ContainerMessageType.Attach:
|
|
710
|
-
case ContainerMessageType.Alias:
|
|
714
|
+
case ContainerMessageType.Alias: {
|
|
711
715
|
this.parentContext.submitMessage(type, content, localOpMetadata);
|
|
712
716
|
return;
|
|
713
|
-
|
|
717
|
+
}
|
|
718
|
+
case ContainerMessageType.FluidDataStoreOp: {
|
|
714
719
|
return this.reSubmitChannelOp(type, content, localOpMetadata);
|
|
715
|
-
|
|
720
|
+
}
|
|
721
|
+
default: {
|
|
716
722
|
assert(false, 0x907 /* unknown op type */);
|
|
723
|
+
}
|
|
717
724
|
}
|
|
718
725
|
}
|
|
719
726
|
|
|
@@ -757,14 +764,18 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
757
764
|
public async applyStashedOp(content: unknown): Promise<unknown> {
|
|
758
765
|
const opContents = content as LocalContainerRuntimeMessage;
|
|
759
766
|
switch (opContents.type) {
|
|
760
|
-
case ContainerMessageType.Attach:
|
|
767
|
+
case ContainerMessageType.Attach: {
|
|
761
768
|
return this.applyStashedAttachOp(opContents.contents);
|
|
762
|
-
|
|
769
|
+
}
|
|
770
|
+
case ContainerMessageType.Alias: {
|
|
763
771
|
return;
|
|
764
|
-
|
|
772
|
+
}
|
|
773
|
+
case ContainerMessageType.FluidDataStoreOp: {
|
|
765
774
|
return this.applyStashedChannelChannelOp(opContents.contents);
|
|
766
|
-
|
|
775
|
+
}
|
|
776
|
+
default: {
|
|
767
777
|
assert(false, 0x908 /* unknon type of op */);
|
|
778
|
+
}
|
|
768
779
|
}
|
|
769
780
|
}
|
|
770
781
|
|
|
@@ -821,7 +832,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
821
832
|
// if the client is not detached put in the pending attach list
|
|
822
833
|
// so that on ack of the stashed op, the context is found.
|
|
823
834
|
// detached client don't send ops, so should not expect and ack.
|
|
824
|
-
this.pendingAttach.set(
|
|
835
|
+
this.pendingAttach.set(id, message);
|
|
825
836
|
}
|
|
826
837
|
}
|
|
827
838
|
|
|
@@ -831,17 +842,21 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
831
842
|
*/
|
|
832
843
|
public processMessages(messageCollection: IRuntimeMessageCollection): void {
|
|
833
844
|
switch (messageCollection.envelope.type) {
|
|
834
|
-
case ContainerMessageType.FluidDataStoreOp:
|
|
845
|
+
case ContainerMessageType.FluidDataStoreOp: {
|
|
835
846
|
this.processChannelMessages(messageCollection);
|
|
836
847
|
break;
|
|
837
|
-
|
|
848
|
+
}
|
|
849
|
+
case ContainerMessageType.Attach: {
|
|
838
850
|
this.processAttachMessages(messageCollection);
|
|
839
851
|
break;
|
|
840
|
-
|
|
852
|
+
}
|
|
853
|
+
case ContainerMessageType.Alias: {
|
|
841
854
|
this.processAliasMessages(messageCollection);
|
|
842
855
|
break;
|
|
843
|
-
|
|
856
|
+
}
|
|
857
|
+
default: {
|
|
844
858
|
assert(false, 0x8e9 /* unreached */);
|
|
859
|
+
}
|
|
845
860
|
}
|
|
846
861
|
}
|
|
847
862
|
|
|
@@ -874,7 +889,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
874
889
|
* @param messageCollection - The collection of messages to process.
|
|
875
890
|
*/
|
|
876
891
|
private processChannelMessages(messageCollection: IRuntimeMessageCollection): void {
|
|
877
|
-
const { messagesContent, local } = messageCollection;
|
|
892
|
+
const { envelope, messagesContent, local } = messageCollection;
|
|
878
893
|
let currentMessageState: { address: string; type: string } | undefined;
|
|
879
894
|
let currentMessagesContent: IRuntimeMessagesContent[] = [];
|
|
880
895
|
|
|
@@ -888,7 +903,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
888
903
|
assert(!!currentContext, 0xa66 /* Context not found */);
|
|
889
904
|
|
|
890
905
|
currentContext.processMessages({
|
|
891
|
-
envelope: { ...
|
|
906
|
+
envelope: { ...envelope, type: currentMessageState.type },
|
|
892
907
|
messagesContent: currentMessagesContent,
|
|
893
908
|
local,
|
|
894
909
|
});
|
|
@@ -916,11 +931,11 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
916
931
|
throw DataProcessingError.create(
|
|
917
932
|
"No context for op",
|
|
918
933
|
"processFluidDataStoreOp",
|
|
919
|
-
|
|
934
|
+
envelope as ISequencedDocumentMessage,
|
|
920
935
|
{
|
|
921
936
|
local,
|
|
922
937
|
messageDetails: JSON.stringify({
|
|
923
|
-
type:
|
|
938
|
+
type: envelope.type,
|
|
924
939
|
contentType: typeof contents,
|
|
925
940
|
}),
|
|
926
941
|
...tagCodeArtifacts({ address }),
|
|
@@ -948,16 +963,12 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
948
963
|
this.gcNodeUpdated({
|
|
949
964
|
node: { type: "DataStore", path: `/${address}` },
|
|
950
965
|
reason: "Changed",
|
|
951
|
-
timestampMs:
|
|
966
|
+
timestampMs: envelope.timestamp,
|
|
952
967
|
packagePath: context.isLoaded ? context.packagePath : undefined,
|
|
953
968
|
});
|
|
954
969
|
|
|
955
970
|
detectOutboundReferences(address, contextContents, (fromPath: string, toPath: string) =>
|
|
956
|
-
this.parentContext.addedGCOutboundRoute(
|
|
957
|
-
fromPath,
|
|
958
|
-
toPath,
|
|
959
|
-
messageCollection.envelope.timestamp,
|
|
960
|
-
),
|
|
971
|
+
this.parentContext.addedGCOutboundRoute(fromPath, toPath, envelope.timestamp),
|
|
961
972
|
);
|
|
962
973
|
}
|
|
963
974
|
|
|
@@ -985,6 +996,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
985
996
|
// The requested data store has been deleted by gc. Create a 404 response exception.
|
|
986
997
|
throw responseToException(
|
|
987
998
|
createResponseError(404, "DataStore was deleted", originalRequest, {
|
|
999
|
+
// eslint-disable-next-line import/no-deprecated
|
|
988
1000
|
[DeletedResponseHeaderKey]: true,
|
|
989
1001
|
}),
|
|
990
1002
|
originalRequest,
|
|
@@ -1051,7 +1063,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1051
1063
|
}
|
|
1052
1064
|
|
|
1053
1065
|
const idToLog =
|
|
1054
|
-
originalRequest
|
|
1066
|
+
originalRequest === undefined ? dataStoreNodePath : urlToGCNodePath(originalRequest.url);
|
|
1055
1067
|
|
|
1056
1068
|
// Log the package details asynchronously since getInitialSnapshotDetails is async
|
|
1057
1069
|
const recentlyDeletedContext = this.contexts.getRecentlyDeletedContext(id);
|
|
@@ -1200,7 +1212,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1200
1212
|
},
|
|
1201
1213
|
);
|
|
1202
1214
|
// Get the outbound routes (aliased data stores) and add a GC node for this channel.
|
|
1203
|
-
builder.addNode("/",
|
|
1215
|
+
builder.addNode("/", [...this.aliasedDataStores]);
|
|
1204
1216
|
return builder.getGCData();
|
|
1205
1217
|
}
|
|
1206
1218
|
|
|
@@ -1412,7 +1424,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1412
1424
|
|
|
1413
1425
|
this.deleteChild(dataStoreId);
|
|
1414
1426
|
}
|
|
1415
|
-
return
|
|
1427
|
+
return [...sweepReadyDataStoreRoutes];
|
|
1416
1428
|
}
|
|
1417
1429
|
|
|
1418
1430
|
/**
|
|
@@ -1467,13 +1479,15 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1467
1479
|
// If the node belongs to a data store, return its package path. For DDSes, we return the package path of the
|
|
1468
1480
|
// data store that contains it.
|
|
1469
1481
|
const context = this.contexts.get(nodePath.split("/")[1]);
|
|
1470
|
-
|
|
1482
|
+
const initialSnapshotDetails = await context?.getInitialSnapshotDetails();
|
|
1483
|
+
return initialSnapshotDetails?.pkg;
|
|
1471
1484
|
}
|
|
1472
1485
|
|
|
1473
1486
|
/**
|
|
1474
1487
|
* Called by GC to determine if a node is for a data store or for an object within a data store (for e.g. DDS).
|
|
1475
1488
|
* @returns the GC node type if the node belongs to a data store or object within data store, undefined otherwise.
|
|
1476
1489
|
*/
|
|
1490
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1477
1491
|
public getGCNodeType(nodePath: string): GCNodeType | undefined {
|
|
1478
1492
|
const pathParts = nodePath.split("/");
|
|
1479
1493
|
if (!this.contexts.has(pathParts[1])) {
|
|
@@ -1483,8 +1497,10 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1483
1497
|
// Data stores paths are of the format "/dataStoreId".
|
|
1484
1498
|
// Sub data store paths are of the format "/dataStoreId/subPath/...".
|
|
1485
1499
|
if (pathParts.length === 2) {
|
|
1500
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1486
1501
|
return GCNodeType.DataStore;
|
|
1487
1502
|
}
|
|
1503
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1488
1504
|
return GCNodeType.SubDataStore;
|
|
1489
1505
|
}
|
|
1490
1506
|
|
|
@@ -1549,6 +1565,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1549
1565
|
|
|
1550
1566
|
export function getSummaryForDatastores(
|
|
1551
1567
|
snapshot: ISnapshotTree | undefined,
|
|
1568
|
+
// eslint-disable-next-line import/no-deprecated
|
|
1552
1569
|
metadata?: IContainerRuntimeMetadata,
|
|
1553
1570
|
): ISnapshotTree | undefined {
|
|
1554
1571
|
if (!snapshot) {
|
|
@@ -1613,7 +1630,9 @@ export function detectOutboundReferences(
|
|
|
1613
1630
|
// GC node paths are all absolute paths, hence the "" prefix.
|
|
1614
1631
|
// e.g. this will yield "/dataStoreId/ddsId"
|
|
1615
1632
|
const fromPath = ["", address, ddsAddress].join("/");
|
|
1616
|
-
|
|
1633
|
+
for (const toPath of outboundPaths) {
|
|
1634
|
+
addedOutboundReference(fromPath, toPath);
|
|
1635
|
+
}
|
|
1617
1636
|
}
|
|
1618
1637
|
|
|
1619
1638
|
/**
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { performanceNow } from "@fluid-internal/client-utils";
|
|
7
7
|
import { IDeltaManagerFull } from "@fluidframework/container-definitions/internal";
|
|
8
8
|
import { IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions/internal";
|
|
9
|
+
import type { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
9
10
|
import { IEventProvider } from "@fluidframework/core-interfaces";
|
|
10
11
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
11
12
|
import {
|
|
@@ -91,7 +92,7 @@ class OpPerfTelemetry {
|
|
|
91
92
|
|
|
92
93
|
private firstConnection = true;
|
|
93
94
|
private connectionOpSeqNumber: number | undefined;
|
|
94
|
-
private readonly bootTime =
|
|
95
|
+
private readonly bootTime = performanceNow();
|
|
95
96
|
private connectionStartTime = 0;
|
|
96
97
|
private gap = 0;
|
|
97
98
|
|
|
@@ -203,7 +204,7 @@ class OpPerfTelemetry {
|
|
|
203
204
|
if (opsBehind !== undefined) {
|
|
204
205
|
this.connectionOpSeqNumber = this.deltaManager.lastKnownSeqNumber;
|
|
205
206
|
this.gap = opsBehind;
|
|
206
|
-
this.connectionStartTime =
|
|
207
|
+
this.connectionStartTime = performanceNow();
|
|
207
208
|
|
|
208
209
|
// We might be already up-today. If so, report it right away.
|
|
209
210
|
if (this.gap <= 0) {
|
|
@@ -305,7 +306,7 @@ class OpPerfTelemetry {
|
|
|
305
306
|
this.connectionOpSeqNumber = undefined;
|
|
306
307
|
this.logger.sendPerformanceEvent({
|
|
307
308
|
eventName: "ConnectionSpeed",
|
|
308
|
-
duration:
|
|
309
|
+
duration: performanceNow() - this.connectionStartTime,
|
|
309
310
|
ops: this.gap,
|
|
310
311
|
// track time to connect only for first connection.
|
|
311
312
|
timeToConnect: this.firstConnection
|
|
@@ -520,7 +521,12 @@ export function ReportOpPerfTelemetry(
|
|
|
520
521
|
clientId: string | undefined,
|
|
521
522
|
deltaManager: IDeltaManagerFull,
|
|
522
523
|
containerRuntimeEvents: IEventProvider<IContainerRuntimeEvents>,
|
|
523
|
-
logger:
|
|
524
|
+
logger: ITelemetryBaseLogger,
|
|
524
525
|
): void {
|
|
525
|
-
new OpPerfTelemetry(
|
|
526
|
+
new OpPerfTelemetry(
|
|
527
|
+
clientId,
|
|
528
|
+
deltaManager,
|
|
529
|
+
containerRuntimeEvents,
|
|
530
|
+
createChildLogger({ logger }),
|
|
531
|
+
);
|
|
526
532
|
}
|