@fluidframework/container-runtime 0.59.1001-62246 → 0.59.2000

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 (88) hide show
  1. package/dist/connectionTelemetry.js +1 -1
  2. package/dist/connectionTelemetry.js.map +1 -1
  3. package/dist/containerRuntime.d.ts.map +1 -1
  4. package/dist/containerRuntime.js +6 -6
  5. package/dist/containerRuntime.js.map +1 -1
  6. package/dist/garbageCollection.d.ts +26 -8
  7. package/dist/garbageCollection.d.ts.map +1 -1
  8. package/dist/garbageCollection.js +81 -57
  9. package/dist/garbageCollection.js.map +1 -1
  10. package/dist/orderedClientElection.d.ts +57 -6
  11. package/dist/orderedClientElection.d.ts.map +1 -1
  12. package/dist/orderedClientElection.js +141 -26
  13. package/dist/orderedClientElection.js.map +1 -1
  14. package/dist/packageVersion.d.ts +1 -1
  15. package/dist/packageVersion.d.ts.map +1 -1
  16. package/dist/packageVersion.js +1 -1
  17. package/dist/packageVersion.js.map +1 -1
  18. package/dist/runningSummarizer.d.ts.map +1 -1
  19. package/dist/runningSummarizer.js +11 -10
  20. package/dist/runningSummarizer.js.map +1 -1
  21. package/dist/summarizer.d.ts +1 -0
  22. package/dist/summarizer.d.ts.map +1 -1
  23. package/dist/summarizer.js +8 -4
  24. package/dist/summarizer.js.map +1 -1
  25. package/dist/summarizerClientElection.d.ts +2 -0
  26. package/dist/summarizerClientElection.d.ts.map +1 -1
  27. package/dist/summarizerClientElection.js +15 -2
  28. package/dist/summarizerClientElection.js.map +1 -1
  29. package/dist/summarizerTypes.d.ts +47 -1
  30. package/dist/summarizerTypes.d.ts.map +1 -1
  31. package/dist/summarizerTypes.js.map +1 -1
  32. package/dist/summaryGenerator.d.ts +0 -2
  33. package/dist/summaryGenerator.d.ts.map +1 -1
  34. package/dist/summaryGenerator.js +2 -3
  35. package/dist/summaryGenerator.js.map +1 -1
  36. package/dist/summaryManager.d.ts.map +1 -1
  37. package/dist/summaryManager.js +29 -18
  38. package/dist/summaryManager.js.map +1 -1
  39. package/lib/connectionTelemetry.js +1 -1
  40. package/lib/connectionTelemetry.js.map +1 -1
  41. package/lib/containerRuntime.d.ts.map +1 -1
  42. package/lib/containerRuntime.js +6 -6
  43. package/lib/containerRuntime.js.map +1 -1
  44. package/lib/garbageCollection.d.ts +26 -8
  45. package/lib/garbageCollection.d.ts.map +1 -1
  46. package/lib/garbageCollection.js +81 -57
  47. package/lib/garbageCollection.js.map +1 -1
  48. package/lib/orderedClientElection.d.ts +57 -6
  49. package/lib/orderedClientElection.d.ts.map +1 -1
  50. package/lib/orderedClientElection.js +141 -26
  51. package/lib/orderedClientElection.js.map +1 -1
  52. package/lib/packageVersion.d.ts +1 -1
  53. package/lib/packageVersion.d.ts.map +1 -1
  54. package/lib/packageVersion.js +1 -1
  55. package/lib/packageVersion.js.map +1 -1
  56. package/lib/runningSummarizer.d.ts.map +1 -1
  57. package/lib/runningSummarizer.js +11 -10
  58. package/lib/runningSummarizer.js.map +1 -1
  59. package/lib/summarizer.d.ts +1 -0
  60. package/lib/summarizer.d.ts.map +1 -1
  61. package/lib/summarizer.js +8 -4
  62. package/lib/summarizer.js.map +1 -1
  63. package/lib/summarizerClientElection.d.ts +2 -0
  64. package/lib/summarizerClientElection.d.ts.map +1 -1
  65. package/lib/summarizerClientElection.js +15 -2
  66. package/lib/summarizerClientElection.js.map +1 -1
  67. package/lib/summarizerTypes.d.ts +47 -1
  68. package/lib/summarizerTypes.d.ts.map +1 -1
  69. package/lib/summarizerTypes.js.map +1 -1
  70. package/lib/summaryGenerator.d.ts +0 -2
  71. package/lib/summaryGenerator.d.ts.map +1 -1
  72. package/lib/summaryGenerator.js +2 -3
  73. package/lib/summaryGenerator.js.map +1 -1
  74. package/lib/summaryManager.d.ts.map +1 -1
  75. package/lib/summaryManager.js +29 -18
  76. package/lib/summaryManager.js.map +1 -1
  77. package/package.json +29 -53
  78. package/src/connectionTelemetry.ts +2 -2
  79. package/src/containerRuntime.ts +4 -6
  80. package/src/garbageCollection.ts +96 -61
  81. package/src/orderedClientElection.ts +155 -25
  82. package/src/packageVersion.ts +1 -1
  83. package/src/runningSummarizer.ts +13 -10
  84. package/src/summarizer.ts +9 -4
  85. package/src/summarizerClientElection.ts +15 -2
  86. package/src/summarizerTypes.ts +60 -1
  87. package/src/summaryGenerator.ts +3 -51
  88. package/src/summaryManager.ts +32 -23
@@ -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!" */);
@@ -187,8 +193,6 @@ export class SummaryManager implements IDisposable {
187
193
 
188
194
  assert(this.summarizer === undefined, 0x262 /* "Old summarizer is still working!" */);
189
195
 
190
- let reason = "unknown";
191
-
192
196
  this.delayBeforeCreatingSummarizer().then(async (startWithInitialDelay: boolean) => {
193
197
  // Re-validate that it need to be running. Due to asynchrony, it may be not the case anymore
194
198
  // but only if creation was delayed. If it was not, then we want to ensure we always create
@@ -196,32 +200,48 @@ export class SummaryManager implements IDisposable {
196
200
  // document out of broken state if it has too many ops and ordering service keeps nacking main
197
201
  // container (and thus it goes into cycle of reconnects)
198
202
  if (startWithInitialDelay && this.getShouldSummarizeState().shouldSummarize === false) {
199
- return;
203
+ return "early exit";
200
204
  }
201
205
 
206
+ // We transition to Running before requesting the summarizer, because after requesting we can't predict
207
+ // when the electedClient will be replaced with the new summarizer client.
208
+ // The alternative would be to let connectedState.clientId !== clientElection.electedClientId when
209
+ // state === Starting || state === Running.
210
+ assert(this.state === SummaryManagerState.Starting, 0x263 /* "Expected: starting" */);
211
+ this.state = SummaryManagerState.Running;
212
+
202
213
  const summarizer = await this.requestSummarizerFn();
214
+ this.summarizer = summarizer;
203
215
 
204
216
  // Re-validate that it need to be running. Due to asynchrony, it may be not the case anymore
205
217
  const shouldSummarizeState = this.getShouldSummarizeState();
206
218
  if (shouldSummarizeState.shouldSummarize === false) {
219
+ this.state = SummaryManagerState.Starting;
207
220
  summarizer.stop(shouldSummarizeState.stopReason);
208
- return;
221
+ return "early exit after starting summarizer";
209
222
  }
210
223
 
211
- assert(this.state === SummaryManagerState.Starting, 0x263 /* "Expected: starting" */);
212
- this.state = SummaryManagerState.Running;
213
-
214
- this.summarizer = summarizer;
215
-
216
224
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
217
225
  const clientId = this.latestClientId!;
218
226
 
219
- reason = await PerformanceEvent.timedExecAsync(
227
+ return PerformanceEvent.timedExecAsync(
220
228
  this.logger,
221
229
  { eventName: "RunningSummarizer", attempt: this.startThrottler.numAttempts },
222
230
  async () => summarizer.run(clientId, this.summarizerOptions),
223
231
  );
232
+ }).then((reason: string) => {
233
+ this.logger.sendTelemetryEvent({
234
+ eventName: "EndingSummarizer",
235
+ reason,
236
+ });
224
237
  }).catch((error) => {
238
+ this.logger.sendTelemetryEvent(
239
+ {
240
+ eventName: "EndingSummarizer",
241
+ reason: "exception",
242
+ },
243
+ error);
244
+
225
245
  // Most of exceptions happen due to container being closed while loading it, due to
226
246
  // summarizer container loosing connection while load.
227
247
  // Not worth reporting such errors as errors. That said, we might miss some real errors if
@@ -241,25 +261,14 @@ export class SummaryManager implements IDisposable {
241
261
  category,
242
262
  },
243
263
  error);
244
-
245
- // Note that summarizer may keep going (like doing last summary).
246
- // Ideally we await stopping process, but this code path is due to a bug
247
- // that needs to be fixed either way.
248
- if (SummaryManager.isStartingOrRunning(this.state)) {
249
- this.stop("summarizerException");
250
- }
251
264
  }
252
265
  }).finally(() => {
253
266
  assert(this.state !== SummaryManagerState.Off, 0x264 /* "Expected: Not Off" */);
254
267
  this.state = SummaryManagerState.Off;
255
268
 
269
+ this.summarizer?.close();
256
270
  this.summarizer = undefined;
257
271
 
258
- this.logger.sendTelemetryEvent({
259
- eventName: "EndingSummarizer",
260
- reason,
261
- });
262
-
263
272
  if (this.getShouldSummarizeState().shouldSummarize) {
264
273
  this.startSummarization();
265
274
  }