@fluidframework/container-runtime 0.58.2002 → 0.58.3000-61081

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 (83) hide show
  1. package/dist/blobManager.d.ts +3 -2
  2. package/dist/blobManager.d.ts.map +1 -1
  3. package/dist/blobManager.js +13 -9
  4. package/dist/blobManager.js.map +1 -1
  5. package/dist/connectionTelemetry.d.ts.map +1 -1
  6. package/dist/connectionTelemetry.js +63 -23
  7. package/dist/connectionTelemetry.js.map +1 -1
  8. package/dist/containerRuntime.d.ts +12 -4
  9. package/dist/containerRuntime.d.ts.map +1 -1
  10. package/dist/containerRuntime.js +61 -15
  11. package/dist/containerRuntime.js.map +1 -1
  12. package/dist/opTelemetry.d.ts +22 -0
  13. package/dist/opTelemetry.d.ts.map +1 -0
  14. package/dist/opTelemetry.js +59 -0
  15. package/dist/opTelemetry.js.map +1 -0
  16. package/dist/orderedClientElection.d.ts +57 -6
  17. package/dist/orderedClientElection.d.ts.map +1 -1
  18. package/dist/orderedClientElection.js +140 -25
  19. package/dist/orderedClientElection.js.map +1 -1
  20. package/dist/packageVersion.d.ts +1 -1
  21. package/dist/packageVersion.d.ts.map +1 -1
  22. package/dist/packageVersion.js +1 -1
  23. package/dist/packageVersion.js.map +1 -1
  24. package/dist/summarizerClientElection.d.ts +2 -0
  25. package/dist/summarizerClientElection.d.ts.map +1 -1
  26. package/dist/summarizerClientElection.js +7 -2
  27. package/dist/summarizerClientElection.js.map +1 -1
  28. package/dist/summarizerTypes.d.ts +9 -0
  29. package/dist/summarizerTypes.d.ts.map +1 -1
  30. package/dist/summarizerTypes.js.map +1 -1
  31. package/dist/summaryGenerator.d.ts.map +1 -1
  32. package/dist/summaryGenerator.js +1 -1
  33. package/dist/summaryGenerator.js.map +1 -1
  34. package/dist/summaryManager.d.ts.map +1 -1
  35. package/dist/summaryManager.js +14 -3
  36. package/dist/summaryManager.js.map +1 -1
  37. package/lib/blobManager.d.ts +3 -2
  38. package/lib/blobManager.d.ts.map +1 -1
  39. package/lib/blobManager.js +14 -10
  40. package/lib/blobManager.js.map +1 -1
  41. package/lib/connectionTelemetry.d.ts.map +1 -1
  42. package/lib/connectionTelemetry.js +63 -23
  43. package/lib/connectionTelemetry.js.map +1 -1
  44. package/lib/containerRuntime.d.ts +12 -4
  45. package/lib/containerRuntime.d.ts.map +1 -1
  46. package/lib/containerRuntime.js +62 -16
  47. package/lib/containerRuntime.js.map +1 -1
  48. package/lib/opTelemetry.d.ts +22 -0
  49. package/lib/opTelemetry.d.ts.map +1 -0
  50. package/lib/opTelemetry.js +55 -0
  51. package/lib/opTelemetry.js.map +1 -0
  52. package/lib/orderedClientElection.d.ts +57 -6
  53. package/lib/orderedClientElection.d.ts.map +1 -1
  54. package/lib/orderedClientElection.js +140 -25
  55. package/lib/orderedClientElection.js.map +1 -1
  56. package/lib/packageVersion.d.ts +1 -1
  57. package/lib/packageVersion.d.ts.map +1 -1
  58. package/lib/packageVersion.js +1 -1
  59. package/lib/packageVersion.js.map +1 -1
  60. package/lib/summarizerClientElection.d.ts +2 -0
  61. package/lib/summarizerClientElection.d.ts.map +1 -1
  62. package/lib/summarizerClientElection.js +7 -2
  63. package/lib/summarizerClientElection.js.map +1 -1
  64. package/lib/summarizerTypes.d.ts +9 -0
  65. package/lib/summarizerTypes.d.ts.map +1 -1
  66. package/lib/summarizerTypes.js.map +1 -1
  67. package/lib/summaryGenerator.d.ts.map +1 -1
  68. package/lib/summaryGenerator.js +1 -1
  69. package/lib/summaryGenerator.js.map +1 -1
  70. package/lib/summaryManager.d.ts.map +1 -1
  71. package/lib/summaryManager.js +14 -3
  72. package/lib/summaryManager.js.map +1 -1
  73. package/package.json +47 -15
  74. package/src/blobManager.ts +19 -11
  75. package/src/connectionTelemetry.ts +110 -19
  76. package/src/containerRuntime.ts +85 -19
  77. package/src/opTelemetry.ts +71 -0
  78. package/src/orderedClientElection.ts +154 -25
  79. package/src/packageVersion.ts +1 -1
  80. package/src/summarizerClientElection.ts +7 -2
  81. package/src/summarizerTypes.ts +9 -0
  82. package/src/summaryGenerator.ts +9 -1
  83. package/src/summaryManager.ts +15 -4
@@ -17,6 +17,7 @@ export interface ISummarizerClientElectionEvents extends IEvent {
17
17
 
18
18
  export interface ISummarizerClientElection extends IEventProvider<ISummarizerClientElectionEvents> {
19
19
  readonly electedClientId: string | undefined;
20
+ readonly electedParentId: string | undefined;
20
21
  }
21
22
 
22
23
  /**
@@ -44,6 +45,9 @@ export class SummarizerClientElection
44
45
  public get electedClientId() {
45
46
  return this.clientElection.electedClient?.clientId;
46
47
  }
48
+ public get electedParentId() {
49
+ return this.clientElection.electedParent?.clientId;
50
+ }
47
51
 
48
52
  constructor(
49
53
  private readonly logger: ITelemetryLogger,
@@ -127,9 +131,10 @@ export class SummarizerClientElection
127
131
  }
128
132
 
129
133
  public serialize(): ISerializedElection {
130
- const { electedClientId, electionSequenceNumber } = this.clientElection.serialize();
134
+ const { electedClientId, electedParentId, electionSequenceNumber } = this.clientElection.serialize();
131
135
  return {
132
136
  electedClientId,
137
+ electedParentId,
133
138
  electionSequenceNumber: this.lastSummaryAckSeqForClient ?? electionSequenceNumber,
134
139
  };
135
140
  }
@@ -144,5 +149,5 @@ export class SummarizerClientElection
144
149
  }
145
150
 
146
151
  public static readonly clientDetailsPermitElection = (details: IClientDetails): boolean =>
147
- details.capabilities.interactive && details.type !== summarizerClientType;
152
+ details.capabilities.interactive || details.type === summarizerClientType;
148
153
  }
@@ -143,6 +143,14 @@ export interface IGeneratedSummaryStats extends ISummaryStats {
143
143
  readonly summarizedDataStoreCount: number;
144
144
  /** The number of data stores whose GC reference state was updated in this summary. */
145
145
  readonly gcStateUpdatedDataStoreCount?: number;
146
+ /** The size of the gc blobs in this summary. */
147
+ readonly gcTotalBlobsSize?: number;
148
+ /** The number of gc blobs in this summary. */
149
+ readonly gcBlobNodeCount?: number;
150
+ /** Sum of the sizes of all op contents since the last summary */
151
+ readonly opsSizesSinceLastSummary: number;
152
+ /** Number of non-system ops since the last summary @see isSystemMessage */
153
+ readonly nonSystemOpsSinceLastSummary: number;
146
154
  }
147
155
 
148
156
  /** Base results for all submitSummary attempts. */
@@ -152,6 +160,7 @@ export interface IBaseSummarizeResult {
152
160
  readonly error: any;
153
161
  /** Reference sequence number as of the generate summary attempt. */
154
162
  readonly referenceSequenceNumber: number;
163
+ readonly minimumSequenceNumber: number;
155
164
  }
156
165
 
157
166
  /** Results of submitSummary after generating the summary tree. */
@@ -65,10 +65,17 @@ type SummaryGeneratorRequiredTelemetryProperties =
65
65
  type SummaryGeneratorOptionalTelemetryProperties =
66
66
  /** Reference sequence number as of the generate summary attempt. */
67
67
  "referenceSequenceNumber" |
68
+ /** minimum sequence number (at the reference sequence number) */
69
+ "minimumSequenceNumber" |
68
70
  /** Delta between the current reference sequence number and the reference sequence number of the last attempt */
69
71
  "opsSinceLastAttempt" |
70
72
  /** Delta between the current reference sequence number and the reference sequence number of the last summary */
71
73
  "opsSinceLastSummary" |
74
+ /** Delta in sum of op sizes between the current reference sequence number and the reference
75
+ * sequence number of the last summary */
76
+ "opsSizesSinceLastSummary" |
77
+ /** Delta between the number of non-system ops since the last summary @see isSystemMessage */
78
+ "nonSystemOpsSinceLastSummary" |
72
79
  /** Time it took to generate the summary tree and stats. */
73
80
  "generateDuration" |
74
81
  /** The handle returned by storage pointing to the uploaded summary tree. */
@@ -84,7 +91,7 @@ type SummaryGeneratorOptionalTelemetryProperties =
84
91
  /** Actual sequence number of the summary op proposal. */
85
92
  "summarySequenceNumber" |
86
93
  /** Optional Retry-After time in seconds. If specified, the client should wait this many seconds before retrying. */
87
- "nackRetryAfter";
94
+ "nackRetryAfter";
88
95
  type SummaryGeneratorTelemetry =
89
96
  Pick<ITelemetryProperties, SummaryGeneratorRequiredTelemetryProperties> &
90
97
  Partial<Pick<ITelemetryProperties, SummaryGeneratorOptionalTelemetryProperties>>;
@@ -298,6 +305,7 @@ export class SummaryGenerator {
298
305
  summarizeTelemetryProps = {
299
306
  ...summarizeTelemetryProps,
300
307
  referenceSequenceNumber,
308
+ minimumSequenceNumber: summaryData.minimumSequenceNumber,
301
309
  opsSinceLastAttempt: referenceSequenceNumber - this.heuristicData.lastAttempt.refSequenceNumber,
302
310
  opsSinceLastSummary,
303
311
  };
@@ -137,9 +137,15 @@ export class SummaryManager implements IDisposable {
137
137
  state === SummaryManagerState.Starting || state === SummaryManagerState.Running;
138
138
 
139
139
  private getShouldSummarizeState(): ShouldSummarizeState {
140
+ // Note that if we're in the Running state, the electedClient may be a summarizer client, so we can't
141
+ // enforce connectedState.clientId === clientElection.electedClientId. But once we're Running, we should
142
+ // only transition to Stopping when the electedParentId changes. Stopping the summarizer without
143
+ // changing the electedParent will just cause us to transition to Starting again.
140
144
  if (!this.connectedState.connected) {
141
145
  return { shouldSummarize: false, stopReason: "parentNotConnected" };
142
- } else if (this.connectedState.clientId !== this.clientElection.electedClientId) {
146
+ } else if (this.connectedState.clientId !== this.clientElection.electedParentId ||
147
+ (this.state !== SummaryManagerState.Running &&
148
+ this.connectedState.clientId !== this.clientElection.electedClientId)) {
143
149
  return { shouldSummarize: false, stopReason: "parentShouldNotSummarize" };
144
150
  } else if (this.disposed) {
145
151
  assert(false, 0x260 /* "Disposed should mean disconnected!" */);
@@ -199,18 +205,23 @@ export class SummaryManager implements IDisposable {
199
205
  return;
200
206
  }
201
207
 
208
+ // We transition to Running before requesting the summarizer, because after requesting we can't predict
209
+ // when the electedClient will be replaced with the new summarizer client.
210
+ // The alternative would be to let connectedState.clientId !== clientElection.electedClientId when
211
+ // state === Starting || state === Running.
212
+ assert(this.state === SummaryManagerState.Starting, 0x263 /* "Expected: starting" */);
213
+ this.state = SummaryManagerState.Running;
214
+
202
215
  const summarizer = await this.requestSummarizerFn();
203
216
 
204
217
  // Re-validate that it need to be running. Due to asynchrony, it may be not the case anymore
205
218
  const shouldSummarizeState = this.getShouldSummarizeState();
206
219
  if (shouldSummarizeState.shouldSummarize === false) {
220
+ this.state = SummaryManagerState.Starting;
207
221
  summarizer.stop(shouldSummarizeState.stopReason);
208
222
  return;
209
223
  }
210
224
 
211
- assert(this.state === SummaryManagerState.Starting, 0x263 /* "Expected: starting" */);
212
- this.state = SummaryManagerState.Running;
213
-
214
225
  this.summarizer = summarizer;
215
226
 
216
227
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion