@fluidframework/container-runtime 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.3.1.0.125672

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 (340) hide show
  1. package/.eslintrc.js +21 -10
  2. package/.mocharc.js +2 -2
  3. package/api-extractor.json +2 -2
  4. package/dist/batchTracker.d.ts +1 -2
  5. package/dist/batchTracker.d.ts.map +1 -1
  6. package/dist/batchTracker.js +2 -1
  7. package/dist/batchTracker.js.map +1 -1
  8. package/dist/blobManager.d.ts +53 -34
  9. package/dist/blobManager.d.ts.map +1 -1
  10. package/dist/blobManager.js +236 -124
  11. package/dist/blobManager.js.map +1 -1
  12. package/dist/connectionTelemetry.d.ts.map +1 -1
  13. package/dist/connectionTelemetry.js +11 -9
  14. package/dist/connectionTelemetry.js.map +1 -1
  15. package/dist/containerHandleContext.d.ts.map +1 -1
  16. package/dist/containerHandleContext.js +3 -1
  17. package/dist/containerHandleContext.js.map +1 -1
  18. package/dist/containerRuntime.d.ts +95 -46
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +288 -135
  21. package/dist/containerRuntime.js.map +1 -1
  22. package/dist/dataStore.d.ts.map +1 -1
  23. package/dist/dataStore.js +11 -9
  24. package/dist/dataStore.js.map +1 -1
  25. package/dist/dataStoreContext.d.ts +2 -1
  26. package/dist/dataStoreContext.d.ts.map +1 -1
  27. package/dist/dataStoreContext.js +38 -21
  28. package/dist/dataStoreContext.js.map +1 -1
  29. package/dist/dataStoreContexts.d.ts.map +1 -1
  30. package/dist/dataStoreContexts.js +7 -3
  31. package/dist/dataStoreContexts.js.map +1 -1
  32. package/dist/dataStoreRegistry.d.ts.map +1 -1
  33. package/dist/dataStoreRegistry.js +3 -1
  34. package/dist/dataStoreRegistry.js.map +1 -1
  35. package/dist/dataStores.d.ts +12 -9
  36. package/dist/dataStores.d.ts.map +1 -1
  37. package/dist/dataStores.js +68 -46
  38. package/dist/dataStores.js.map +1 -1
  39. package/dist/deltaScheduler.d.ts.map +1 -1
  40. package/dist/deltaScheduler.js +8 -3
  41. package/dist/deltaScheduler.js.map +1 -1
  42. package/dist/garbageCollection.d.ts +50 -26
  43. package/dist/garbageCollection.d.ts.map +1 -1
  44. package/dist/garbageCollection.js +348 -196
  45. package/dist/garbageCollection.js.map +1 -1
  46. package/dist/garbageCollectionConstants.d.ts +7 -3
  47. package/dist/garbageCollectionConstants.d.ts.map +1 -1
  48. package/dist/garbageCollectionConstants.js +10 -8
  49. package/dist/garbageCollectionConstants.js.map +1 -1
  50. package/dist/garbageCollectionHelpers.d.ts +15 -0
  51. package/dist/garbageCollectionHelpers.d.ts.map +1 -0
  52. package/dist/garbageCollectionHelpers.js +27 -0
  53. package/dist/garbageCollectionHelpers.js.map +1 -0
  54. package/dist/gcSweepReadyUsageDetection.d.ts +5 -5
  55. package/dist/gcSweepReadyUsageDetection.d.ts.map +1 -1
  56. package/dist/gcSweepReadyUsageDetection.js +14 -10
  57. package/dist/gcSweepReadyUsageDetection.js.map +1 -1
  58. package/dist/index.d.ts +3 -4
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +3 -5
  61. package/dist/index.js.map +1 -1
  62. package/dist/opLifecycle/batchManager.d.ts +13 -1
  63. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  64. package/dist/opLifecycle/batchManager.js +48 -7
  65. package/dist/opLifecycle/batchManager.js.map +1 -1
  66. package/dist/opLifecycle/definitions.d.ts +25 -1
  67. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  68. package/dist/opLifecycle/definitions.js.map +1 -1
  69. package/dist/opLifecycle/index.d.ts +2 -2
  70. package/dist/opLifecycle/index.d.ts.map +1 -1
  71. package/dist/opLifecycle/index.js +2 -1
  72. package/dist/opLifecycle/index.js.map +1 -1
  73. package/dist/opLifecycle/opCompressor.d.ts +1 -1
  74. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  75. package/dist/opLifecycle/opCompressor.js +24 -10
  76. package/dist/opLifecycle/opCompressor.js.map +1 -1
  77. package/dist/opLifecycle/opDecompressor.d.ts +2 -1
  78. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  79. package/dist/opLifecycle/opDecompressor.js +33 -17
  80. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  81. package/dist/opLifecycle/opSplitter.d.ts +34 -2
  82. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  83. package/dist/opLifecycle/opSplitter.js +117 -5
  84. package/dist/opLifecycle/opSplitter.js.map +1 -1
  85. package/dist/opLifecycle/outbox.d.ts +5 -0
  86. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  87. package/dist/opLifecycle/outbox.js +38 -27
  88. package/dist/opLifecycle/outbox.js.map +1 -1
  89. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  90. package/dist/opLifecycle/remoteMessageProcessor.js +17 -2
  91. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  92. package/dist/opProperties.d.ts.map +1 -1
  93. package/dist/opProperties.js +1 -3
  94. package/dist/opProperties.js.map +1 -1
  95. package/dist/orderedClientElection.d.ts.map +1 -1
  96. package/dist/orderedClientElection.js +10 -4
  97. package/dist/orderedClientElection.js.map +1 -1
  98. package/dist/packageVersion.d.ts +1 -1
  99. package/dist/packageVersion.js +1 -1
  100. package/dist/packageVersion.js.map +1 -1
  101. package/dist/pendingStateManager.d.ts +4 -13
  102. package/dist/pendingStateManager.d.ts.map +1 -1
  103. package/dist/pendingStateManager.js +134 -161
  104. package/dist/pendingStateManager.js.map +1 -1
  105. package/dist/runWhileConnectedCoordinator.d.ts.map +1 -1
  106. package/dist/runWhileConnectedCoordinator.js.map +1 -1
  107. package/dist/runningSummarizer.d.ts.map +1 -1
  108. package/dist/runningSummarizer.js +34 -22
  109. package/dist/runningSummarizer.js.map +1 -1
  110. package/dist/scheduleManager.d.ts +0 -1
  111. package/dist/scheduleManager.d.ts.map +1 -1
  112. package/dist/scheduleManager.js +11 -21
  113. package/dist/scheduleManager.js.map +1 -1
  114. package/dist/serializedSnapshotStorage.d.ts.map +1 -1
  115. package/dist/serializedSnapshotStorage.js +3 -1
  116. package/dist/serializedSnapshotStorage.js.map +1 -1
  117. package/dist/summarizer.d.ts +2 -3
  118. package/dist/summarizer.d.ts.map +1 -1
  119. package/dist/summarizer.js +39 -18
  120. package/dist/summarizer.js.map +1 -1
  121. package/dist/summarizerClientElection.d.ts +1 -2
  122. package/dist/summarizerClientElection.d.ts.map +1 -1
  123. package/dist/summarizerClientElection.js +3 -30
  124. package/dist/summarizerClientElection.js.map +1 -1
  125. package/dist/summarizerHandle.d.ts.map +1 -1
  126. package/dist/summarizerHandle.js.map +1 -1
  127. package/dist/summarizerHeuristics.d.ts.map +1 -1
  128. package/dist/summarizerHeuristics.js +6 -9
  129. package/dist/summarizerHeuristics.js.map +1 -1
  130. package/dist/summarizerTypes.d.ts +22 -25
  131. package/dist/summarizerTypes.d.ts.map +1 -1
  132. package/dist/summarizerTypes.js.map +1 -1
  133. package/dist/summaryCollection.d.ts.map +1 -1
  134. package/dist/summaryCollection.js +18 -8
  135. package/dist/summaryCollection.js.map +1 -1
  136. package/dist/summaryFormat.d.ts.map +1 -1
  137. package/dist/summaryFormat.js +18 -11
  138. package/dist/summaryFormat.js.map +1 -1
  139. package/dist/summaryGenerator.d.ts.map +1 -1
  140. package/dist/summaryGenerator.js +32 -14
  141. package/dist/summaryGenerator.js.map +1 -1
  142. package/dist/summaryManager.d.ts.map +1 -1
  143. package/dist/summaryManager.js +21 -9
  144. package/dist/summaryManager.js.map +1 -1
  145. package/dist/throttler.d.ts +2 -2
  146. package/dist/throttler.d.ts.map +1 -1
  147. package/dist/throttler.js +4 -4
  148. package/dist/throttler.js.map +1 -1
  149. package/garbageCollection.md +15 -2
  150. package/lib/batchTracker.d.ts +1 -2
  151. package/lib/batchTracker.d.ts.map +1 -1
  152. package/lib/batchTracker.js +2 -1
  153. package/lib/batchTracker.js.map +1 -1
  154. package/lib/blobManager.d.ts +53 -34
  155. package/lib/blobManager.d.ts.map +1 -1
  156. package/lib/blobManager.js +239 -127
  157. package/lib/blobManager.js.map +1 -1
  158. package/lib/connectionTelemetry.d.ts.map +1 -1
  159. package/lib/connectionTelemetry.js +11 -9
  160. package/lib/connectionTelemetry.js.map +1 -1
  161. package/lib/containerHandleContext.d.ts.map +1 -1
  162. package/lib/containerHandleContext.js +3 -1
  163. package/lib/containerHandleContext.js.map +1 -1
  164. package/lib/containerRuntime.d.ts +95 -46
  165. package/lib/containerRuntime.d.ts.map +1 -1
  166. package/lib/containerRuntime.js +291 -138
  167. package/lib/containerRuntime.js.map +1 -1
  168. package/lib/dataStore.d.ts.map +1 -1
  169. package/lib/dataStore.js +11 -9
  170. package/lib/dataStore.js.map +1 -1
  171. package/lib/dataStoreContext.d.ts +2 -1
  172. package/lib/dataStoreContext.d.ts.map +1 -1
  173. package/lib/dataStoreContext.js +40 -23
  174. package/lib/dataStoreContext.js.map +1 -1
  175. package/lib/dataStoreContexts.d.ts.map +1 -1
  176. package/lib/dataStoreContexts.js +7 -3
  177. package/lib/dataStoreContexts.js.map +1 -1
  178. package/lib/dataStoreRegistry.d.ts.map +1 -1
  179. package/lib/dataStoreRegistry.js +3 -1
  180. package/lib/dataStoreRegistry.js.map +1 -1
  181. package/lib/dataStores.d.ts +12 -9
  182. package/lib/dataStores.d.ts.map +1 -1
  183. package/lib/dataStores.js +74 -52
  184. package/lib/dataStores.js.map +1 -1
  185. package/lib/deltaScheduler.d.ts.map +1 -1
  186. package/lib/deltaScheduler.js +9 -4
  187. package/lib/deltaScheduler.js.map +1 -1
  188. package/lib/garbageCollection.d.ts +50 -26
  189. package/lib/garbageCollection.d.ts.map +1 -1
  190. package/lib/garbageCollection.js +347 -195
  191. package/lib/garbageCollection.js.map +1 -1
  192. package/lib/garbageCollectionConstants.d.ts +7 -3
  193. package/lib/garbageCollectionConstants.d.ts.map +1 -1
  194. package/lib/garbageCollectionConstants.js +9 -7
  195. package/lib/garbageCollectionConstants.js.map +1 -1
  196. package/lib/garbageCollectionHelpers.d.ts +15 -0
  197. package/lib/garbageCollectionHelpers.d.ts.map +1 -0
  198. package/lib/garbageCollectionHelpers.js +23 -0
  199. package/lib/garbageCollectionHelpers.js.map +1 -0
  200. package/lib/gcSweepReadyUsageDetection.d.ts +5 -5
  201. package/lib/gcSweepReadyUsageDetection.d.ts.map +1 -1
  202. package/lib/gcSweepReadyUsageDetection.js +14 -10
  203. package/lib/gcSweepReadyUsageDetection.js.map +1 -1
  204. package/lib/index.d.ts +3 -4
  205. package/lib/index.d.ts.map +1 -1
  206. package/lib/index.js +2 -3
  207. package/lib/index.js.map +1 -1
  208. package/lib/opLifecycle/batchManager.d.ts +13 -1
  209. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  210. package/lib/opLifecycle/batchManager.js +48 -7
  211. package/lib/opLifecycle/batchManager.js.map +1 -1
  212. package/lib/opLifecycle/definitions.d.ts +25 -1
  213. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  214. package/lib/opLifecycle/definitions.js.map +1 -1
  215. package/lib/opLifecycle/index.d.ts +2 -2
  216. package/lib/opLifecycle/index.d.ts.map +1 -1
  217. package/lib/opLifecycle/index.js +1 -1
  218. package/lib/opLifecycle/index.js.map +1 -1
  219. package/lib/opLifecycle/opCompressor.d.ts +1 -1
  220. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  221. package/lib/opLifecycle/opCompressor.js +24 -10
  222. package/lib/opLifecycle/opCompressor.js.map +1 -1
  223. package/lib/opLifecycle/opDecompressor.d.ts +2 -1
  224. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  225. package/lib/opLifecycle/opDecompressor.js +33 -17
  226. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  227. package/lib/opLifecycle/opSplitter.d.ts +34 -2
  228. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  229. package/lib/opLifecycle/opSplitter.js +116 -5
  230. package/lib/opLifecycle/opSplitter.js.map +1 -1
  231. package/lib/opLifecycle/outbox.d.ts +5 -0
  232. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  233. package/lib/opLifecycle/outbox.js +38 -27
  234. package/lib/opLifecycle/outbox.js.map +1 -1
  235. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  236. package/lib/opLifecycle/remoteMessageProcessor.js +17 -2
  237. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  238. package/lib/opProperties.d.ts.map +1 -1
  239. package/lib/opProperties.js +1 -3
  240. package/lib/opProperties.js.map +1 -1
  241. package/lib/orderedClientElection.d.ts.map +1 -1
  242. package/lib/orderedClientElection.js +10 -4
  243. package/lib/orderedClientElection.js.map +1 -1
  244. package/lib/packageVersion.d.ts +1 -1
  245. package/lib/packageVersion.js +1 -1
  246. package/lib/packageVersion.js.map +1 -1
  247. package/lib/pendingStateManager.d.ts +4 -13
  248. package/lib/pendingStateManager.d.ts.map +1 -1
  249. package/lib/pendingStateManager.js +134 -161
  250. package/lib/pendingStateManager.js.map +1 -1
  251. package/lib/runWhileConnectedCoordinator.d.ts.map +1 -1
  252. package/lib/runWhileConnectedCoordinator.js.map +1 -1
  253. package/lib/runningSummarizer.d.ts.map +1 -1
  254. package/lib/runningSummarizer.js +35 -23
  255. package/lib/runningSummarizer.js.map +1 -1
  256. package/lib/scheduleManager.d.ts +0 -1
  257. package/lib/scheduleManager.d.ts.map +1 -1
  258. package/lib/scheduleManager.js +11 -21
  259. package/lib/scheduleManager.js.map +1 -1
  260. package/lib/serializedSnapshotStorage.d.ts.map +1 -1
  261. package/lib/serializedSnapshotStorage.js +3 -1
  262. package/lib/serializedSnapshotStorage.js.map +1 -1
  263. package/lib/summarizer.d.ts +2 -3
  264. package/lib/summarizer.d.ts.map +1 -1
  265. package/lib/summarizer.js +39 -18
  266. package/lib/summarizer.js.map +1 -1
  267. package/lib/summarizerClientElection.d.ts +1 -2
  268. package/lib/summarizerClientElection.d.ts.map +1 -1
  269. package/lib/summarizerClientElection.js +3 -30
  270. package/lib/summarizerClientElection.js.map +1 -1
  271. package/lib/summarizerHandle.d.ts.map +1 -1
  272. package/lib/summarizerHandle.js.map +1 -1
  273. package/lib/summarizerHeuristics.d.ts.map +1 -1
  274. package/lib/summarizerHeuristics.js +6 -9
  275. package/lib/summarizerHeuristics.js.map +1 -1
  276. package/lib/summarizerTypes.d.ts +22 -25
  277. package/lib/summarizerTypes.d.ts.map +1 -1
  278. package/lib/summarizerTypes.js.map +1 -1
  279. package/lib/summaryCollection.d.ts.map +1 -1
  280. package/lib/summaryCollection.js +18 -8
  281. package/lib/summaryCollection.js.map +1 -1
  282. package/lib/summaryFormat.d.ts.map +1 -1
  283. package/lib/summaryFormat.js +20 -13
  284. package/lib/summaryFormat.js.map +1 -1
  285. package/lib/summaryGenerator.d.ts.map +1 -1
  286. package/lib/summaryGenerator.js +32 -14
  287. package/lib/summaryGenerator.js.map +1 -1
  288. package/lib/summaryManager.d.ts.map +1 -1
  289. package/lib/summaryManager.js +21 -9
  290. package/lib/summaryManager.js.map +1 -1
  291. package/lib/throttler.d.ts +2 -2
  292. package/lib/throttler.d.ts.map +1 -1
  293. package/lib/throttler.js +4 -4
  294. package/lib/throttler.js.map +1 -1
  295. package/package.json +27 -24
  296. package/prettier.config.cjs +1 -1
  297. package/src/batchTracker.ts +55 -50
  298. package/src/blobManager.ts +799 -593
  299. package/src/connectionTelemetry.ts +280 -249
  300. package/src/containerHandleContext.ts +27 -29
  301. package/src/containerRuntime.ts +3123 -2793
  302. package/src/dataStore.ts +172 -159
  303. package/src/dataStoreContext.ts +1048 -991
  304. package/src/dataStoreContexts.ts +178 -161
  305. package/src/dataStoreRegistry.ts +25 -20
  306. package/src/dataStores.ts +784 -711
  307. package/src/deltaScheduler.ts +158 -150
  308. package/src/garbageCollection.ts +1795 -1546
  309. package/src/garbageCollectionConstants.ts +10 -7
  310. package/src/garbageCollectionHelpers.ts +37 -0
  311. package/src/gcSweepReadyUsageDetection.ts +89 -83
  312. package/src/index.ts +67 -69
  313. package/src/opLifecycle/batchManager.ts +148 -86
  314. package/src/opLifecycle/definitions.ts +45 -19
  315. package/src/opLifecycle/index.ts +6 -5
  316. package/src/opLifecycle/opCompressor.ts +57 -39
  317. package/src/opLifecycle/opDecompressor.ts +104 -64
  318. package/src/opLifecycle/opSplitter.ts +226 -66
  319. package/src/opLifecycle/outbox.ts +206 -182
  320. package/src/opLifecycle/remoteMessageProcessor.ts +63 -47
  321. package/src/opProperties.ts +11 -9
  322. package/src/orderedClientElection.ts +489 -457
  323. package/src/packageVersion.ts +1 -1
  324. package/src/pendingStateManager.ts +379 -381
  325. package/src/runWhileConnectedCoordinator.ts +78 -71
  326. package/src/runningSummarizer.ts +619 -582
  327. package/src/scheduleManager.ts +299 -280
  328. package/src/serializedSnapshotStorage.ts +116 -111
  329. package/src/summarizer.ts +417 -381
  330. package/src/summarizerClientElection.ts +107 -129
  331. package/src/summarizerHandle.ts +11 -9
  332. package/src/summarizerHeuristics.ts +183 -186
  333. package/src/summarizerTypes.ts +344 -333
  334. package/src/summaryCollection.ts +378 -349
  335. package/src/summaryFormat.ts +146 -127
  336. package/src/summaryGenerator.ts +464 -406
  337. package/src/summaryManager.ts +377 -348
  338. package/src/throttler.ts +131 -122
  339. package/tsconfig.esnext.json +6 -6
  340. package/tsconfig.json +9 -13
@@ -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,136 +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
- private readonly electionEnabled: boolean,
58
- ) {
59
- super();
60
- // On every inbound op, if enough ops pass without seeing a summary ack (per elected client),
61
- // elect a new client and log to telemetry.
62
- this.summaryCollection.on("default", ({ sequenceNumber }) => {
63
- const electedClientId = this.electedClientId;
64
- if (electedClientId === undefined) {
65
- // Reset election if no elected client, but eligible clients are connected.
66
- // This should be uncommon, but is possible if the initial state of the
67
- // ordered client election contains an undefined client id or one not found
68
- // in the quorum (the latter would already log an error).
69
- if (this.clientElection.eligibleCount > 0) {
70
- this.clientElection.resetElectedClient(sequenceNumber);
71
- }
72
- return;
73
- }
74
- let electionSequenceNumber = this.clientElection.electionSequenceNumber;
75
- const opsWithoutSummary = sequenceNumber - (this.lastSummaryAckSeqForClient ?? electionSequenceNumber);
76
- if (opsWithoutSummary > this.maxOpsSinceLastSummary) {
77
- // Log and elect a new summarizer client.
78
- const opsSinceLastReport = sequenceNumber - this.lastReportedSeq;
79
- if (opsSinceLastReport > this.maxOpsSinceLastSummary) {
80
- this.logger.sendTelemetryEvent({
81
- eventName: "ElectedClientNotSummarizing",
82
- electedClientId,
83
- lastSummaryAckSeqForClient: this.lastSummaryAckSeqForClient,
84
- electionSequenceNumber,
85
- nextElectedClientId: this.clientElection.peekNextElectedClient()?.clientId,
86
- electionEnabled: this.electionEnabled,
87
- });
88
- this.lastReportedSeq = sequenceNumber;
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
- if (this.electionEnabled) {
92
- const previousParentId = this.electedParentId;
93
- this.clientElection.incrementElectedClient(sequenceNumber);
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
+ });
94
101
 
95
- // Verify that state incremented as expected. This should be reliable,
96
- // since all of OrderedClientElection is synchronous.
97
- electionSequenceNumber = this.clientElection.electionSequenceNumber;
98
- if (sequenceNumber > (this.lastSummaryAckSeqForClient ?? electionSequenceNumber)) {
99
- if (opsSinceLastReport > this.maxOpsSinceLastSummary) {
100
- this.logger.sendErrorEvent({
101
- eventName: "UnexpectedElectionSequenceNumber",
102
- // Expected to be undefined
103
- lastSummaryAckSeqForClient: this.lastSummaryAckSeqForClient,
104
- // Expected to be same as op sequenceNumber
105
- electionSequenceNumber,
106
- sequenceNumber,
107
- previousClientId: electedClientId,
108
- previousParentId,
109
- electedParentId: this.electedParentId,
110
- electedClientId: this.electedClientId,
111
- opsSinceLastReport,
112
- maxOpsSinceLastSummary,
113
- });
114
- }
115
- }
116
- }
117
- }
118
- });
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
+ }
119
117
 
120
- // When a summary ack comes in, reset our op seq counter.
121
- this.summaryCollection.on(MessageType.SummaryAck, (op) => {
122
- this.lastSummaryAckSeqForClient = op.sequenceNumber;
123
- });
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
+ }
124
127
 
125
- // Use oldest client election for unanimously and deterministically deciding
126
- // which client should summarize.
127
- this.clientElection.on("election", (client, sequenceNumber) => {
128
- this.lastSummaryAckSeqForClient = undefined;
129
- if (client === undefined && this.clientElection.eligibleCount > 0) {
130
- // If no client is valid for election, reset to the oldest again.
131
- // Also make extra sure not to get stuck in an infinite loop here:
132
- // If there are no eligible clients, just wait until a client joins
133
- // and will be auto-elected.
134
- this.clientElection.resetElectedClient(sequenceNumber);
135
- }
136
- // Election can trigger a change in SummaryManager state.
137
- this.emit("electedSummarizerChanged");
138
- });
139
- }
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
+ }
140
136
 
141
- public serialize(): ISerializedElection {
142
- const { electedClientId, electedParentId, electionSequenceNumber } = this.clientElection.serialize();
143
- return {
144
- electedClientId,
145
- electedParentId,
146
- electionSequenceNumber: this.lastSummaryAckSeqForClient ?? electionSequenceNumber,
147
- };
148
- }
149
-
150
- public static isClientEligible(client: ITrackedClient): boolean {
151
- const details = client.client.details;
152
- if (details === undefined) {
153
- // Very old clients back-compat
154
- return true;
155
- }
156
- return SummarizerClientElection.clientDetailsPermitElection(details);
157
- }
158
-
159
- public static readonly clientDetailsPermitElection = (details: IClientDetails): boolean =>
160
- details.capabilities.interactive || details.type === summarizerClientType;
137
+ public static readonly clientDetailsPermitElection = (details: IClientDetails): boolean =>
138
+ details.capabilities.interactive || details.type === summarizerClientType;
161
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
  }