@fluidframework/container-runtime 2.0.0-rc.3.0.3 → 2.0.0-rc.4.0.1
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 +46 -0
- package/api-report/container-runtime.api.md +72 -34
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +7 -7
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +2 -4
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +6 -4
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +20 -7
- 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 +54 -5
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +17 -35
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +194 -163
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +9 -6
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +19 -5
- 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 +81 -0
- package/dist/deltaManagerProxies.d.ts.map +1 -0
- package/dist/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +75 -20
- package/dist/deltaManagerProxies.js.map +1 -0
- package/dist/deltaScheduler.d.ts +2 -2
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +1 -1
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +1 -2
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- 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/legacy.d.ts +6 -1
- package/dist/messageTypes.d.ts +5 -2
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/metadata.d.ts +2 -2
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +4 -1
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +0 -10
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +0 -4
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +7 -38
- 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 +9 -2
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +26 -10
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +2 -2
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +3 -1
- package/dist/summary/documentSchema.d.ts.map +1 -1
- package/dist/summary/documentSchema.js +25 -7
- 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 +2 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runningSummarizer.js +10 -10
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +1 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +1 -1
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +4 -3
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +4 -10
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -3
- 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 +1 -2
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +2 -9
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +3 -5
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +25 -5
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +1 -2
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +12 -11
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +5 -5
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +7 -7
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +3 -5
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +6 -4
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +21 -8
- 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 +49 -0
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +17 -35
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +195 -164
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +1 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +9 -6
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +21 -7
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/deltaManagerProxies.d.ts +81 -0
- package/lib/deltaManagerProxies.d.ts.map +1 -0
- package/lib/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +72 -19
- package/lib/deltaManagerProxies.js.map +1 -0
- package/lib/deltaScheduler.d.ts +2 -2
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +1 -1
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +1 -2
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- 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/legacy.d.ts +6 -1
- package/lib/messageTypes.d.ts +5 -2
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js.map +1 -1
- package/lib/metadata.d.ts +2 -2
- package/lib/metadata.d.ts.map +1 -1
- package/lib/metadata.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +4 -1
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +0 -10
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +0 -4
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +7 -38
- 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 +9 -2
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +27 -11
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts +2 -2
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +3 -1
- package/lib/summary/documentSchema.d.ts.map +1 -1
- package/lib/summary/documentSchema.js +25 -7
- 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.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +1 -1
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runningSummarizer.js +1 -1
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +1 -2
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +1 -1
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +4 -3
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +4 -10
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -3
- 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 +1 -2
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +2 -9
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +3 -5
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +25 -5
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +1 -2
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +5 -4
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +2 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/tsdoc-metadata.json +1 -1
- package/package.json +28 -50
- package/src/batchTracker.ts +1 -2
- package/src/blobManager.ts +11 -10
- package/src/channelCollection.ts +30 -12
- package/src/connectionTelemetry.ts +59 -4
- package/src/containerRuntime.ts +262 -239
- package/src/dataStore.ts +7 -4
- package/src/dataStoreContext.ts +57 -16
- package/src/dataStoreContexts.ts +1 -2
- package/src/{deltaManagerSummarizerProxy.ts → deltaManagerProxies.ts} +98 -24
- package/src/deltaScheduler.ts +2 -3
- package/src/gc/garbageCollection.ts +1 -1
- package/src/gc/gcDefinitions.ts +1 -1
- package/src/gc/gcTelemetry.ts +1 -3
- package/src/index.ts +5 -0
- package/src/messageTypes.ts +4 -2
- package/src/metadata.ts +2 -2
- package/src/opLifecycle/README.md +4 -4
- package/src/opLifecycle/batchManager.ts +5 -14
- package/src/opLifecycle/outbox.ts +7 -53
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +38 -15
- package/src/scheduleManager.ts +2 -2
- package/src/summary/documentSchema.ts +37 -12
- package/src/summary/index.ts +4 -0
- package/src/summary/orderedClientElection.ts +6 -3
- package/src/summary/runningSummarizer.ts +1 -1
- package/src/summary/summarizer.ts +1 -1
- package/src/summary/summarizerClientElection.ts +1 -1
- package/src/summary/summarizerHeuristics.ts +1 -1
- package/src/summary/summarizerNode/summarizerNode.ts +3 -12
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +2 -3
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +1 -10
- package/src/summary/summarizerTypes.ts +6 -5
- package/src/summary/summaryCollection.ts +2 -2
- package/src/summary/summaryFormat.ts +30 -4
- package/src/summary/summaryGenerator.ts +20 -9
- package/src/summary/summaryManager.ts +6 -3
- package/dist/deltaManagerSummarizerProxy.d.ts +0 -44
- package/dist/deltaManagerSummarizerProxy.d.ts.map +0 -1
- package/dist/deltaManagerSummarizerProxy.js.map +0 -1
- package/lib/deltaManagerSummarizerProxy.d.ts +0 -44
- package/lib/deltaManagerSummarizerProxy.d.ts.map +0 -1
- package/lib/deltaManagerSummarizerProxy.js.map +0 -1
package/src/channelCollection.ts
CHANGED
|
@@ -7,14 +7,19 @@ import { AttachState } from "@fluidframework/container-definitions";
|
|
|
7
7
|
import {
|
|
8
8
|
FluidObject,
|
|
9
9
|
IDisposable,
|
|
10
|
-
IFluidHandle,
|
|
11
10
|
IRequest,
|
|
12
11
|
IResponse,
|
|
13
12
|
ITelemetryBaseLogger,
|
|
14
13
|
} from "@fluidframework/core-interfaces";
|
|
14
|
+
import type { IFluidHandleInternal } from "@fluidframework/core-interfaces/internal";
|
|
15
15
|
import { assert, Lazy, LazyPromise } from "@fluidframework/core-utils/internal";
|
|
16
16
|
import { FluidObjectHandle } from "@fluidframework/datastore/internal";
|
|
17
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
buildSnapshotTree,
|
|
19
|
+
getSnapshotTree,
|
|
20
|
+
isInstanceOfISnapshot,
|
|
21
|
+
} from "@fluidframework/driver-utils/internal";
|
|
22
|
+
import type { ISnapshot } from "@fluidframework/driver-definitions/internal";
|
|
18
23
|
import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
|
|
19
24
|
import {
|
|
20
25
|
IGarbageCollectionData,
|
|
@@ -168,6 +173,7 @@ export function wrapContext(context: IFluidParentContext): IFluidParentContext {
|
|
|
168
173
|
getAudience: (...args) => {
|
|
169
174
|
return context.getAudience(...args);
|
|
170
175
|
},
|
|
176
|
+
// back-compat, to be removed in 2.0
|
|
171
177
|
ensureNoDataModelChanges: (...args) => {
|
|
172
178
|
return context.ensureNoDataModelChanges(...args);
|
|
173
179
|
},
|
|
@@ -254,7 +260,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
254
260
|
|
|
255
261
|
private readonly disposeOnce = new Lazy<void>(() => this.contexts.dispose());
|
|
256
262
|
|
|
257
|
-
public readonly entryPoint:
|
|
263
|
+
public readonly entryPoint: IFluidHandleInternal<FluidObject>;
|
|
258
264
|
|
|
259
265
|
public readonly containerLoadStats: {
|
|
260
266
|
// number of dataStores during loadContainer
|
|
@@ -268,7 +274,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
268
274
|
private dataStoresSinceLastGC: string[] = [];
|
|
269
275
|
// The handle to the container runtime. This is used mainly for GC purposes to represent outbound reference from
|
|
270
276
|
// the container runtime to other nodes.
|
|
271
|
-
private readonly containerRuntimeHandle:
|
|
277
|
+
private readonly containerRuntimeHandle: IFluidHandleInternal;
|
|
272
278
|
private readonly pendingAliasMap: Map<string, Promise<AliasResult>> = new Map<
|
|
273
279
|
string,
|
|
274
280
|
Promise<AliasResult>
|
|
@@ -278,7 +284,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
278
284
|
private readonly aliasedDataStores: Set<string>;
|
|
279
285
|
|
|
280
286
|
constructor(
|
|
281
|
-
protected readonly baseSnapshot: ISnapshotTree | undefined,
|
|
287
|
+
protected readonly baseSnapshot: ISnapshotTree | ISnapshot | undefined,
|
|
282
288
|
public readonly parentContext: IFluidParentContext,
|
|
283
289
|
baseLogger: ITelemetryBaseLogger,
|
|
284
290
|
private readonly gcNodeUpdated: (props: IGCNodeUpdatedProps) => void,
|
|
@@ -303,7 +309,8 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
303
309
|
// Extract stores stored inside the snapshot
|
|
304
310
|
const fluidDataStores = new Map<string, ISnapshotTree>();
|
|
305
311
|
if (baseSnapshot) {
|
|
306
|
-
|
|
312
|
+
const baseSnapshotTree = getSnapshotTree(baseSnapshot);
|
|
313
|
+
for (const [key, value] of Object.entries(baseSnapshotTree.trees)) {
|
|
307
314
|
fluidDataStores.set(key, value);
|
|
308
315
|
}
|
|
309
316
|
}
|
|
@@ -319,9 +326,16 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
319
326
|
}
|
|
320
327
|
// If we have a detached container, then create local data store contexts.
|
|
321
328
|
if (this.parentContext.attachState !== AttachState.Detached) {
|
|
329
|
+
let snapshotForRemoteFluidDatastoreContext: ISnapshot | ISnapshotTree = value;
|
|
330
|
+
if (isInstanceOfISnapshot(baseSnapshot)) {
|
|
331
|
+
snapshotForRemoteFluidDatastoreContext = {
|
|
332
|
+
...baseSnapshot,
|
|
333
|
+
snapshotTree: value,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
322
336
|
dataStoreContext = new RemoteFluidDataStoreContext({
|
|
323
337
|
id: key,
|
|
324
|
-
|
|
338
|
+
snapshot: snapshotForRemoteFluidDatastoreContext,
|
|
325
339
|
parentContext: this.wrapContextForInnerChannel(key),
|
|
326
340
|
storage: this.parentContext.storage,
|
|
327
341
|
scope: this.parentContext.scope,
|
|
@@ -442,9 +456,12 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
442
456
|
}
|
|
443
457
|
|
|
444
458
|
const flatAttachBlobs = new Map<string, ArrayBufferLike>();
|
|
445
|
-
let
|
|
459
|
+
let snapshot: ISnapshotTree | ISnapshot | undefined;
|
|
446
460
|
if (attachMessage.snapshot) {
|
|
447
|
-
|
|
461
|
+
snapshot = buildSnapshotTree(attachMessage.snapshot.entries, flatAttachBlobs);
|
|
462
|
+
if (isInstanceOfISnapshot(this.baseSnapshot)) {
|
|
463
|
+
snapshot = { ...this.baseSnapshot, snapshotTree: snapshot };
|
|
464
|
+
}
|
|
448
465
|
}
|
|
449
466
|
|
|
450
467
|
// Include the type of attach message which is the pkg of the store to be
|
|
@@ -452,7 +469,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
452
469
|
const pkg = [attachMessage.type];
|
|
453
470
|
const remoteFluidDataStoreContext = new RemoteFluidDataStoreContext({
|
|
454
471
|
id: attachMessage.id,
|
|
455
|
-
|
|
472
|
+
snapshot,
|
|
456
473
|
parentContext: this.wrapContextForInnerChannel(attachMessage.id),
|
|
457
474
|
storage: new StorageServiceWithAttachBlobs(this.parentContext.storage, flatAttachBlobs),
|
|
458
475
|
scope: this.parentContext.scope,
|
|
@@ -562,8 +579,8 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
562
579
|
* If the container is detached, this data store will be part of the summary that makes the container attached.
|
|
563
580
|
*/
|
|
564
581
|
if (this.parentContext.attachState !== AttachState.Detached) {
|
|
565
|
-
localContext.setAttachState(AttachState.Attaching);
|
|
566
582
|
this.submitAttachChannelOp(localContext);
|
|
583
|
+
localContext.setAttachState(AttachState.Attaching);
|
|
567
584
|
}
|
|
568
585
|
|
|
569
586
|
this.contexts.bind(id);
|
|
@@ -643,6 +660,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
643
660
|
createProps?: any,
|
|
644
661
|
loadingGroupId?: string,
|
|
645
662
|
) {
|
|
663
|
+
assert(loadingGroupId !== "", 0x974 /* loadingGroupId should not be the empty string */);
|
|
646
664
|
const context = new contextCtor({
|
|
647
665
|
id,
|
|
648
666
|
pkg,
|
|
@@ -1152,7 +1170,7 @@ export class ChannelCollection implements IFluidDataStoreChannel, IDisposable {
|
|
|
1152
1170
|
0x166 /* "BaseSnapshot should be there as detached container loaded from snapshot" */,
|
|
1153
1171
|
);
|
|
1154
1172
|
dataStoreSummary = convertSnapshotTreeToSummaryTree(
|
|
1155
|
-
this.baseSnapshot.trees[key],
|
|
1173
|
+
getSnapshotTree(this.baseSnapshot).trees[key],
|
|
1156
1174
|
);
|
|
1157
1175
|
}
|
|
1158
1176
|
builder.addWithStats(key, dataStoreSummary);
|
|
@@ -4,18 +4,19 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { performance } from "@fluid-internal/client-utils";
|
|
7
|
-
import { IDeltaManager } from "@fluidframework/container-definitions";
|
|
7
|
+
import { IDeltaManager } from "@fluidframework/container-definitions/internal";
|
|
8
8
|
import { IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions/internal";
|
|
9
9
|
import { IEventProvider } from "@fluidframework/core-interfaces";
|
|
10
10
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
11
|
+
import { isRuntimeMessage } from "@fluidframework/driver-utils/internal";
|
|
11
12
|
import {
|
|
12
13
|
IDocumentMessage,
|
|
13
14
|
ISequencedDocumentMessage,
|
|
14
15
|
MessageType,
|
|
15
16
|
} from "@fluidframework/protocol-definitions";
|
|
16
|
-
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
17
17
|
import {
|
|
18
18
|
IEventSampler,
|
|
19
|
+
ITelemetryLoggerExt,
|
|
19
20
|
ISampledTelemetryLogger,
|
|
20
21
|
createChildLogger,
|
|
21
22
|
createSampledLogger,
|
|
@@ -80,6 +81,11 @@ class OpPerfTelemetry {
|
|
|
80
81
|
private connectionStartTime = 0;
|
|
81
82
|
private gap = 0;
|
|
82
83
|
|
|
84
|
+
/** Count of no-ops sent by this client. This variable is reset everytime the OpStats sampled event is logged */
|
|
85
|
+
private noOpCountForTelemetry = 0;
|
|
86
|
+
/** Cumulative size of the ops processed by this client. This variable is reset everytime the OpStats sampled event is logged */
|
|
87
|
+
private processedOpSizeForTelemetry = 0;
|
|
88
|
+
|
|
83
89
|
private readonly logger: ITelemetryLoggerExt;
|
|
84
90
|
|
|
85
91
|
private static readonly OP_LATENCY_SAMPLE_RATE = 500;
|
|
@@ -88,6 +94,9 @@ class OpPerfTelemetry {
|
|
|
88
94
|
private static readonly DELTA_LATENCY_SAMPLE_RATE = 100;
|
|
89
95
|
private readonly deltaLatencyLogger: ISampledTelemetryLogger;
|
|
90
96
|
|
|
97
|
+
private static readonly PROCESSED_OPS_SAMPLE_RATE = 500;
|
|
98
|
+
private readonly opsLogger: ISampledTelemetryLogger;
|
|
99
|
+
|
|
91
100
|
/**
|
|
92
101
|
* Create an instance of OpPerfTelemetry which starts monitoring and generating telemetry related to op performance.
|
|
93
102
|
*
|
|
@@ -142,11 +151,27 @@ class OpPerfTelemetry {
|
|
|
142
151
|
// due to complexity of the different asynchronus scenarios of the op message lifecycle.
|
|
143
152
|
this.opLatencyLogger = createSampledLogger(logger);
|
|
144
153
|
|
|
154
|
+
const opsEventSampler: IEventSampler = (() => {
|
|
155
|
+
let eventCount = 0;
|
|
156
|
+
return {
|
|
157
|
+
sample: () => {
|
|
158
|
+
eventCount++;
|
|
159
|
+
const shouldSample =
|
|
160
|
+
eventCount % OpPerfTelemetry.PROCESSED_OPS_SAMPLE_RATE === 0;
|
|
161
|
+
if (shouldSample) {
|
|
162
|
+
eventCount = 0;
|
|
163
|
+
this.noOpCountForTelemetry = 0;
|
|
164
|
+
this.processedOpSizeForTelemetry = 0;
|
|
165
|
+
}
|
|
166
|
+
return shouldSample;
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
})();
|
|
170
|
+
this.opsLogger = createSampledLogger(logger, opsEventSampler);
|
|
171
|
+
|
|
145
172
|
this.deltaManager.on("pong", (latency) => this.recordPingTime(latency));
|
|
146
173
|
this.deltaManager.on("submitOp", (message) => this.beforeOpSubmit(message));
|
|
147
|
-
|
|
148
174
|
this.deltaManager.on("op", (message) => this.afterProcessingOp(message));
|
|
149
|
-
|
|
150
175
|
this.deltaManager.on("connect", (details, opsBehind) => {
|
|
151
176
|
if (opsBehind !== undefined) {
|
|
152
177
|
this.connectionOpSeqNumber = this.deltaManager.lastKnownSeqNumber;
|
|
@@ -226,6 +251,9 @@ class OpPerfTelemetry {
|
|
|
226
251
|
latencyStats.opPerfData.lengthInboundQueue = this.deltaManager.inbound.length;
|
|
227
252
|
}
|
|
228
253
|
}
|
|
254
|
+
if (isRuntimeMessage(message) && typeof message.contents === "string") {
|
|
255
|
+
this.processedOpSizeForTelemetry += message.contents.length;
|
|
256
|
+
}
|
|
229
257
|
});
|
|
230
258
|
|
|
231
259
|
this.deltaManager.inbound.on("idle", (count: number, duration: number) => {
|
|
@@ -302,6 +330,12 @@ class OpPerfTelemetry {
|
|
|
302
330
|
opPerfData: {},
|
|
303
331
|
});
|
|
304
332
|
}
|
|
333
|
+
|
|
334
|
+
if (message.type === MessageType.NoOp) {
|
|
335
|
+
// Count the number of no-ops submitted by this client.
|
|
336
|
+
// The value is reset when we log the OpStats sampled event.
|
|
337
|
+
this.noOpCountForTelemetry++;
|
|
338
|
+
}
|
|
305
339
|
}
|
|
306
340
|
|
|
307
341
|
private afterProcessingOp(message: ISequencedDocumentMessage) {
|
|
@@ -335,6 +369,7 @@ class OpPerfTelemetry {
|
|
|
335
369
|
|
|
336
370
|
if (
|
|
337
371
|
this.clientId === message.clientId &&
|
|
372
|
+
message.type === MessageType.Operation &&
|
|
338
373
|
(this.opLatencyLogger.isSamplingDisabled ||
|
|
339
374
|
this.clientSequenceNumberForLatencyStatistics === message.clientSequenceNumber)
|
|
340
375
|
) {
|
|
@@ -372,9 +407,29 @@ class OpPerfTelemetry {
|
|
|
372
407
|
this.deltaManager.lastSequenceNumber - this.deltaManager.minimumSequenceNumber,
|
|
373
408
|
...latencyData.opPerfData,
|
|
374
409
|
});
|
|
410
|
+
|
|
375
411
|
this.clientSequenceNumberForLatencyStatistics = undefined;
|
|
376
412
|
this.latencyStatistics.delete(message.clientSequenceNumber);
|
|
377
413
|
}
|
|
414
|
+
|
|
415
|
+
if (isRuntimeMessage(message)) {
|
|
416
|
+
// Sampled logging of Ops that have been processed by the current client, the NoOp sent and the
|
|
417
|
+
// size of the ops processed within one sampling window of this log event.
|
|
418
|
+
// This data will be used to monitor the efficiency of NoOp-heuristics or to get approximate collab window size.
|
|
419
|
+
this.opsLogger.sendPerformanceEvent({
|
|
420
|
+
eventName: "OpStats",
|
|
421
|
+
// Logging as 'details' property to avoid adding new column name to the log tables */
|
|
422
|
+
details: {
|
|
423
|
+
// Count of the ops processed by the current client. Note: these counts are after
|
|
424
|
+
// compression/grouping/chunking (if enabled) of the ops.
|
|
425
|
+
processedOpCount: OpPerfTelemetry.PROCESSED_OPS_SAMPLE_RATE,
|
|
426
|
+
// Cumulative size of all the ops processed by the current client since the last OpStats event log
|
|
427
|
+
processedOpSize: this.processedOpSizeForTelemetry,
|
|
428
|
+
// Count of all the NoOp sent by the current client since the last OpStats event log
|
|
429
|
+
submitedNoOpCount: this.noOpCountForTelemetry,
|
|
430
|
+
},
|
|
431
|
+
});
|
|
432
|
+
}
|
|
378
433
|
}
|
|
379
434
|
}
|
|
380
435
|
export interface IPerfSignalReport {
|