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

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 (486) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +69 -0
  3. package/dist/blobManager.d.ts +29 -24
  4. package/dist/blobManager.d.ts.map +1 -1
  5. package/dist/blobManager.js +162 -92
  6. package/dist/blobManager.js.map +1 -1
  7. package/dist/containerRuntime.d.ts +74 -76
  8. package/dist/containerRuntime.d.ts.map +1 -1
  9. package/dist/containerRuntime.js +328 -264
  10. package/dist/containerRuntime.js.map +1 -1
  11. package/dist/dataStoreContext.d.ts +39 -13
  12. package/dist/dataStoreContext.d.ts.map +1 -1
  13. package/dist/dataStoreContext.js +112 -49
  14. package/dist/dataStoreContext.js.map +1 -1
  15. package/dist/dataStores.d.ts +28 -4
  16. package/dist/dataStores.d.ts.map +1 -1
  17. package/dist/dataStores.js +107 -41
  18. package/dist/dataStores.js.map +1 -1
  19. package/dist/deltaManagerSummarizerProxy.d.ts +19 -0
  20. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -0
  21. package/dist/deltaManagerSummarizerProxy.js +40 -0
  22. package/dist/deltaManagerSummarizerProxy.js.map +1 -0
  23. package/dist/gc/garbageCollection.d.ts +204 -0
  24. package/dist/gc/garbageCollection.d.ts.map +1 -0
  25. package/dist/{garbageCollection.js → gc/garbageCollection.js} +190 -554
  26. package/dist/gc/garbageCollection.js.map +1 -0
  27. package/dist/gc/gcConfigs.d.ts +22 -0
  28. package/dist/gc/gcConfigs.d.ts.map +1 -0
  29. package/dist/gc/gcConfigs.js +143 -0
  30. package/dist/gc/gcConfigs.js.map +1 -0
  31. package/dist/gc/gcDefinitions.d.ts +320 -0
  32. package/dist/gc/gcDefinitions.d.ts.map +1 -0
  33. package/dist/gc/gcDefinitions.js +81 -0
  34. package/dist/gc/gcDefinitions.js.map +1 -0
  35. package/dist/gc/gcHelpers.d.ts +86 -0
  36. package/dist/gc/gcHelpers.d.ts.map +1 -0
  37. package/dist/gc/gcHelpers.js +268 -0
  38. package/dist/gc/gcHelpers.js.map +1 -0
  39. package/dist/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
  40. package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
  41. package/dist/gc/gcReferenceGraphAlgorithm.js +49 -0
  42. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
  43. package/dist/gc/gcSummaryDefinitions.d.ts +52 -0
  44. package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -0
  45. package/dist/gc/gcSummaryDefinitions.js +7 -0
  46. package/dist/gc/gcSummaryDefinitions.js.map +1 -0
  47. package/dist/gc/gcSummaryStateTracker.d.ts +93 -0
  48. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
  49. package/dist/gc/gcSummaryStateTracker.js +239 -0
  50. package/dist/gc/gcSummaryStateTracker.js.map +1 -0
  51. package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  52. package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +2 -2
  53. package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
  54. package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
  55. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  56. package/dist/gc/gcUnreferencedStateTracker.js +94 -0
  57. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
  58. package/dist/gc/index.d.ts +13 -0
  59. package/dist/gc/index.d.ts.map +1 -0
  60. package/dist/gc/index.js +50 -0
  61. package/dist/gc/index.js.map +1 -0
  62. package/dist/index.d.ts +3 -7
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +5 -9
  65. package/dist/index.js.map +1 -1
  66. package/dist/opLifecycle/batchManager.d.ts +11 -13
  67. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  68. package/dist/opLifecycle/batchManager.js +26 -38
  69. package/dist/opLifecycle/batchManager.js.map +1 -1
  70. package/dist/opLifecycle/definitions.d.ts +4 -0
  71. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  72. package/dist/opLifecycle/definitions.js.map +1 -1
  73. package/dist/opLifecycle/index.d.ts +2 -1
  74. package/dist/opLifecycle/index.d.ts.map +1 -1
  75. package/dist/opLifecycle/index.js +4 -1
  76. package/dist/opLifecycle/index.js.map +1 -1
  77. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  78. package/dist/opLifecycle/opCompressor.js +25 -10
  79. package/dist/opLifecycle/opCompressor.js.map +1 -1
  80. package/dist/opLifecycle/opDecompressor.d.ts +4 -0
  81. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  82. package/dist/opLifecycle/opDecompressor.js +43 -4
  83. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  84. package/dist/opLifecycle/opGroupingManager.d.ts +14 -0
  85. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -0
  86. package/dist/opLifecycle/opGroupingManager.js +56 -0
  87. package/dist/opLifecycle/opGroupingManager.js.map +1 -0
  88. package/dist/opLifecycle/opSplitter.d.ts +16 -4
  89. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  90. package/dist/opLifecycle/opSplitter.js +39 -15
  91. package/dist/opLifecycle/opSplitter.js.map +1 -1
  92. package/dist/opLifecycle/outbox.d.ts +21 -3
  93. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  94. package/dist/opLifecycle/outbox.js +90 -51
  95. package/dist/opLifecycle/outbox.js.map +1 -1
  96. package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -2
  97. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  98. package/dist/opLifecycle/remoteMessageProcessor.js +30 -20
  99. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  100. package/dist/packageVersion.d.ts +1 -1
  101. package/dist/packageVersion.js +1 -1
  102. package/dist/packageVersion.js.map +1 -1
  103. package/dist/pendingStateManager.d.ts +3 -3
  104. package/dist/pendingStateManager.d.ts.map +1 -1
  105. package/dist/pendingStateManager.js +20 -21
  106. package/dist/pendingStateManager.js.map +1 -1
  107. package/dist/storageServiceWithAttachBlobs.d.ts +17 -0
  108. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -0
  109. package/dist/storageServiceWithAttachBlobs.js +32 -0
  110. package/dist/storageServiceWithAttachBlobs.js.map +1 -0
  111. package/dist/summary/index.d.ts +17 -0
  112. package/dist/summary/index.d.ts.map +1 -0
  113. package/dist/summary/index.js +48 -0
  114. package/dist/summary/index.js.map +1 -0
  115. package/dist/summary/orderedClientElection.d.ts.map +1 -0
  116. package/dist/summary/orderedClientElection.js.map +1 -0
  117. package/dist/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +3 -2
  118. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  119. package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
  120. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
  121. package/{lib → dist/summary}/runningSummarizer.d.ts +23 -20
  122. package/dist/summary/runningSummarizer.d.ts.map +1 -0
  123. package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +191 -74
  124. package/dist/summary/runningSummarizer.js.map +1 -0
  125. package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +4 -9
  126. package/dist/summary/summarizer.d.ts.map +1 -0
  127. package/dist/{summarizer.js → summary/summarizer.js} +10 -79
  128. package/dist/summary/summarizer.js.map +1 -0
  129. package/dist/summary/summarizerClientElection.d.ts.map +1 -0
  130. package/dist/summary/summarizerClientElection.js.map +1 -0
  131. package/dist/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +2 -1
  132. package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
  133. package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -3
  134. package/dist/summary/summarizerHeuristics.js.map +1 -0
  135. package/dist/summary/summarizerNode/index.d.ts +8 -0
  136. package/dist/summary/summarizerNode/index.d.ts.map +1 -0
  137. package/dist/summary/summarizerNode/index.js +12 -0
  138. package/dist/summary/summarizerNode/index.js.map +1 -0
  139. package/dist/summary/summarizerNode/summarizerNode.d.ts +149 -0
  140. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
  141. package/dist/summary/summarizerNode/summarizerNode.js +531 -0
  142. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
  143. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
  144. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
  145. package/dist/summary/summarizerNode/summarizerNodeUtils.js +132 -0
  146. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
  147. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +148 -0
  148. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
  149. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +424 -0
  150. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
  151. package/{lib → dist/summary}/summarizerTypes.d.ts +21 -19
  152. package/dist/summary/summarizerTypes.d.ts.map +1 -0
  153. package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -5
  154. package/dist/summary/summarizerTypes.js.map +1 -0
  155. package/dist/summary/summaryCollection.d.ts.map +1 -0
  156. package/dist/summary/summaryCollection.js.map +1 -0
  157. package/{lib → dist/summary}/summaryFormat.d.ts +3 -21
  158. package/dist/summary/summaryFormat.d.ts.map +1 -0
  159. package/dist/{summaryFormat.js → summary/summaryFormat.js} +1 -10
  160. package/dist/summary/summaryFormat.js.map +1 -0
  161. package/{lib → dist/summary}/summaryGenerator.d.ts +28 -2
  162. package/dist/summary/summaryGenerator.d.ts.map +1 -0
  163. package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +23 -20
  164. package/dist/summary/summaryGenerator.js.map +1 -0
  165. package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  166. package/dist/summary/summaryManager.d.ts.map +1 -0
  167. package/dist/summary/summaryManager.js.map +1 -0
  168. package/lib/blobManager.d.ts +29 -24
  169. package/lib/blobManager.d.ts.map +1 -1
  170. package/lib/blobManager.js +159 -89
  171. package/lib/blobManager.js.map +1 -1
  172. package/lib/containerRuntime.d.ts +74 -76
  173. package/lib/containerRuntime.d.ts.map +1 -1
  174. package/lib/containerRuntime.js +301 -237
  175. package/lib/containerRuntime.js.map +1 -1
  176. package/lib/dataStoreContext.d.ts +39 -13
  177. package/lib/dataStoreContext.d.ts.map +1 -1
  178. package/lib/dataStoreContext.js +101 -38
  179. package/lib/dataStoreContext.js.map +1 -1
  180. package/lib/dataStores.d.ts +28 -4
  181. package/lib/dataStores.d.ts.map +1 -1
  182. package/lib/dataStores.js +100 -34
  183. package/lib/dataStores.js.map +1 -1
  184. package/lib/deltaManagerSummarizerProxy.d.ts +19 -0
  185. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -0
  186. package/lib/deltaManagerSummarizerProxy.js +36 -0
  187. package/lib/deltaManagerSummarizerProxy.js.map +1 -0
  188. package/lib/gc/garbageCollection.d.ts +204 -0
  189. package/lib/gc/garbageCollection.d.ts.map +1 -0
  190. package/lib/{garbageCollection.js → gc/garbageCollection.js} +172 -535
  191. package/lib/gc/garbageCollection.js.map +1 -0
  192. package/lib/gc/gcConfigs.d.ts +22 -0
  193. package/lib/gc/gcConfigs.d.ts.map +1 -0
  194. package/lib/gc/gcConfigs.js +139 -0
  195. package/lib/gc/gcConfigs.js.map +1 -0
  196. package/lib/gc/gcDefinitions.d.ts +320 -0
  197. package/lib/gc/gcDefinitions.d.ts.map +1 -0
  198. package/lib/gc/gcDefinitions.js +78 -0
  199. package/lib/gc/gcDefinitions.js.map +1 -0
  200. package/lib/gc/gcHelpers.d.ts +86 -0
  201. package/lib/gc/gcHelpers.d.ts.map +1 -0
  202. package/lib/gc/gcHelpers.js +254 -0
  203. package/lib/gc/gcHelpers.js.map +1 -0
  204. package/lib/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
  205. package/lib/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
  206. package/lib/gc/gcReferenceGraphAlgorithm.js +45 -0
  207. package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -0
  208. package/lib/gc/gcSummaryDefinitions.d.ts +52 -0
  209. package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -0
  210. package/lib/gc/gcSummaryDefinitions.js +6 -0
  211. package/lib/gc/gcSummaryDefinitions.js.map +1 -0
  212. package/lib/gc/gcSummaryStateTracker.d.ts +93 -0
  213. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
  214. package/lib/gc/gcSummaryStateTracker.js +235 -0
  215. package/lib/gc/gcSummaryStateTracker.js.map +1 -0
  216. package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  217. package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +1 -1
  218. package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
  219. package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
  220. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  221. package/lib/gc/gcUnreferencedStateTracker.js +90 -0
  222. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
  223. package/lib/gc/index.d.ts +13 -0
  224. package/lib/gc/index.d.ts.map +1 -0
  225. package/lib/gc/index.js +12 -0
  226. package/lib/gc/index.js.map +1 -0
  227. package/lib/index.d.ts +3 -7
  228. package/lib/index.d.ts.map +1 -1
  229. package/lib/index.js +1 -4
  230. package/lib/index.js.map +1 -1
  231. package/lib/opLifecycle/batchManager.d.ts +11 -13
  232. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  233. package/lib/opLifecycle/batchManager.js +24 -37
  234. package/lib/opLifecycle/batchManager.js.map +1 -1
  235. package/lib/opLifecycle/definitions.d.ts +4 -0
  236. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  237. package/lib/opLifecycle/definitions.js.map +1 -1
  238. package/lib/opLifecycle/index.d.ts +2 -1
  239. package/lib/opLifecycle/index.d.ts.map +1 -1
  240. package/lib/opLifecycle/index.js +2 -1
  241. package/lib/opLifecycle/index.js.map +1 -1
  242. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  243. package/lib/opLifecycle/opCompressor.js +26 -11
  244. package/lib/opLifecycle/opCompressor.js.map +1 -1
  245. package/lib/opLifecycle/opDecompressor.d.ts +4 -0
  246. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  247. package/lib/opLifecycle/opDecompressor.js +43 -4
  248. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  249. package/lib/opLifecycle/opGroupingManager.d.ts +14 -0
  250. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -0
  251. package/lib/opLifecycle/opGroupingManager.js +52 -0
  252. package/lib/opLifecycle/opGroupingManager.js.map +1 -0
  253. package/lib/opLifecycle/opSplitter.d.ts +16 -4
  254. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  255. package/lib/opLifecycle/opSplitter.js +39 -15
  256. package/lib/opLifecycle/opSplitter.js.map +1 -1
  257. package/lib/opLifecycle/outbox.d.ts +21 -3
  258. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  259. package/lib/opLifecycle/outbox.js +92 -53
  260. package/lib/opLifecycle/outbox.js.map +1 -1
  261. package/lib/opLifecycle/remoteMessageProcessor.d.ts +4 -2
  262. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  263. package/lib/opLifecycle/remoteMessageProcessor.js +30 -20
  264. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  265. package/lib/packageVersion.d.ts +1 -1
  266. package/lib/packageVersion.js +1 -1
  267. package/lib/packageVersion.js.map +1 -1
  268. package/lib/pendingStateManager.d.ts +3 -3
  269. package/lib/pendingStateManager.d.ts.map +1 -1
  270. package/lib/pendingStateManager.js +20 -21
  271. package/lib/pendingStateManager.js.map +1 -1
  272. package/lib/storageServiceWithAttachBlobs.d.ts +17 -0
  273. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -0
  274. package/lib/storageServiceWithAttachBlobs.js +28 -0
  275. package/lib/storageServiceWithAttachBlobs.js.map +1 -0
  276. package/lib/summary/index.d.ts +17 -0
  277. package/lib/summary/index.d.ts.map +1 -0
  278. package/lib/summary/index.js +16 -0
  279. package/lib/summary/index.js.map +1 -0
  280. package/lib/summary/orderedClientElection.d.ts.map +1 -0
  281. package/lib/summary/orderedClientElection.js.map +1 -0
  282. package/lib/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +3 -2
  283. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  284. package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
  285. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
  286. package/{dist → lib/summary}/runningSummarizer.d.ts +23 -20
  287. package/lib/summary/runningSummarizer.d.ts.map +1 -0
  288. package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +192 -75
  289. package/lib/summary/runningSummarizer.js.map +1 -0
  290. package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +4 -9
  291. package/lib/summary/summarizer.d.ts.map +1 -0
  292. package/lib/{summarizer.js → summary/summarizer.js} +12 -81
  293. package/lib/summary/summarizer.js.map +1 -0
  294. package/lib/summary/summarizerClientElection.d.ts.map +1 -0
  295. package/lib/summary/summarizerClientElection.js.map +1 -0
  296. package/lib/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +2 -1
  297. package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
  298. package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -3
  299. package/lib/summary/summarizerHeuristics.js.map +1 -0
  300. package/lib/summary/summarizerNode/index.d.ts +8 -0
  301. package/lib/summary/summarizerNode/index.d.ts.map +1 -0
  302. package/lib/summary/summarizerNode/index.js +7 -0
  303. package/lib/summary/summarizerNode/index.js.map +1 -0
  304. package/lib/summary/summarizerNode/summarizerNode.d.ts +149 -0
  305. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
  306. package/lib/summary/summarizerNode/summarizerNode.js +526 -0
  307. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -0
  308. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
  309. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
  310. package/lib/summary/summarizerNode/summarizerNodeUtils.js +125 -0
  311. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
  312. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +148 -0
  313. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
  314. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +419 -0
  315. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
  316. package/{dist → lib/summary}/summarizerTypes.d.ts +21 -19
  317. package/lib/summary/summarizerTypes.d.ts.map +1 -0
  318. package/lib/summary/summarizerTypes.js +6 -0
  319. package/lib/summary/summarizerTypes.js.map +1 -0
  320. package/lib/summary/summaryCollection.d.ts.map +1 -0
  321. package/lib/summary/summaryCollection.js.map +1 -0
  322. package/{dist → lib/summary}/summaryFormat.d.ts +3 -21
  323. package/lib/summary/summaryFormat.d.ts.map +1 -0
  324. package/lib/{summaryFormat.js → summary/summaryFormat.js} +0 -8
  325. package/lib/summary/summaryFormat.js.map +1 -0
  326. package/{dist → lib/summary}/summaryGenerator.d.ts +28 -2
  327. package/lib/summary/summaryGenerator.d.ts.map +1 -0
  328. package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +21 -19
  329. package/lib/summary/summaryGenerator.js.map +1 -0
  330. package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  331. package/lib/summary/summaryManager.d.ts.map +1 -0
  332. package/lib/summary/summaryManager.js.map +1 -0
  333. package/package.json +66 -60
  334. package/src/blobManager.ts +196 -110
  335. package/src/containerRuntime.ts +491 -391
  336. package/src/dataStoreContext.ts +140 -49
  337. package/src/dataStores.ts +139 -41
  338. package/src/deltaManagerSummarizerProxy.ts +46 -0
  339. package/{garbageCollection.md → src/gc/garbageCollection.md} +2 -2
  340. package/src/{garbageCollection.ts → gc/garbageCollection.ts} +245 -890
  341. package/src/gc/gcConfigs.ts +193 -0
  342. package/src/gc/gcDefinitions.ts +387 -0
  343. package/src/gc/gcHelpers.ts +335 -0
  344. package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
  345. package/src/gc/gcSummaryDefinitions.ts +54 -0
  346. package/src/gc/gcSummaryStateTracker.ts +329 -0
  347. package/src/{gcSweepReadyUsageDetection.ts → gc/gcSweepReadyUsageDetection.ts} +1 -1
  348. package/src/gc/gcUnreferencedStateTracker.ts +114 -0
  349. package/src/gc/index.ts +65 -0
  350. package/src/index.ts +10 -22
  351. package/src/opLifecycle/README.md +263 -0
  352. package/src/opLifecycle/batchManager.ts +26 -55
  353. package/src/opLifecycle/definitions.ts +4 -0
  354. package/src/opLifecycle/index.ts +2 -1
  355. package/src/opLifecycle/opCompressor.ts +32 -12
  356. package/src/opLifecycle/opDecompressor.ts +50 -5
  357. package/src/opLifecycle/opGroupingManager.ts +78 -0
  358. package/src/opLifecycle/opSplitter.ts +56 -17
  359. package/src/opLifecycle/outbox.ts +126 -62
  360. package/src/opLifecycle/remoteMessageProcessor.ts +38 -22
  361. package/src/packageVersion.ts +1 -1
  362. package/src/pendingStateManager.ts +34 -27
  363. package/src/storageServiceWithAttachBlobs.ts +38 -0
  364. package/src/summary/index.ts +105 -0
  365. package/src/{runWhileConnectedCoordinator.ts → summary/runWhileConnectedCoordinator.ts} +7 -7
  366. package/src/{runningSummarizer.ts → summary/runningSummarizer.ts} +318 -156
  367. package/src/{summarizer.ts → summary/summarizer.ts} +12 -105
  368. package/src/{summarizerHeuristics.ts → summary/summarizerHeuristics.ts} +13 -4
  369. package/src/summary/summarizerNode/index.ts +12 -0
  370. package/src/summary/summarizerNode/summarizerNode.ts +766 -0
  371. package/src/summary/summarizerNode/summarizerNodeUtils.ts +214 -0
  372. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +644 -0
  373. package/src/{summarizerTypes.ts → summary/summarizerTypes.ts} +28 -25
  374. package/src/{summaryFormat.ts → summary/summaryFormat.ts} +3 -29
  375. package/src/{summaryGenerator.ts → summary/summaryGenerator.ts} +34 -27
  376. package/src/{summaryManager.ts → summary/summaryManager.ts} +1 -1
  377. package/dist/garbageCollection.d.ts +0 -411
  378. package/dist/garbageCollection.d.ts.map +0 -1
  379. package/dist/garbageCollection.js.map +0 -1
  380. package/dist/garbageCollectionConstants.d.ts +0 -23
  381. package/dist/garbageCollectionConstants.d.ts.map +0 -1
  382. package/dist/garbageCollectionConstants.js +0 -36
  383. package/dist/garbageCollectionConstants.js.map +0 -1
  384. package/dist/garbageCollectionHelpers.d.ts +0 -15
  385. package/dist/garbageCollectionHelpers.d.ts.map +0 -1
  386. package/dist/garbageCollectionHelpers.js +0 -27
  387. package/dist/garbageCollectionHelpers.js.map +0 -1
  388. package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
  389. package/dist/gcSweepReadyUsageDetection.js.map +0 -1
  390. package/dist/orderedClientElection.d.ts.map +0 -1
  391. package/dist/orderedClientElection.js.map +0 -1
  392. package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
  393. package/dist/runWhileConnectedCoordinator.js.map +0 -1
  394. package/dist/runningSummarizer.d.ts.map +0 -1
  395. package/dist/runningSummarizer.js.map +0 -1
  396. package/dist/serializedSnapshotStorage.d.ts +0 -58
  397. package/dist/serializedSnapshotStorage.d.ts.map +0 -1
  398. package/dist/serializedSnapshotStorage.js +0 -110
  399. package/dist/serializedSnapshotStorage.js.map +0 -1
  400. package/dist/summarizer.d.ts.map +0 -1
  401. package/dist/summarizer.js.map +0 -1
  402. package/dist/summarizerClientElection.d.ts.map +0 -1
  403. package/dist/summarizerClientElection.js.map +0 -1
  404. package/dist/summarizerHandle.d.ts +0 -12
  405. package/dist/summarizerHandle.d.ts.map +0 -1
  406. package/dist/summarizerHandle.js +0 -22
  407. package/dist/summarizerHandle.js.map +0 -1
  408. package/dist/summarizerHeuristics.d.ts.map +0 -1
  409. package/dist/summarizerHeuristics.js.map +0 -1
  410. package/dist/summarizerTypes.d.ts.map +0 -1
  411. package/dist/summarizerTypes.js.map +0 -1
  412. package/dist/summaryCollection.d.ts.map +0 -1
  413. package/dist/summaryCollection.js.map +0 -1
  414. package/dist/summaryFormat.d.ts.map +0 -1
  415. package/dist/summaryFormat.js.map +0 -1
  416. package/dist/summaryGenerator.d.ts.map +0 -1
  417. package/dist/summaryGenerator.js.map +0 -1
  418. package/dist/summaryManager.d.ts.map +0 -1
  419. package/dist/summaryManager.js.map +0 -1
  420. package/lib/garbageCollection.d.ts +0 -411
  421. package/lib/garbageCollection.d.ts.map +0 -1
  422. package/lib/garbageCollection.js.map +0 -1
  423. package/lib/garbageCollectionConstants.d.ts +0 -23
  424. package/lib/garbageCollectionConstants.d.ts.map +0 -1
  425. package/lib/garbageCollectionConstants.js +0 -33
  426. package/lib/garbageCollectionConstants.js.map +0 -1
  427. package/lib/garbageCollectionHelpers.d.ts +0 -15
  428. package/lib/garbageCollectionHelpers.d.ts.map +0 -1
  429. package/lib/garbageCollectionHelpers.js +0 -23
  430. package/lib/garbageCollectionHelpers.js.map +0 -1
  431. package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
  432. package/lib/gcSweepReadyUsageDetection.js.map +0 -1
  433. package/lib/orderedClientElection.d.ts.map +0 -1
  434. package/lib/orderedClientElection.js.map +0 -1
  435. package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
  436. package/lib/runWhileConnectedCoordinator.js.map +0 -1
  437. package/lib/runningSummarizer.d.ts.map +0 -1
  438. package/lib/runningSummarizer.js.map +0 -1
  439. package/lib/serializedSnapshotStorage.d.ts +0 -58
  440. package/lib/serializedSnapshotStorage.d.ts.map +0 -1
  441. package/lib/serializedSnapshotStorage.js +0 -106
  442. package/lib/serializedSnapshotStorage.js.map +0 -1
  443. package/lib/summarizer.d.ts.map +0 -1
  444. package/lib/summarizer.js.map +0 -1
  445. package/lib/summarizerClientElection.d.ts.map +0 -1
  446. package/lib/summarizerClientElection.js.map +0 -1
  447. package/lib/summarizerHandle.d.ts +0 -12
  448. package/lib/summarizerHandle.d.ts.map +0 -1
  449. package/lib/summarizerHandle.js +0 -18
  450. package/lib/summarizerHandle.js.map +0 -1
  451. package/lib/summarizerHeuristics.d.ts.map +0 -1
  452. package/lib/summarizerHeuristics.js.map +0 -1
  453. package/lib/summarizerTypes.d.ts.map +0 -1
  454. package/lib/summarizerTypes.js +0 -9
  455. package/lib/summarizerTypes.js.map +0 -1
  456. package/lib/summaryCollection.d.ts.map +0 -1
  457. package/lib/summaryCollection.js.map +0 -1
  458. package/lib/summaryFormat.d.ts.map +0 -1
  459. package/lib/summaryFormat.js.map +0 -1
  460. package/lib/summaryGenerator.d.ts.map +0 -1
  461. package/lib/summaryGenerator.js.map +0 -1
  462. package/lib/summaryManager.d.ts.map +0 -1
  463. package/lib/summaryManager.js.map +0 -1
  464. package/src/garbageCollectionConstants.ts +0 -38
  465. package/src/garbageCollectionHelpers.ts +0 -37
  466. package/src/serializedSnapshotStorage.ts +0 -151
  467. package/src/summarizerHandle.ts +0 -23
  468. /package/dist/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
  469. /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  470. /package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
  471. /package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  472. /package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  473. /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  474. /package/dist/{summaryCollection.js → summary/summaryCollection.js} +0 -0
  475. /package/dist/{summaryManager.js → summary/summaryManager.js} +0 -0
  476. /package/lib/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
  477. /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  478. /package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
  479. /package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  480. /package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  481. /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  482. /package/lib/{summaryCollection.js → summary/summaryCollection.js} +0 -0
  483. /package/lib/{summaryManager.js → summary/summaryManager.js} +0 -0
  484. /package/src/{orderedClientElection.ts → summary/orderedClientElection.ts} +0 -0
  485. /package/src/{summarizerClientElection.ts → summary/summarizerClientElection.ts} +0 -0
  486. /package/src/{summaryCollection.ts → summary/summaryCollection.ts} +0 -0
@@ -6,11 +6,17 @@
6
6
  import { IDisposable, ITelemetryLogger } from "@fluidframework/common-definitions";
7
7
  import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/common-utils";
8
8
  import { UsageError } from "@fluidframework/container-utils";
9
+ import { DriverErrorType } from "@fluidframework/driver-definitions";
9
10
  import { isRuntimeMessage } from "@fluidframework/driver-utils";
10
11
  import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
11
- import { ChildLogger } from "@fluidframework/telemetry-utils";
12
- import { ISummaryConfiguration } from "./containerRuntime";
13
- import { opSize } from "./opProperties";
12
+ import {
13
+ ChildLogger,
14
+ isFluidError,
15
+ loggerToMonitoringContext,
16
+ MonitoringContext,
17
+ } from "@fluidframework/telemetry-utils";
18
+ import { ISummaryConfiguration } from "../containerRuntime";
19
+ import { opSize } from "../opProperties";
14
20
  import { SummarizeHeuristicRunner } from "./summarizerHeuristics";
15
21
  import {
16
22
  IEnqueueSummarizeOptions,
@@ -27,8 +33,9 @@ import {
27
33
  ISummarizeTelemetryProperties,
28
34
  ISummarizerRuntime,
29
35
  ISummarizeRunnerTelemetry,
36
+ IRefreshSummaryAckOptions,
30
37
  } from "./summarizerTypes";
31
- import { IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
38
+ import { IAckedSummary, IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
32
39
  import {
33
40
  raceTimer,
34
41
  SummarizeReason,
@@ -38,6 +45,9 @@ import {
38
45
 
39
46
  const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
40
47
 
48
+ const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
49
+ const numberOfAttemptsOnRestartAsRecovery = 1; // Only summarize once
50
+
41
51
  /**
42
52
  * An instance of RunningSummarizer manages the heuristics for summarizing.
43
53
  * Until disposed, the instance of RunningSummarizer can assume that it is
@@ -51,8 +61,8 @@ export class RunningSummarizer implements IDisposable {
51
61
  summaryWatcher: IClientSummaryWatcher,
52
62
  configuration: ISummaryConfiguration,
53
63
  submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
64
+ refreshLatestSummaryAckCallback: (options: IRefreshSummaryAckOptions) => Promise<void>,
54
65
  heuristicData: ISummarizeHeuristicData,
55
- raiseSummarizingError: (errorMessage: string) => void,
56
66
  summaryCollection: SummaryCollection,
57
67
  cancellationToken: ISummaryCancellationToken,
58
68
  stopSummarizerCallback: (reason: SummarizerStopReason) => void,
@@ -63,16 +73,26 @@ export class RunningSummarizer implements IDisposable {
63
73
  summaryWatcher,
64
74
  configuration,
65
75
  submitSummaryCallback,
76
+ refreshLatestSummaryAckCallback,
66
77
  heuristicData,
67
- raiseSummarizingError,
68
78
  summaryCollection,
69
79
  cancellationToken,
70
80
  stopSummarizerCallback,
71
81
  runtime,
72
82
  );
73
83
 
84
+ // Before doing any heuristics or proceeding with its refreshing, if there is a summary ack received while
85
+ // this summarizer catches up, let's refresh state before proceeding with the summarization.
86
+ const lastAckRefSeq = await summarizer.handleSummaryAck();
87
+
74
88
  await summarizer.waitStart();
75
89
 
90
+ // Handle summary acks asynchronously
91
+ // Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
92
+ summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
93
+ logger.sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
94
+ });
95
+
76
96
  // Update heuristic counts
77
97
  // By the time we get here, there are potentially ops missing from the heuristic summary counts
78
98
  // Examples of where this could happen:
@@ -108,12 +128,13 @@ export class RunningSummarizer implements IDisposable {
108
128
  private stopping = false;
109
129
  private _disposed = false;
110
130
  private summarizingLock: Promise<void> | undefined;
111
- private refreshSummaryAckLock: Promise<void> | undefined;
112
131
  private tryWhileSummarizing = false;
113
132
  private readonly pendingAckTimer: PromiseTimer;
114
133
  private heuristicRunner?: ISummarizeHeuristicRunner;
115
134
  private readonly generator: SummaryGenerator;
116
- private readonly logger: ITelemetryLogger;
135
+ private readonly mc: MonitoringContext;
136
+ private readonly shouldAbortOnSummaryFailure: boolean;
137
+
117
138
  private enqueuedSummary:
118
139
  | {
119
140
  reason: SummarizeReason;
@@ -126,6 +147,9 @@ export class RunningSummarizer implements IDisposable {
126
147
  private totalSuccessfulAttempts = 0;
127
148
  private initialized = false;
128
149
 
150
+ private readonly deltaManagerListener;
151
+ private readonly runtimeListener;
152
+
129
153
  private constructor(
130
154
  baseLogger: ITelemetryLogger,
131
155
  private readonly summaryWatcher: IClientSummaryWatcher,
@@ -133,8 +157,10 @@ export class RunningSummarizer implements IDisposable {
133
157
  private readonly submitSummaryCallback: (
134
158
  options: ISubmitSummaryOptions,
135
159
  ) => Promise<SubmitSummaryResult>,
160
+ private readonly refreshLatestSummaryAckCallback: (
161
+ options: IRefreshSummaryAckOptions,
162
+ ) => Promise<void>,
136
163
  private readonly heuristicData: ISummarizeHeuristicData,
137
- private readonly raiseSummarizingError: (errorMessage: string) => void,
138
164
  private readonly summaryCollection: SummaryCollection,
139
165
  private readonly cancellationToken: ISummaryCancellationToken,
140
166
  private readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,
@@ -145,9 +171,15 @@ export class RunningSummarizer implements IDisposable {
145
171
  summarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,
146
172
  };
147
173
 
148
- this.logger = ChildLogger.create(baseLogger, "Running", {
149
- all: telemetryProps,
150
- });
174
+ this.mc = loggerToMonitoringContext(
175
+ ChildLogger.create(baseLogger, "Running", {
176
+ all: telemetryProps,
177
+ }),
178
+ );
179
+
180
+ this.shouldAbortOnSummaryFailure =
181
+ this.mc.config.getString("Fluid.ContainerRuntime.Test.SummarizationRecoveryMethod") ===
182
+ "restart";
151
183
 
152
184
  if (configuration.state !== "disableHeuristics") {
153
185
  assert(
@@ -158,7 +190,7 @@ export class RunningSummarizer implements IDisposable {
158
190
  heuristicData,
159
191
  this.configuration,
160
192
  (reason) => this.trySummarize(reason),
161
- this.logger,
193
+ this.mc.logger,
162
194
  );
163
195
  }
164
196
 
@@ -173,13 +205,12 @@ export class RunningSummarizer implements IDisposable {
173
205
  const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);
174
206
 
175
207
  this.pendingAckTimer = new PromiseTimer(maxAckWaitTime, () => {
176
- // pre-0.58 error message: summaryAckWaitTimeout
177
- this.raiseSummarizingError("Pending summary ack not received in time");
178
208
  // Note: summarizeCount (from ChildLogger definition) may be 0,
179
209
  // since this code path is hit when RunningSummarizer first starts up,
180
210
  // before this instance has kicked off a new summarize run.
181
- this.logger.sendErrorEvent({
211
+ this.mc.logger.sendErrorEvent({
182
212
  eventName: "SummaryAckWaitTimeout",
213
+ message: "Pending summary ack not received in time",
183
214
  maxAckWaitTime,
184
215
  referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,
185
216
  summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,
@@ -189,7 +220,7 @@ export class RunningSummarizer implements IDisposable {
189
220
  // Set up pending ack timeout by op timestamp differences for previous summaries.
190
221
  summaryCollection.setPendingAckTimerTimeoutCallback(maxAckWaitTime, () => {
191
222
  if (this.pendingAckTimer.hasTimer) {
192
- this.logger.sendTelemetryEvent({
223
+ this.mc.logger.sendTelemetryEvent({
193
224
  eventName: "MissingSummaryAckFoundByOps",
194
225
  referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,
195
226
  summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,
@@ -202,24 +233,127 @@ export class RunningSummarizer implements IDisposable {
202
233
  this.pendingAckTimer,
203
234
  this.heuristicData,
204
235
  this.submitSummaryCallback,
205
- this.raiseSummarizingError,
206
236
  () => {
207
237
  this.totalSuccessfulAttempts++;
208
238
  },
209
239
  this.summaryWatcher,
210
- this.logger,
240
+ this.mc.logger,
211
241
  );
212
242
 
213
- // Listen for ops
214
- this.runtime.deltaManager.on("op", (op) => {
215
- this.handleOp(op);
216
- });
243
+ // Listen to deltaManager for non-runtime ops
244
+ this.deltaManagerListener = (op) => {
245
+ if (!isRuntimeMessage(op)) {
246
+ this.handleOp(op, false);
247
+ }
248
+ };
249
+
250
+ // Listen to runtime for runtime ops
251
+ this.runtimeListener = (op, runtimeMessage) => {
252
+ if (runtimeMessage) {
253
+ this.handleOp(op, true);
254
+ }
255
+ };
256
+
257
+ // Purpose of listening to deltaManager is for back-compat
258
+ // Can remove and only listen to runtime once loader version is past 2.0.0-internal.1.2.0 (https://github.com/microsoft/FluidFramework/pull/11832)
259
+ // Tracked by AB#3883
260
+ this.runtime.deltaManager.on("op", this.deltaManagerListener);
261
+ this.runtime.on?.("op", this.runtimeListener);
262
+ }
263
+
264
+ private async handleSummaryAck(): Promise<number> {
265
+ const lastAck: IAckedSummary | undefined = this.summaryCollection.latestAck;
266
+ let refSequenceNumber = -1;
267
+ // In case we haven't received the lastestAck yet, just return.
268
+ if (lastAck !== undefined) {
269
+ refSequenceNumber = lastAck.summaryOp.referenceSequenceNumber;
270
+ const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
271
+ const summaryOpHandle = lastAck.summaryOp.contents.handle;
272
+ const summaryAckHandle = lastAck.summaryAck.contents.handle;
273
+ while (this.summarizingLock !== undefined) {
274
+ summaryLogger.sendTelemetryEvent({
275
+ eventName: "RefreshAttemptWithSummarizerRunning",
276
+ referenceSequenceNumber: refSequenceNumber,
277
+ proposalHandle: summaryOpHandle,
278
+ ackHandle: summaryAckHandle,
279
+ });
280
+ await this.summarizingLock;
281
+ }
282
+
283
+ // Make sure we block any summarizer from being executed/enqueued while
284
+ // executing the refreshLatestSummaryAck.
285
+ // https://dev.azure.com/fluidframework/internal/_workitems/edit/779
286
+ await this.lockedSummaryAction(
287
+ () => {},
288
+ async () =>
289
+ this.refreshLatestSummaryAckCallback({
290
+ proposalHandle: summaryOpHandle,
291
+ ackHandle: summaryAckHandle,
292
+ summaryRefSeq: refSequenceNumber,
293
+ summaryLogger,
294
+ }).catch(async (error) => {
295
+ // If the error is 404, so maybe the fetched version no longer exists on server. We just
296
+ // ignore this error in that case, as that means we will have another summaryAck for the
297
+ // latest version with which we will refresh the state. However in case of single commit
298
+ // summary, we might me missing a summary ack, so in that case we are still fine as the
299
+ // code in `submitSummary` function in container runtime, will refresh the latest state
300
+ // by calling `refreshLatestSummaryAckFromServer` and we will be fine.
301
+ const isIgnoredError =
302
+ isFluidError(error) &&
303
+ error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError;
304
+
305
+ summaryLogger.sendTelemetryEvent(
306
+ {
307
+ eventName: isIgnoredError
308
+ ? "HandleSummaryAckErrorIgnored"
309
+ : "HandleLastSummaryAckError",
310
+ referenceSequenceNumber: refSequenceNumber,
311
+ proposalHandle: summaryOpHandle,
312
+ ackHandle: summaryAckHandle,
313
+ },
314
+ error,
315
+ );
316
+ }),
317
+ () => {},
318
+ );
319
+ refSequenceNumber++;
320
+ }
321
+ return refSequenceNumber;
322
+ }
323
+
324
+ /**
325
+ * Responsible for receiving and processing all the summaryAcks.
326
+ * In case there was a summary ack processed by the running summarizer before processIncomingSummaryAcks is called,
327
+ * it will wait for the summary ack that is newer than the one indicated by the lastAckRefSeq.
328
+ * @param lastAckRefSeq - Identifies the minimum reference sequence number the summarizer needs to wait for.
329
+ * In case of a negative number, the summarizer will wait for ANY summary ack that is greater than the deltaManager's initial sequence number,
330
+ * and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
331
+ */
332
+ private async processIncomingSummaryAcks(lastAckRefSeq: number) {
333
+ let refSequenceNumber =
334
+ lastAckRefSeq > 0 ? lastAckRefSeq : this.runtime.deltaManager.initialSequenceNumber;
335
+ while (!this.disposed) {
336
+ const summaryLogger = this.tryGetCorrelatedLogger(refSequenceNumber) ?? this.mc.logger;
337
+
338
+ // Initialize ack with undefined if exception happens inside of waitSummaryAck on second iteration,
339
+ // we record undefined, not previous handles.
340
+ await this.summaryCollection.waitSummaryAck(refSequenceNumber);
341
+
342
+ summaryLogger.sendTelemetryEvent({
343
+ eventName: "processIncomingSummaryAcks",
344
+ referenceSequenceNumber: refSequenceNumber,
345
+ lastAckRefSeq,
346
+ });
347
+
348
+ refSequenceNumber = await this.handleSummaryAck();
349
+ // A valid Summary Ack must have been processed.
350
+ assert(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
351
+ }
217
352
  }
218
353
 
219
354
  public dispose(): void {
220
- this.runtime.deltaManager.off("op", (op) => {
221
- this.handleOp(op);
222
- });
355
+ this.runtime.deltaManager.off("op", this.deltaManagerListener);
356
+ this.runtime.off?.("op", this.runtimeListener);
223
357
  this.summaryWatcher.dispose();
224
358
  this.heuristicRunner?.dispose();
225
359
  this.heuristicRunner = undefined;
@@ -238,16 +372,16 @@ export class RunningSummarizer implements IDisposable {
238
372
  */
239
373
  public tryGetCorrelatedLogger = (summaryOpRefSeq) =>
240
374
  this.heuristicData.lastAttempt.refSequenceNumber === summaryOpRefSeq
241
- ? this.logger
375
+ ? this.mc.logger
242
376
  : undefined;
243
377
 
244
378
  /** We only want a single heuristic runner micro-task (will provide better optimized grouping of ops) */
245
379
  private heuristicRunnerMicroTaskExists = false;
246
380
 
247
- public handleOp(op: ISequencedDocumentMessage) {
381
+ public handleOp(op: ISequencedDocumentMessage, runtimeMessage: boolean) {
248
382
  this.heuristicData.lastOpSequenceNumber = op.sequenceNumber;
249
383
 
250
- if (isRuntimeMessage(op)) {
384
+ if (runtimeMessage) {
251
385
  this.heuristicData.numRuntimeOps++;
252
386
  } else {
253
387
  this.heuristicData.numNonRuntimeOps++;
@@ -258,7 +392,7 @@ export class RunningSummarizer implements IDisposable {
258
392
  // Check for enqueued on-demand summaries; Intentionally do nothing otherwise
259
393
  if (
260
394
  this.initialized &&
261
- this.opCanTriggerSummary(op) &&
395
+ this.opCanTriggerSummary(op, runtimeMessage) &&
262
396
  !this.tryRunEnqueuedSummary() &&
263
397
  !this.heuristicRunnerMicroTaskExists
264
398
  ) {
@@ -279,14 +413,14 @@ export class RunningSummarizer implements IDisposable {
279
413
  * @param op - op to check
280
414
  * @returns true if this op can trigger a summary
281
415
  */
282
- private opCanTriggerSummary(op: ISequencedDocumentMessage): boolean {
416
+ private opCanTriggerSummary(op: ISequencedDocumentMessage, runtimeMessage: boolean): boolean {
283
417
  switch (op.type) {
284
418
  case MessageType.Summarize:
285
419
  case MessageType.SummaryAck:
286
420
  case MessageType.SummaryNack:
287
421
  return false;
288
422
  default:
289
- return isRuntimeMessage(op) || this.nonRuntimeOpCanTriggerSummary();
423
+ return runtimeMessage || this.nonRuntimeOpCanTriggerSummary();
290
424
  }
291
425
  }
292
426
 
@@ -353,41 +487,35 @@ export class RunningSummarizer implements IDisposable {
353
487
  this.initialized = true;
354
488
  }
355
489
 
356
- /**
357
- * Blocks a new summarizer from running in case RefreshSummaryAck is being processed.
358
- * Assumes that caller checked upfront for lack of concurrent action (this.refreshSummaryAckLock)
359
- * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
360
- * Note: The refreshSummaryAckLock makes sure no summarizer gets enqueued or processed
361
- * until the refresh has completed. One can't rely uniquely on the summarizingLock as the
362
- * refreshLatestSummaryAck also happens during the time summarizingLock !== undefined.
363
- * Ex. Summarizer submits a summay + op and then waits for the Summary Ack to proceed
364
- * with the refreshLatestSummaryAck and complete the summary.
365
- * @param action - action to perform.
366
- * @returns - result of action.
367
- */
368
- public async lockedRefreshSummaryAckAction<T>(action: () => Promise<T>) {
369
- assert(
370
- this.refreshSummaryAckLock === undefined,
371
- 0x396 /* Refresh Summary Ack - Caller is responsible for checking lock */,
372
- );
490
+ private beforeSummaryAction() {
491
+ this.summarizeCount++;
492
+ }
373
493
 
374
- const refreshSummaryAckLock = new Deferred<void>();
375
- this.refreshSummaryAckLock = refreshSummaryAckLock.promise;
494
+ private afterSummaryAction() {
495
+ const retry = this.tryWhileSummarizing;
496
+ this.tryWhileSummarizing = false;
376
497
 
377
- return action().finally(() => {
378
- refreshSummaryAckLock.resolve();
379
- this.refreshSummaryAckLock = undefined;
380
- });
498
+ // After summarizing, we should check to see if we need to summarize again.
499
+ // Rerun the heuristics and check for enqueued summaries.
500
+ if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
501
+ this.heuristicRunner?.run();
502
+ }
381
503
  }
382
504
 
383
505
  /**
384
506
  * Runs single summary action that prevents any other concurrent actions.
385
507
  * Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)
386
508
  * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
509
+ * @param before - set of instructions to run before running the action.
387
510
  * @param action - action to perform.
511
+ * @param after - set of instructions to run after running the action.
388
512
  * @returns - result of action.
389
513
  */
390
- private async lockedSummaryAction<T>(action: () => Promise<T>) {
514
+ private async lockedSummaryAction<T>(
515
+ before: () => void,
516
+ action: () => Promise<T>,
517
+ after: () => void,
518
+ ) {
391
519
  assert(
392
520
  this.summarizingLock === undefined,
393
521
  0x25b /* "Caller is responsible for checking lock" */,
@@ -396,22 +524,12 @@ export class RunningSummarizer implements IDisposable {
396
524
  const summarizingLock = new Deferred<void>();
397
525
  this.summarizingLock = summarizingLock.promise;
398
526
 
399
- this.summarizeCount++;
400
- // Make sure the RefreshLatestSummaryAck is not being executed.
401
- await this.refreshSummaryAckLock;
527
+ before();
402
528
 
403
529
  return action().finally(() => {
404
530
  summarizingLock.resolve();
405
531
  this.summarizingLock = undefined;
406
-
407
- const retry = this.tryWhileSummarizing;
408
- this.tryWhileSummarizing = false;
409
-
410
- // After summarizing, we should check to see if we need to summarize again.
411
- // Rerun the heuristics and check for enqueued summaries.
412
- if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
413
- this.heuristicRunner?.run();
414
- }
532
+ after();
415
533
  });
416
534
  }
417
535
 
@@ -429,16 +547,24 @@ export class RunningSummarizer implements IDisposable {
429
547
  cancellationToken = this.cancellationToken,
430
548
  resultsBuilder = new SummarizeResultBuilder(),
431
549
  ): ISummarizeResults {
432
- this.lockedSummaryAction(async () => {
433
- const summarizeResult = this.generator.summarize(
434
- summarizeProps,
435
- options,
436
- cancellationToken,
437
- resultsBuilder,
438
- );
439
- // ensure we wait till the end of the process
440
- return summarizeResult.receivedSummaryAckOrNack;
441
- }).catch((error) => {
550
+ this.lockedSummaryAction(
551
+ () => {
552
+ this.beforeSummaryAction();
553
+ },
554
+ async () => {
555
+ const summarizeResult = this.generator.summarize(
556
+ summarizeProps,
557
+ options,
558
+ cancellationToken,
559
+ resultsBuilder,
560
+ );
561
+ // ensure we wait till the end of the process
562
+ return summarizeResult.receivedSummaryAckOrNack;
563
+ },
564
+ () => {
565
+ this.afterSummaryAction();
566
+ },
567
+ ).catch((error) => {
442
568
  // SummaryGenerator.summarize() does not throw exceptions - it converts them to failed result
443
569
  // on resultsBuilder
444
570
  // We do not care about exceptions on receivedSummaryAckOrNack - caller should check results
@@ -460,91 +586,127 @@ export class RunningSummarizer implements IDisposable {
460
586
  return;
461
587
  }
462
588
 
463
- this.lockedSummaryAction(async () => {
464
- const attempts: (ISummarizeOptions & { delaySeconds?: number })[] = [
465
- { refreshLatestAck: false, fullTree: false },
466
- { refreshLatestAck: true, fullTree: false },
467
- { refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },
468
- { refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },
469
- ];
470
- let overrideDelaySeconds: number | undefined;
471
- let summaryAttempts = 0;
472
- let summaryAttemptsPerPhase = 0;
473
-
474
- let lastResult: { message: string; error: any } | undefined;
475
-
476
- for (let summaryAttemptPhase = 0; summaryAttemptPhase < attempts.length; ) {
477
- if (this.cancellationToken.cancelled) {
478
- return;
479
- }
480
-
481
- // We only want to attempt 1 summary when reason is "lastSummary"
482
- if (++summaryAttempts > 1 && reason === "lastSummary") {
483
- return;
484
- }
485
-
486
- summaryAttemptsPerPhase++;
487
-
488
- const { delaySeconds: regularDelaySeconds = 0, ...options } =
489
- attempts[summaryAttemptPhase];
490
- const delaySeconds = overrideDelaySeconds ?? regularDelaySeconds;
491
-
492
- const summarizeProps: ISummarizeTelemetryProperties = {
493
- reason,
494
- summaryAttempts,
495
- summaryAttemptsPerPhase,
496
- summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
497
- ...options,
498
- };
499
-
500
- if (delaySeconds > 0) {
501
- this.logger.sendPerformanceEvent({
502
- eventName: "SummarizeAttemptDelay",
503
- duration: delaySeconds,
504
- summaryNackDelay: overrideDelaySeconds !== undefined,
505
- ...summarizeProps,
589
+ this.lockedSummaryAction(
590
+ () => {
591
+ this.beforeSummaryAction();
592
+ },
593
+ async () => {
594
+ const attempts: (ISummarizeOptions & { delaySeconds?: number })[] = [
595
+ { refreshLatestAck: false, fullTree: false },
596
+ { refreshLatestAck: true, fullTree: false },
597
+ { refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },
598
+ { refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },
599
+ ];
600
+ let overrideDelaySeconds: number | undefined;
601
+ let summaryAttempts = 0;
602
+ let summaryAttemptsPerPhase = 0;
603
+ // Reducing the default number of attempts to defaultNumberofSummarizationAttempts.
604
+ let totalAttempts = this.shouldAbortOnSummaryFailure
605
+ ? numberOfAttemptsOnRestartAsRecovery
606
+ : this.mc.config.getNumber("Fluid.Summarizer.Attempts") ??
607
+ defaultNumberSummarizationAttempts;
608
+
609
+ if (totalAttempts > attempts.length) {
610
+ this.mc.logger.sendTelemetryEvent({
611
+ eventName: "InvalidSummarizerAttempts",
612
+ attempts: totalAttempts,
506
613
  });
507
- await delay(delaySeconds * 1000);
614
+ totalAttempts = defaultNumberSummarizationAttempts;
615
+ } else if (totalAttempts < 1) {
616
+ throw new UsageError("Invalid number of attempts.");
508
617
  }
509
618
 
510
- // Make sure the refresh Summary Ack is not being executed.
511
- await this.refreshSummaryAckLock;
512
-
513
- // Note: no need to account for cancellationToken.waitCancelled here, as
514
- // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
515
- const resultSummarize = this.generator.summarize(
516
- summarizeProps,
517
- options,
518
- cancellationToken,
519
- );
520
- const result = await resultSummarize.receivedSummaryAckOrNack;
619
+ let lastResult: { message: string; error: any } | undefined;
620
+
621
+ for (let summaryAttemptPhase = 0; summaryAttemptPhase < totalAttempts; ) {
622
+ if (this.cancellationToken.cancelled) {
623
+ return;
624
+ }
625
+
626
+ // We only want to attempt 1 summary when reason is "lastSummary"
627
+ if (++summaryAttempts > 1 && reason === "lastSummary") {
628
+ return;
629
+ }
630
+
631
+ summaryAttemptsPerPhase++;
632
+
633
+ const { delaySeconds: regularDelaySeconds = 0, ...options } =
634
+ attempts[summaryAttemptPhase];
635
+
636
+ const summarizeProps: ISummarizeTelemetryProperties = {
637
+ reason,
638
+ summaryAttempts,
639
+ summaryAttemptsPerPhase,
640
+ summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
641
+ ...options,
642
+ };
643
+
644
+ // Note: no need to account for cancellationToken.waitCancelled here, as
645
+ // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
646
+ const resultSummarize = this.generator.summarize(
647
+ summarizeProps,
648
+ options,
649
+ cancellationToken,
650
+ );
651
+ const result = await resultSummarize.receivedSummaryAckOrNack;
652
+
653
+ if (result.success) {
654
+ return;
655
+ }
656
+
657
+ // Check for retryDelay that can come from summaryNack or upload summary flow.
658
+ // Retry the same step only once per retryAfter response.
659
+ overrideDelaySeconds = result.retryAfterSeconds;
660
+ if (overrideDelaySeconds === undefined || summaryAttemptsPerPhase > 1) {
661
+ summaryAttemptPhase++;
662
+ summaryAttemptsPerPhase = 0;
663
+ }
664
+ lastResult = result;
665
+
666
+ const delaySeconds = overrideDelaySeconds ?? regularDelaySeconds;
667
+
668
+ if (delaySeconds > 0) {
669
+ this.mc.logger.sendPerformanceEvent({
670
+ eventName: "SummarizeAttemptDelay",
671
+ duration: delaySeconds,
672
+ summaryNackDelay: overrideDelaySeconds !== undefined,
673
+ ...summarizeProps,
674
+ });
675
+ await delay(delaySeconds * 1000);
676
+ }
677
+ }
521
678
 
522
- if (result.success) {
679
+ if (this.shouldAbortOnSummaryFailure) {
680
+ this.mc.logger.sendTelemetryEvent(
681
+ {
682
+ eventName: "ClosingSummarizerOnSummaryStale",
683
+ reason,
684
+ message: lastResult?.message,
685
+ },
686
+ lastResult?.error,
687
+ );
688
+
689
+ this.stopSummarizerCallback("latestSummaryStateStale");
690
+ this.runtime.closeFn();
523
691
  return;
524
692
  }
525
- // Check for retryDelay that can come from summaryNack or upload summary flow.
526
- // Retry the same step only once per retryAfter response.
527
- overrideDelaySeconds = result.retryAfterSeconds;
528
- if (overrideDelaySeconds === undefined || summaryAttemptsPerPhase > 1) {
529
- summaryAttemptPhase++;
530
- summaryAttemptsPerPhase = 0;
531
- }
532
- lastResult = result;
533
- }
534
-
535
- // If all attempts failed, log error (with last attempt info) and close the summarizer container
536
- this.logger.sendErrorEvent(
537
- {
538
- eventName: "FailToSummarize",
539
- reason,
540
- message: lastResult?.message,
541
- },
542
- lastResult?.error,
543
- );
693
+ // If all attempts failed, log error (with last attempt info) and close the summarizer container
694
+ this.mc.logger.sendErrorEvent(
695
+ {
696
+ eventName: "FailToSummarize",
697
+ reason,
698
+ message: lastResult?.message,
699
+ },
700
+ lastResult?.error,
701
+ );
544
702
 
545
- this.stopSummarizerCallback("failToSummarize");
546
- }).catch((error) => {
547
- this.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
703
+ this.stopSummarizerCallback("failToSummarize");
704
+ },
705
+ () => {
706
+ this.afterSummaryAction();
707
+ },
708
+ ).catch((error) => {
709
+ this.mc.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
548
710
  });
549
711
  }
550
712