@fluidframework/container-runtime 2.0.0-internal.3.0.1 → 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
@@ -7,216 +7,213 @@ import { ITelemetryLogger } from "@fluidframework/common-definitions";
7
7
  import { Timer } from "@fluidframework/common-utils";
8
8
  import { ISummaryConfigurationHeuristics } from "./containerRuntime";
9
9
  import {
10
- ISummarizeHeuristicData,
11
- ISummarizeHeuristicRunner,
12
- ISummarizeAttempt,
13
- ISummaryHeuristicStrategy,
10
+ ISummarizeHeuristicData,
11
+ ISummarizeHeuristicRunner,
12
+ ISummarizeAttempt,
13
+ ISummaryHeuristicStrategy,
14
14
  } from "./summarizerTypes";
15
15
  import { SummarizeReason } from "./summaryGenerator";
16
16
 
17
17
  /** Simple implementation of class for tracking summarize heuristic data. */
18
18
  export class SummarizeHeuristicData implements ISummarizeHeuristicData {
19
- protected _lastAttempt: ISummarizeAttempt;
20
- public get lastAttempt(): ISummarizeAttempt {
21
- return this._lastAttempt;
22
- }
23
-
24
- protected _lastSuccessfulSummary: Readonly<ISummarizeAttempt>;
25
- public get lastSuccessfulSummary(): Readonly<ISummarizeAttempt> {
26
- return this._lastSuccessfulSummary;
27
- }
28
-
29
- public numNonRuntimeOps: number = 0;
30
- public totalOpsSize: number = 0;
31
- public hasMissingOpData: boolean = false;
32
-
33
- /**
34
- * Cumulative size in bytes of all the ops at the beginning of the summarization attempt.
35
- * Is used to adjust totalOpsSize appropriately after successful summarization.
36
- */
37
- /** */
38
- private totalOpsSizeBefore: number = 0;
39
-
40
- /**
41
- * Number of system ops at beginning of attempting to summarize.
42
- * Is used to adjust numSystemOps appropriately after successful summarization.
43
- */
44
- private numSystemOpsBefore: number = 0;
45
-
46
- public numRuntimeOps: number = 0;
47
- /**
48
- * Number of non-system ops at beginning of attempting to summarize.
49
- * Is used to adjust numNonSystemOps appropriately after successful summarization.
50
- */
51
- private numNonSystemOpsBefore: number = 0;
52
-
53
- constructor(
54
- public lastOpSequenceNumber: number,
55
- /** Baseline attempt data used for comparisons with subsequent attempts/calculations. */
56
- attemptBaseline: ISummarizeAttempt,
57
- ) {
58
- this._lastAttempt = attemptBaseline;
59
- this._lastSuccessfulSummary = { ...attemptBaseline };
60
- }
61
-
62
- public updateWithLastSummaryAckInfo(lastSummary: Readonly<ISummarizeAttempt>) {
63
- this._lastAttempt = lastSummary;
64
- this._lastSuccessfulSummary = { ...lastSummary };
65
- }
66
-
67
- public recordAttempt(refSequenceNumber?: number) {
68
- this._lastAttempt = {
69
- refSequenceNumber: refSequenceNumber ?? this.lastOpSequenceNumber,
70
- summaryTime: Date.now(),
71
- };
72
-
73
- this.numSystemOpsBefore = this.numNonRuntimeOps;
74
- this.numNonSystemOpsBefore = this.numRuntimeOps;
75
- this.totalOpsSizeBefore = this.totalOpsSize;
76
- }
77
-
78
- public markLastAttemptAsSuccessful() {
79
- this._lastSuccessfulSummary = { ...this.lastAttempt };
80
-
81
- this.numNonRuntimeOps -= this.numSystemOpsBefore;
82
- this.numSystemOpsBefore = 0;
83
-
84
- this.numRuntimeOps -= this.numNonSystemOpsBefore;
85
- this.numNonSystemOpsBefore = 0;
86
-
87
- this.totalOpsSize -= this.totalOpsSizeBefore;
88
- this.totalOpsSizeBefore = 0;
89
- }
19
+ protected _lastAttempt: ISummarizeAttempt;
20
+ public get lastAttempt(): ISummarizeAttempt {
21
+ return this._lastAttempt;
22
+ }
23
+
24
+ protected _lastSuccessfulSummary: Readonly<ISummarizeAttempt>;
25
+ public get lastSuccessfulSummary(): Readonly<ISummarizeAttempt> {
26
+ return this._lastSuccessfulSummary;
27
+ }
28
+
29
+ public numNonRuntimeOps: number = 0;
30
+ public totalOpsSize: number = 0;
31
+ public hasMissingOpData: boolean = false;
32
+
33
+ /**
34
+ * Cumulative size in bytes of all the ops at the beginning of the summarization attempt.
35
+ * Is used to adjust totalOpsSize appropriately after successful summarization.
36
+ */
37
+ /** */
38
+ private totalOpsSizeBefore: number = 0;
39
+
40
+ /**
41
+ * Number of system ops at beginning of attempting to summarize.
42
+ * Is used to adjust numSystemOps appropriately after successful summarization.
43
+ */
44
+ private numSystemOpsBefore: number = 0;
45
+
46
+ public numRuntimeOps: number = 0;
47
+ /**
48
+ * Number of non-system ops at beginning of attempting to summarize.
49
+ * Is used to adjust numNonSystemOps appropriately after successful summarization.
50
+ */
51
+ private numNonSystemOpsBefore: number = 0;
52
+
53
+ constructor(
54
+ public lastOpSequenceNumber: number,
55
+ /** Baseline attempt data used for comparisons with subsequent attempts/calculations. */
56
+ attemptBaseline: ISummarizeAttempt,
57
+ ) {
58
+ this._lastAttempt = attemptBaseline;
59
+ this._lastSuccessfulSummary = { ...attemptBaseline };
60
+ }
61
+
62
+ public updateWithLastSummaryAckInfo(lastSummary: Readonly<ISummarizeAttempt>) {
63
+ this._lastAttempt = lastSummary;
64
+ this._lastSuccessfulSummary = { ...lastSummary };
65
+ }
66
+
67
+ public recordAttempt(refSequenceNumber?: number) {
68
+ this._lastAttempt = {
69
+ refSequenceNumber: refSequenceNumber ?? this.lastOpSequenceNumber,
70
+ summaryTime: Date.now(),
71
+ };
72
+
73
+ this.numSystemOpsBefore = this.numNonRuntimeOps;
74
+ this.numNonSystemOpsBefore = this.numRuntimeOps;
75
+ this.totalOpsSizeBefore = this.totalOpsSize;
76
+ }
77
+
78
+ public markLastAttemptAsSuccessful() {
79
+ this._lastSuccessfulSummary = { ...this.lastAttempt };
80
+
81
+ this.numNonRuntimeOps -= this.numSystemOpsBefore;
82
+ this.numSystemOpsBefore = 0;
83
+
84
+ this.numRuntimeOps -= this.numNonSystemOpsBefore;
85
+ this.numNonSystemOpsBefore = 0;
86
+
87
+ this.totalOpsSize -= this.totalOpsSizeBefore;
88
+ this.totalOpsSizeBefore = 0;
89
+ }
90
90
  }
91
91
 
92
92
  /**
93
93
  * This class contains the heuristics for when to summarize.
94
94
  */
95
95
  export class SummarizeHeuristicRunner implements ISummarizeHeuristicRunner {
96
- private readonly idleTimer: Timer | undefined;
97
- private readonly runSummarize: (reason: SummarizeReason) => void;
98
-
99
- public constructor(
100
- private readonly heuristicData: ISummarizeHeuristicData,
101
- private readonly configuration: ISummaryConfigurationHeuristics,
102
- trySummarize: (reason: SummarizeReason) => void,
103
- private readonly logger: ITelemetryLogger,
104
- private readonly summarizeStrategies: ISummaryHeuristicStrategy[] = getDefaultSummaryHeuristicStrategies(),
105
- ) {
106
- this.idleTimer = new Timer(
107
- this.idleTime,
108
- () => this.runSummarize("idle"));
109
-
110
- this.runSummarize = (reason: SummarizeReason) => {
111
- this.idleTimer?.clear();
112
-
113
- // We shouldn't attempt a summary if there are no new processed ops
114
- const opsSinceLastAck = this.opsSinceLastAck;
115
- if (opsSinceLastAck > 0) {
116
- trySummarize(reason);
117
- }
118
- };
119
- }
120
-
121
- public get idleTime(): number {
122
- const maxIdleTime = this.configuration.maxIdleTime;
123
- const minIdleTime = this.configuration.minIdleTime;
124
- const weightedNumOfOps = getWeightedNumberOfOps(
125
- this.heuristicData.numRuntimeOps,
126
- this.heuristicData.numNonRuntimeOps,
127
- this.configuration.runtimeOpWeight,
128
- this.configuration.nonRuntimeOpWeight,
129
- );
130
- const pToMaxOps = weightedNumOfOps * 1.0 / this.configuration.maxOps;
131
-
132
- if (pToMaxOps >= 1) {
133
- return minIdleTime;
134
- }
135
-
136
- // Return a ratioed idle time based on the percentage of ops
137
- return maxIdleTime - ((maxIdleTime - minIdleTime) * pToMaxOps);
138
- }
139
-
140
- public get opsSinceLastAck(): number {
141
- return this.heuristicData.lastOpSequenceNumber - this.heuristicData.lastSuccessfulSummary.refSequenceNumber;
142
- }
143
-
144
- public start() {
145
- this.idleTimer?.start(this.idleTime);
146
- }
147
-
148
- public run() {
149
- for (const strategy of this.summarizeStrategies) {
150
- if (strategy.shouldRunSummary(this.configuration, this.heuristicData)) {
151
- return this.runSummarize(strategy.summarizeReason);
152
- }
153
- }
154
-
155
- this.idleTimer?.restart(this.idleTime);
156
- }
157
-
158
- public shouldRunLastSummary(): boolean {
159
- const opsSinceLastAck = this.opsSinceLastAck;
160
- const minOpsForLastSummaryAttempt = this.configuration.minOpsForLastSummaryAttempt;
161
-
162
- this.logger.sendTelemetryEvent({
163
- eventName: "ShouldRunLastSummary",
164
- opsSinceLastAck,
165
- minOpsForLastSummaryAttempt,
166
- });
167
-
168
- return opsSinceLastAck >= minOpsForLastSummaryAttempt;
169
- }
170
-
171
- public dispose() {
172
- this.idleTimer?.clear();
173
- }
96
+ private readonly idleTimer: Timer | undefined;
97
+ private readonly runSummarize: (reason: SummarizeReason) => void;
98
+
99
+ public constructor(
100
+ private readonly heuristicData: ISummarizeHeuristicData,
101
+ private readonly configuration: ISummaryConfigurationHeuristics,
102
+ trySummarize: (reason: SummarizeReason) => void,
103
+ private readonly logger: ITelemetryLogger,
104
+ private readonly summarizeStrategies: ISummaryHeuristicStrategy[] = getDefaultSummaryHeuristicStrategies(),
105
+ ) {
106
+ this.idleTimer = new Timer(this.idleTime, () => this.runSummarize("idle"));
107
+
108
+ this.runSummarize = (reason: SummarizeReason) => {
109
+ this.idleTimer?.clear();
110
+
111
+ // We shouldn't attempt a summary if there are no new processed ops
112
+ const opsSinceLastAck = this.opsSinceLastAck;
113
+ if (opsSinceLastAck > 0) {
114
+ trySummarize(reason);
115
+ }
116
+ };
117
+ }
118
+
119
+ public get idleTime(): number {
120
+ const maxIdleTime = this.configuration.maxIdleTime;
121
+ const minIdleTime = this.configuration.minIdleTime;
122
+ const weightedNumOfOps = getWeightedNumberOfOps(
123
+ this.heuristicData.numRuntimeOps,
124
+ this.heuristicData.numNonRuntimeOps,
125
+ this.configuration.runtimeOpWeight,
126
+ this.configuration.nonRuntimeOpWeight,
127
+ );
128
+ const pToMaxOps = (weightedNumOfOps * 1.0) / this.configuration.maxOps;
129
+
130
+ if (pToMaxOps >= 1) {
131
+ return minIdleTime;
132
+ }
133
+
134
+ // Return a ratioed idle time based on the percentage of ops
135
+ return maxIdleTime - (maxIdleTime - minIdleTime) * pToMaxOps;
136
+ }
137
+
138
+ public get opsSinceLastAck(): number {
139
+ return (
140
+ this.heuristicData.lastOpSequenceNumber -
141
+ this.heuristicData.lastSuccessfulSummary.refSequenceNumber
142
+ );
143
+ }
144
+
145
+ public start() {
146
+ this.idleTimer?.start(this.idleTime);
147
+ }
148
+
149
+ public run() {
150
+ for (const strategy of this.summarizeStrategies) {
151
+ if (strategy.shouldRunSummary(this.configuration, this.heuristicData)) {
152
+ return this.runSummarize(strategy.summarizeReason);
153
+ }
154
+ }
155
+
156
+ this.idleTimer?.restart(this.idleTime);
157
+ }
158
+
159
+ public shouldRunLastSummary(): boolean {
160
+ const opsSinceLastAck = this.opsSinceLastAck;
161
+ const minOpsForLastSummaryAttempt = this.configuration.minOpsForLastSummaryAttempt;
162
+
163
+ this.logger.sendTelemetryEvent({
164
+ eventName: "ShouldRunLastSummary",
165
+ opsSinceLastAck,
166
+ minOpsForLastSummaryAttempt,
167
+ });
168
+
169
+ return opsSinceLastAck >= minOpsForLastSummaryAttempt;
170
+ }
171
+
172
+ public dispose() {
173
+ this.idleTimer?.clear();
174
+ }
174
175
  }
175
176
 
176
177
  /** Strategy used to run a summary when it's been a while since our last successful summary */
177
178
  class MaxTimeSummaryHeuristicStrategy implements ISummaryHeuristicStrategy {
178
- public readonly summarizeReason: Readonly<SummarizeReason> = "maxTime";
179
-
180
- public shouldRunSummary(
181
- configuration: ISummaryConfigurationHeuristics,
182
- heuristicData: ISummarizeHeuristicData,
183
- ): boolean {
184
- const timeSinceLastSummary = Date.now() - heuristicData.lastSuccessfulSummary.summaryTime;
185
- return timeSinceLastSummary > configuration.maxTime;
186
- }
179
+ public readonly summarizeReason: Readonly<SummarizeReason> = "maxTime";
180
+
181
+ public shouldRunSummary(
182
+ configuration: ISummaryConfigurationHeuristics,
183
+ heuristicData: ISummarizeHeuristicData,
184
+ ): boolean {
185
+ const timeSinceLastSummary = Date.now() - heuristicData.lastSuccessfulSummary.summaryTime;
186
+ return timeSinceLastSummary > configuration.maxTime;
187
+ }
187
188
  }
188
189
 
189
190
  function getWeightedNumberOfOps(
190
- runtimeOpCount: number,
191
- nonRuntimeOpCount: number,
192
- runtimeOpWeight: number,
193
- nonRuntimeOpWeight: number,
191
+ runtimeOpCount: number,
192
+ nonRuntimeOpCount: number,
193
+ runtimeOpWeight: number,
194
+ nonRuntimeOpWeight: number,
194
195
  ): number {
195
- return (runtimeOpWeight * runtimeOpCount)
196
- + (nonRuntimeOpWeight * nonRuntimeOpCount);
196
+ return runtimeOpWeight * runtimeOpCount + nonRuntimeOpWeight * nonRuntimeOpCount;
197
197
  }
198
198
 
199
199
  /** Strategy used to do a weighted analysis on the ops we've processed since the last successful summary */
200
200
  class WeightedOpsSummaryHeuristicStrategy implements ISummaryHeuristicStrategy {
201
- public readonly summarizeReason: Readonly<SummarizeReason> = "maxOps";
202
-
203
- public shouldRunSummary(
204
- configuration: ISummaryConfigurationHeuristics,
205
- heuristicData: ISummarizeHeuristicData,
206
- ): boolean {
207
- const weightedNumOfOps = getWeightedNumberOfOps(
208
- heuristicData.numRuntimeOps,
209
- heuristicData.numNonRuntimeOps,
210
- configuration.runtimeOpWeight,
211
- configuration.nonRuntimeOpWeight,
212
- );
213
- return weightedNumOfOps > configuration.maxOps;
214
- }
201
+ public readonly summarizeReason: Readonly<SummarizeReason> = "maxOps";
202
+
203
+ public shouldRunSummary(
204
+ configuration: ISummaryConfigurationHeuristics,
205
+ heuristicData: ISummarizeHeuristicData,
206
+ ): boolean {
207
+ const weightedNumOfOps = getWeightedNumberOfOps(
208
+ heuristicData.numRuntimeOps,
209
+ heuristicData.numNonRuntimeOps,
210
+ configuration.runtimeOpWeight,
211
+ configuration.nonRuntimeOpWeight,
212
+ );
213
+ return weightedNumOfOps > configuration.maxOps;
214
+ }
215
215
  }
216
216
 
217
217
  function getDefaultSummaryHeuristicStrategies() {
218
- return [
219
- new MaxTimeSummaryHeuristicStrategy(),
220
- new WeightedOpsSummaryHeuristicStrategy(),
221
- ];
218
+ return [new MaxTimeSummaryHeuristicStrategy(), new WeightedOpsSummaryHeuristicStrategy()];
222
219
  }