@fluidframework/container-runtime 2.4.0-297027 → 2.4.0-299374

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.
Files changed (52) hide show
  1. package/container-runtime.test-files.tar +0 -0
  2. package/dist/containerRuntime.d.ts +8 -0
  3. package/dist/containerRuntime.d.ts.map +1 -1
  4. package/dist/containerRuntime.js +79 -58
  5. package/dist/containerRuntime.js.map +1 -1
  6. package/dist/dataStoreContext.d.ts.map +1 -1
  7. package/dist/dataStoreContext.js +0 -3
  8. package/dist/dataStoreContext.js.map +1 -1
  9. package/dist/packageVersion.d.ts +1 -1
  10. package/dist/packageVersion.js +1 -1
  11. package/dist/packageVersion.js.map +1 -1
  12. package/dist/summary/summarizerNode/summarizerNode.d.ts +30 -13
  13. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  14. package/dist/summary/summarizerNode/summarizerNode.js +84 -102
  15. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  16. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +15 -42
  17. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  18. package/dist/summary/summarizerNode/summarizerNodeUtils.js +10 -88
  19. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  20. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +5 -6
  21. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  22. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +28 -38
  23. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  24. package/lib/containerRuntime.d.ts +8 -0
  25. package/lib/containerRuntime.d.ts.map +1 -1
  26. package/lib/containerRuntime.js +79 -58
  27. package/lib/containerRuntime.js.map +1 -1
  28. package/lib/dataStoreContext.d.ts.map +1 -1
  29. package/lib/dataStoreContext.js +0 -3
  30. package/lib/dataStoreContext.js.map +1 -1
  31. package/lib/packageVersion.d.ts +1 -1
  32. package/lib/packageVersion.js +1 -1
  33. package/lib/packageVersion.js.map +1 -1
  34. package/lib/summary/summarizerNode/summarizerNode.d.ts +30 -13
  35. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  36. package/lib/summary/summarizerNode/summarizerNode.js +85 -103
  37. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  38. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +15 -42
  39. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  40. package/lib/summary/summarizerNode/summarizerNodeUtils.js +8 -84
  41. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  42. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +5 -6
  43. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  44. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +29 -39
  45. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  46. package/package.json +21 -22
  47. package/src/containerRuntime.ts +98 -76
  48. package/src/dataStoreContext.ts +0 -3
  49. package/src/packageVersion.ts +1 -1
  50. package/src/summary/summarizerNode/summarizerNode.ts +90 -123
  51. package/src/summary/summarizerNode/summarizerNodeUtils.ts +19 -99
  52. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +37 -53
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/container-runtime",
3
- "version": "2.4.0-297027",
3
+ "version": "2.4.0-299374",
4
4
  "description": "Fluid container runtime",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -127,18 +127,18 @@
127
127
  "temp-directory": "nyc/.nyc_output"
128
128
  },
129
129
  "dependencies": {
130
- "@fluid-internal/client-utils": "2.4.0-297027",
131
- "@fluidframework/container-definitions": "2.4.0-297027",
132
- "@fluidframework/container-runtime-definitions": "2.4.0-297027",
133
- "@fluidframework/core-interfaces": "2.4.0-297027",
134
- "@fluidframework/core-utils": "2.4.0-297027",
135
- "@fluidframework/datastore": "2.4.0-297027",
136
- "@fluidframework/driver-definitions": "2.4.0-297027",
137
- "@fluidframework/driver-utils": "2.4.0-297027",
138
- "@fluidframework/id-compressor": "2.4.0-297027",
139
- "@fluidframework/runtime-definitions": "2.4.0-297027",
140
- "@fluidframework/runtime-utils": "2.4.0-297027",
141
- "@fluidframework/telemetry-utils": "2.4.0-297027",
130
+ "@fluid-internal/client-utils": "2.4.0-299374",
131
+ "@fluidframework/container-definitions": "2.4.0-299374",
132
+ "@fluidframework/container-runtime-definitions": "2.4.0-299374",
133
+ "@fluidframework/core-interfaces": "2.4.0-299374",
134
+ "@fluidframework/core-utils": "2.4.0-299374",
135
+ "@fluidframework/datastore": "2.4.0-299374",
136
+ "@fluidframework/driver-definitions": "2.4.0-299374",
137
+ "@fluidframework/driver-utils": "2.4.0-299374",
138
+ "@fluidframework/id-compressor": "2.4.0-299374",
139
+ "@fluidframework/runtime-definitions": "2.4.0-299374",
140
+ "@fluidframework/runtime-utils": "2.4.0-299374",
141
+ "@fluidframework/telemetry-utils": "2.4.0-299374",
142
142
  "@tylerbu/sorted-btree-es6": "^1.8.0",
143
143
  "double-ended-queue": "^2.1.0-0",
144
144
  "lz4js": "^0.2.0",
@@ -147,16 +147,16 @@
147
147
  "devDependencies": {
148
148
  "@arethetypeswrong/cli": "^0.15.2",
149
149
  "@biomejs/biome": "~1.8.3",
150
- "@fluid-internal/mocha-test-setup": "2.4.0-297027",
151
- "@fluid-private/stochastic-test-utils": "2.4.0-297027",
152
- "@fluid-private/test-pairwise-generator": "2.4.0-297027",
150
+ "@fluid-internal/mocha-test-setup": "2.4.0-299374",
151
+ "@fluid-private/stochastic-test-utils": "2.4.0-299374",
152
+ "@fluid-private/test-pairwise-generator": "2.4.0-299374",
153
153
  "@fluid-tools/benchmark": "^0.50.0",
154
- "@fluid-tools/build-cli": "^0.46.0",
154
+ "@fluid-tools/build-cli": "^0.48.0",
155
155
  "@fluidframework/build-common": "^2.0.3",
156
- "@fluidframework/build-tools": "^0.46.0",
157
- "@fluidframework/container-runtime-previous": "npm:@fluidframework/container-runtime@2.3.0",
156
+ "@fluidframework/build-tools": "^0.48.0",
157
+ "@fluidframework/container-runtime-previous": "npm:@fluidframework/container-runtime@~2.3.0",
158
158
  "@fluidframework/eslint-config-fluid": "^5.4.0",
159
- "@fluidframework/test-runtime-utils": "2.4.0-297027",
159
+ "@fluidframework/test-runtime-utils": "2.4.0-299374",
160
160
  "@microsoft/api-extractor": "7.47.8",
161
161
  "@types/double-ended-queue": "^2.1.0",
162
162
  "@types/mocha": "^9.1.1",
@@ -169,7 +169,6 @@
169
169
  "cross-env": "^7.0.3",
170
170
  "eslint": "~8.55.0",
171
171
  "mocha": "^10.2.0",
172
- "mocha-json-output-reporter": "^2.0.1",
173
172
  "mocha-multi-reporters": "^1.5.1",
174
173
  "moment": "^2.21.0",
175
174
  "prettier": "~3.0.3",
@@ -183,7 +182,7 @@
183
182
  "backCompat": false
184
183
  }
185
184
  },
186
- "entrypoint": "internal"
185
+ "entrypoint": "legacy"
187
186
  },
188
187
  "scripts": {
189
188
  "api": "fluid-build . --task api",
@@ -1148,6 +1148,9 @@ export class ContainerRuntime
1148
1148
  summaryOp: ISummaryContent,
1149
1149
  referenceSequenceNumber?: number,
1150
1150
  ) => number;
1151
+ /**
1152
+ * Do not call directly - use submitAddressesSignal
1153
+ */
1151
1154
  private readonly submitSignalFn: (content: ISignalEnvelope, targetClientId?: string) => void;
1152
1155
  public readonly disposeFn: (error?: ICriticalContainerError) => void;
1153
1156
  public readonly closeFn: (error?: ICriticalContainerError) => void;
@@ -1711,6 +1714,13 @@ export class ContainerRuntime
1711
1714
  });
1712
1715
 
1713
1716
  const loadedFromSequenceNumber = this.deltaManager.initialSequenceNumber;
1717
+ // If the base snapshot was generated when isolated channels were disabled, set the summary reference
1718
+ // sequence to undefined so that this snapshot will not be used for incremental summaries. This is for
1719
+ // back-compat and will rarely happen so its okay to re-summarize everything in the first summary.
1720
+ const summaryReferenceSequenceNumber =
1721
+ baseSnapshot === undefined || metadata?.disableIsolatedChannels === true
1722
+ ? undefined
1723
+ : loadedFromSequenceNumber;
1714
1724
  this.summarizerNode = createRootSummarizerNodeWithGC(
1715
1725
  createChildLogger({ logger: this.logger, namespace: "SummarizerNode" }),
1716
1726
  // Summarize function to call when summarize is called. Summarizer node always tracks summary state.
@@ -1718,8 +1728,7 @@ export class ContainerRuntime
1718
1728
  this.summarizeInternal(fullTree, trackState, telemetryContext),
1719
1729
  // Latest change sequence number, no changes since summary applied yet
1720
1730
  loadedFromSequenceNumber,
1721
- // Summary reference sequence number, undefined if no summary yet
1722
- baseSnapshot !== undefined ? loadedFromSequenceNumber : undefined,
1731
+ summaryReferenceSequenceNumber,
1723
1732
  {
1724
1733
  // Must set to false to prevent sending summary handle which would be pointing to
1725
1734
  // a summary with an older protocol state.
@@ -1733,10 +1742,6 @@ export class ContainerRuntime
1733
1742
  async () => this.garbageCollector.getBaseGCDetails(),
1734
1743
  );
1735
1744
 
1736
- if (baseSnapshot) {
1737
- this.summarizerNode.updateBaseSummaryState(baseSnapshot);
1738
- }
1739
-
1740
1745
  const parentContext = wrapContext(this);
1741
1746
 
1742
1747
  if (snapshotWithContents !== undefined) {
@@ -1753,7 +1758,7 @@ export class ContainerRuntime
1753
1758
  type,
1754
1759
  envelope1.contents,
1755
1760
  );
1756
- return this.submitSignalFn(envelope2, targetClientId);
1761
+ return this.submitEnvelopedSignal(envelope2, targetClientId);
1757
1762
  };
1758
1763
 
1759
1764
  let snapshot: ISnapshot | ISnapshotTree | undefined = getSummaryForDatastores(
@@ -3019,6 +3024,72 @@ export class ContainerRuntime
3019
3024
  this._signalTracking.totalSignalsSentInLatencyWindow = 0;
3020
3025
  }
3021
3026
 
3027
+ /**
3028
+ * Updates signal telemetry including emitting telemetry events.
3029
+ */
3030
+ private processSignalForTelemetry(envelope: ISignalEnvelope): void {
3031
+ const { clientBroadcastSignalSequenceNumber } = envelope;
3032
+ if (clientBroadcastSignalSequenceNumber === undefined) {
3033
+ return;
3034
+ }
3035
+
3036
+ if (
3037
+ this._signalTracking.trackingSignalSequenceNumber === undefined ||
3038
+ this._signalTracking.minimumTrackingSignalSequenceNumber === undefined
3039
+ ) {
3040
+ return;
3041
+ }
3042
+
3043
+ if (
3044
+ clientBroadcastSignalSequenceNumber >= this._signalTracking.trackingSignalSequenceNumber
3045
+ ) {
3046
+ // Calculate the number of signals lost and log the event.
3047
+ const signalsLost =
3048
+ clientBroadcastSignalSequenceNumber -
3049
+ this._signalTracking.trackingSignalSequenceNumber;
3050
+ if (signalsLost > 0) {
3051
+ this._signalTracking.signalsLost += signalsLost;
3052
+ this.mc.logger.sendErrorEvent({
3053
+ eventName: "SignalLost",
3054
+ signalsLost, // Number of lost signals detected.
3055
+ trackingSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
3056
+ clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
3057
+ });
3058
+ }
3059
+ // Update the tracking signal sequence number to the next expected signal in the sequence.
3060
+ this._signalTracking.trackingSignalSequenceNumber =
3061
+ clientBroadcastSignalSequenceNumber + 1;
3062
+ } else if (
3063
+ // Check if this is a signal in range of interest.
3064
+ clientBroadcastSignalSequenceNumber >=
3065
+ this._signalTracking.minimumTrackingSignalSequenceNumber
3066
+ ) {
3067
+ this._signalTracking.signalsOutOfOrder++;
3068
+ this.mc.logger.sendTelemetryEvent({
3069
+ eventName: "SignalOutOfOrder",
3070
+ type: envelope.contents.type, // Type of signal that was received out of order.
3071
+ trackingSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
3072
+ clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
3073
+ });
3074
+ }
3075
+ if (
3076
+ this._signalTracking.roundTripSignalSequenceNumber !== undefined &&
3077
+ clientBroadcastSignalSequenceNumber >= this._signalTracking.roundTripSignalSequenceNumber
3078
+ ) {
3079
+ if (
3080
+ clientBroadcastSignalSequenceNumber ===
3081
+ this._signalTracking.roundTripSignalSequenceNumber
3082
+ ) {
3083
+ // Latency tracked signal has been received.
3084
+ // We now log the roundtrip duration of the tracked signal.
3085
+ // This telemetry event also logs metrics for signals sent, signals lost, and out of order signals received.
3086
+ // These metrics are reset after logging the telemetry event.
3087
+ this.sendSignalTelemetryEvent();
3088
+ }
3089
+ this._signalTracking.roundTripSignalSequenceNumber = undefined;
3090
+ }
3091
+ }
3092
+
3022
3093
  public processSignal(message: ISignalMessage, local: boolean) {
3023
3094
  const envelope = message.content as ISignalEnvelope;
3024
3095
  const transformed: IInboundSignalMessage = {
@@ -3031,64 +3102,15 @@ export class ContainerRuntime
3031
3102
  // Only collect signal telemetry for broadcast messages sent by the current client.
3032
3103
  if (
3033
3104
  message.clientId === this.clientId &&
3034
- this.connected &&
3035
- envelope.clientBroadcastSignalSequenceNumber !== undefined
3105
+ // jason-ha: This `connected` check seems incorrect. Signals that come through
3106
+ // here must have been received while connected to service and there is no need
3107
+ // to avoid processing when connection has dropped. Because container runtime's
3108
+ // `connected` (and `_connected`) state also reflects some ops state, it may
3109
+ // easily be false when newly connected and signal tracking may very well
3110
+ // complain lost signals (that were simply skipped per this check).
3111
+ this.connected
3036
3112
  ) {
3037
- if (
3038
- this._signalTracking.trackingSignalSequenceNumber !== undefined &&
3039
- this._signalTracking.minimumTrackingSignalSequenceNumber !== undefined
3040
- ) {
3041
- if (
3042
- envelope.clientBroadcastSignalSequenceNumber >=
3043
- this._signalTracking.trackingSignalSequenceNumber
3044
- ) {
3045
- // Calculate the number of signals lost and log the event.
3046
- const signalsLost =
3047
- envelope.clientBroadcastSignalSequenceNumber -
3048
- this._signalTracking.trackingSignalSequenceNumber;
3049
- if (signalsLost > 0) {
3050
- this._signalTracking.signalsLost += signalsLost;
3051
- this.mc.logger.sendErrorEvent({
3052
- eventName: "SignalLost",
3053
- signalsLost, // Number of lost signals detected.
3054
- trackingSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
3055
- clientBroadcastSignalSequenceNumber:
3056
- envelope.clientBroadcastSignalSequenceNumber, // Actual signal sequence number received.
3057
- });
3058
- }
3059
- // Update the tracking signal sequence number to the next expected signal in the sequence.
3060
- this._signalTracking.trackingSignalSequenceNumber =
3061
- envelope.clientBroadcastSignalSequenceNumber + 1;
3062
- } else if (
3063
- envelope.clientBroadcastSignalSequenceNumber >=
3064
- this._signalTracking.minimumTrackingSignalSequenceNumber
3065
- ) {
3066
- this._signalTracking.signalsOutOfOrder++;
3067
- this.mc.logger.sendTelemetryEvent({
3068
- eventName: "SignalOutOfOrder",
3069
- type: envelope.contents.type, // Type of signal that was received out of order.
3070
- trackingSequenceNumber: this._signalTracking.trackingSignalSequenceNumber, // The next expected signal sequence number.
3071
- clientBroadcastSignalSequenceNumber: envelope.clientBroadcastSignalSequenceNumber, // Sequence number of the out of order signal.
3072
- });
3073
- }
3074
- if (
3075
- this._signalTracking.roundTripSignalSequenceNumber !== undefined &&
3076
- envelope.clientBroadcastSignalSequenceNumber >=
3077
- this._signalTracking.roundTripSignalSequenceNumber
3078
- ) {
3079
- if (
3080
- envelope.clientBroadcastSignalSequenceNumber ===
3081
- this._signalTracking.roundTripSignalSequenceNumber
3082
- ) {
3083
- // Latency tracked signal has been received.
3084
- // We now log the roundtrip duration of the tracked signal.
3085
- // This telemetry event also logs metrics for signals sent, signals lost, and out of order signals received.
3086
- // These metrics are reset after logging the telemetry event.
3087
- this.sendSignalTelemetryEvent();
3088
- }
3089
- this._signalTracking.roundTripSignalSequenceNumber = undefined;
3090
- }
3091
- }
3113
+ this.processSignalForTelemetry(envelope);
3092
3114
  }
3093
3115
 
3094
3116
  if (envelope.address === undefined) {
@@ -3335,19 +3357,24 @@ export class ContainerRuntime
3335
3357
  address: string | undefined,
3336
3358
  type: string,
3337
3359
  content: any,
3338
- targetClientId?: string,
3339
- ): ISignalEnvelope {
3340
- const newEnvelope: ISignalEnvelope = {
3360
+ ): Omit<ISignalEnvelope, "broadcastSignalSequenceNumber"> {
3361
+ const newEnvelope: Omit<ISignalEnvelope, "broadcastSignalSequenceNumber"> = {
3341
3362
  address,
3342
3363
  contents: { type, content },
3343
3364
  };
3344
3365
 
3366
+ return newEnvelope;
3367
+ }
3368
+
3369
+ private submitEnvelopedSignal(envelope: ISignalEnvelope, targetClientId?: string) {
3345
3370
  const isBroadcastSignal = targetClientId === undefined;
3346
3371
 
3347
3372
  if (isBroadcastSignal) {
3348
3373
  const clientBroadcastSignalSequenceNumber = ++this._signalTracking
3349
3374
  .broadcastSignalSequenceNumber;
3350
- newEnvelope.clientBroadcastSignalSequenceNumber = clientBroadcastSignalSequenceNumber;
3375
+ // Stamp with the broadcast signal sequence number.
3376
+ envelope.clientBroadcastSignalSequenceNumber = clientBroadcastSignalSequenceNumber;
3377
+
3351
3378
  this._signalTracking.signalsSentSinceLastLatencyMeasurement++;
3352
3379
 
3353
3380
  if (
@@ -3376,7 +3403,7 @@ export class ContainerRuntime
3376
3403
  }
3377
3404
  }
3378
3405
 
3379
- return newEnvelope;
3406
+ this.submitSignalFn(envelope, targetClientId);
3380
3407
  }
3381
3408
 
3382
3409
  /**
@@ -3393,13 +3420,8 @@ export class ContainerRuntime
3393
3420
  */
3394
3421
  public submitSignal(type: string, content: unknown, targetClientId?: string) {
3395
3422
  this.verifyNotClosed();
3396
- const envelope = this.createNewSignalEnvelope(
3397
- undefined /* address */,
3398
- type,
3399
- content,
3400
- targetClientId,
3401
- );
3402
- return this.submitSignalFn(envelope, targetClientId);
3423
+ const envelope = this.createNewSignalEnvelope(undefined /* address */, type, content);
3424
+ return this.submitEnvelopedSignal(envelope, targetClientId);
3403
3425
  }
3404
3426
 
3405
3427
  public setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {
@@ -1034,9 +1034,6 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
1034
1034
  this._baseSnapshot = props.snapshot;
1035
1035
  this.isSnapshotInISnapshotFormat = false;
1036
1036
  }
1037
- if (this._baseSnapshot !== undefined) {
1038
- this.summarizerNode.updateBaseSummaryState(this._baseSnapshot);
1039
- }
1040
1037
  }
1041
1038
 
1042
1039
  /*
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/container-runtime";
9
- export const pkgVersion = "2.4.0-297027";
9
+ export const pkgVersion = "2.4.0-299374";