@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
@@ -18,6 +18,7 @@ export declare const neverCancelledSummaryToken: ISummaryCancellationToken;
18
18
  */
19
19
  export declare class RunWhileConnectedCoordinator implements ICancellableSummarizerController {
20
20
  private readonly runtime;
21
+ private readonly active;
21
22
  private _cancelled;
22
23
  private readonly stopDeferred;
23
24
  get cancelled(): boolean;
@@ -25,8 +26,8 @@ export declare class RunWhileConnectedCoordinator implements ICancellableSummari
25
26
  * Returns a promise that resolves once stopped either externally or by disconnect.
26
27
  */
27
28
  get waitCancelled(): Promise<SummarizerStopReason>;
28
- static create(runtime: IConnectableRuntime): Promise<RunWhileConnectedCoordinator>;
29
- protected constructor(runtime: IConnectableRuntime);
29
+ static create(runtime: IConnectableRuntime, active: () => boolean): Promise<RunWhileConnectedCoordinator>;
30
+ protected constructor(runtime: IConnectableRuntime, active: () => boolean);
30
31
  /**
31
32
  * Starts and waits for a promise which resolves when connected.
32
33
  * The promise will also resolve if stopped either externally or by disconnect.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runWhileConnectedCoordinator.d.ts","sourceRoot":"","sources":["../../src/summary/runWhileConnectedCoordinator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACN,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,gCAAiC,SAAQ,yBAAyB;IAClF,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACzC;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,yBAGxC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,4BAA6B,YAAW,gCAAgC;IAsCnF,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAtCxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IAErE,IAAW,SAAS,YAkBnB;IAED;;OAEG;IACH,IAAW,aAAa,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAExD;WAEmB,MAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO;IAM9E,SAAS,aACS,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,MAAM,OAAO;IAGvC;;;;;;;;;;;;OAYG;cACa,SAAS;IAiBzB;;OAEG;IACI,IAAI,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;CAM/C"}
@@ -17,14 +17,15 @@ export const neverCancelledSummaryToken = {
17
17
  * when disconnected or if stop() is called.
18
18
  */
19
19
  export class RunWhileConnectedCoordinator {
20
- constructor(runtime) {
20
+ constructor(runtime, active) {
21
21
  this.runtime = runtime;
22
+ this.active = active;
22
23
  this._cancelled = false;
23
24
  this.stopDeferred = new Deferred();
24
25
  }
25
26
  get cancelled() {
26
27
  if (!this._cancelled) {
27
- assert(this.runtime.deltaManager.active, 0x25d /* "We should never connect as 'read'" */);
28
+ assert(this.active(), 0x25d /* "We should never connect as 'read'" */);
28
29
  // This check can't be enabled in current design due to lastSummary flow, where
29
30
  // summarizer for closed container stays around and can produce one more summary.
30
31
  // Currently we solve the problem of overlapping summarizer by doing wait in
@@ -45,8 +46,8 @@ export class RunWhileConnectedCoordinator {
45
46
  get waitCancelled() {
46
47
  return this.stopDeferred.promise;
47
48
  }
48
- static async create(runtime) {
49
- const obj = new RunWhileConnectedCoordinator(runtime);
49
+ static async create(runtime, active) {
50
+ const obj = new RunWhileConnectedCoordinator(runtime, active);
50
51
  await obj.waitStart();
51
52
  return obj;
52
53
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runWhileConnectedCoordinator.js","sourceRoot":"","sources":["../../src/summary/runWhileConnectedCoordinator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAYhE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAA8B;IACpE,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;CACpC,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IAqCxC,YACkB,OAA4B,EAC5B,MAAqB;QADrB,YAAO,GAAP,OAAO,CAAqB;QAC5B,WAAM,GAAN,MAAM,CAAe;QAtC/B,eAAU,GAAG,KAAK,CAAC;QACV,iBAAY,GAAG,IAAI,QAAQ,EAAwB,CAAC;IAsClE,CAAC;IApCJ,IAAW,SAAS;QACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACrB,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAEvE,+EAA+E;YAC/E,iFAAiF;YACjF,4EAA4E;YAC5E,oCAAoC;YACpC,6CAA6C;YAC7C,mGAAmG;YACnG,yBAAyB;YACzB,oFAAoF;YACpF,EAAE;YACF,wEAAwE;YACxE,uFAAuF;SACvF;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,IAAW,aAAa;QACvB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IAClC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAA4B,EAAE,MAAqB;QAC7E,MAAM,GAAG,GAAG,IAAI,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC;IACZ,CAAC;IAOD;;;;;;;;;;;;OAYG;IACO,KAAK,CAAC,SAAS;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC1B,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC1C,OAAO;SACP;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAE9E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YAC5B,MAAM,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CACnD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CACvC,CAAC;YACF,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;SACxD;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACpF,CAAC;IAED;;OAEG;IACI,IAAI,CAAC,MAA4B;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;SAClC;IACF,CAAC;CACD","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert, Deferred } from \"@fluidframework/common-utils\";\nimport {\n\tSummarizerStopReason,\n\tIConnectableRuntime,\n\tISummaryCancellationToken,\n} from \"./summarizerTypes\";\n\n/* Similar to AbortController, but using promise instead of events */\nexport interface ICancellableSummarizerController extends ISummaryCancellationToken {\n\tstop(reason: SummarizerStopReason): void;\n}\n\n/**\n * Can be useful in testing as well as in places where caller does not use cancellation.\n * This object implements ISummaryCancellationToken interface but cancellation is never leveraged.\n */\nexport const neverCancelledSummaryToken: ISummaryCancellationToken = {\n\tcancelled: false,\n\twaitCancelled: new Promise(() => {}),\n};\n\n/**\n * Helper class to coordinate something that needs to run only while connected.\n * This provides promises that resolve as it starts or stops. Stopping happens\n * when disconnected or if stop() is called.\n */\nexport class RunWhileConnectedCoordinator implements ICancellableSummarizerController {\n\tprivate _cancelled = false;\n\tprivate readonly stopDeferred = new Deferred<SummarizerStopReason>();\n\n\tpublic get cancelled() {\n\t\tif (!this._cancelled) {\n\t\t\tassert(this.active(), 0x25d /* \"We should never connect as 'read'\" */);\n\n\t\t\t// This check can't be enabled in current design due to lastSummary flow, where\n\t\t\t// summarizer for closed container stays around and can produce one more summary.\n\t\t\t// Currently we solve the problem of overlapping summarizer by doing wait in\n\t\t\t// SummaryManager.createSummarizer()\n\t\t\t// Better solution would involve these steps:\n\t\t\t// 1. Summarizer selection logic should chose summarizing client (with clientType === \"summarizer\")\n\t\t\t// if such client exists.\n\t\t\t// 2. Summarizer should be updated about such changes (to update onBehalfOfClientId)\n\t\t\t//\n\t\t\t// assert(this.runtime.summarizerClientId === this.onBehalfOfClientId ||\n\t\t\t// this.runtime.summarizerClientId === this.runtime.clientId, \"onBehalfOfClientId\");\n\t\t}\n\n\t\treturn this._cancelled;\n\t}\n\n\t/**\n\t * Returns a promise that resolves once stopped either externally or by disconnect.\n\t */\n\tpublic get waitCancelled(): Promise<SummarizerStopReason> {\n\t\treturn this.stopDeferred.promise;\n\t}\n\n\tpublic static async create(runtime: IConnectableRuntime, active: () => boolean) {\n\t\tconst obj = new RunWhileConnectedCoordinator(runtime, active);\n\t\tawait obj.waitStart();\n\t\treturn obj;\n\t}\n\n\tprotected constructor(\n\t\tprivate readonly runtime: IConnectableRuntime,\n\t\tprivate readonly active: () => boolean,\n\t) {}\n\n\t/**\n\t * Starts and waits for a promise which resolves when connected.\n\t * The promise will also resolve if stopped either externally or by disconnect.\n\t *\n\t * We only listen on disconnected event for clientType === \"summarizer\" container!\n\t * And only do it here - no other place should check it! That way we have only one place\n\t * that controls policy and it's easy to change policy in the future if we want to!\n\t * We do not listen for \"main\" (aka interactive) container disconnect here, as it's\n\t * responsibility of SummaryManager to decide if that's material or not. There are cases\n\t * like \"lastSummary\", or main client experiencing nacks / disconnects due to hitting limit\n\t * of non-summarized ops, where can make determination to continue with summary even if main\n\t * client is disconnected.\n\t */\n\tprotected async waitStart() {\n\t\tif (this.runtime.disposed) {\n\t\t\tthis.stop(\"summarizerClientDisconnected\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.runtime.once(\"dispose\", () => this.stop(\"summarizerClientDisconnected\"));\n\n\t\tif (!this.runtime.connected) {\n\t\t\tconst waitConnected = new Promise<void>((resolve) =>\n\t\t\t\tthis.runtime.once(\"connected\", resolve),\n\t\t\t);\n\t\t\tawait Promise.race([waitConnected, this.waitCancelled]);\n\t\t}\n\t\tthis.runtime.once(\"disconnected\", () => this.stop(\"summarizerClientDisconnected\"));\n\t}\n\n\t/**\n\t * Stops running.\n\t */\n\tpublic stop(reason: SummarizerStopReason): void {\n\t\tif (!this._cancelled) {\n\t\t\tthis._cancelled = true;\n\t\t\tthis.stopDeferred.resolve(reason);\n\t\t}\n\t}\n}\n"]}
@@ -4,8 +4,8 @@
4
4
  */
5
5
  import { IDisposable, ITelemetryLogger } from "@fluidframework/common-definitions";
6
6
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
7
- import { ISummaryConfiguration } from "./containerRuntime";
8
- import { IEnqueueSummarizeOptions, ISummarizeHeuristicData, IOnDemandSummarizeOptions, EnqueueSummarizeResult, SummarizerStopReason, ISubmitSummaryOptions, SubmitSummaryResult, ISummaryCancellationToken, ISummarizeResults, ISummarizerRuntime } from "./summarizerTypes";
7
+ import { ISummaryConfiguration } from "../containerRuntime";
8
+ import { IEnqueueSummarizeOptions, ISummarizeHeuristicData, IOnDemandSummarizeOptions, EnqueueSummarizeResult, SummarizerStopReason, ISubmitSummaryOptions, SubmitSummaryResult, ISummaryCancellationToken, ISummarizeResults, ISummarizerRuntime, IRefreshSummaryAckOptions } from "./summarizerTypes";
9
9
  import { IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
10
10
  import { SummarizeResultBuilder } from "./summaryGenerator";
11
11
  /**
@@ -19,28 +19,40 @@ export declare class RunningSummarizer implements IDisposable {
19
19
  private readonly summaryWatcher;
20
20
  private readonly configuration;
21
21
  private readonly submitSummaryCallback;
22
+ private readonly refreshLatestSummaryAckCallback;
22
23
  private readonly heuristicData;
23
- private readonly raiseSummarizingError;
24
24
  private readonly summaryCollection;
25
25
  private readonly cancellationToken;
26
26
  private readonly stopSummarizerCallback;
27
27
  private readonly runtime;
28
- static start(logger: ITelemetryLogger, summaryWatcher: IClientSummaryWatcher, configuration: ISummaryConfiguration, submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>, heuristicData: ISummarizeHeuristicData, raiseSummarizingError: (errorMessage: string) => void, summaryCollection: SummaryCollection, cancellationToken: ISummaryCancellationToken, stopSummarizerCallback: (reason: SummarizerStopReason) => void, runtime: ISummarizerRuntime): Promise<RunningSummarizer>;
28
+ static start(logger: ITelemetryLogger, summaryWatcher: IClientSummaryWatcher, configuration: ISummaryConfiguration, submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>, refreshLatestSummaryAckCallback: (options: IRefreshSummaryAckOptions) => Promise<void>, heuristicData: ISummarizeHeuristicData, summaryCollection: SummaryCollection, cancellationToken: ISummaryCancellationToken, stopSummarizerCallback: (reason: SummarizerStopReason) => void, runtime: ISummarizerRuntime): Promise<RunningSummarizer>;
29
29
  get disposed(): boolean;
30
30
  private stopping;
31
31
  private _disposed;
32
32
  private summarizingLock;
33
- private refreshSummaryAckLock;
34
33
  private tryWhileSummarizing;
35
34
  private readonly pendingAckTimer;
36
35
  private heuristicRunner?;
37
36
  private readonly generator;
38
- private readonly logger;
37
+ private readonly mc;
38
+ private readonly shouldAbortOnSummaryFailure;
39
39
  private enqueuedSummary;
40
40
  private summarizeCount;
41
41
  private totalSuccessfulAttempts;
42
42
  private initialized;
43
+ private readonly deltaManagerListener;
44
+ private readonly runtimeListener;
43
45
  private constructor();
46
+ private handleSummaryAck;
47
+ /**
48
+ * Responsible for receiving and processing all the summaryAcks.
49
+ * In case there was a summary ack processed by the running summarizer before processIncomingSummaryAcks is called,
50
+ * it will wait for the summary ack that is newer than the one indicated by the lastAckRefSeq.
51
+ * @param lastAckRefSeq - Identifies the minimum reference sequence number the summarizer needs to wait for.
52
+ * In case of a negative number, the summarizer will wait for ANY summary ack that is greater than the deltaManager's initial sequence number,
53
+ * and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
54
+ */
55
+ private processIncomingSummaryAcks;
44
56
  dispose(): void;
45
57
  /**
46
58
  * RunningSummarizer's logger includes the sequenced index of the current summary on each event.
@@ -51,7 +63,7 @@ export declare class RunningSummarizer implements IDisposable {
51
63
  tryGetCorrelatedLogger: (summaryOpRefSeq: any) => ITelemetryLogger | undefined;
52
64
  /** We only want a single heuristic runner micro-task (will provide better optimized grouping of ops) */
53
65
  private heuristicRunnerMicroTaskExists;
54
- handleOp(op: ISequencedDocumentMessage): void;
66
+ handleOp(op: ISequencedDocumentMessage, runtimeMessage: boolean): void;
55
67
  /**
56
68
  * Can the given op trigger a summary?
57
69
  * # Currently always prevents summaries for Summarize and SummaryAck/Nack ops
@@ -62,24 +74,15 @@ export declare class RunningSummarizer implements IDisposable {
62
74
  private nonRuntimeOpCanTriggerSummary;
63
75
  waitStop(allowLastSummary: boolean): Promise<void>;
64
76
  private waitStart;
65
- /**
66
- * Blocks a new summarizer from running in case RefreshSummaryAck is being processed.
67
- * Assumes that caller checked upfront for lack of concurrent action (this.refreshSummaryAckLock)
68
- * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
69
- * Note: The refreshSummaryAckLock makes sure no summarizer gets enqueued or processed
70
- * until the refresh has completed. One can't rely uniquely on the summarizingLock as the
71
- * refreshLatestSummaryAck also happens during the time summarizingLock !== undefined.
72
- * Ex. Summarizer submits a summay + op and then waits for the Summary Ack to proceed
73
- * with the refreshLatestSummaryAck and complete the summary.
74
- * @param action - action to perform.
75
- * @returns - result of action.
76
- */
77
- lockedRefreshSummaryAckAction<T>(action: () => Promise<T>): Promise<T>;
77
+ private beforeSummaryAction;
78
+ private afterSummaryAction;
78
79
  /**
79
80
  * Runs single summary action that prevents any other concurrent actions.
80
81
  * Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)
81
82
  * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
83
+ * @param before - set of instructions to run before running the action.
82
84
  * @param action - action to perform.
85
+ * @param after - set of instructions to run after running the action.
83
86
  * @returns - result of action.
84
87
  */
85
88
  private lockedSummaryAction;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runningSummarizer.d.ts","sourceRoot":"","sources":["../../src/summary/runningSummarizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAKnF,OAAO,EAAE,yBAAyB,EAAe,MAAM,sCAAsC,CAAC;AAO9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EACN,wBAAwB,EAExB,uBAAuB,EAEvB,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EAEjB,kBAAkB,EAElB,yBAAyB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAiB,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAGN,sBAAsB,EAEtB,MAAM,oBAAoB,CAAC;AAO5B;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IAiGnD,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAGtC,OAAO,CAAC,QAAQ,CAAC,+BAA+B;IAGhD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO;WA5GL,KAAK,CACxB,MAAM,EAAE,gBAAgB,EACxB,cAAc,EAAE,qBAAqB,EACrC,aAAa,EAAE,qBAAqB,EACpC,qBAAqB,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,mBAAmB,CAAC,EACvF,+BAA+B,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,IAAI,CAAC,EACtF,aAAa,EAAE,uBAAuB,EACtC,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,yBAAyB,EAC5C,sBAAsB,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,EAC9D,OAAO,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,CAAC;IAuD7B,IAAW,QAAQ,YAElB;IACD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,eAAe,CAAC,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;IAC7C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAU;IAEtD,OAAO,CAAC,eAAe,CAOV;IACb,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAEjC,OAAO;YA+GO,gBAAgB;IA4D9B;;;;;;;OAOG;YACW,0BAA0B;IAsBjC,OAAO,IAAI,IAAI;IAatB;;;;;OAKG;IACI,sBAAsB,yDAGf;IAEd,wGAAwG;IACxG,OAAO,CAAC,8BAA8B,CAAS;IAExC,QAAQ,CAAC,EAAE,EAAE,yBAAyB,EAAE,cAAc,EAAE,OAAO;IA6BtE;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,6BAA6B;IAWxB,QAAQ,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YA6BjD,SAAS;IAuBvB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,kBAAkB;IAW1B;;;;;;;;OAQG;YACW,mBAAmB;IAsBjC;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAiCxB,oCAAoC;IACpC,OAAO,CAAC,YAAY;IAuIpB,8DAA8D;IACvD,iBAAiB,CACvB,cAAc,oCAAuD,EACrE,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,EAAE,yBAAyB,GAC/C,iBAAiB;IAqBpB,6DAA6D;IACtD,gBAAgB,CAAC,EACvB,MAAM,EACN,mBAAuB,EACvB,QAAgB,EAChB,GAAG,OAAO,EACV,EAAE,wBAAwB,GAAG,sBAAsB;IAgCpD,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,sBAAsB;CAS9B"}
@@ -15,13 +15,16 @@ var __rest = (this && this.__rest) || function (s, e) {
15
15
  };
16
16
  import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/common-utils";
17
17
  import { UsageError } from "@fluidframework/container-utils";
18
+ import { DriverErrorType } from "@fluidframework/driver-definitions";
18
19
  import { isRuntimeMessage } from "@fluidframework/driver-utils";
19
20
  import { MessageType } from "@fluidframework/protocol-definitions";
20
- import { ChildLogger } from "@fluidframework/telemetry-utils";
21
- import { opSize } from "./opProperties";
21
+ import { ChildLogger, isFluidError, loggerToMonitoringContext, } from "@fluidframework/telemetry-utils";
22
+ import { opSize } from "../opProperties";
22
23
  import { SummarizeHeuristicRunner } from "./summarizerHeuristics";
23
24
  import { raceTimer, SummarizeResultBuilder, SummaryGenerator, } from "./summaryGenerator";
24
25
  const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
26
+ const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
27
+ const numberOfAttemptsOnRestartAsRecovery = 1; // Only summarize once
25
28
  /**
26
29
  * An instance of RunningSummarizer manages the heuristics for summarizing.
27
30
  * Until disposed, the instance of RunningSummarizer can assume that it is
@@ -30,12 +33,13 @@ const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
30
33
  * This object is created and controlled by Summarizer object.
31
34
  */
32
35
  export class RunningSummarizer {
33
- constructor(baseLogger, summaryWatcher, configuration, submitSummaryCallback, heuristicData, raiseSummarizingError, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
36
+ constructor(baseLogger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
37
+ var _a, _b;
34
38
  this.summaryWatcher = summaryWatcher;
35
39
  this.configuration = configuration;
36
40
  this.submitSummaryCallback = submitSummaryCallback;
41
+ this.refreshLatestSummaryAckCallback = refreshLatestSummaryAckCallback;
37
42
  this.heuristicData = heuristicData;
38
- this.raiseSummarizingError = raiseSummarizingError;
39
43
  this.summaryCollection = summaryCollection;
40
44
  this.cancellationToken = cancellationToken;
41
45
  this.stopSummarizerCallback = stopSummarizerCallback;
@@ -53,7 +57,7 @@ export class RunningSummarizer {
53
57
  * @param summaryOpRefSeq - RefSeq number of the summary op, to ensure the log correlation will be correct
54
58
  */
55
59
  this.tryGetCorrelatedLogger = (summaryOpRefSeq) => this.heuristicData.lastAttempt.refSequenceNumber === summaryOpRefSeq
56
- ? this.logger
60
+ ? this.mc.logger
57
61
  : undefined;
58
62
  /** We only want a single heuristic runner micro-task (will provide better optimized grouping of ops) */
59
63
  this.heuristicRunnerMicroTaskExists = false;
@@ -61,25 +65,27 @@ export class RunningSummarizer {
61
65
  summarizeCount: () => this.summarizeCount,
62
66
  summarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,
63
67
  };
64
- this.logger = ChildLogger.create(baseLogger, "Running", {
68
+ this.mc = loggerToMonitoringContext(ChildLogger.create(baseLogger, "Running", {
65
69
  all: telemetryProps,
66
- });
70
+ }));
71
+ this.shouldAbortOnSummaryFailure =
72
+ this.mc.config.getString("Fluid.ContainerRuntime.Test.SummarizationRecoveryMethod") ===
73
+ "restart";
67
74
  if (configuration.state !== "disableHeuristics") {
68
75
  assert(this.configuration.state === "enabled", 0x2ea /* "Configuration state should be enabled" */);
69
- this.heuristicRunner = new SummarizeHeuristicRunner(heuristicData, this.configuration, (reason) => this.trySummarize(reason), this.logger);
76
+ this.heuristicRunner = new SummarizeHeuristicRunner(heuristicData, this.configuration, (reason) => this.trySummarize(reason), this.mc.logger);
70
77
  }
71
78
  assert(this.configuration.state !== "disabled", 0x2eb /* "Summary not supported with configuration disabled" */);
72
79
  // Cap the maximum amount of time client will wait for a summarize op ack to maxSummarizeAckWaitTime
73
80
  // configuration.maxAckWaitTime is composed from defaults, server values, and runtime overrides
74
81
  const maxAckWaitTime = Math.min(this.configuration.maxAckWaitTime, maxSummarizeAckWaitTime);
75
82
  this.pendingAckTimer = new PromiseTimer(maxAckWaitTime, () => {
76
- // pre-0.58 error message: summaryAckWaitTimeout
77
- this.raiseSummarizingError("Pending summary ack not received in time");
78
83
  // Note: summarizeCount (from ChildLogger definition) may be 0,
79
84
  // since this code path is hit when RunningSummarizer first starts up,
80
85
  // before this instance has kicked off a new summarize run.
81
- this.logger.sendErrorEvent({
86
+ this.mc.logger.sendErrorEvent({
82
87
  eventName: "SummaryAckWaitTimeout",
88
+ message: "Pending summary ack not received in time",
83
89
  maxAckWaitTime,
84
90
  referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,
85
91
  summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,
@@ -89,7 +95,7 @@ export class RunningSummarizer {
89
95
  // Set up pending ack timeout by op timestamp differences for previous summaries.
90
96
  summaryCollection.setPendingAckTimerTimeoutCallback(maxAckWaitTime, () => {
91
97
  if (this.pendingAckTimer.hasTimer) {
92
- this.logger.sendTelemetryEvent({
98
+ this.mc.logger.sendTelemetryEvent({
93
99
  eventName: "MissingSummaryAckFoundByOps",
94
100
  referenceSequenceNumber: this.heuristicData.lastAttempt.refSequenceNumber,
95
101
  summarySequenceNumber: this.heuristicData.lastAttempt.summarySequenceNumber,
@@ -97,18 +103,39 @@ export class RunningSummarizer {
97
103
  this.pendingAckTimer.clear();
98
104
  }
99
105
  });
100
- this.generator = new SummaryGenerator(this.pendingAckTimer, this.heuristicData, this.submitSummaryCallback, this.raiseSummarizingError, () => {
106
+ this.generator = new SummaryGenerator(this.pendingAckTimer, this.heuristicData, this.submitSummaryCallback, () => {
101
107
  this.totalSuccessfulAttempts++;
102
- }, this.summaryWatcher, this.logger);
103
- // Listen for ops
104
- this.runtime.deltaManager.on("op", (op) => {
105
- this.handleOp(op);
106
- });
108
+ }, this.summaryWatcher, this.mc.logger);
109
+ // Listen to deltaManager for non-runtime ops
110
+ this.deltaManagerListener = (op) => {
111
+ if (!isRuntimeMessage(op)) {
112
+ this.handleOp(op, false);
113
+ }
114
+ };
115
+ // Listen to runtime for runtime ops
116
+ this.runtimeListener = (op, runtimeMessage) => {
117
+ if (runtimeMessage) {
118
+ this.handleOp(op, true);
119
+ }
120
+ };
121
+ // Purpose of listening to deltaManager is for back-compat
122
+ // 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)
123
+ // Tracked by AB#3883
124
+ this.runtime.deltaManager.on("op", this.deltaManagerListener);
125
+ (_b = (_a = this.runtime).on) === null || _b === void 0 ? void 0 : _b.call(_a, "op", this.runtimeListener);
107
126
  }
108
- static async start(logger, summaryWatcher, configuration, submitSummaryCallback, heuristicData, raiseSummarizingError, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
127
+ static async start(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime) {
109
128
  var _a, _b;
110
- const summarizer = new RunningSummarizer(logger, summaryWatcher, configuration, submitSummaryCallback, heuristicData, raiseSummarizingError, summaryCollection, cancellationToken, stopSummarizerCallback, runtime);
129
+ const summarizer = new RunningSummarizer(logger, summaryWatcher, configuration, submitSummaryCallback, refreshLatestSummaryAckCallback, heuristicData, summaryCollection, cancellationToken, stopSummarizerCallback, runtime);
130
+ // Before doing any heuristics or proceeding with its refreshing, if there is a summary ack received while
131
+ // this summarizer catches up, let's refresh state before proceeding with the summarization.
132
+ const lastAckRefSeq = await summarizer.handleSummaryAck();
111
133
  await summarizer.waitStart();
134
+ // Handle summary acks asynchronously
135
+ // Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
136
+ summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
137
+ logger.sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
138
+ });
112
139
  // Update heuristic counts
113
140
  // By the time we get here, there are potentially ops missing from the heuristic summary counts
114
141
  // Examples of where this could happen:
@@ -135,13 +162,87 @@ export class RunningSummarizer {
135
162
  get disposed() {
136
163
  return this._disposed;
137
164
  }
138
- dispose() {
165
+ async handleSummaryAck() {
139
166
  var _a;
140
- this.runtime.deltaManager.off("op", (op) => {
141
- this.handleOp(op);
142
- });
167
+ const lastAck = this.summaryCollection.latestAck;
168
+ let refSequenceNumber = -1;
169
+ // In case we haven't received the lastestAck yet, just return.
170
+ if (lastAck !== undefined) {
171
+ refSequenceNumber = lastAck.summaryOp.referenceSequenceNumber;
172
+ const summaryLogger = (_a = this.tryGetCorrelatedLogger(refSequenceNumber)) !== null && _a !== void 0 ? _a : this.mc.logger;
173
+ const summaryOpHandle = lastAck.summaryOp.contents.handle;
174
+ const summaryAckHandle = lastAck.summaryAck.contents.handle;
175
+ while (this.summarizingLock !== undefined) {
176
+ summaryLogger.sendTelemetryEvent({
177
+ eventName: "RefreshAttemptWithSummarizerRunning",
178
+ referenceSequenceNumber: refSequenceNumber,
179
+ proposalHandle: summaryOpHandle,
180
+ ackHandle: summaryAckHandle,
181
+ });
182
+ await this.summarizingLock;
183
+ }
184
+ // Make sure we block any summarizer from being executed/enqueued while
185
+ // executing the refreshLatestSummaryAck.
186
+ // https://dev.azure.com/fluidframework/internal/_workitems/edit/779
187
+ await this.lockedSummaryAction(() => { }, async () => this.refreshLatestSummaryAckCallback({
188
+ proposalHandle: summaryOpHandle,
189
+ ackHandle: summaryAckHandle,
190
+ summaryRefSeq: refSequenceNumber,
191
+ summaryLogger,
192
+ }).catch(async (error) => {
193
+ // If the error is 404, so maybe the fetched version no longer exists on server. We just
194
+ // ignore this error in that case, as that means we will have another summaryAck for the
195
+ // latest version with which we will refresh the state. However in case of single commit
196
+ // summary, we might me missing a summary ack, so in that case we are still fine as the
197
+ // code in `submitSummary` function in container runtime, will refresh the latest state
198
+ // by calling `refreshLatestSummaryAckFromServer` and we will be fine.
199
+ const isIgnoredError = isFluidError(error) &&
200
+ error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError;
201
+ summaryLogger.sendTelemetryEvent({
202
+ eventName: isIgnoredError
203
+ ? "HandleSummaryAckErrorIgnored"
204
+ : "HandleLastSummaryAckError",
205
+ referenceSequenceNumber: refSequenceNumber,
206
+ proposalHandle: summaryOpHandle,
207
+ ackHandle: summaryAckHandle,
208
+ }, error);
209
+ }), () => { });
210
+ refSequenceNumber++;
211
+ }
212
+ return refSequenceNumber;
213
+ }
214
+ /**
215
+ * Responsible for receiving and processing all the summaryAcks.
216
+ * In case there was a summary ack processed by the running summarizer before processIncomingSummaryAcks is called,
217
+ * it will wait for the summary ack that is newer than the one indicated by the lastAckRefSeq.
218
+ * @param lastAckRefSeq - Identifies the minimum reference sequence number the summarizer needs to wait for.
219
+ * In case of a negative number, the summarizer will wait for ANY summary ack that is greater than the deltaManager's initial sequence number,
220
+ * and, in case of a positive one, it will wait for a summary ack that is greater than this current reference sequence number.
221
+ */
222
+ async processIncomingSummaryAcks(lastAckRefSeq) {
223
+ var _a;
224
+ let refSequenceNumber = lastAckRefSeq > 0 ? lastAckRefSeq : this.runtime.deltaManager.initialSequenceNumber;
225
+ while (!this.disposed) {
226
+ const summaryLogger = (_a = this.tryGetCorrelatedLogger(refSequenceNumber)) !== null && _a !== void 0 ? _a : this.mc.logger;
227
+ // Initialize ack with undefined if exception happens inside of waitSummaryAck on second iteration,
228
+ // we record undefined, not previous handles.
229
+ await this.summaryCollection.waitSummaryAck(refSequenceNumber);
230
+ summaryLogger.sendTelemetryEvent({
231
+ eventName: "processIncomingSummaryAcks",
232
+ referenceSequenceNumber: refSequenceNumber,
233
+ lastAckRefSeq,
234
+ });
235
+ refSequenceNumber = await this.handleSummaryAck();
236
+ // A valid Summary Ack must have been processed.
237
+ assert(refSequenceNumber >= 0, 0x58f /* Invalid ref sequence number */);
238
+ }
239
+ }
240
+ dispose() {
241
+ var _a, _b, _c;
242
+ this.runtime.deltaManager.off("op", this.deltaManagerListener);
243
+ (_b = (_a = this.runtime).off) === null || _b === void 0 ? void 0 : _b.call(_a, "op", this.runtimeListener);
143
244
  this.summaryWatcher.dispose();
144
- (_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.dispose();
245
+ (_c = this.heuristicRunner) === null || _c === void 0 ? void 0 : _c.dispose();
145
246
  this.heuristicRunner = undefined;
146
247
  this.generator.dispose();
147
248
  this.pendingAckTimer.clear();
@@ -149,9 +250,9 @@ export class RunningSummarizer {
149
250
  this._disposed = true;
150
251
  this.stopping = true;
151
252
  }
152
- handleOp(op) {
253
+ handleOp(op, runtimeMessage) {
153
254
  this.heuristicData.lastOpSequenceNumber = op.sequenceNumber;
154
- if (isRuntimeMessage(op)) {
255
+ if (runtimeMessage) {
155
256
  this.heuristicData.numRuntimeOps++;
156
257
  }
157
258
  else {
@@ -160,7 +261,7 @@ export class RunningSummarizer {
160
261
  this.heuristicData.totalOpsSize += opSize(op);
161
262
  // Check for enqueued on-demand summaries; Intentionally do nothing otherwise
162
263
  if (this.initialized &&
163
- this.opCanTriggerSummary(op) &&
264
+ this.opCanTriggerSummary(op, runtimeMessage) &&
164
265
  !this.tryRunEnqueuedSummary() &&
165
266
  !this.heuristicRunnerMicroTaskExists) {
166
267
  this.heuristicRunnerMicroTaskExists = true;
@@ -180,14 +281,14 @@ export class RunningSummarizer {
180
281
  * @param op - op to check
181
282
  * @returns true if this op can trigger a summary
182
283
  */
183
- opCanTriggerSummary(op) {
284
+ opCanTriggerSummary(op, runtimeMessage) {
184
285
  switch (op.type) {
185
286
  case MessageType.Summarize:
186
287
  case MessageType.SummaryAck:
187
288
  case MessageType.SummaryNack:
188
289
  return false;
189
290
  default:
190
- return isRuntimeMessage(op) || this.nonRuntimeOpCanTriggerSummary();
291
+ return runtimeMessage || this.nonRuntimeOpCanTriggerSummary();
191
292
  }
192
293
  }
193
294
  nonRuntimeOpCanTriggerSummary() {
@@ -238,52 +339,37 @@ export class RunningSummarizer {
238
339
  }
239
340
  this.initialized = true;
240
341
  }
241
- /**
242
- * Blocks a new summarizer from running in case RefreshSummaryAck is being processed.
243
- * Assumes that caller checked upfront for lack of concurrent action (this.refreshSummaryAckLock)
244
- * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
245
- * Note: The refreshSummaryAckLock makes sure no summarizer gets enqueued or processed
246
- * until the refresh has completed. One can't rely uniquely on the summarizingLock as the
247
- * refreshLatestSummaryAck also happens during the time summarizingLock !== undefined.
248
- * Ex. Summarizer submits a summay + op and then waits for the Summary Ack to proceed
249
- * with the refreshLatestSummaryAck and complete the summary.
250
- * @param action - action to perform.
251
- * @returns - result of action.
252
- */
253
- async lockedRefreshSummaryAckAction(action) {
254
- assert(this.refreshSummaryAckLock === undefined, 0x396 /* Refresh Summary Ack - Caller is responsible for checking lock */);
255
- const refreshSummaryAckLock = new Deferred();
256
- this.refreshSummaryAckLock = refreshSummaryAckLock.promise;
257
- return action().finally(() => {
258
- refreshSummaryAckLock.resolve();
259
- this.refreshSummaryAckLock = undefined;
260
- });
342
+ beforeSummaryAction() {
343
+ this.summarizeCount++;
344
+ }
345
+ afterSummaryAction() {
346
+ var _a;
347
+ const retry = this.tryWhileSummarizing;
348
+ this.tryWhileSummarizing = false;
349
+ // After summarizing, we should check to see if we need to summarize again.
350
+ // Rerun the heuristics and check for enqueued summaries.
351
+ if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
352
+ (_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.run();
353
+ }
261
354
  }
262
355
  /**
263
356
  * Runs single summary action that prevents any other concurrent actions.
264
357
  * Assumes that caller checked upfront for lack of concurrent action (this.summarizingLock)
265
358
  * before calling this API. I.e. caller is responsible for either erroring out or waiting on this promise.
359
+ * @param before - set of instructions to run before running the action.
266
360
  * @param action - action to perform.
361
+ * @param after - set of instructions to run after running the action.
267
362
  * @returns - result of action.
268
363
  */
269
- async lockedSummaryAction(action) {
364
+ async lockedSummaryAction(before, action, after) {
270
365
  assert(this.summarizingLock === undefined, 0x25b /* "Caller is responsible for checking lock" */);
271
366
  const summarizingLock = new Deferred();
272
367
  this.summarizingLock = summarizingLock.promise;
273
- this.summarizeCount++;
274
- // Make sure the RefreshLatestSummaryAck is not being executed.
275
- await this.refreshSummaryAckLock;
368
+ before();
276
369
  return action().finally(() => {
277
- var _a;
278
370
  summarizingLock.resolve();
279
371
  this.summarizingLock = undefined;
280
- const retry = this.tryWhileSummarizing;
281
- this.tryWhileSummarizing = false;
282
- // After summarizing, we should check to see if we need to summarize again.
283
- // Rerun the heuristics and check for enqueued summaries.
284
- if (!this.stopping && !this.tryRunEnqueuedSummary() && retry) {
285
- (_a = this.heuristicRunner) === null || _a === void 0 ? void 0 : _a.run();
286
- }
372
+ after();
287
373
  });
288
374
  }
289
375
  /**
@@ -295,10 +381,14 @@ export class RunningSummarizer {
295
381
  * @returns ISummarizeResult - result of running a summary.
296
382
  */
297
383
  trySummarizeOnce(summarizeProps, options, cancellationToken = this.cancellationToken, resultsBuilder = new SummarizeResultBuilder()) {
298
- this.lockedSummaryAction(async () => {
384
+ this.lockedSummaryAction(() => {
385
+ this.beforeSummaryAction();
386
+ }, async () => {
299
387
  const summarizeResult = this.generator.summarize(summarizeProps, options, cancellationToken, resultsBuilder);
300
388
  // ensure we wait till the end of the process
301
389
  return summarizeResult.receivedSummaryAckOrNack;
390
+ }, () => {
391
+ this.afterSummaryAction();
302
392
  }).catch((error) => {
303
393
  // SummaryGenerator.summarize() does not throw exceptions - it converts them to failed result
304
394
  // on resultsBuilder
@@ -315,7 +405,10 @@ export class RunningSummarizer {
315
405
  this.tryWhileSummarizing = true;
316
406
  return;
317
407
  }
318
- this.lockedSummaryAction(async () => {
408
+ this.lockedSummaryAction(() => {
409
+ this.beforeSummaryAction();
410
+ }, async () => {
411
+ var _a;
319
412
  const attempts = [
320
413
  { refreshLatestAck: false, fullTree: false },
321
414
  { refreshLatestAck: true, fullTree: false },
@@ -325,8 +418,22 @@ export class RunningSummarizer {
325
418
  let overrideDelaySeconds;
326
419
  let summaryAttempts = 0;
327
420
  let summaryAttemptsPerPhase = 0;
421
+ // Reducing the default number of attempts to defaultNumberofSummarizationAttempts.
422
+ let totalAttempts = this.shouldAbortOnSummaryFailure
423
+ ? numberOfAttemptsOnRestartAsRecovery
424
+ : (_a = this.mc.config.getNumber("Fluid.Summarizer.Attempts")) !== null && _a !== void 0 ? _a : defaultNumberSummarizationAttempts;
425
+ if (totalAttempts > attempts.length) {
426
+ this.mc.logger.sendTelemetryEvent({
427
+ eventName: "InvalidSummarizerAttempts",
428
+ attempts: totalAttempts,
429
+ });
430
+ totalAttempts = defaultNumberSummarizationAttempts;
431
+ }
432
+ else if (totalAttempts < 1) {
433
+ throw new UsageError("Invalid number of attempts.");
434
+ }
328
435
  let lastResult;
329
- for (let summaryAttemptPhase = 0; summaryAttemptPhase < attempts.length;) {
436
+ for (let summaryAttemptPhase = 0; summaryAttemptPhase < totalAttempts;) {
330
437
  if (this.cancellationToken.cancelled) {
331
438
  return;
332
439
  }
@@ -335,17 +442,10 @@ export class RunningSummarizer {
335
442
  return;
336
443
  }
337
444
  summaryAttemptsPerPhase++;
338
- const _a = attempts[summaryAttemptPhase], { delaySeconds: regularDelaySeconds = 0 } = _a, options = __rest(_a, ["delaySeconds"]);
339
- const delaySeconds = overrideDelaySeconds !== null && overrideDelaySeconds !== void 0 ? overrideDelaySeconds : regularDelaySeconds;
445
+ const _b = attempts[summaryAttemptPhase], { delaySeconds: regularDelaySeconds = 0 } = _b, options = __rest(_b, ["delaySeconds"]);
340
446
  const summarizeProps = Object.assign({ reason,
341
447
  summaryAttempts,
342
448
  summaryAttemptsPerPhase, summaryAttemptPhase: summaryAttemptPhase + 1 }, options);
343
- if (delaySeconds > 0) {
344
- this.logger.sendPerformanceEvent(Object.assign({ eventName: "SummarizeAttemptDelay", duration: delaySeconds, summaryNackDelay: overrideDelaySeconds !== undefined }, summarizeProps));
345
- await delay(delaySeconds * 1000);
346
- }
347
- // Make sure the refresh Summary Ack is not being executed.
348
- await this.refreshSummaryAckLock;
349
449
  // Note: no need to account for cancellationToken.waitCancelled here, as
350
450
  // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
351
451
  const resultSummarize = this.generator.summarize(summarizeProps, options, cancellationToken);
@@ -361,16 +461,33 @@ export class RunningSummarizer {
361
461
  summaryAttemptsPerPhase = 0;
362
462
  }
363
463
  lastResult = result;
464
+ const delaySeconds = overrideDelaySeconds !== null && overrideDelaySeconds !== void 0 ? overrideDelaySeconds : regularDelaySeconds;
465
+ if (delaySeconds > 0) {
466
+ this.mc.logger.sendPerformanceEvent(Object.assign({ eventName: "SummarizeAttemptDelay", duration: delaySeconds, summaryNackDelay: overrideDelaySeconds !== undefined }, summarizeProps));
467
+ await delay(delaySeconds * 1000);
468
+ }
469
+ }
470
+ if (this.shouldAbortOnSummaryFailure) {
471
+ this.mc.logger.sendTelemetryEvent({
472
+ eventName: "ClosingSummarizerOnSummaryStale",
473
+ reason,
474
+ message: lastResult === null || lastResult === void 0 ? void 0 : lastResult.message,
475
+ }, lastResult === null || lastResult === void 0 ? void 0 : lastResult.error);
476
+ this.stopSummarizerCallback("latestSummaryStateStale");
477
+ this.runtime.closeFn();
478
+ return;
364
479
  }
365
480
  // If all attempts failed, log error (with last attempt info) and close the summarizer container
366
- this.logger.sendErrorEvent({
481
+ this.mc.logger.sendErrorEvent({
367
482
  eventName: "FailToSummarize",
368
483
  reason,
369
484
  message: lastResult === null || lastResult === void 0 ? void 0 : lastResult.message,
370
485
  }, lastResult === null || lastResult === void 0 ? void 0 : lastResult.error);
371
486
  this.stopSummarizerCallback("failToSummarize");
487
+ }, () => {
488
+ this.afterSummaryAction();
372
489
  }).catch((error) => {
373
- this.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
490
+ this.mc.logger.sendErrorEvent({ eventName: "UnexpectedSummarizeError" }, error);
374
491
  });
375
492
  }
376
493
  /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */