@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,14 +6,9 @@
6
6
  import { ITelemetryLogger } from "@fluidframework/common-definitions";
7
7
  import { performance } from "@fluidframework/common-utils";
8
8
  import { IDeltaManager } from "@fluidframework/container-definitions";
9
- import {
10
- IDocumentMessage,
11
- ISequencedDocumentMessage,
12
- } from "@fluidframework/protocol-definitions";
13
-
14
- import {
15
- TelemetryLogger,
16
- } from "@fluidframework/telemetry-utils";
9
+ import { IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
10
+
11
+ import { TelemetryLogger } from "@fluidframework/telemetry-utils";
17
12
  /**
18
13
  * DeltaScheduler is responsible for the scheduling of inbound delta queue in cases where there
19
14
  * is more than one op a particular run of the queue. It does not schedule if there is just one
@@ -28,146 +23,159 @@ import {
28
23
  * processed, the time and number of turns it took to process the ops.
29
24
  */
30
25
  export class DeltaScheduler {
31
- private readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;
32
- // The time for processing ops in a single turn.
33
- public static readonly processingTime = 50;
34
-
35
- // The increase in time for processing ops after each turn.
36
- private readonly processingTimeIncrement = 10;
37
-
38
- private processingStartTime: number | undefined;
39
- private currentAllowedProcessingTimeForTurn: number = DeltaScheduler.processingTime;
40
-
41
- // This keeps track of the number of times inbound queue has been scheduled. After a particular
42
- // count, we log telemetry for the number of ops processed, the time and number of turns it took
43
- // to process the ops.
44
- private schedulingCount: number = 0;
45
-
46
- private schedulingLog: {
47
- opsRemainingToProcess: number;
48
- totalProcessingTime: number;
49
- numberOfTurns: number;
50
- numberOfBatchesProcessed: number;
51
- lastSequenceNumber: number;
52
- firstSequenceNumber: number;
53
- startTime: number;
54
- } | undefined;
55
-
56
- constructor(
57
- deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,
58
- private readonly logger: ITelemetryLogger,
59
- ) {
60
- this.deltaManager = deltaManager;
61
- this.deltaManager.inbound.on("idle", () => { this.inboundQueueIdle(); });
62
- }
63
-
64
- public batchBegin(message: ISequencedDocumentMessage) {
65
- if (!this.processingStartTime) {
66
- this.processingStartTime = performance.now();
67
- }
68
- if (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {
69
- // Every 500th time we are scheduling the inbound queue, we log telemetry for the
70
- // number of ops processed, the time and number of turns it took to process the ops.
71
- this.schedulingLog = {
72
- opsRemainingToProcess: 0,
73
- numberOfTurns: 1,
74
- totalProcessingTime: 0,
75
- numberOfBatchesProcessed: 0,
76
- firstSequenceNumber: message.sequenceNumber,
77
- lastSequenceNumber: message.sequenceNumber,
78
- startTime: performance.now(),
79
- };
80
- }
81
- }
82
-
83
- public batchEnd(message: ISequencedDocumentMessage) {
84
- if (this.schedulingLog) {
85
- this.schedulingLog.numberOfBatchesProcessed++;
86
- this.schedulingLog.lastSequenceNumber = message.sequenceNumber;
87
- this.schedulingLog.opsRemainingToProcess = this.deltaManager.inbound.length;
88
- }
89
-
90
- if (this.shouldRunScheduler()) {
91
- const currentTime = performance.now();
92
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
93
- const elapsedTime = currentTime - this.processingStartTime!;
94
- if (elapsedTime > this.currentAllowedProcessingTimeForTurn) {
95
- // We have processed ops for more than the total processing time. So, pause the
96
- // queue, yield the thread and schedule a resume.
97
-
98
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
99
- this.deltaManager.inbound.pause();
100
-
101
- // Increase the total processing time. Keep doing this after each turn until all the ops have
102
- // been processed. This way we keep the responsiveness at the beginning while also making sure
103
- // that all the ops process fairly quickly.
104
- this.currentAllowedProcessingTimeForTurn += this.processingTimeIncrement;
105
-
106
- // If we are logging the telemetry this time, update the telemetry log object.
107
- if (this.schedulingLog) {
108
- this.schedulingLog.numberOfTurns++;
109
- this.schedulingLog.totalProcessingTime += elapsedTime;
110
- }
111
-
112
- setTimeout(() => {
113
- if (this.schedulingLog) {
114
- this.logger.sendTelemetryEvent({
115
- eventName: "InboundOpsPartialProcessingTime",
116
- duration: TelemetryLogger.formatTick(elapsedTime),
117
- opsProcessed: this.schedulingLog.lastSequenceNumber -
118
- this.schedulingLog.firstSequenceNumber + 1,
119
- opsRemainingToProcess: this.deltaManager.inbound.length,
120
- processingTime: TelemetryLogger.formatTick(this.schedulingLog.totalProcessingTime),
121
- numberOfTurns: this.schedulingLog.numberOfTurns,
122
- batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
123
- timeToResume: TelemetryLogger.formatTick(performance.now() - currentTime),
124
- });
125
- }
126
- this.deltaManager.inbound.resume();
127
- });
128
-
129
- this.processingStartTime = undefined;
130
- }
131
- }
132
- }
133
-
134
- private inboundQueueIdle() {
135
- if (this.schedulingLog) {
136
- // Add the time taken for processing the final ops to the total processing time in the
137
- // telemetry log object.
138
- const currentTime = performance.now();
139
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
140
- this.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;
141
-
142
- this.logger.sendTelemetryEvent({
143
- eventName: "InboundOpsProcessingTime",
144
- opsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,
145
- numberOfTurns: this.schedulingLog.numberOfTurns,
146
- processingTime: TelemetryLogger.formatTick(this.schedulingLog.totalProcessingTime),
147
- opsProcessed: this.schedulingLog.lastSequenceNumber - this.schedulingLog.firstSequenceNumber + 1,
148
- batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
149
- duration: TelemetryLogger.formatTick(currentTime - this.schedulingLog.startTime),
150
- schedulingCount: this.schedulingCount,
151
- });
152
-
153
- this.schedulingLog = undefined;
154
- }
155
-
156
- // If we scheduled this batch of the inbound queue, increment the counter that tracks the
157
- // number of times we have done this.
158
- this.schedulingCount++;
159
-
160
- // Reset the processing times.
161
- this.processingStartTime = undefined;
162
- this.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;
163
- }
164
-
165
- /**
166
- * This function tells whether we should run the scheduler.
167
- */
168
- private shouldRunScheduler(): boolean {
169
- // If there are still ops in the queue after the one we are processing now, we should
170
- // run the scheduler.
171
- return this.deltaManager.inbound.length > 0;
172
- }
26
+ private readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;
27
+ // The time for processing ops in a single turn.
28
+ public static readonly processingTime = 50;
29
+
30
+ // The increase in time for processing ops after each turn.
31
+ private readonly processingTimeIncrement = 10;
32
+
33
+ private processingStartTime: number | undefined;
34
+ private currentAllowedProcessingTimeForTurn: number = DeltaScheduler.processingTime;
35
+
36
+ // This keeps track of the number of times inbound queue has been scheduled. After a particular
37
+ // count, we log telemetry for the number of ops processed, the time and number of turns it took
38
+ // to process the ops.
39
+ private schedulingCount: number = 0;
40
+
41
+ private schedulingLog:
42
+ | {
43
+ opsRemainingToProcess: number;
44
+ totalProcessingTime: number;
45
+ numberOfTurns: number;
46
+ numberOfBatchesProcessed: number;
47
+ lastSequenceNumber: number;
48
+ firstSequenceNumber: number;
49
+ startTime: number;
50
+ }
51
+ | undefined;
52
+
53
+ constructor(
54
+ deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,
55
+ private readonly logger: ITelemetryLogger,
56
+ ) {
57
+ this.deltaManager = deltaManager;
58
+ this.deltaManager.inbound.on("idle", () => {
59
+ this.inboundQueueIdle();
60
+ });
61
+ }
62
+
63
+ public batchBegin(message: ISequencedDocumentMessage) {
64
+ if (!this.processingStartTime) {
65
+ this.processingStartTime = performance.now();
66
+ }
67
+ if (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {
68
+ // Every 500th time we are scheduling the inbound queue, we log telemetry for the
69
+ // number of ops processed, the time and number of turns it took to process the ops.
70
+ this.schedulingLog = {
71
+ opsRemainingToProcess: 0,
72
+ numberOfTurns: 1,
73
+ totalProcessingTime: 0,
74
+ numberOfBatchesProcessed: 0,
75
+ firstSequenceNumber: message.sequenceNumber,
76
+ lastSequenceNumber: message.sequenceNumber,
77
+ startTime: performance.now(),
78
+ };
79
+ }
80
+ }
81
+
82
+ public batchEnd(message: ISequencedDocumentMessage) {
83
+ if (this.schedulingLog) {
84
+ this.schedulingLog.numberOfBatchesProcessed++;
85
+ this.schedulingLog.lastSequenceNumber = message.sequenceNumber;
86
+ this.schedulingLog.opsRemainingToProcess = this.deltaManager.inbound.length;
87
+ }
88
+
89
+ if (this.shouldRunScheduler()) {
90
+ const currentTime = performance.now();
91
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
92
+ const elapsedTime = currentTime - this.processingStartTime!;
93
+ if (elapsedTime > this.currentAllowedProcessingTimeForTurn) {
94
+ // We have processed ops for more than the total processing time. So, pause the
95
+ // queue, yield the thread and schedule a resume.
96
+
97
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
98
+ this.deltaManager.inbound.pause();
99
+
100
+ // Increase the total processing time. Keep doing this after each turn until all the ops have
101
+ // been processed. This way we keep the responsiveness at the beginning while also making sure
102
+ // that all the ops process fairly quickly.
103
+ this.currentAllowedProcessingTimeForTurn += this.processingTimeIncrement;
104
+
105
+ // If we are logging the telemetry this time, update the telemetry log object.
106
+ if (this.schedulingLog) {
107
+ this.schedulingLog.numberOfTurns++;
108
+ this.schedulingLog.totalProcessingTime += elapsedTime;
109
+ }
110
+
111
+ setTimeout(() => {
112
+ if (this.schedulingLog) {
113
+ this.logger.sendTelemetryEvent({
114
+ eventName: "InboundOpsPartialProcessingTime",
115
+ duration: TelemetryLogger.formatTick(elapsedTime),
116
+ opsProcessed:
117
+ this.schedulingLog.lastSequenceNumber -
118
+ this.schedulingLog.firstSequenceNumber +
119
+ 1,
120
+ opsRemainingToProcess: this.deltaManager.inbound.length,
121
+ processingTime: TelemetryLogger.formatTick(
122
+ this.schedulingLog.totalProcessingTime,
123
+ ),
124
+ numberOfTurns: this.schedulingLog.numberOfTurns,
125
+ batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
126
+ timeToResume: TelemetryLogger.formatTick(
127
+ performance.now() - currentTime,
128
+ ),
129
+ });
130
+ }
131
+ this.deltaManager.inbound.resume();
132
+ });
133
+
134
+ this.processingStartTime = undefined;
135
+ }
136
+ }
137
+ }
138
+
139
+ private inboundQueueIdle() {
140
+ if (this.schedulingLog) {
141
+ // Add the time taken for processing the final ops to the total processing time in the
142
+ // telemetry log object.
143
+ const currentTime = performance.now();
144
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
145
+ this.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;
146
+
147
+ this.logger.sendTelemetryEvent({
148
+ eventName: "InboundOpsProcessingTime",
149
+ opsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,
150
+ numberOfTurns: this.schedulingLog.numberOfTurns,
151
+ processingTime: TelemetryLogger.formatTick(this.schedulingLog.totalProcessingTime),
152
+ opsProcessed:
153
+ this.schedulingLog.lastSequenceNumber -
154
+ this.schedulingLog.firstSequenceNumber +
155
+ 1,
156
+ batchesProcessed: this.schedulingLog.numberOfBatchesProcessed,
157
+ duration: TelemetryLogger.formatTick(currentTime - this.schedulingLog.startTime),
158
+ schedulingCount: this.schedulingCount,
159
+ });
160
+
161
+ this.schedulingLog = undefined;
162
+ }
163
+
164
+ // If we scheduled this batch of the inbound queue, increment the counter that tracks the
165
+ // number of times we have done this.
166
+ this.schedulingCount++;
167
+
168
+ // Reset the processing times.
169
+ this.processingStartTime = undefined;
170
+ this.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;
171
+ }
172
+
173
+ /**
174
+ * This function tells whether we should run the scheduler.
175
+ */
176
+ private shouldRunScheduler(): boolean {
177
+ // If there are still ops in the queue after the one we are processing now, we should
178
+ // run the scheduler.
179
+ return this.deltaManager.inbound.length > 0;
180
+ }
173
181
  }