@fluidframework/container-runtime 2.0.0-internal.3.0.0 → 2.0.0-internal.3.1.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.
Files changed (327) hide show
  1. package/.eslintrc.js +19 -19
  2. package/.mocharc.js +2 -2
  3. package/api-extractor.json +2 -2
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +2 -1
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +9 -2
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +80 -33
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts.map +1 -1
  12. package/dist/connectionTelemetry.js +11 -9
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerHandleContext.d.ts.map +1 -1
  15. package/dist/containerHandleContext.js +3 -1
  16. package/dist/containerHandleContext.js.map +1 -1
  17. package/dist/containerRuntime.d.ts +10 -0
  18. package/dist/containerRuntime.d.ts.map +1 -1
  19. package/dist/containerRuntime.js +140 -72
  20. package/dist/containerRuntime.js.map +1 -1
  21. package/dist/dataStore.d.ts.map +1 -1
  22. package/dist/dataStore.js +11 -9
  23. package/dist/dataStore.js.map +1 -1
  24. package/dist/dataStoreContext.d.ts +18 -1
  25. package/dist/dataStoreContext.d.ts.map +1 -1
  26. package/dist/dataStoreContext.js +66 -15
  27. package/dist/dataStoreContext.js.map +1 -1
  28. package/dist/dataStoreContexts.d.ts.map +1 -1
  29. package/dist/dataStoreContexts.js +7 -3
  30. package/dist/dataStoreContexts.js.map +1 -1
  31. package/dist/dataStoreRegistry.d.ts.map +1 -1
  32. package/dist/dataStoreRegistry.js +3 -1
  33. package/dist/dataStoreRegistry.js.map +1 -1
  34. package/dist/dataStores.d.ts +26 -1
  35. package/dist/dataStores.d.ts.map +1 -1
  36. package/dist/dataStores.js +103 -18
  37. package/dist/dataStores.js.map +1 -1
  38. package/dist/deltaScheduler.d.ts.map +1 -1
  39. package/dist/deltaScheduler.js +8 -3
  40. package/dist/deltaScheduler.js.map +1 -1
  41. package/dist/garbageCollection.d.ts +34 -14
  42. package/dist/garbageCollection.d.ts.map +1 -1
  43. package/dist/garbageCollection.js +188 -93
  44. package/dist/garbageCollection.js.map +1 -1
  45. package/dist/garbageCollectionConstants.d.ts +3 -0
  46. package/dist/garbageCollectionConstants.d.ts.map +1 -1
  47. package/dist/garbageCollectionConstants.js +6 -1
  48. package/dist/garbageCollectionConstants.js.map +1 -1
  49. package/dist/garbageCollectionHelpers.d.ts +26 -0
  50. package/dist/garbageCollectionHelpers.d.ts.map +1 -0
  51. package/dist/garbageCollectionHelpers.js +45 -0
  52. package/dist/garbageCollectionHelpers.js.map +1 -0
  53. package/dist/gcSweepReadyUsageDetection.d.ts +5 -5
  54. package/dist/gcSweepReadyUsageDetection.d.ts.map +1 -1
  55. package/dist/gcSweepReadyUsageDetection.js +14 -10
  56. package/dist/gcSweepReadyUsageDetection.js.map +1 -1
  57. package/dist/index.d.ts +2 -2
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/opLifecycle/batchManager.d.ts +5 -5
  61. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  62. package/dist/opLifecycle/batchManager.js +19 -12
  63. package/dist/opLifecycle/batchManager.js.map +1 -1
  64. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  65. package/dist/opLifecycle/definitions.js.map +1 -1
  66. package/dist/opLifecycle/index.d.ts.map +1 -1
  67. package/dist/opLifecycle/index.js.map +1 -1
  68. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  69. package/dist/opLifecycle/opCompressor.js.map +1 -1
  70. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  71. package/dist/opLifecycle/opDecompressor.js +5 -2
  72. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  73. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  74. package/dist/opLifecycle/opSplitter.js +4 -1
  75. package/dist/opLifecycle/opSplitter.js.map +1 -1
  76. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  77. package/dist/opLifecycle/outbox.js +19 -17
  78. package/dist/opLifecycle/outbox.js.map +1 -1
  79. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  80. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  81. package/dist/opProperties.d.ts.map +1 -1
  82. package/dist/opProperties.js +1 -3
  83. package/dist/opProperties.js.map +1 -1
  84. package/dist/orderedClientElection.d.ts.map +1 -1
  85. package/dist/orderedClientElection.js +10 -4
  86. package/dist/orderedClientElection.js.map +1 -1
  87. package/dist/packageVersion.d.ts +1 -1
  88. package/dist/packageVersion.js +1 -1
  89. package/dist/packageVersion.js.map +1 -1
  90. package/dist/pendingStateManager.d.ts +7 -0
  91. package/dist/pendingStateManager.d.ts.map +1 -1
  92. package/dist/pendingStateManager.js +7 -4
  93. package/dist/pendingStateManager.js.map +1 -1
  94. package/dist/runWhileConnectedCoordinator.d.ts.map +1 -1
  95. package/dist/runWhileConnectedCoordinator.js.map +1 -1
  96. package/dist/runningSummarizer.d.ts.map +1 -1
  97. package/dist/runningSummarizer.js +34 -21
  98. package/dist/runningSummarizer.js.map +1 -1
  99. package/dist/scheduleManager.d.ts.map +1 -1
  100. package/dist/scheduleManager.js +3 -2
  101. package/dist/scheduleManager.js.map +1 -1
  102. package/dist/serializedSnapshotStorage.d.ts +2 -2
  103. package/dist/serializedSnapshotStorage.d.ts.map +1 -1
  104. package/dist/serializedSnapshotStorage.js +5 -3
  105. package/dist/serializedSnapshotStorage.js.map +1 -1
  106. package/dist/summarizer.d.ts +2 -2
  107. package/dist/summarizer.d.ts.map +1 -1
  108. package/dist/summarizer.js +37 -17
  109. package/dist/summarizer.js.map +1 -1
  110. package/dist/summarizerClientElection.d.ts.map +1 -1
  111. package/dist/summarizerClientElection.js.map +1 -1
  112. package/dist/summarizerHandle.d.ts.map +1 -1
  113. package/dist/summarizerHandle.js.map +1 -1
  114. package/dist/summarizerHeuristics.d.ts.map +1 -1
  115. package/dist/summarizerHeuristics.js +6 -9
  116. package/dist/summarizerHeuristics.js.map +1 -1
  117. package/dist/summarizerTypes.d.ts +21 -21
  118. package/dist/summarizerTypes.d.ts.map +1 -1
  119. package/dist/summarizerTypes.js.map +1 -1
  120. package/dist/summaryCollection.d.ts.map +1 -1
  121. package/dist/summaryCollection.js +18 -8
  122. package/dist/summaryCollection.js.map +1 -1
  123. package/dist/summaryFormat.d.ts +22 -0
  124. package/dist/summaryFormat.d.ts.map +1 -1
  125. package/dist/summaryFormat.js +18 -10
  126. package/dist/summaryFormat.js.map +1 -1
  127. package/dist/summaryGenerator.d.ts.map +1 -1
  128. package/dist/summaryGenerator.js +34 -15
  129. package/dist/summaryGenerator.js.map +1 -1
  130. package/dist/summaryManager.d.ts.map +1 -1
  131. package/dist/summaryManager.js +21 -9
  132. package/dist/summaryManager.js.map +1 -1
  133. package/dist/throttler.d.ts +2 -2
  134. package/dist/throttler.d.ts.map +1 -1
  135. package/dist/throttler.js +4 -4
  136. package/dist/throttler.js.map +1 -1
  137. package/garbageCollection.md +15 -2
  138. package/lib/batchTracker.d.ts.map +1 -1
  139. package/lib/batchTracker.js +2 -1
  140. package/lib/batchTracker.js.map +1 -1
  141. package/lib/blobManager.d.ts +9 -2
  142. package/lib/blobManager.d.ts.map +1 -1
  143. package/lib/blobManager.js +82 -35
  144. package/lib/blobManager.js.map +1 -1
  145. package/lib/connectionTelemetry.d.ts.map +1 -1
  146. package/lib/connectionTelemetry.js +11 -9
  147. package/lib/connectionTelemetry.js.map +1 -1
  148. package/lib/containerHandleContext.d.ts.map +1 -1
  149. package/lib/containerHandleContext.js +3 -1
  150. package/lib/containerHandleContext.js.map +1 -1
  151. package/lib/containerRuntime.d.ts +10 -0
  152. package/lib/containerRuntime.d.ts.map +1 -1
  153. package/lib/containerRuntime.js +146 -78
  154. package/lib/containerRuntime.js.map +1 -1
  155. package/lib/dataStore.d.ts.map +1 -1
  156. package/lib/dataStore.js +11 -9
  157. package/lib/dataStore.js.map +1 -1
  158. package/lib/dataStoreContext.d.ts +18 -1
  159. package/lib/dataStoreContext.d.ts.map +1 -1
  160. package/lib/dataStoreContext.js +68 -17
  161. package/lib/dataStoreContext.js.map +1 -1
  162. package/lib/dataStoreContexts.d.ts.map +1 -1
  163. package/lib/dataStoreContexts.js +7 -3
  164. package/lib/dataStoreContexts.js.map +1 -1
  165. package/lib/dataStoreRegistry.d.ts.map +1 -1
  166. package/lib/dataStoreRegistry.js +3 -1
  167. package/lib/dataStoreRegistry.js.map +1 -1
  168. package/lib/dataStores.d.ts +26 -1
  169. package/lib/dataStores.d.ts.map +1 -1
  170. package/lib/dataStores.js +109 -24
  171. package/lib/dataStores.js.map +1 -1
  172. package/lib/deltaScheduler.d.ts.map +1 -1
  173. package/lib/deltaScheduler.js +9 -4
  174. package/lib/deltaScheduler.js.map +1 -1
  175. package/lib/garbageCollection.d.ts +34 -14
  176. package/lib/garbageCollection.d.ts.map +1 -1
  177. package/lib/garbageCollection.js +190 -95
  178. package/lib/garbageCollection.js.map +1 -1
  179. package/lib/garbageCollectionConstants.d.ts +3 -0
  180. package/lib/garbageCollectionConstants.d.ts.map +1 -1
  181. package/lib/garbageCollectionConstants.js +5 -0
  182. package/lib/garbageCollectionConstants.js.map +1 -1
  183. package/lib/garbageCollectionHelpers.d.ts +26 -0
  184. package/lib/garbageCollectionHelpers.d.ts.map +1 -0
  185. package/lib/garbageCollectionHelpers.js +40 -0
  186. package/lib/garbageCollectionHelpers.js.map +1 -0
  187. package/lib/gcSweepReadyUsageDetection.d.ts +5 -5
  188. package/lib/gcSweepReadyUsageDetection.d.ts.map +1 -1
  189. package/lib/gcSweepReadyUsageDetection.js +14 -10
  190. package/lib/gcSweepReadyUsageDetection.js.map +1 -1
  191. package/lib/index.d.ts +2 -2
  192. package/lib/index.d.ts.map +1 -1
  193. package/lib/index.js +1 -1
  194. package/lib/index.js.map +1 -1
  195. package/lib/opLifecycle/batchManager.d.ts +5 -5
  196. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  197. package/lib/opLifecycle/batchManager.js +19 -12
  198. package/lib/opLifecycle/batchManager.js.map +1 -1
  199. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  200. package/lib/opLifecycle/definitions.js.map +1 -1
  201. package/lib/opLifecycle/index.d.ts.map +1 -1
  202. package/lib/opLifecycle/index.js.map +1 -1
  203. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  204. package/lib/opLifecycle/opCompressor.js.map +1 -1
  205. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  206. package/lib/opLifecycle/opDecompressor.js +5 -2
  207. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  208. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  209. package/lib/opLifecycle/opSplitter.js +5 -2
  210. package/lib/opLifecycle/opSplitter.js.map +1 -1
  211. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  212. package/lib/opLifecycle/outbox.js +19 -17
  213. package/lib/opLifecycle/outbox.js.map +1 -1
  214. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  215. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  216. package/lib/opProperties.d.ts.map +1 -1
  217. package/lib/opProperties.js +1 -3
  218. package/lib/opProperties.js.map +1 -1
  219. package/lib/orderedClientElection.d.ts.map +1 -1
  220. package/lib/orderedClientElection.js +10 -4
  221. package/lib/orderedClientElection.js.map +1 -1
  222. package/lib/packageVersion.d.ts +1 -1
  223. package/lib/packageVersion.js +1 -1
  224. package/lib/packageVersion.js.map +1 -1
  225. package/lib/pendingStateManager.d.ts +7 -0
  226. package/lib/pendingStateManager.d.ts.map +1 -1
  227. package/lib/pendingStateManager.js +7 -4
  228. package/lib/pendingStateManager.js.map +1 -1
  229. package/lib/runWhileConnectedCoordinator.d.ts.map +1 -1
  230. package/lib/runWhileConnectedCoordinator.js.map +1 -1
  231. package/lib/runningSummarizer.d.ts.map +1 -1
  232. package/lib/runningSummarizer.js +35 -22
  233. package/lib/runningSummarizer.js.map +1 -1
  234. package/lib/scheduleManager.d.ts.map +1 -1
  235. package/lib/scheduleManager.js +3 -2
  236. package/lib/scheduleManager.js.map +1 -1
  237. package/lib/serializedSnapshotStorage.d.ts +2 -2
  238. package/lib/serializedSnapshotStorage.d.ts.map +1 -1
  239. package/lib/serializedSnapshotStorage.js +5 -3
  240. package/lib/serializedSnapshotStorage.js.map +1 -1
  241. package/lib/summarizer.d.ts +2 -2
  242. package/lib/summarizer.d.ts.map +1 -1
  243. package/lib/summarizer.js +37 -17
  244. package/lib/summarizer.js.map +1 -1
  245. package/lib/summarizerClientElection.d.ts.map +1 -1
  246. package/lib/summarizerClientElection.js.map +1 -1
  247. package/lib/summarizerHandle.d.ts.map +1 -1
  248. package/lib/summarizerHandle.js.map +1 -1
  249. package/lib/summarizerHeuristics.d.ts.map +1 -1
  250. package/lib/summarizerHeuristics.js +6 -9
  251. package/lib/summarizerHeuristics.js.map +1 -1
  252. package/lib/summarizerTypes.d.ts +21 -21
  253. package/lib/summarizerTypes.d.ts.map +1 -1
  254. package/lib/summarizerTypes.js.map +1 -1
  255. package/lib/summaryCollection.d.ts.map +1 -1
  256. package/lib/summaryCollection.js +18 -8
  257. package/lib/summaryCollection.js.map +1 -1
  258. package/lib/summaryFormat.d.ts +22 -0
  259. package/lib/summaryFormat.d.ts.map +1 -1
  260. package/lib/summaryFormat.js +20 -12
  261. package/lib/summaryFormat.js.map +1 -1
  262. package/lib/summaryGenerator.d.ts.map +1 -1
  263. package/lib/summaryGenerator.js +34 -15
  264. package/lib/summaryGenerator.js.map +1 -1
  265. package/lib/summaryManager.d.ts.map +1 -1
  266. package/lib/summaryManager.js +21 -9
  267. package/lib/summaryManager.js.map +1 -1
  268. package/lib/throttler.d.ts +2 -2
  269. package/lib/throttler.d.ts.map +1 -1
  270. package/lib/throttler.js +4 -4
  271. package/lib/throttler.js.map +1 -1
  272. package/package.json +121 -149
  273. package/prettier.config.cjs +1 -1
  274. package/src/batchTracker.ts +54 -49
  275. package/src/blobManager.ts +793 -672
  276. package/src/connectionTelemetry.ts +280 -249
  277. package/src/containerHandleContext.ts +27 -29
  278. package/src/containerRuntime.ts +3168 -2940
  279. package/src/dataStore.ts +172 -159
  280. package/src/dataStoreContext.ts +1098 -996
  281. package/src/dataStoreContexts.ts +178 -161
  282. package/src/dataStoreRegistry.ts +25 -20
  283. package/src/dataStores.ts +884 -728
  284. package/src/deltaScheduler.ts +158 -150
  285. package/src/garbageCollection.ts +1883 -1692
  286. package/src/garbageCollectionConstants.ts +6 -0
  287. package/src/garbageCollectionHelpers.ts +61 -0
  288. package/src/gcSweepReadyUsageDetection.ts +89 -83
  289. package/src/index.ts +67 -66
  290. package/src/opLifecycle/README.md +152 -0
  291. package/src/opLifecycle/batchManager.ts +145 -141
  292. package/src/opLifecycle/definitions.ts +29 -29
  293. package/src/opLifecycle/index.ts +5 -5
  294. package/src/opLifecycle/opCompressor.ts +54 -53
  295. package/src/opLifecycle/opDecompressor.ts +100 -81
  296. package/src/opLifecycle/opSplitter.ts +214 -188
  297. package/src/opLifecycle/outbox.ts +204 -194
  298. package/src/opLifecycle/remoteMessageProcessor.ts +62 -62
  299. package/src/opProperties.ts +11 -9
  300. package/src/orderedClientElection.ts +489 -457
  301. package/src/packageVersion.ts +1 -1
  302. package/src/pendingStateManager.ts +384 -338
  303. package/src/runWhileConnectedCoordinator.ts +78 -71
  304. package/src/runningSummarizer.ts +619 -581
  305. package/src/scheduleManager.ts +299 -269
  306. package/src/serializedSnapshotStorage.ts +126 -112
  307. package/src/summarizer.ts +417 -381
  308. package/src/summarizerClientElection.ts +107 -100
  309. package/src/summarizerHandle.ts +11 -9
  310. package/src/summarizerHeuristics.ts +183 -186
  311. package/src/summarizerTypes.ts +344 -330
  312. package/src/summaryCollection.ts +378 -349
  313. package/src/summaryFormat.ts +170 -126
  314. package/src/summaryGenerator.ts +465 -406
  315. package/src/summaryManager.ts +377 -348
  316. package/src/throttler.ts +131 -122
  317. package/tsconfig.esnext.json +6 -6
  318. package/tsconfig.json +9 -13
  319. package/dist/garbageCollectionTombstoneUtils.d.ts +0 -14
  320. package/dist/garbageCollectionTombstoneUtils.d.ts.map +0 -1
  321. package/dist/garbageCollectionTombstoneUtils.js +0 -23
  322. package/dist/garbageCollectionTombstoneUtils.js.map +0 -1
  323. package/lib/garbageCollectionTombstoneUtils.d.ts +0 -14
  324. package/lib/garbageCollectionTombstoneUtils.d.ts.map +0 -1
  325. package/lib/garbageCollectionTombstoneUtils.js +0 -19
  326. package/lib/garbageCollectionTombstoneUtils.js.map +0 -1
  327. package/src/garbageCollectionTombstoneUtils.ts +0 -28
@@ -6,18 +6,22 @@
6
6
  import { IEvent, IEventProvider, ITelemetryLogger } from "@fluidframework/common-definitions";
7
7
  import { TypedEventEmitter } from "@fluidframework/common-utils";
8
8
  import { IClientDetails, MessageType } from "@fluidframework/protocol-definitions";
9
- import { IOrderedClientElection, ISerializedElection, ITrackedClient } from "./orderedClientElection";
9
+ import {
10
+ IOrderedClientElection,
11
+ ISerializedElection,
12
+ ITrackedClient,
13
+ } from "./orderedClientElection";
10
14
  import { ISummaryCollectionOpEvents } from "./summaryCollection";
11
15
 
12
16
  export const summarizerClientType = "summarizer";
13
17
 
14
18
  export interface ISummarizerClientElectionEvents extends IEvent {
15
- (event: "electedSummarizerChanged", handler: () => void): void;
19
+ (event: "electedSummarizerChanged", handler: () => void): void;
16
20
  }
17
21
 
18
22
  export interface ISummarizerClientElection extends IEventProvider<ISummarizerClientElectionEvents> {
19
- readonly electedClientId: string | undefined;
20
- readonly electedParentId: string | undefined;
23
+ readonly electedClientId: string | undefined;
24
+ readonly electedParentId: string | undefined;
21
25
  }
22
26
 
23
27
  /**
@@ -26,107 +30,110 @@ export interface ISummarizerClientElection extends IEventProvider<ISummarizerCli
26
30
  * for some configured number of ops.
27
31
  */
28
32
  export class SummarizerClientElection
29
- extends TypedEventEmitter<ISummarizerClientElectionEvents>
30
- implements ISummarizerClientElection {
31
- /**
32
- * Used to calculate number of ops since last summary ack for the current elected client.
33
- * This will be undefined if there is no elected summarizer, or no summary ack has been
34
- * observed since this client was elected.
35
- * When a summary ack comes in, this will be set to the sequence number of the summary ack.
36
- */
37
- private lastSummaryAckSeqForClient: number | undefined;
38
- /**
39
- * Used to prevent excess logging by recording the sequence number that we last reported at,
40
- * and making sure we don't report another event to telemetry. If things work as intended,
41
- * this is not needed, otherwise it could report an event on every op in worst case scenario.
42
- */
43
- private lastReportedSeq = 0;
33
+ extends TypedEventEmitter<ISummarizerClientElectionEvents>
34
+ implements ISummarizerClientElection
35
+ {
36
+ /**
37
+ * Used to calculate number of ops since last summary ack for the current elected client.
38
+ * This will be undefined if there is no elected summarizer, or no summary ack has been
39
+ * observed since this client was elected.
40
+ * When a summary ack comes in, this will be set to the sequence number of the summary ack.
41
+ */
42
+ private lastSummaryAckSeqForClient: number | undefined;
43
+ /**
44
+ * Used to prevent excess logging by recording the sequence number that we last reported at,
45
+ * and making sure we don't report another event to telemetry. If things work as intended,
46
+ * this is not needed, otherwise it could report an event on every op in worst case scenario.
47
+ */
48
+ private lastReportedSeq = 0;
44
49
 
45
- public get electedClientId() {
46
- return this.clientElection.electedClient?.clientId;
47
- }
48
- public get electedParentId() {
49
- return this.clientElection.electedParent?.clientId;
50
- }
50
+ public get electedClientId() {
51
+ return this.clientElection.electedClient?.clientId;
52
+ }
53
+ public get electedParentId() {
54
+ return this.clientElection.electedParent?.clientId;
55
+ }
51
56
 
52
- constructor(
53
- private readonly logger: ITelemetryLogger,
54
- private readonly summaryCollection: IEventProvider<ISummaryCollectionOpEvents>,
55
- public readonly clientElection: IOrderedClientElection,
56
- private readonly maxOpsSinceLastSummary: number,
57
- ) {
58
- super();
59
- // On every inbound op, if enough ops pass without seeing a summary ack (per elected client),
60
- // elect a new client and log to telemetry.
61
- this.summaryCollection.on("default", ({ sequenceNumber }) => {
62
- const electedClientId = this.electedClientId;
63
- if (electedClientId === undefined) {
64
- // Reset election if no elected client, but eligible clients are connected.
65
- // This should be uncommon, but is possible if the initial state of the
66
- // ordered client election contains an undefined client id or one not found
67
- // in the quorum (the latter would already log an error).
68
- if (this.clientElection.eligibleCount > 0) {
69
- this.clientElection.resetElectedClient(sequenceNumber);
70
- }
71
- return;
72
- }
73
- const electionSequenceNumber = this.clientElection.electionSequenceNumber;
74
- const opsWithoutSummary = sequenceNumber - (this.lastSummaryAckSeqForClient ?? electionSequenceNumber);
75
- if (opsWithoutSummary > this.maxOpsSinceLastSummary) {
76
- // Log and elect a new summarizer client.
77
- const opsSinceLastReport = sequenceNumber - this.lastReportedSeq;
78
- if (opsSinceLastReport > this.maxOpsSinceLastSummary) {
79
- this.logger.sendTelemetryEvent({
80
- eventName: "ElectedClientNotSummarizing",
81
- electedClientId,
82
- lastSummaryAckSeqForClient: this.lastSummaryAckSeqForClient,
83
- electionSequenceNumber,
84
- nextElectedClientId: this.clientElection.peekNextElectedClient()?.clientId,
85
- });
86
- this.lastReportedSeq = sequenceNumber;
87
- }
88
- }
89
- });
57
+ constructor(
58
+ private readonly logger: ITelemetryLogger,
59
+ private readonly summaryCollection: IEventProvider<ISummaryCollectionOpEvents>,
60
+ public readonly clientElection: IOrderedClientElection,
61
+ private readonly maxOpsSinceLastSummary: number,
62
+ ) {
63
+ super();
64
+ // On every inbound op, if enough ops pass without seeing a summary ack (per elected client),
65
+ // elect a new client and log to telemetry.
66
+ this.summaryCollection.on("default", ({ sequenceNumber }) => {
67
+ const electedClientId = this.electedClientId;
68
+ if (electedClientId === undefined) {
69
+ // Reset election if no elected client, but eligible clients are connected.
70
+ // This should be uncommon, but is possible if the initial state of the
71
+ // ordered client election contains an undefined client id or one not found
72
+ // in the quorum (the latter would already log an error).
73
+ if (this.clientElection.eligibleCount > 0) {
74
+ this.clientElection.resetElectedClient(sequenceNumber);
75
+ }
76
+ return;
77
+ }
78
+ const electionSequenceNumber = this.clientElection.electionSequenceNumber;
79
+ const opsWithoutSummary =
80
+ sequenceNumber - (this.lastSummaryAckSeqForClient ?? electionSequenceNumber);
81
+ if (opsWithoutSummary > this.maxOpsSinceLastSummary) {
82
+ // Log and elect a new summarizer client.
83
+ const opsSinceLastReport = sequenceNumber - this.lastReportedSeq;
84
+ if (opsSinceLastReport > this.maxOpsSinceLastSummary) {
85
+ this.logger.sendTelemetryEvent({
86
+ eventName: "ElectedClientNotSummarizing",
87
+ electedClientId,
88
+ lastSummaryAckSeqForClient: this.lastSummaryAckSeqForClient,
89
+ electionSequenceNumber,
90
+ nextElectedClientId: this.clientElection.peekNextElectedClient()?.clientId,
91
+ });
92
+ this.lastReportedSeq = sequenceNumber;
93
+ }
94
+ }
95
+ });
90
96
 
91
- // When a summary ack comes in, reset our op seq counter.
92
- this.summaryCollection.on(MessageType.SummaryAck, (op) => {
93
- this.lastSummaryAckSeqForClient = op.sequenceNumber;
94
- });
97
+ // When a summary ack comes in, reset our op seq counter.
98
+ this.summaryCollection.on(MessageType.SummaryAck, (op) => {
99
+ this.lastSummaryAckSeqForClient = op.sequenceNumber;
100
+ });
95
101
 
96
- // Use oldest client election for unanimously and deterministically deciding
97
- // which client should summarize.
98
- this.clientElection.on("election", (client, sequenceNumber) => {
99
- this.lastSummaryAckSeqForClient = undefined;
100
- if (client === undefined && this.clientElection.eligibleCount > 0) {
101
- // If no client is valid for election, reset to the oldest again.
102
- // Also make extra sure not to get stuck in an infinite loop here:
103
- // If there are no eligible clients, just wait until a client joins
104
- // and will be auto-elected.
105
- this.clientElection.resetElectedClient(sequenceNumber);
106
- }
107
- // Election can trigger a change in SummaryManager state.
108
- this.emit("electedSummarizerChanged");
109
- });
110
- }
102
+ // Use oldest client election for unanimously and deterministically deciding
103
+ // which client should summarize.
104
+ this.clientElection.on("election", (client, sequenceNumber) => {
105
+ this.lastSummaryAckSeqForClient = undefined;
106
+ if (client === undefined && this.clientElection.eligibleCount > 0) {
107
+ // If no client is valid for election, reset to the oldest again.
108
+ // Also make extra sure not to get stuck in an infinite loop here:
109
+ // If there are no eligible clients, just wait until a client joins
110
+ // and will be auto-elected.
111
+ this.clientElection.resetElectedClient(sequenceNumber);
112
+ }
113
+ // Election can trigger a change in SummaryManager state.
114
+ this.emit("electedSummarizerChanged");
115
+ });
116
+ }
111
117
 
112
- public serialize(): ISerializedElection {
113
- const { electedClientId, electedParentId, electionSequenceNumber } = this.clientElection.serialize();
114
- return {
115
- electedClientId,
116
- electedParentId,
117
- electionSequenceNumber: this.lastSummaryAckSeqForClient ?? electionSequenceNumber,
118
- };
119
- }
118
+ public serialize(): ISerializedElection {
119
+ const { electedClientId, electedParentId, electionSequenceNumber } =
120
+ this.clientElection.serialize();
121
+ return {
122
+ electedClientId,
123
+ electedParentId,
124
+ electionSequenceNumber: this.lastSummaryAckSeqForClient ?? electionSequenceNumber,
125
+ };
126
+ }
120
127
 
121
- public static isClientEligible(client: ITrackedClient): boolean {
122
- const details = client.client.details;
123
- if (details === undefined) {
124
- // Very old clients back-compat
125
- return true;
126
- }
127
- return SummarizerClientElection.clientDetailsPermitElection(details);
128
- }
128
+ public static isClientEligible(client: ITrackedClient): boolean {
129
+ const details = client.client.details;
130
+ if (details === undefined) {
131
+ // Very old clients back-compat
132
+ return true;
133
+ }
134
+ return SummarizerClientElection.clientDetailsPermitElection(details);
135
+ }
129
136
 
130
- public static readonly clientDetailsPermitElection = (details: IClientDetails): boolean =>
131
- details.capabilities.interactive || details.type === summarizerClientType;
137
+ public static readonly clientDetailsPermitElection = (details: IClientDetails): boolean =>
138
+ details.capabilities.interactive || details.type === summarizerClientType;
132
139
  }
@@ -7,15 +7,17 @@ import { IFluidHandle } from "@fluidframework/core-interfaces";
7
7
 
8
8
  // TODO #2425 Expose Summarizer handle as FluidObjectHandle w/ tests
9
9
  export class SummarizerHandle extends FluidObjectHandle {
10
- public async get(): Promise<any> {
11
- throw Error("Do not try to get a summarizer object from the handle. Reference it directly.");
12
- }
10
+ public async get(): Promise<any> {
11
+ throw Error(
12
+ "Do not try to get a summarizer object from the handle. Reference it directly.",
13
+ );
14
+ }
13
15
 
14
- public attach(): void {
15
- return;
16
- }
16
+ public attach(): void {
17
+ return;
18
+ }
17
19
 
18
- public bind(handle: IFluidHandle) {
19
- return;
20
- }
20
+ public bind(handle: IFluidHandle) {
21
+ return;
22
+ }
21
23
  }