@fluidframework/container-runtime 2.0.0-internal.5.3.2 → 2.0.0-internal.6.0.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/CHANGELOG.md +80 -0
- package/dist/batchTracker.d.ts +2 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +13 -2
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +103 -25
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +12 -4
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +69 -22
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +344 -238
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +11 -2
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +1 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +40 -44
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.js +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStores.d.ts +21 -5
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +102 -58
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +2 -0
- package/dist/deltaManagerSummarizerProxy.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 +29 -25
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.js +13 -11
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +1 -0
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +5 -6
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +4 -6
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +44 -33
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/id-compressor/idCompressor.d.ts +3 -3
- package/dist/id-compressor/idCompressor.d.ts.map +1 -1
- package/dist/id-compressor/idCompressor.js +52 -52
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/idRange.js +2 -2
- package/dist/id-compressor/idRange.js.map +1 -1
- package/dist/id-compressor/sessionIdNormalizer.js +11 -16
- package/dist/id-compressor/sessionIdNormalizer.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/opLifecycle/batchManager.js +10 -6
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +2 -2
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +7 -2
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +2 -2
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +12 -10
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +13 -5
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +2 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +11 -7
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +6 -5
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +6 -14
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +8 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.js +1 -2
- package/dist/opProperties.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 +6 -3
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +41 -32
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +15 -11
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -1
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +18 -19
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +3 -5
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +42 -66
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.js +5 -8
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.js +5 -9
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +8 -12
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +5 -5
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +26 -22
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +13 -16
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summaryCollection.js +3 -5
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.js +1 -2
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +67 -21
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +2 -3
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +9 -7
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +2 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +13 -2
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +103 -25
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +13 -5
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +69 -22
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +343 -238
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +11 -2
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +1 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +42 -46
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.js +2 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStores.d.ts +21 -5
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +103 -59
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js +2 -0
- package/lib/deltaManagerSummarizerProxy.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 +30 -26
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.js +13 -11
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +1 -0
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +5 -6
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +4 -6
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +45 -34
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/id-compressor/idCompressor.d.ts +3 -3
- package/lib/id-compressor/idCompressor.d.ts.map +1 -1
- package/lib/id-compressor/idCompressor.js +52 -52
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/idRange.js +2 -2
- package/lib/id-compressor/idRange.js.map +1 -1
- package/lib/id-compressor/sessionIdNormalizer.js +11 -16
- package/lib/id-compressor/sessionIdNormalizer.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/opLifecycle/batchManager.js +10 -6
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +8 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +13 -11
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +13 -5
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +12 -8
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +6 -5
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +7 -15
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +8 -2
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.js +1 -2
- package/lib/opProperties.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 +6 -3
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +41 -32
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +16 -12
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +19 -20
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +3 -5
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +43 -67
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.js +6 -9
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.js +5 -9
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +8 -12
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +5 -5
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +27 -23
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +14 -17
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summaryCollection.js +3 -5
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.js +1 -2
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +68 -22
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +2 -3
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +10 -8
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +30 -18
- package/src/batchTracker.ts +4 -3
- package/src/blobManager.ts +113 -15
- package/src/connectionTelemetry.ts +7 -3
- package/src/containerRuntime.ts +354 -194
- package/src/dataStore.ts +10 -1
- package/src/dataStoreContext.ts +31 -33
- package/src/dataStoreContexts.ts +2 -2
- package/src/dataStores.ts +108 -71
- package/src/deltaManagerSummarizerProxy.ts +2 -0
- package/src/deltaScheduler.ts +6 -10
- package/src/gc/garbageCollection.ts +13 -8
- package/src/gc/gcHelpers.ts +1 -0
- package/src/gc/gcTelemetry.ts +13 -10
- package/src/id-compressor/idCompressor.ts +6 -5
- package/src/index.ts +0 -1
- package/src/opLifecycle/opCompressor.ts +4 -3
- package/src/opLifecycle/opDecompressor.ts +4 -3
- package/src/opLifecycle/opSplitter.ts +4 -3
- package/src/opLifecycle/outbox.ts +13 -25
- package/src/opLifecycle/remoteMessageProcessor.ts +8 -2
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +34 -25
- package/src/scheduleManager.ts +2 -2
- package/src/summary/orderedClientElection.ts +4 -3
- package/src/summary/runningSummarizer.ts +18 -44
- package/src/summary/summarizer.ts +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +13 -15
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +8 -7
- package/src/summary/summaryGenerator.ts +6 -2
- package/src/summary/summaryManager.ts +9 -5
package/src/dataStore.ts
CHANGED
|
@@ -62,6 +62,9 @@ class DataStore implements IDataStore {
|
|
|
62
62
|
private readonly pendingAliases: Map<string, Promise<AliasResult>>;
|
|
63
63
|
private aliasResult: Promise<AliasResult> | undefined;
|
|
64
64
|
|
|
65
|
+
/**
|
|
66
|
+
* {@inheritDoc @fluidframework/runtime-definitions#IDataStore.trySetAlias}
|
|
67
|
+
*/
|
|
65
68
|
async trySetAlias(alias: string): Promise<AliasResult> {
|
|
66
69
|
if (alias.includes("/")) {
|
|
67
70
|
throw new UsageError(`The alias cannot contain slashes: '${alias}'`);
|
|
@@ -158,7 +161,10 @@ class DataStore implements IDataStore {
|
|
|
158
161
|
return "Success";
|
|
159
162
|
}
|
|
160
163
|
|
|
161
|
-
|
|
164
|
+
/**
|
|
165
|
+
* @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
|
|
166
|
+
*/
|
|
167
|
+
public async request(request: IRequest): Promise<IResponse> {
|
|
162
168
|
return this.fluidDataStoreChannel.request(request);
|
|
163
169
|
}
|
|
164
170
|
|
|
@@ -179,6 +185,9 @@ class DataStore implements IDataStore {
|
|
|
179
185
|
this.pendingAliases = datastores.pendingAliases;
|
|
180
186
|
}
|
|
181
187
|
|
|
188
|
+
/**
|
|
189
|
+
* @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
|
|
190
|
+
*/
|
|
182
191
|
public get IFluidRouter() {
|
|
183
192
|
return this.fluidDataStoreChannel;
|
|
184
193
|
}
|
package/src/dataStoreContext.ts
CHANGED
|
@@ -54,19 +54,14 @@ import {
|
|
|
54
54
|
IIdCompressorCore,
|
|
55
55
|
VisibilityState,
|
|
56
56
|
} from "@fluidframework/runtime-definitions";
|
|
57
|
+
import { addBlobToSummary, convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
|
|
57
58
|
import {
|
|
58
|
-
|
|
59
|
-
convertSummaryTreeToITree,
|
|
60
|
-
packagePathToTelemetryProperty,
|
|
61
|
-
} from "@fluidframework/runtime-utils";
|
|
62
|
-
import {
|
|
63
|
-
ChildLogger,
|
|
59
|
+
createChildMonitoringContext,
|
|
64
60
|
generateStack,
|
|
65
61
|
ITelemetryLoggerExt,
|
|
66
|
-
loggerToMonitoringContext,
|
|
67
62
|
LoggingError,
|
|
68
63
|
MonitoringContext,
|
|
69
|
-
|
|
64
|
+
tagCodeArtifacts,
|
|
70
65
|
ThresholdCounter,
|
|
71
66
|
} from "@fluidframework/telemetry-utils";
|
|
72
67
|
import {
|
|
@@ -316,9 +311,16 @@ export abstract class FluidDataStoreContext
|
|
|
316
311
|
async (fullGC?: boolean) => this.getGCDataInternal(fullGC),
|
|
317
312
|
);
|
|
318
313
|
|
|
319
|
-
this.mc =
|
|
320
|
-
|
|
321
|
-
|
|
314
|
+
this.mc = createChildMonitoringContext({
|
|
315
|
+
logger: this.logger,
|
|
316
|
+
namespace: "FluidDataStoreContext",
|
|
317
|
+
properties: {
|
|
318
|
+
all: tagCodeArtifacts({
|
|
319
|
+
fluidDataStoreId: this.id,
|
|
320
|
+
fullPackageName: this.pkg?.join("/"),
|
|
321
|
+
}),
|
|
322
|
+
},
|
|
323
|
+
});
|
|
322
324
|
this.thresholdOpsCounter = new ThresholdCounter(
|
|
323
325
|
FluidDataStoreContext.pendingOpsCountThreshold,
|
|
324
326
|
this.mc.logger,
|
|
@@ -374,10 +376,13 @@ export abstract class FluidDataStoreContext
|
|
|
374
376
|
failedPkgPath?: string,
|
|
375
377
|
fullPackageName?: readonly string[],
|
|
376
378
|
): never {
|
|
377
|
-
throw new LoggingError(
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
379
|
+
throw new LoggingError(
|
|
380
|
+
reason,
|
|
381
|
+
tagCodeArtifacts({
|
|
382
|
+
failedPkgPath,
|
|
383
|
+
packagePath: fullPackageName?.join("/"),
|
|
384
|
+
}),
|
|
385
|
+
);
|
|
381
386
|
}
|
|
382
387
|
|
|
383
388
|
public async realize(): Promise<IFluidDataStoreChannel> {
|
|
@@ -389,13 +394,12 @@ export abstract class FluidDataStoreContext
|
|
|
389
394
|
error,
|
|
390
395
|
"realizeFluidDataStoreContext",
|
|
391
396
|
);
|
|
392
|
-
errorWrapped.addTelemetryProperties(
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
},
|
|
397
|
-
|
|
398
|
-
});
|
|
397
|
+
errorWrapped.addTelemetryProperties(
|
|
398
|
+
tagCodeArtifacts({
|
|
399
|
+
fullPackageName: this.pkg?.join("/"),
|
|
400
|
+
fluidDataStoreId: this.id,
|
|
401
|
+
}),
|
|
402
|
+
);
|
|
399
403
|
this.channelDeferred?.reject(errorWrapped);
|
|
400
404
|
this.mc.logger.sendErrorEvent({ eventName: "RealizeError" }, errorWrapped);
|
|
401
405
|
});
|
|
@@ -790,10 +794,6 @@ export abstract class FluidDataStoreContext
|
|
|
790
794
|
this.mc.logger.sendErrorEvent(
|
|
791
795
|
{
|
|
792
796
|
eventName: "BindRuntimeError",
|
|
793
|
-
fluidDataStoreId: {
|
|
794
|
-
value: this.id,
|
|
795
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
796
|
-
},
|
|
797
797
|
},
|
|
798
798
|
error,
|
|
799
799
|
);
|
|
@@ -917,11 +917,6 @@ export abstract class FluidDataStoreContext
|
|
|
917
917
|
this.mc.logger.sendTelemetryEvent({
|
|
918
918
|
eventName,
|
|
919
919
|
type,
|
|
920
|
-
fluidDataStoreId: {
|
|
921
|
-
value: this.id,
|
|
922
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
923
|
-
},
|
|
924
|
-
packageName: packagePathToTelemetryProperty(this.pkg),
|
|
925
920
|
isSummaryInProgress: this.summarizerNode.isSummaryInProgress?.(),
|
|
926
921
|
stack: generateStack(),
|
|
927
922
|
});
|
|
@@ -943,8 +938,11 @@ export abstract class FluidDataStoreContext
|
|
|
943
938
|
);
|
|
944
939
|
}
|
|
945
940
|
|
|
946
|
-
public async uploadBlob(
|
|
947
|
-
|
|
941
|
+
public async uploadBlob(
|
|
942
|
+
blob: ArrayBufferLike,
|
|
943
|
+
signal?: AbortSignal,
|
|
944
|
+
): Promise<IFluidHandle<ArrayBufferLike>> {
|
|
945
|
+
return this.containerRuntime.uploadBlob(blob, signal);
|
|
948
946
|
}
|
|
949
947
|
}
|
|
950
948
|
|
package/src/dataStoreContexts.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { ITelemetryBaseLogger } from "@fluidframework/common-definitions";
|
|
|
7
7
|
import { assert, Deferred } from "@fluidframework/common-utils";
|
|
8
8
|
import { Lazy } from "@fluidframework/core-utils";
|
|
9
9
|
import { IDisposable } from "@fluidframework/core-interfaces";
|
|
10
|
-
import {
|
|
10
|
+
import { createChildLogger, ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
11
11
|
import { FluidDataStoreContext, LocalFluidDataStoreContext } from "./dataStoreContext";
|
|
12
12
|
|
|
13
13
|
export class DataStoreContexts implements Iterable<[string, FluidDataStoreContext]>, IDisposable {
|
|
@@ -47,7 +47,7 @@ export class DataStoreContexts implements Iterable<[string, FluidDataStoreContex
|
|
|
47
47
|
private readonly _logger: ITelemetryLoggerExt;
|
|
48
48
|
|
|
49
49
|
constructor(baseLogger: ITelemetryBaseLogger) {
|
|
50
|
-
this._logger =
|
|
50
|
+
this._logger = createChildLogger({ logger: baseLogger });
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
[Symbol.iterator](): Iterator<[string, FluidDataStoreContext]> {
|
package/src/dataStores.ts
CHANGED
|
@@ -42,11 +42,10 @@ import {
|
|
|
42
42
|
unpackChildNodesUsedRoutes,
|
|
43
43
|
} from "@fluidframework/runtime-utils";
|
|
44
44
|
import {
|
|
45
|
-
ChildLogger,
|
|
46
|
-
loggerToMonitoringContext,
|
|
47
45
|
LoggingError,
|
|
48
46
|
MonitoringContext,
|
|
49
|
-
|
|
47
|
+
createChildMonitoringContext,
|
|
48
|
+
tagCodeArtifacts,
|
|
50
49
|
} from "@fluidframework/telemetry-utils";
|
|
51
50
|
import { AttachState } from "@fluidframework/container-definitions";
|
|
52
51
|
import { buildSnapshotTree } from "@fluidframework/driver-utils";
|
|
@@ -137,7 +136,7 @@ export class DataStores implements IDisposable {
|
|
|
137
136
|
private readonly aliasMap: Map<string, string>,
|
|
138
137
|
private readonly contexts: DataStoreContexts = new DataStoreContexts(baseLogger),
|
|
139
138
|
) {
|
|
140
|
-
this.mc =
|
|
139
|
+
this.mc = createChildMonitoringContext({ logger: baseLogger });
|
|
141
140
|
this.containerRuntimeHandle = new FluidObjectHandle(
|
|
142
141
|
this.runtime,
|
|
143
142
|
"/",
|
|
@@ -243,10 +242,7 @@ export class DataStores implements IDisposable {
|
|
|
243
242
|
"Duplicate DataStore created with existing id",
|
|
244
243
|
{
|
|
245
244
|
...extractSafePropertiesFromMessage(message),
|
|
246
|
-
dataStoreId:
|
|
247
|
-
value: attachMessage.id,
|
|
248
|
-
tag: TelemetryDataTag.CodeArtifact,
|
|
249
|
-
},
|
|
245
|
+
...tagCodeArtifacts({ dataStoreId: attachMessage.id }),
|
|
250
246
|
},
|
|
251
247
|
);
|
|
252
248
|
throw error;
|
|
@@ -435,8 +431,7 @@ export class DataStores implements IDisposable {
|
|
|
435
431
|
) {
|
|
436
432
|
const envelope = message.contents as IEnvelope;
|
|
437
433
|
const transformed = { ...message, contents: envelope.contents };
|
|
438
|
-
|
|
439
|
-
this.validateNotDeleted(envelope.address, request);
|
|
434
|
+
this.validateNotDeleted(envelope.address);
|
|
440
435
|
const context = this.contexts.get(envelope.address);
|
|
441
436
|
assert(!!context, 0x162 /* "There should be a store context for the op" */);
|
|
442
437
|
context.process(transformed, local, localMessageMetadata);
|
|
@@ -455,114 +450,154 @@ export class DataStores implements IDisposable {
|
|
|
455
450
|
requestHeaderData: RuntimeHeaderData,
|
|
456
451
|
): Promise<FluidDataStoreContext> {
|
|
457
452
|
const headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
this.validateNotDeleted(id, request, headerData);
|
|
453
|
+
this.validateNotDeleted(id, headerData);
|
|
461
454
|
|
|
462
455
|
const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
|
|
463
456
|
if (context === undefined) {
|
|
464
457
|
// The requested data store does not exits. Throw a 404 response exception.
|
|
458
|
+
const request: IRequest = { url: id };
|
|
465
459
|
throw responseToException(create404Response(request), request);
|
|
466
460
|
}
|
|
467
461
|
|
|
468
|
-
this.validateNotTombstoned(context,
|
|
462
|
+
this.validateNotTombstoned(context, requestHeaderData);
|
|
469
463
|
|
|
470
464
|
return context;
|
|
471
465
|
}
|
|
472
466
|
|
|
473
467
|
/**
|
|
474
|
-
*
|
|
475
|
-
|
|
468
|
+
* Returns the data store requested with the given id if available. Otherwise, returns undefined.
|
|
469
|
+
*/
|
|
470
|
+
public async getDataStoreIfAvailable(
|
|
471
|
+
id: string,
|
|
472
|
+
requestHeaderData: RuntimeHeaderData,
|
|
473
|
+
): Promise<FluidDataStoreContext | undefined> {
|
|
474
|
+
// If the data store has been deleted, return undefined.
|
|
475
|
+
if (this.checkIfDeleted(id, requestHeaderData)) {
|
|
476
|
+
return undefined;
|
|
477
|
+
}
|
|
478
|
+
const headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };
|
|
479
|
+
const context = await this.contexts.getBoundOrRemoted(id, headerData.wait);
|
|
480
|
+
if (context === undefined) {
|
|
481
|
+
return undefined;
|
|
482
|
+
}
|
|
483
|
+
// Check if the data store is tombstoned. If so, we want to log a telemetry event.
|
|
484
|
+
this.checkIfTombstoned(context, requestHeaderData);
|
|
485
|
+
return context;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/**
|
|
489
|
+
* Checks if the data store has been deleted by GC.
|
|
476
490
|
* @param id - data store id
|
|
477
491
|
* @param request - the request information to log if the validation detects the data store has been deleted
|
|
478
492
|
* @param requestHeaderData - the request header information to log if the validation detects the data store has been deleted
|
|
493
|
+
* @returns true if the data store is deleted. Otherwise, returns false.
|
|
479
494
|
*/
|
|
480
|
-
private
|
|
481
|
-
id: string,
|
|
482
|
-
request: IRequest,
|
|
483
|
-
requestHeaderData?: RuntimeHeaderData,
|
|
484
|
-
) {
|
|
495
|
+
private checkIfDeleted(id: string, requestHeaderData?: RuntimeHeaderData) {
|
|
485
496
|
const dataStoreNodePath = `/${id}`;
|
|
486
|
-
if (this.isDataStoreDeleted(dataStoreNodePath)) {
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
)
|
|
497
|
+
if (!this.isDataStoreDeleted(dataStoreNodePath)) {
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
500
|
+
assert(
|
|
501
|
+
!this.contexts.has(id),
|
|
502
|
+
0x570 /* Inconsistent state! GC says the data store is deleted, but the data store is not deleted from the runtime. */,
|
|
503
|
+
);
|
|
504
|
+
sendGCUnexpectedUsageEvent(
|
|
505
|
+
this.mc,
|
|
506
|
+
{
|
|
507
|
+
eventName: "GC_Deleted_DataStore_Requested",
|
|
508
|
+
category: "error",
|
|
509
|
+
isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
|
|
510
|
+
id,
|
|
511
|
+
headers: JSON.stringify(requestHeaderData),
|
|
512
|
+
gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
|
|
513
|
+
},
|
|
514
|
+
undefined /* packagePath */,
|
|
515
|
+
);
|
|
516
|
+
return true;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* Validate that the data store had not been deleted by GC.
|
|
521
|
+
* @param id - data store id
|
|
522
|
+
* @param requestHeaderData - the request header information to log if the validation detects the data store has been deleted
|
|
523
|
+
*/
|
|
524
|
+
private validateNotDeleted(id: string, requestHeaderData?: RuntimeHeaderData) {
|
|
525
|
+
if (this.checkIfDeleted(id, requestHeaderData)) {
|
|
491
526
|
// The requested data store is removed by gc. Create a 404 gc response exception.
|
|
492
|
-
const
|
|
527
|
+
const request: IRequest = { url: id };
|
|
528
|
+
throw responseToException(
|
|
493
529
|
createResponseError(404, "DataStore was deleted", request),
|
|
494
530
|
request,
|
|
495
531
|
);
|
|
496
|
-
sendGCUnexpectedUsageEvent(
|
|
497
|
-
this.mc,
|
|
498
|
-
{
|
|
499
|
-
eventName: "GC_Deleted_DataStore_Requested",
|
|
500
|
-
category: "error",
|
|
501
|
-
isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
|
|
502
|
-
headers: JSON.stringify(requestHeaderData),
|
|
503
|
-
gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
|
|
504
|
-
},
|
|
505
|
-
undefined /** packagePath */,
|
|
506
|
-
error,
|
|
507
|
-
);
|
|
508
|
-
throw error;
|
|
509
532
|
}
|
|
510
533
|
}
|
|
511
534
|
|
|
535
|
+
/**
|
|
536
|
+
* Checks if the data store has not been marked as tombstone by GC or not.
|
|
537
|
+
* @param context - the data store context in question
|
|
538
|
+
* @param requestHeaderData - the request header information to log if the validation detects the data store has been tombstoned
|
|
539
|
+
* @returns true if the data store is tombstoned. Otherwise, returns false.
|
|
540
|
+
*/
|
|
541
|
+
private checkIfTombstoned(
|
|
542
|
+
context: FluidDataStoreContext,
|
|
543
|
+
requestHeaderData: RuntimeHeaderData,
|
|
544
|
+
) {
|
|
545
|
+
if (!context.tombstoned) {
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
const logErrorEvent = this.throwOnTombstoneLoad && !requestHeaderData.allowTombstone;
|
|
549
|
+
sendGCUnexpectedUsageEvent(
|
|
550
|
+
this.mc,
|
|
551
|
+
{
|
|
552
|
+
eventName: "GC_Tombstone_DataStore_Requested",
|
|
553
|
+
category: logErrorEvent ? "error" : "generic",
|
|
554
|
+
isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
|
|
555
|
+
id: context.id,
|
|
556
|
+
headers: JSON.stringify(requestHeaderData),
|
|
557
|
+
gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
|
|
558
|
+
},
|
|
559
|
+
context.isLoaded ? context.packagePath : undefined,
|
|
560
|
+
);
|
|
561
|
+
return true;
|
|
562
|
+
}
|
|
563
|
+
|
|
512
564
|
/**
|
|
513
565
|
* Validates that the data store context requested has not been marked as tombstone by GC.
|
|
514
|
-
*
|
|
515
566
|
* @param context - the data store context in question
|
|
516
567
|
* @param request - the request information to log if the validation detects the data store has been tombstoned
|
|
517
|
-
* @param
|
|
568
|
+
* @param requestHeaderData - the request header information to log if the validation detects the data store has been tombstoned
|
|
518
569
|
*/
|
|
519
570
|
private validateNotTombstoned(
|
|
520
571
|
context: FluidDataStoreContext,
|
|
521
|
-
|
|
522
|
-
headerData: RuntimeHeaderData,
|
|
572
|
+
requestHeaderData: RuntimeHeaderData,
|
|
523
573
|
) {
|
|
524
|
-
if (context
|
|
525
|
-
const shouldFail = this.throwOnTombstoneLoad && !headerData.allowTombstone;
|
|
526
|
-
|
|
574
|
+
if (this.checkIfTombstoned(context, requestHeaderData)) {
|
|
527
575
|
// The requested data store is removed by gc. Create a 404 gc response exception.
|
|
576
|
+
const request: IRequest = { url: context.id };
|
|
528
577
|
const error = responseToException(
|
|
529
578
|
createResponseError(404, "DataStore was deleted", request, {
|
|
530
579
|
[TombstoneResponseHeaderKey]: true,
|
|
531
580
|
}),
|
|
532
581
|
request,
|
|
533
582
|
);
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
{
|
|
537
|
-
eventName: "GC_Tombstone_DataStore_Requested",
|
|
538
|
-
category: shouldFail ? "error" : "generic",
|
|
539
|
-
isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
|
|
540
|
-
headers: JSON.stringify(headerData),
|
|
541
|
-
gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
|
|
542
|
-
},
|
|
543
|
-
context.isLoaded ? context.packagePath : undefined,
|
|
544
|
-
error,
|
|
545
|
-
);
|
|
546
|
-
|
|
547
|
-
if (shouldFail) {
|
|
583
|
+
// Throw an error if configured via options and via request headers.
|
|
584
|
+
if (this.throwOnTombstoneLoad && !requestHeaderData.allowTombstone) {
|
|
548
585
|
throw error;
|
|
549
586
|
}
|
|
550
587
|
}
|
|
551
588
|
}
|
|
552
589
|
|
|
553
|
-
public processSignal(
|
|
554
|
-
|
|
555
|
-
this.
|
|
556
|
-
const context = this.contexts.get(address);
|
|
590
|
+
public processSignal(fluidDataStoreId: string, message: IInboundSignalMessage, local: boolean) {
|
|
591
|
+
this.validateNotDeleted(fluidDataStoreId);
|
|
592
|
+
const context = this.contexts.get(fluidDataStoreId);
|
|
557
593
|
if (!context) {
|
|
558
594
|
// Attach message may not have been processed yet
|
|
559
595
|
assert(!local, 0x163 /* "Missing datastore for local signal" */);
|
|
560
596
|
this.mc.logger.sendTelemetryEvent({
|
|
561
597
|
eventName: "SignalFluidDataStoreNotFound",
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
},
|
|
598
|
+
...tagCodeArtifacts({
|
|
599
|
+
fluidDataStoreId,
|
|
600
|
+
}),
|
|
566
601
|
});
|
|
567
602
|
return;
|
|
568
603
|
}
|
|
@@ -571,7 +606,7 @@ export class DataStores implements IDisposable {
|
|
|
571
606
|
}
|
|
572
607
|
|
|
573
608
|
public setConnectionState(connected: boolean, clientId?: string) {
|
|
574
|
-
for (const [
|
|
609
|
+
for (const [fluidDataStoreId, context] of this.contexts) {
|
|
575
610
|
try {
|
|
576
611
|
context.setConnectionState(connected, clientId);
|
|
577
612
|
} catch (error) {
|
|
@@ -579,7 +614,9 @@ export class DataStores implements IDisposable {
|
|
|
579
614
|
{
|
|
580
615
|
eventName: "SetConnectionStateError",
|
|
581
616
|
clientId,
|
|
582
|
-
|
|
617
|
+
...tagCodeArtifacts({
|
|
618
|
+
fluidDataStoreId,
|
|
619
|
+
}),
|
|
583
620
|
details: JSON.stringify({
|
|
584
621
|
runtimeConnected: this.runtime.connected,
|
|
585
622
|
connected,
|
|
@@ -41,6 +41,8 @@ export class DeltaManagerSummarizerProxy
|
|
|
41
41
|
|
|
42
42
|
constructor(deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>) {
|
|
43
43
|
super(deltaManager);
|
|
44
|
+
// We are expecting this class to have many listeners, so we suppress noisy "MaxListenersExceededWarning" logging.
|
|
45
|
+
super.setMaxListeners(0);
|
|
44
46
|
this.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;
|
|
45
47
|
}
|
|
46
48
|
}
|
package/src/deltaScheduler.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { ITelemetryLoggerExt,
|
|
6
|
+
import { ITelemetryLoggerExt, formatTick } from "@fluidframework/telemetry-utils";
|
|
7
7
|
import { performance } from "@fluidframework/common-utils";
|
|
8
8
|
import { IDeltaManager } from "@fluidframework/container-definitions";
|
|
9
9
|
import { IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
|
|
@@ -111,20 +111,16 @@ export class DeltaScheduler {
|
|
|
111
111
|
if (this.schedulingLog) {
|
|
112
112
|
this.logger.sendTelemetryEvent({
|
|
113
113
|
eventName: "InboundOpsPartialProcessingTime",
|
|
114
|
-
duration:
|
|
114
|
+
duration: formatTick(elapsedTime),
|
|
115
115
|
opsProcessed:
|
|
116
116
|
this.schedulingLog.lastSequenceNumber -
|
|
117
117
|
this.schedulingLog.firstSequenceNumber +
|
|
118
118
|
1,
|
|
119
119
|
opsRemainingToProcess: this.deltaManager.inbound.length,
|
|
120
|
-
processingTime:
|
|
121
|
-
this.schedulingLog.totalProcessingTime,
|
|
122
|
-
),
|
|
120
|
+
processingTime: formatTick(this.schedulingLog.totalProcessingTime),
|
|
123
121
|
numberOfTurns: this.schedulingLog.numberOfTurns,
|
|
124
122
|
batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
|
|
125
|
-
timeToResume:
|
|
126
|
-
performance.now() - currentTime,
|
|
127
|
-
),
|
|
123
|
+
timeToResume: formatTick(performance.now() - currentTime),
|
|
128
124
|
});
|
|
129
125
|
}
|
|
130
126
|
this.deltaManager.inbound.resume();
|
|
@@ -147,13 +143,13 @@ export class DeltaScheduler {
|
|
|
147
143
|
eventName: "InboundOpsProcessingTime",
|
|
148
144
|
opsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,
|
|
149
145
|
numberOfTurns: this.schedulingLog.numberOfTurns,
|
|
150
|
-
processingTime:
|
|
146
|
+
processingTime: formatTick(this.schedulingLog.totalProcessingTime),
|
|
151
147
|
opsProcessed:
|
|
152
148
|
this.schedulingLog.lastSequenceNumber -
|
|
153
149
|
this.schedulingLog.firstSequenceNumber +
|
|
154
150
|
1,
|
|
155
151
|
batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
|
|
156
|
-
duration:
|
|
152
|
+
duration: formatTick(currentTime - this.schedulingLog.startTime),
|
|
157
153
|
schedulingCount: this.schedulingCount,
|
|
158
154
|
});
|
|
159
155
|
|
|
@@ -16,9 +16,9 @@ import {
|
|
|
16
16
|
} from "@fluidframework/runtime-definitions";
|
|
17
17
|
import { ReadAndParseBlob } from "@fluidframework/runtime-utils";
|
|
18
18
|
import {
|
|
19
|
-
|
|
19
|
+
createChildLogger,
|
|
20
|
+
createChildMonitoringContext,
|
|
20
21
|
ITelemetryLoggerExt,
|
|
21
|
-
loggerToMonitoringContext,
|
|
22
22
|
MonitoringContext,
|
|
23
23
|
PerformanceEvent,
|
|
24
24
|
} from "@fluidframework/telemetry-utils";
|
|
@@ -137,11 +137,13 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
137
137
|
const baseSnapshot = createParams.baseSnapshot;
|
|
138
138
|
const readAndParseBlob = createParams.readAndParseBlob;
|
|
139
139
|
|
|
140
|
-
this.mc =
|
|
141
|
-
|
|
140
|
+
this.mc = createChildMonitoringContext({
|
|
141
|
+
logger: createParams.baseLogger,
|
|
142
|
+
namespace: "GarbageCollector",
|
|
143
|
+
properties: {
|
|
142
144
|
all: { completedGCRuns: () => this.completedRuns },
|
|
143
|
-
}
|
|
144
|
-
);
|
|
145
|
+
},
|
|
146
|
+
});
|
|
145
147
|
|
|
146
148
|
this.configs = generateGCConfigs(this.mc, createParams);
|
|
147
149
|
|
|
@@ -466,8 +468,11 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
466
468
|
});
|
|
467
469
|
|
|
468
470
|
const logger = options.logger
|
|
469
|
-
?
|
|
470
|
-
|
|
471
|
+
? createChildLogger({
|
|
472
|
+
logger: options.logger,
|
|
473
|
+
properties: {
|
|
474
|
+
all: { completedGCRuns: () => this.completedRuns },
|
|
475
|
+
},
|
|
471
476
|
})
|
|
472
477
|
: this.mc.logger;
|
|
473
478
|
|
package/src/gc/gcHelpers.ts
CHANGED
|
@@ -307,6 +307,7 @@ export function trimLeadingAndTrailingSlashes(str: string) {
|
|
|
307
307
|
|
|
308
308
|
/**
|
|
309
309
|
* Tags the passed value as a CodeArtifact and returns the tagged value.
|
|
310
|
+
* @deprecated - Use telemetry-utils tagCodeArtifacts instead
|
|
310
311
|
*/
|
|
311
312
|
export function tagAsCodeArtifact(value: string) {
|
|
312
313
|
return {
|
package/src/gc/gcTelemetry.ts
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
import { ITelemetryGenericEvent } from "@fluidframework/core-interfaces";
|
|
7
7
|
import { IGarbageCollectionData } from "@fluidframework/runtime-definitions";
|
|
8
|
-
import { packagePathToTelemetryProperty } from "@fluidframework/runtime-utils";
|
|
9
8
|
import {
|
|
10
9
|
generateStack,
|
|
11
10
|
ITelemetryLoggerExt,
|
|
12
11
|
MonitoringContext,
|
|
12
|
+
tagCodeArtifacts,
|
|
13
13
|
} from "@fluidframework/telemetry-utils";
|
|
14
14
|
import { ICreateContainerMetadata } from "../summary";
|
|
15
15
|
import {
|
|
@@ -161,7 +161,6 @@ export class GCTelemetryTracker {
|
|
|
161
161
|
const { usageType, currentReferenceTimestampMs, packagePath, id, fromId, ...propsToLog } =
|
|
162
162
|
nodeUsageProps;
|
|
163
163
|
const eventProps: Omit<IUnreferencedEventProps, "state" | "usageType"> = {
|
|
164
|
-
id: tagAsCodeArtifact(id),
|
|
165
164
|
type: nodeType,
|
|
166
165
|
unrefTime: nodeStateTracker.unreferencedTimestampMs,
|
|
167
166
|
age:
|
|
@@ -171,7 +170,7 @@ export class GCTelemetryTracker {
|
|
|
171
170
|
state === UnreferencedState.Inactive
|
|
172
171
|
? this.configs.inactiveTimeoutMs
|
|
173
172
|
: this.configs.sweepTimeoutMs,
|
|
174
|
-
|
|
173
|
+
...tagCodeArtifacts({ id, fromId }),
|
|
175
174
|
...propsToLog,
|
|
176
175
|
...this.createContainerMetadata,
|
|
177
176
|
};
|
|
@@ -211,7 +210,7 @@ export class GCTelemetryTracker {
|
|
|
211
210
|
const { id: taggedId, fromId: taggedFromId, ...otherProps } = eventProps;
|
|
212
211
|
const event = {
|
|
213
212
|
eventName: `${state}Object_${nodeUsageProps.usageType}`,
|
|
214
|
-
pkg:
|
|
213
|
+
pkg: tagCodeArtifacts({ pkg: nodeUsageProps.packagePath?.join("/") }).pkg,
|
|
215
214
|
stack: generateStack(),
|
|
216
215
|
id: taggedId,
|
|
217
216
|
fromId: taggedFromId,
|
|
@@ -277,8 +276,10 @@ export class GCTelemetryTracker {
|
|
|
277
276
|
if (missingExplicitRoutes.length > 0) {
|
|
278
277
|
logger.sendErrorEvent({
|
|
279
278
|
eventName: "gcUnknownOutboundReferences",
|
|
280
|
-
|
|
281
|
-
|
|
279
|
+
...tagCodeArtifacts({
|
|
280
|
+
id: nodeId,
|
|
281
|
+
routes: JSON.stringify(missingExplicitRoutes),
|
|
282
|
+
}),
|
|
282
283
|
});
|
|
283
284
|
}
|
|
284
285
|
}
|
|
@@ -318,8 +319,10 @@ export class GCTelemetryTracker {
|
|
|
318
319
|
}),
|
|
319
320
|
id,
|
|
320
321
|
fromId,
|
|
321
|
-
|
|
322
|
-
|
|
322
|
+
...tagCodeArtifacts({
|
|
323
|
+
pkg: pkg?.join("/"),
|
|
324
|
+
fromPkg: fromPkg?.join("/"),
|
|
325
|
+
}),
|
|
323
326
|
};
|
|
324
327
|
|
|
325
328
|
if (state === UnreferencedState.Inactive) {
|
|
@@ -379,7 +382,7 @@ export class GCTelemetryTracker {
|
|
|
379
382
|
lastSummaryTime,
|
|
380
383
|
...this.createContainerMetadata,
|
|
381
384
|
}),
|
|
382
|
-
id:
|
|
385
|
+
...tagCodeArtifacts({ id: JSON.stringify(deletedNodeIds) }),
|
|
383
386
|
});
|
|
384
387
|
}
|
|
385
388
|
}
|
|
@@ -398,7 +401,7 @@ export function sendGCUnexpectedUsageEvent(
|
|
|
398
401
|
packagePath: readonly string[] | undefined,
|
|
399
402
|
error?: unknown,
|
|
400
403
|
) {
|
|
401
|
-
event.pkg =
|
|
404
|
+
event.pkg = tagCodeArtifacts({ pkg: packagePath?.join("/") })?.pkg;
|
|
402
405
|
event.tombstoneFlags = JSON.stringify({
|
|
403
406
|
DisableTombstone: mc.config.getBoolean(disableTombstoneKey),
|
|
404
407
|
ThrowOnTombstoneUsage: mc.config.getBoolean(throwOnTombstoneUsageKey),
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
/* eslint-disable @typescript-eslint/restrict-plus-operands */
|
|
7
7
|
|
|
8
|
-
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
9
8
|
import { assert } from "@fluidframework/common-utils";
|
|
10
9
|
import {
|
|
11
10
|
IIdCompressor,
|
|
@@ -31,6 +30,8 @@ import type {
|
|
|
31
30
|
VersionedSerializedIdCompressor,
|
|
32
31
|
} from "@fluidframework/runtime-definitions";
|
|
33
32
|
import BTree from "sorted-btree";
|
|
33
|
+
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
34
|
+
import { ITelemetryLoggerExt, createChildLogger } from "@fluidframework/telemetry-utils";
|
|
34
35
|
import {
|
|
35
36
|
hasAtLeastLength,
|
|
36
37
|
compareFiniteNumbers,
|
|
@@ -305,15 +306,15 @@ export class IdCompressor implements IIdCompressorCore, IIdCompressor {
|
|
|
305
306
|
private readonly finalIdToCluster: AppendOnlySortedMap<FinalCompressedId, IdCluster> =
|
|
306
307
|
new AppendOnlySortedMap(compareFiniteNumbers);
|
|
307
308
|
|
|
309
|
+
private readonly logger: ITelemetryLoggerExt;
|
|
310
|
+
|
|
308
311
|
/**
|
|
309
312
|
* @param localSessionId - the `IdCompressor`'s current local session ID.
|
|
310
313
|
* {@link generateStableId}.
|
|
311
314
|
*/
|
|
312
|
-
public constructor(
|
|
313
|
-
public readonly localSessionId: SessionId,
|
|
314
|
-
private readonly logger?: ITelemetryLoggerExt,
|
|
315
|
-
) {
|
|
315
|
+
public constructor(public readonly localSessionId: SessionId, logger?: ITelemetryBaseLogger) {
|
|
316
316
|
this.localSession = this.createSession(localSessionId);
|
|
317
|
+
this.logger = createChildLogger({ logger });
|
|
317
318
|
}
|
|
318
319
|
|
|
319
320
|
/**
|