@fluidframework/container-runtime 2.0.0-dev.5.3.2.178189 → 2.0.0-dev.6.4.0.191457

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 (526) hide show
  1. package/CHANGELOG.md +123 -0
  2. package/README.md +4 -3
  3. package/dist/batchTracker.d.ts +3 -2
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +6 -5
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +10 -16
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +184 -172
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/connectionTelemetry.d.ts.map +1 -1
  12. package/dist/connectionTelemetry.js +25 -16
  13. package/dist/connectionTelemetry.js.map +1 -1
  14. package/dist/containerRuntime.d.ts +161 -35
  15. package/dist/containerRuntime.d.ts.map +1 -1
  16. package/dist/containerRuntime.js +697 -449
  17. package/dist/containerRuntime.js.map +1 -1
  18. package/dist/dataStore.d.ts.map +1 -1
  19. package/dist/dataStore.js +15 -7
  20. package/dist/dataStore.js.map +1 -1
  21. package/dist/dataStoreContext.d.ts +3 -2
  22. package/dist/dataStoreContext.d.ts.map +1 -1
  23. package/dist/dataStoreContext.js +83 -87
  24. package/dist/dataStoreContext.js.map +1 -1
  25. package/dist/dataStoreContexts.d.ts +1 -2
  26. package/dist/dataStoreContexts.d.ts.map +1 -1
  27. package/dist/dataStoreContexts.js +8 -9
  28. package/dist/dataStoreContexts.js.map +1 -1
  29. package/dist/dataStoreRegistry.js +2 -2
  30. package/dist/dataStoreRegistry.js.map +1 -1
  31. package/dist/dataStores.d.ts +22 -6
  32. package/dist/dataStores.d.ts.map +1 -1
  33. package/dist/dataStores.js +123 -81
  34. package/dist/dataStores.js.map +1 -1
  35. package/dist/deltaManagerProxyBase.d.ts +35 -0
  36. package/dist/deltaManagerProxyBase.d.ts.map +1 -0
  37. package/dist/deltaManagerProxyBase.js +77 -0
  38. package/dist/deltaManagerProxyBase.js.map +1 -0
  39. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  40. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  41. package/dist/deltaManagerSummarizerProxy.js +4 -2
  42. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  43. package/dist/deltaScheduler.d.ts.map +1 -1
  44. package/dist/deltaScheduler.js +10 -10
  45. package/dist/deltaScheduler.js.map +1 -1
  46. package/dist/error.d.ts +14 -0
  47. package/dist/error.d.ts.map +1 -0
  48. package/dist/error.js +21 -0
  49. package/dist/error.js.map +1 -0
  50. package/dist/gc/garbageCollection.d.ts +10 -9
  51. package/dist/gc/garbageCollection.d.ts.map +1 -1
  52. package/dist/gc/garbageCollection.js +61 -53
  53. package/dist/gc/garbageCollection.js.map +1 -1
  54. package/dist/gc/gcConfigs.d.ts.map +1 -1
  55. package/dist/gc/gcConfigs.js +18 -14
  56. package/dist/gc/gcConfigs.js.map +1 -1
  57. package/dist/gc/gcDefinitions.d.ts +17 -4
  58. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  59. package/dist/gc/gcDefinitions.js +14 -15
  60. package/dist/gc/gcDefinitions.js.map +1 -1
  61. package/dist/gc/gcHelpers.d.ts +0 -8
  62. package/dist/gc/gcHelpers.d.ts.map +1 -1
  63. package/dist/gc/gcHelpers.js +11 -24
  64. package/dist/gc/gcHelpers.js.map +1 -1
  65. package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
  66. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  67. package/dist/gc/gcSummaryStateTracker.js +19 -58
  68. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  69. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  70. package/dist/gc/gcTelemetry.js +45 -35
  71. package/dist/gc/gcTelemetry.js.map +1 -1
  72. package/dist/gc/gcUnreferencedStateTracker.js +4 -4
  73. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  74. package/dist/gc/index.d.ts +2 -2
  75. package/dist/gc/index.d.ts.map +1 -1
  76. package/dist/gc/index.js +3 -5
  77. package/dist/gc/index.js.map +1 -1
  78. package/dist/id-compressor/appendOnlySortedMap.d.ts +8 -30
  79. package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  80. package/dist/id-compressor/appendOnlySortedMap.js +26 -68
  81. package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
  82. package/dist/id-compressor/finalSpace.d.ts +29 -0
  83. package/dist/id-compressor/finalSpace.d.ts.map +1 -0
  84. package/dist/id-compressor/finalSpace.js +62 -0
  85. package/dist/id-compressor/finalSpace.js.map +1 -0
  86. package/dist/id-compressor/idCompressor.d.ts +25 -250
  87. package/dist/id-compressor/idCompressor.d.ts.map +1 -1
  88. package/dist/id-compressor/idCompressor.js +390 -1153
  89. package/dist/id-compressor/idCompressor.js.map +1 -1
  90. package/dist/id-compressor/identifiers.d.ts +32 -0
  91. package/dist/id-compressor/identifiers.d.ts.map +1 -0
  92. package/dist/id-compressor/identifiers.js +15 -0
  93. package/dist/id-compressor/identifiers.js.map +1 -0
  94. package/dist/id-compressor/index.d.ts +5 -6
  95. package/dist/id-compressor/index.d.ts.map +1 -1
  96. package/dist/id-compressor/index.js +20 -26
  97. package/dist/id-compressor/index.js.map +1 -1
  98. package/dist/id-compressor/persistanceUtilities.d.ts +22 -0
  99. package/dist/id-compressor/persistanceUtilities.d.ts.map +1 -0
  100. package/dist/id-compressor/persistanceUtilities.js +43 -0
  101. package/dist/id-compressor/persistanceUtilities.js.map +1 -0
  102. package/dist/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  103. package/dist/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  104. package/dist/id-compressor/sessionSpaceNormalizer.js +80 -0
  105. package/dist/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  106. package/dist/id-compressor/sessions.d.ts +115 -0
  107. package/dist/id-compressor/sessions.d.ts.map +1 -0
  108. package/dist/id-compressor/sessions.js +305 -0
  109. package/dist/id-compressor/sessions.js.map +1 -0
  110. package/dist/id-compressor/utilities.d.ts +49 -0
  111. package/dist/id-compressor/utilities.d.ts.map +1 -0
  112. package/dist/id-compressor/utilities.js +166 -0
  113. package/dist/id-compressor/utilities.js.map +1 -0
  114. package/dist/index.d.ts +3 -3
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +6 -4
  117. package/dist/index.js.map +1 -1
  118. package/dist/opLifecycle/batchManager.js +10 -6
  119. package/dist/opLifecycle/batchManager.js.map +1 -1
  120. package/dist/opLifecycle/opCompressor.d.ts +2 -2
  121. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  122. package/dist/opLifecycle/opCompressor.js +12 -7
  123. package/dist/opLifecycle/opCompressor.js.map +1 -1
  124. package/dist/opLifecycle/opDecompressor.d.ts +2 -2
  125. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  126. package/dist/opLifecycle/opDecompressor.js +23 -20
  127. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  128. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  129. package/dist/opLifecycle/opGroupingManager.js +19 -9
  130. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  131. package/dist/opLifecycle/opSplitter.d.ts +2 -2
  132. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  133. package/dist/opLifecycle/opSplitter.js +22 -19
  134. package/dist/opLifecycle/opSplitter.js.map +1 -1
  135. package/dist/opLifecycle/outbox.d.ts +7 -5
  136. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  137. package/dist/opLifecycle/outbox.js +22 -31
  138. package/dist/opLifecycle/outbox.js.map +1 -1
  139. package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  140. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  141. package/dist/opLifecycle/remoteMessageProcessor.js +19 -7
  142. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  143. package/dist/opProperties.js +1 -2
  144. package/dist/opProperties.js.map +1 -1
  145. package/dist/packageVersion.d.ts +1 -1
  146. package/dist/packageVersion.js +1 -1
  147. package/dist/packageVersion.js.map +1 -1
  148. package/dist/pendingStateManager.d.ts +18 -8
  149. package/dist/pendingStateManager.d.ts.map +1 -1
  150. package/dist/pendingStateManager.js +73 -51
  151. package/dist/pendingStateManager.js.map +1 -1
  152. package/dist/scheduleManager.d.ts.map +1 -1
  153. package/dist/scheduleManager.js +36 -32
  154. package/dist/scheduleManager.js.map +1 -1
  155. package/dist/summary/index.d.ts +3 -3
  156. package/dist/summary/index.d.ts.map +1 -1
  157. package/dist/summary/index.js +2 -1
  158. package/dist/summary/index.js.map +1 -1
  159. package/dist/summary/orderedClientElection.d.ts +3 -3
  160. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  161. package/dist/summary/orderedClientElection.js +26 -27
  162. package/dist/summary/orderedClientElection.js.map +1 -1
  163. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  164. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  165. package/dist/summary/runningSummarizer.d.ts +31 -10
  166. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  167. package/dist/summary/runningSummarizer.js +271 -139
  168. package/dist/summary/runningSummarizer.js.map +1 -1
  169. package/dist/summary/summarizer.d.ts +8 -7
  170. package/dist/summary/summarizer.d.ts.map +1 -1
  171. package/dist/summary/summarizer.js +79 -78
  172. package/dist/summary/summarizer.js.map +1 -1
  173. package/dist/summary/summarizerClientElection.d.ts +2 -2
  174. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  175. package/dist/summary/summarizerClientElection.js +7 -11
  176. package/dist/summary/summarizerClientElection.js.map +1 -1
  177. package/dist/summary/summarizerHeuristics.js +10 -14
  178. package/dist/summary/summarizerHeuristics.js.map +1 -1
  179. package/dist/summary/summarizerNode/index.d.ts +1 -1
  180. package/dist/summary/summarizerNode/index.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/index.js.map +1 -1
  182. package/dist/summary/summarizerNode/summarizerNode.d.ts +10 -19
  183. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  184. package/dist/summary/summarizerNode/summarizerNode.js +57 -130
  185. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  186. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
  187. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  188. package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  189. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  190. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -14
  191. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  192. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +15 -101
  193. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  194. package/dist/summary/summarizerTypes.d.ts +38 -25
  195. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  196. package/dist/summary/summarizerTypes.js.map +1 -1
  197. package/dist/summary/summaryCollection.d.ts +2 -3
  198. package/dist/summary/summaryCollection.d.ts.map +1 -1
  199. package/dist/summary/summaryCollection.js +12 -13
  200. package/dist/summary/summaryCollection.js.map +1 -1
  201. package/dist/summary/summaryFormat.d.ts +3 -0
  202. package/dist/summary/summaryFormat.d.ts.map +1 -1
  203. package/dist/summary/summaryFormat.js +6 -4
  204. package/dist/summary/summaryFormat.js.map +1 -1
  205. package/dist/summary/summaryGenerator.d.ts +10 -4
  206. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  207. package/dist/summary/summaryGenerator.js +106 -57
  208. package/dist/summary/summaryGenerator.js.map +1 -1
  209. package/dist/summary/summaryManager.d.ts +8 -8
  210. package/dist/summary/summaryManager.d.ts.map +1 -1
  211. package/dist/summary/summaryManager.js +38 -28
  212. package/dist/summary/summaryManager.js.map +1 -1
  213. package/lib/batchTracker.d.ts +3 -2
  214. package/lib/batchTracker.d.ts.map +1 -1
  215. package/lib/batchTracker.js +5 -4
  216. package/lib/batchTracker.js.map +1 -1
  217. package/lib/blobManager.d.ts +10 -16
  218. package/lib/blobManager.d.ts.map +1 -1
  219. package/lib/blobManager.js +159 -147
  220. package/lib/blobManager.js.map +1 -1
  221. package/lib/connectionTelemetry.d.ts.map +1 -1
  222. package/lib/connectionTelemetry.js +15 -6
  223. package/lib/connectionTelemetry.js.map +1 -1
  224. package/lib/containerRuntime.d.ts +161 -35
  225. package/lib/containerRuntime.d.ts.map +1 -1
  226. package/lib/containerRuntime.js +651 -402
  227. package/lib/containerRuntime.js.map +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +13 -5
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +3 -2
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +47 -51
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -2
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -4
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.js +1 -1
  240. package/lib/dataStoreRegistry.js.map +1 -1
  241. package/lib/dataStores.d.ts +22 -6
  242. package/lib/dataStores.d.ts.map +1 -1
  243. package/lib/dataStores.js +107 -65
  244. package/lib/dataStores.js.map +1 -1
  245. package/lib/deltaManagerProxyBase.d.ts +35 -0
  246. package/lib/deltaManagerProxyBase.d.ts.map +1 -0
  247. package/lib/deltaManagerProxyBase.js +73 -0
  248. package/lib/deltaManagerProxyBase.js.map +1 -0
  249. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  250. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  251. package/lib/deltaManagerSummarizerProxy.js +3 -1
  252. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  253. package/lib/deltaScheduler.d.ts.map +1 -1
  254. package/lib/deltaScheduler.js +7 -7
  255. package/lib/deltaScheduler.js.map +1 -1
  256. package/lib/error.d.ts +14 -0
  257. package/lib/error.d.ts.map +1 -0
  258. package/lib/error.js +17 -0
  259. package/lib/error.js.map +1 -0
  260. package/lib/gc/garbageCollection.d.ts +10 -9
  261. package/lib/gc/garbageCollection.d.ts.map +1 -1
  262. package/lib/gc/garbageCollection.js +61 -53
  263. package/lib/gc/garbageCollection.js.map +1 -1
  264. package/lib/gc/gcConfigs.d.ts.map +1 -1
  265. package/lib/gc/gcConfigs.js +16 -12
  266. package/lib/gc/gcConfigs.js.map +1 -1
  267. package/lib/gc/gcDefinitions.d.ts +17 -4
  268. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  269. package/lib/gc/gcDefinitions.js +13 -14
  270. package/lib/gc/gcDefinitions.js.map +1 -1
  271. package/lib/gc/gcHelpers.d.ts +0 -8
  272. package/lib/gc/gcHelpers.d.ts.map +1 -1
  273. package/lib/gc/gcHelpers.js +5 -17
  274. package/lib/gc/gcHelpers.js.map +1 -1
  275. package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
  276. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  277. package/lib/gc/gcSummaryStateTracker.js +20 -59
  278. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  279. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  280. package/lib/gc/gcTelemetry.js +46 -36
  281. package/lib/gc/gcTelemetry.js.map +1 -1
  282. package/lib/gc/gcUnreferencedStateTracker.js +1 -1
  283. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  284. package/lib/gc/index.d.ts +2 -2
  285. package/lib/gc/index.d.ts.map +1 -1
  286. package/lib/gc/index.js +2 -2
  287. package/lib/gc/index.js.map +1 -1
  288. package/lib/id-compressor/appendOnlySortedMap.d.ts +8 -30
  289. package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -1
  290. package/lib/id-compressor/appendOnlySortedMap.js +25 -66
  291. package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
  292. package/lib/id-compressor/finalSpace.d.ts +29 -0
  293. package/lib/id-compressor/finalSpace.d.ts.map +1 -0
  294. package/lib/id-compressor/finalSpace.js +58 -0
  295. package/lib/id-compressor/finalSpace.js.map +1 -0
  296. package/lib/id-compressor/idCompressor.d.ts +25 -250
  297. package/lib/id-compressor/idCompressor.d.ts.map +1 -1
  298. package/lib/id-compressor/idCompressor.js +385 -1142
  299. package/lib/id-compressor/idCompressor.js.map +1 -1
  300. package/lib/id-compressor/identifiers.d.ts +32 -0
  301. package/lib/id-compressor/identifiers.d.ts.map +1 -0
  302. package/lib/id-compressor/identifiers.js +11 -0
  303. package/lib/id-compressor/identifiers.js.map +1 -0
  304. package/lib/id-compressor/index.d.ts +5 -6
  305. package/lib/id-compressor/index.d.ts.map +1 -1
  306. package/lib/id-compressor/index.js +5 -6
  307. package/lib/id-compressor/index.js.map +1 -1
  308. package/lib/id-compressor/persistanceUtilities.d.ts +22 -0
  309. package/lib/id-compressor/persistanceUtilities.d.ts.map +1 -0
  310. package/lib/id-compressor/persistanceUtilities.js +34 -0
  311. package/lib/id-compressor/persistanceUtilities.js.map +1 -0
  312. package/lib/id-compressor/sessionSpaceNormalizer.d.ts +46 -0
  313. package/lib/id-compressor/sessionSpaceNormalizer.d.ts.map +1 -0
  314. package/lib/id-compressor/sessionSpaceNormalizer.js +76 -0
  315. package/lib/id-compressor/sessionSpaceNormalizer.js.map +1 -0
  316. package/lib/id-compressor/sessions.d.ts +115 -0
  317. package/lib/id-compressor/sessions.d.ts.map +1 -0
  318. package/lib/id-compressor/sessions.js +290 -0
  319. package/lib/id-compressor/sessions.js.map +1 -0
  320. package/lib/id-compressor/utilities.d.ts +49 -0
  321. package/lib/id-compressor/utilities.d.ts.map +1 -0
  322. package/lib/id-compressor/utilities.js +148 -0
  323. package/lib/id-compressor/utilities.js.map +1 -0
  324. package/lib/index.d.ts +3 -3
  325. package/lib/index.d.ts.map +1 -1
  326. package/lib/index.js +2 -2
  327. package/lib/index.js.map +1 -1
  328. package/lib/opLifecycle/batchManager.js +10 -6
  329. package/lib/opLifecycle/batchManager.js.map +1 -1
  330. package/lib/opLifecycle/opCompressor.d.ts +2 -2
  331. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  332. package/lib/opLifecycle/opCompressor.js +10 -5
  333. package/lib/opLifecycle/opCompressor.js.map +1 -1
  334. package/lib/opLifecycle/opDecompressor.d.ts +2 -2
  335. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  336. package/lib/opLifecycle/opDecompressor.js +15 -12
  337. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  338. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  339. package/lib/opLifecycle/opGroupingManager.js +17 -7
  340. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  341. package/lib/opLifecycle/opSplitter.d.ts +2 -2
  342. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  343. package/lib/opLifecycle/opSplitter.js +13 -10
  344. package/lib/opLifecycle/opSplitter.js.map +1 -1
  345. package/lib/opLifecycle/outbox.d.ts +7 -5
  346. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  347. package/lib/opLifecycle/outbox.js +13 -22
  348. package/lib/opLifecycle/outbox.js.map +1 -1
  349. package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  350. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  351. package/lib/opLifecycle/remoteMessageProcessor.js +20 -8
  352. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  353. package/lib/opProperties.js +1 -2
  354. package/lib/opProperties.js.map +1 -1
  355. package/lib/packageVersion.d.ts +1 -1
  356. package/lib/packageVersion.js +1 -1
  357. package/lib/packageVersion.js.map +1 -1
  358. package/lib/pendingStateManager.d.ts +18 -8
  359. package/lib/pendingStateManager.d.ts.map +1 -1
  360. package/lib/pendingStateManager.js +62 -40
  361. package/lib/pendingStateManager.js.map +1 -1
  362. package/lib/scheduleManager.d.ts.map +1 -1
  363. package/lib/scheduleManager.js +18 -14
  364. package/lib/scheduleManager.js.map +1 -1
  365. package/lib/summary/index.d.ts +3 -3
  366. package/lib/summary/index.d.ts.map +1 -1
  367. package/lib/summary/index.js +1 -1
  368. package/lib/summary/index.js.map +1 -1
  369. package/lib/summary/orderedClientElection.d.ts +3 -3
  370. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  371. package/lib/summary/orderedClientElection.js +21 -22
  372. package/lib/summary/orderedClientElection.js.map +1 -1
  373. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  374. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  375. package/lib/summary/runningSummarizer.d.ts +31 -10
  376. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  377. package/lib/summary/runningSummarizer.js +265 -133
  378. package/lib/summary/runningSummarizer.js.map +1 -1
  379. package/lib/summary/summarizer.d.ts +8 -7
  380. package/lib/summary/summarizer.d.ts.map +1 -1
  381. package/lib/summary/summarizer.js +75 -74
  382. package/lib/summary/summarizer.js.map +1 -1
  383. package/lib/summary/summarizerClientElection.d.ts +2 -2
  384. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  385. package/lib/summary/summarizerClientElection.js +6 -10
  386. package/lib/summary/summarizerClientElection.js.map +1 -1
  387. package/lib/summary/summarizerHeuristics.js +9 -13
  388. package/lib/summary/summarizerHeuristics.js.map +1 -1
  389. package/lib/summary/summarizerNode/index.d.ts +1 -1
  390. package/lib/summary/summarizerNode/index.d.ts.map +1 -1
  391. package/lib/summary/summarizerNode/index.js.map +1 -1
  392. package/lib/summary/summarizerNode/summarizerNode.d.ts +10 -19
  393. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  394. package/lib/summary/summarizerNode/summarizerNode.js +42 -115
  395. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  396. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
  397. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  398. package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
  399. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  400. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -14
  401. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  402. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +14 -100
  403. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  404. package/lib/summary/summarizerTypes.d.ts +38 -25
  405. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  406. package/lib/summary/summarizerTypes.js.map +1 -1
  407. package/lib/summary/summaryCollection.d.ts +2 -3
  408. package/lib/summary/summaryCollection.d.ts.map +1 -1
  409. package/lib/summary/summaryCollection.js +5 -6
  410. package/lib/summary/summaryCollection.js.map +1 -1
  411. package/lib/summary/summaryFormat.d.ts +3 -0
  412. package/lib/summary/summaryFormat.d.ts.map +1 -1
  413. package/lib/summary/summaryFormat.js +5 -3
  414. package/lib/summary/summaryFormat.js.map +1 -1
  415. package/lib/summary/summaryGenerator.d.ts +10 -4
  416. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  417. package/lib/summary/summaryGenerator.js +100 -51
  418. package/lib/summary/summaryGenerator.js.map +1 -1
  419. package/lib/summary/summaryManager.d.ts +8 -8
  420. package/lib/summary/summaryManager.d.ts.map +1 -1
  421. package/lib/summary/summaryManager.js +35 -25
  422. package/lib/summary/summaryManager.js.map +1 -1
  423. package/package.json +28 -31
  424. package/src/batchTracker.ts +7 -5
  425. package/src/blobManager.ts +188 -166
  426. package/src/connectionTelemetry.ts +9 -4
  427. package/src/containerRuntime.ts +806 -441
  428. package/src/dataStore.ts +12 -4
  429. package/src/dataStoreContext.ts +39 -43
  430. package/src/dataStoreContexts.ts +4 -6
  431. package/src/dataStoreRegistry.ts +1 -1
  432. package/src/dataStores.ts +114 -80
  433. package/src/deltaManagerProxyBase.ts +111 -0
  434. package/src/deltaManagerSummarizerProxy.ts +4 -1
  435. package/src/deltaScheduler.ts +7 -11
  436. package/src/error.ts +18 -0
  437. package/src/gc/garbageCollection.md +53 -5
  438. package/src/gc/garbageCollection.ts +58 -52
  439. package/src/gc/gcConfigs.ts +4 -2
  440. package/src/gc/gcDefinitions.ts +17 -20
  441. package/src/gc/gcEarlyAdoption.md +145 -0
  442. package/src/gc/gcHelpers.ts +1 -12
  443. package/src/gc/gcSummaryStateTracker.ts +19 -65
  444. package/src/gc/gcTelemetry.ts +14 -12
  445. package/src/gc/gcUnreferencedStateTracker.ts +1 -1
  446. package/src/gc/index.ts +2 -4
  447. package/src/id-compressor/appendOnlySortedMap.ts +26 -87
  448. package/src/id-compressor/finalSpace.ts +67 -0
  449. package/src/id-compressor/idCompressor.ts +458 -1682
  450. package/src/id-compressor/identifiers.ts +42 -0
  451. package/src/id-compressor/index.ts +11 -20
  452. package/src/id-compressor/persistanceUtilities.ts +58 -0
  453. package/src/id-compressor/sessionSpaceNormalizer.ts +83 -0
  454. package/src/id-compressor/sessions.ts +405 -0
  455. package/src/id-compressor/utilities.ts +187 -0
  456. package/src/index.ts +7 -2
  457. package/src/opLifecycle/opCompressor.ts +6 -5
  458. package/src/opLifecycle/opDecompressor.ts +6 -4
  459. package/src/opLifecycle/opGroupingManager.ts +9 -6
  460. package/src/opLifecycle/opSplitter.ts +7 -6
  461. package/src/opLifecycle/outbox.ts +23 -32
  462. package/src/opLifecycle/remoteMessageProcessor.ts +27 -8
  463. package/src/packageVersion.ts +1 -1
  464. package/src/pendingStateManager.ts +72 -42
  465. package/src/scheduleManager.ts +7 -5
  466. package/src/summary/index.ts +4 -3
  467. package/src/summary/orderedClientElection.ts +10 -6
  468. package/src/summary/runWhileConnectedCoordinator.ts +1 -1
  469. package/src/summary/runningSummarizer.ts +291 -163
  470. package/src/summary/summarizer.ts +27 -16
  471. package/src/summary/summarizerClientElection.ts +2 -2
  472. package/src/summary/summarizerHeuristics.ts +1 -1
  473. package/src/summary/summarizerNode/index.ts +1 -2
  474. package/src/summary/summarizerNode/summarizerNode.ts +36 -160
  475. package/src/summary/summarizerNode/summarizerNodeUtils.ts +7 -38
  476. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +11 -130
  477. package/src/summary/summarizerTypes.ts +40 -25
  478. package/src/summary/summaryCollection.ts +3 -3
  479. package/src/summary/summaryFormat.ts +4 -1
  480. package/src/summary/summaryGenerator.ts +52 -52
  481. package/src/summary/summaryManager.ts +44 -17
  482. package/dist/id-compressor/idRange.d.ts +0 -11
  483. package/dist/id-compressor/idRange.d.ts.map +0 -1
  484. package/dist/id-compressor/idRange.js +0 -29
  485. package/dist/id-compressor/idRange.js.map +0 -1
  486. package/dist/id-compressor/numericUuid.d.ts +0 -59
  487. package/dist/id-compressor/numericUuid.d.ts.map +0 -1
  488. package/dist/id-compressor/numericUuid.js +0 -325
  489. package/dist/id-compressor/numericUuid.js.map +0 -1
  490. package/dist/id-compressor/sessionIdNormalizer.d.ts +0 -138
  491. package/dist/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  492. package/dist/id-compressor/sessionIdNormalizer.js +0 -488
  493. package/dist/id-compressor/sessionIdNormalizer.js.map +0 -1
  494. package/dist/id-compressor/utils.d.ts +0 -57
  495. package/dist/id-compressor/utils.d.ts.map +0 -1
  496. package/dist/id-compressor/utils.js +0 -90
  497. package/dist/id-compressor/utils.js.map +0 -1
  498. package/dist/id-compressor/uuidUtilities.d.ts +0 -28
  499. package/dist/id-compressor/uuidUtilities.d.ts.map +0 -1
  500. package/dist/id-compressor/uuidUtilities.js +0 -104
  501. package/dist/id-compressor/uuidUtilities.js.map +0 -1
  502. package/lib/id-compressor/idRange.d.ts +0 -11
  503. package/lib/id-compressor/idRange.d.ts.map +0 -1
  504. package/lib/id-compressor/idRange.js +0 -25
  505. package/lib/id-compressor/idRange.js.map +0 -1
  506. package/lib/id-compressor/numericUuid.d.ts +0 -59
  507. package/lib/id-compressor/numericUuid.d.ts.map +0 -1
  508. package/lib/id-compressor/numericUuid.js +0 -315
  509. package/lib/id-compressor/numericUuid.js.map +0 -1
  510. package/lib/id-compressor/sessionIdNormalizer.d.ts +0 -138
  511. package/lib/id-compressor/sessionIdNormalizer.d.ts.map +0 -1
  512. package/lib/id-compressor/sessionIdNormalizer.js +0 -484
  513. package/lib/id-compressor/sessionIdNormalizer.js.map +0 -1
  514. package/lib/id-compressor/utils.d.ts +0 -57
  515. package/lib/id-compressor/utils.d.ts.map +0 -1
  516. package/lib/id-compressor/utils.js +0 -79
  517. package/lib/id-compressor/utils.js.map +0 -1
  518. package/lib/id-compressor/uuidUtilities.d.ts +0 -28
  519. package/lib/id-compressor/uuidUtilities.d.ts.map +0 -1
  520. package/lib/id-compressor/uuidUtilities.js +0 -96
  521. package/lib/id-compressor/uuidUtilities.js.map +0 -1
  522. package/src/id-compressor/idRange.ts +0 -35
  523. package/src/id-compressor/numericUuid.ts +0 -383
  524. package/src/id-compressor/sessionIdNormalizer.ts +0 -609
  525. package/src/id-compressor/utils.ts +0 -114
  526. package/src/id-compressor/uuidUtilities.ts +0 -120
@@ -3,18 +3,17 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { IDisposable } from "@fluidframework/core-interfaces";
6
+ import { IDisposable, ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
7
7
  import {
8
- ITelemetryLoggerExt,
9
- ChildLogger,
10
8
  isFluidError,
11
- loggerToMonitoringContext,
12
9
  MonitoringContext,
10
+ createChildMonitoringContext,
11
+ createChildLogger,
12
+ UsageError,
13
13
  } from "@fluidframework/telemetry-utils";
14
- import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/common-utils";
15
- import { UsageError } from "@fluidframework/container-utils";
16
- import { DriverErrorType } from "@fluidframework/driver-definitions";
17
- import { isRuntimeMessage } from "@fluidframework/driver-utils";
14
+ import { assert, delay, Deferred, PromiseTimer } from "@fluidframework/core-utils";
15
+ import { TypedEventEmitter } from "@fluid-internal/client-utils";
16
+ import { DriverErrorTypes } from "@fluidframework/driver-definitions";
18
17
  import { ISequencedDocumentMessage, MessageType } from "@fluidframework/protocol-definitions";
19
18
  import { ISummaryConfiguration } from "../containerRuntime";
20
19
  import { opSize } from "../opProperties";
@@ -35,6 +34,8 @@ import {
35
34
  ISummarizerRuntime,
36
35
  ISummarizeRunnerTelemetry,
37
36
  IRefreshSummaryAckOptions,
37
+ ISummarizerEvents,
38
+ ISummarizeEventProps,
38
39
  } from "./summarizerTypes";
39
40
  import { IAckedSummary, IClientSummaryWatcher, SummaryCollection } from "./summaryCollection";
40
41
  import {
@@ -46,7 +47,16 @@ import {
46
47
 
47
48
  const maxSummarizeAckWaitTime = 10 * 60 * 1000; // 10 minutes
48
49
 
49
- const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
50
+ /**
51
+ * The maximum number of summarization attempts that will be done by default in case of failures
52
+ * that can be retried.
53
+ */
54
+ export const defaultMaxAttempts = 2;
55
+ /**
56
+ * The default value for maximum number of summarization attempts that will be done for summarization failures where
57
+ * submit fails and the failure can be retried.
58
+ */
59
+ export const defaultMaxAttemptsForSubmitFailures = 5;
50
60
 
51
61
  /**
52
62
  * An instance of RunningSummarizer manages the heuristics for summarizing.
@@ -55,9 +65,9 @@ const defaultNumberSummarizationAttempts = 2; // only up to 2 attempts
55
65
  * track of summaries that it is generating as they are broadcast and acked/nacked.
56
66
  * This object is created and controlled by Summarizer object.
57
67
  */
58
- export class RunningSummarizer implements IDisposable {
68
+ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> implements IDisposable {
59
69
  public static async start(
60
- logger: ITelemetryLoggerExt,
70
+ logger: ITelemetryBaseLogger,
61
71
  summaryWatcher: IClientSummaryWatcher,
62
72
  configuration: ISummaryConfiguration,
63
73
  submitSummaryCallback: (options: ISubmitSummaryOptions) => Promise<SubmitSummaryResult>,
@@ -90,7 +100,10 @@ export class RunningSummarizer implements IDisposable {
90
100
  // Handle summary acks asynchronously
91
101
  // Note: no exceptions are thrown from processIncomingSummaryAcks handler as it handles all exceptions
92
102
  summarizer.processIncomingSummaryAcks(lastAckRefSeq).catch((error) => {
93
- logger.sendErrorEvent({ eventName: "HandleSummaryAckFatalError" }, error);
103
+ createChildLogger({ logger }).sendErrorEvent(
104
+ { eventName: "HandleSummaryAckFatalError" },
105
+ error,
106
+ );
94
107
  });
95
108
 
96
109
  // Update heuristic counts
@@ -138,7 +151,7 @@ export class RunningSummarizer implements IDisposable {
138
151
  | {
139
152
  reason: SummarizeReason;
140
153
  afterSequenceNumber: number;
141
- options: ISummarizeOptions;
154
+ summarizeOptions: ISummarizeOptions;
142
155
  readonly resultsBuilder: SummarizeResultBuilder;
143
156
  }
144
157
  | undefined;
@@ -146,11 +159,13 @@ export class RunningSummarizer implements IDisposable {
146
159
  private totalSuccessfulAttempts = 0;
147
160
  private initialized = false;
148
161
 
149
- private readonly deltaManagerListener;
150
162
  private readonly runtimeListener;
151
163
 
164
+ /** The maximum number of summary attempts to do when submit summary fails. */
165
+ private readonly maxAttemptsForSubmitFailures: number;
166
+
152
167
  private constructor(
153
- baseLogger: ITelemetryLoggerExt,
168
+ baseLogger: ITelemetryBaseLogger,
154
169
  private readonly summaryWatcher: IClientSummaryWatcher,
155
170
  private readonly configuration: ISummaryConfiguration,
156
171
  private readonly submitSummaryCallback: (
@@ -165,16 +180,20 @@ export class RunningSummarizer implements IDisposable {
165
180
  private readonly stopSummarizerCallback: (reason: SummarizerStopReason) => void,
166
181
  private readonly runtime: ISummarizerRuntime,
167
182
  ) {
183
+ super();
184
+
168
185
  const telemetryProps: ISummarizeRunnerTelemetry = {
169
186
  summarizeCount: () => this.summarizeCount,
170
187
  summarizerSuccessfulAttempts: () => this.totalSuccessfulAttempts,
171
188
  };
172
189
 
173
- this.mc = loggerToMonitoringContext(
174
- ChildLogger.create(baseLogger, "Running", {
190
+ this.mc = createChildMonitoringContext({
191
+ logger: baseLogger,
192
+ namespace: "Running",
193
+ properties: {
175
194
  all: telemetryProps,
176
- }),
177
- );
195
+ },
196
+ });
178
197
 
179
198
  if (configuration.state !== "disableHeuristics") {
180
199
  assert(
@@ -235,25 +254,22 @@ export class RunningSummarizer implements IDisposable {
235
254
  this.mc.logger,
236
255
  );
237
256
 
238
- // Listen to deltaManager for non-runtime ops
239
- this.deltaManagerListener = (op) => {
240
- if (!isRuntimeMessage(op)) {
241
- this.handleOp(op, false);
242
- }
243
- };
244
-
245
- // Listen to runtime for runtime ops
246
- this.runtimeListener = (op, runtimeMessage) => {
247
- if (runtimeMessage) {
248
- this.handleOp(op, true);
249
- }
257
+ // Listen to runtime for ops
258
+ this.runtimeListener = (op: ISequencedDocumentMessage, runtimeMessage?: boolean) => {
259
+ this.handleOp(op, runtimeMessage === true);
250
260
  };
251
-
252
- // Purpose of listening to deltaManager is for back-compat
253
- // 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)
254
- // Tracked by AB#3883
255
- this.runtime.deltaManager.on("op", this.deltaManagerListener);
256
261
  this.runtime.on("op", this.runtimeListener);
262
+
263
+ // The max attempts for submit failures can be overridden via a feature flag. This allows us to
264
+ // tweak this as per telemetry data until we arrive at a stable number.
265
+ // If its set to a number higher than `defaultMaxAttemptsForSubmitFailures`, it will be ignored.
266
+ const overrideMaxAttempts = this.mc.config.getNumber(
267
+ "Fluid.Summarizer.AttemptsForSubmitFailures",
268
+ );
269
+ this.maxAttemptsForSubmitFailures =
270
+ overrideMaxAttempts && overrideMaxAttempts < defaultMaxAttemptsForSubmitFailures
271
+ ? overrideMaxAttempts
272
+ : defaultMaxAttemptsForSubmitFailures;
257
273
  }
258
274
 
259
275
  private async handleSummaryAck(): Promise<number> {
@@ -295,7 +311,7 @@ export class RunningSummarizer implements IDisposable {
295
311
  // by calling `refreshLatestSummaryAckFromServer` and we will be fine.
296
312
  const isIgnoredError =
297
313
  isFluidError(error) &&
298
- error.errorType === DriverErrorType.fileNotFoundOrAccessDeniedError;
314
+ error.errorType === DriverErrorTypes.fileNotFoundOrAccessDeniedError;
299
315
 
300
316
  summaryLogger.sendTelemetryEvent(
301
317
  {
@@ -347,7 +363,6 @@ export class RunningSummarizer implements IDisposable {
347
363
  }
348
364
 
349
365
  public dispose(): void {
350
- this.runtime.deltaManager.off("op", this.deltaManagerListener);
351
366
  this.runtime.off("op", this.runtimeListener);
352
367
  this.summaryWatcher.dispose();
353
368
  this.heuristicRunner?.dispose();
@@ -444,7 +459,7 @@ export class RunningSummarizer implements IDisposable {
444
459
  if (this.summarizingLock === undefined) {
445
460
  this.trySummarizeOnce(
446
461
  // summarizeProps
447
- { reason: "lastSummary" },
462
+ { summarizeReason: "lastSummary" },
448
463
  // ISummarizeOptions, using defaults: { refreshLatestAck: false, fullTree: false }
449
464
  {},
450
465
  );
@@ -504,7 +519,7 @@ export class RunningSummarizer implements IDisposable {
504
519
  * @param before - set of instructions to run before running the action.
505
520
  * @param action - action to perform.
506
521
  * @param after - set of instructions to run after running the action.
507
- * @returns - result of action.
522
+ * @returns The result of the action.
508
523
  */
509
524
  private async lockedSummaryAction<T>(
510
525
  before: () => void,
@@ -539,7 +554,6 @@ export class RunningSummarizer implements IDisposable {
539
554
  private trySummarizeOnce(
540
555
  summarizeProps: ISummarizeTelemetryProperties,
541
556
  options: ISummarizeOptions,
542
- cancellationToken = this.cancellationToken,
543
557
  resultsBuilder = new SummarizeResultBuilder(),
544
558
  ): ISummarizeResults {
545
559
  this.lockedSummaryAction(
@@ -547,12 +561,16 @@ export class RunningSummarizer implements IDisposable {
547
561
  this.beforeSummaryAction();
548
562
  },
549
563
  async () => {
550
- const summarizeResult = this.generator.summarize(
551
- summarizeProps,
552
- options,
553
- cancellationToken,
554
- resultsBuilder,
555
- );
564
+ const summaryLogger = createChildLogger({
565
+ logger: this.mc.logger,
566
+ properties: { all: summarizeProps },
567
+ });
568
+ const summaryOptions: ISubmitSummaryOptions = {
569
+ ...options,
570
+ summaryLogger,
571
+ cancellationToken: this.cancellationToken,
572
+ };
573
+ const summarizeResult = this.generator.summarize(summaryOptions, resultsBuilder);
556
574
  // ensure we wait till the end of the process
557
575
  return summarizeResult.receivedSummaryAckOrNack;
558
576
  },
@@ -570,10 +588,7 @@ export class RunningSummarizer implements IDisposable {
570
588
  }
571
589
 
572
590
  /** Heuristics summarize attempt. */
573
- private trySummarize(
574
- reason: SummarizeReason,
575
- cancellationToken = this.cancellationToken,
576
- ): void {
591
+ private trySummarize(reason: SummarizeReason): void {
577
592
  if (this.summarizingLock !== undefined) {
578
593
  // lockedSummaryAction() will retry heuristic-based summary at the end of current attempt
579
594
  // if it's still needed
@@ -586,101 +601,9 @@ export class RunningSummarizer implements IDisposable {
586
601
  this.beforeSummaryAction();
587
602
  },
588
603
  async () => {
589
- const attempts: (ISummarizeOptions & { delaySeconds?: number })[] = [
590
- { refreshLatestAck: false, fullTree: false },
591
- { refreshLatestAck: true, fullTree: false },
592
- { refreshLatestAck: true, fullTree: false, delaySeconds: 2 * 60 },
593
- { refreshLatestAck: true, fullTree: true, delaySeconds: 10 * 60 },
594
- ];
595
- let overrideDelaySeconds: number | undefined;
596
- let summaryAttempts = 0;
597
- let summaryAttemptsPerPhase = 0;
598
- // Reducing the default number of attempts to defaultNumberofSummarizationAttempts.
599
- let totalAttempts =
600
- this.mc.config.getNumber("Fluid.Summarizer.Attempts") ??
601
- defaultNumberSummarizationAttempts;
602
-
603
- if (totalAttempts > attempts.length) {
604
- this.mc.logger.sendTelemetryEvent({
605
- eventName: "InvalidSummarizerAttempts",
606
- attempts: totalAttempts,
607
- });
608
- totalAttempts = defaultNumberSummarizationAttempts;
609
- } else if (totalAttempts < 1) {
610
- throw new UsageError("Invalid number of attempts.");
611
- }
612
-
613
- let lastResult: { message: string; error: any } | undefined;
614
-
615
- for (let summaryAttemptPhase = 0; summaryAttemptPhase < totalAttempts; ) {
616
- if (this.cancellationToken.cancelled) {
617
- return;
618
- }
619
-
620
- // We only want to attempt 1 summary when reason is "lastSummary"
621
- if (++summaryAttempts > 1 && reason === "lastSummary") {
622
- return;
623
- }
624
-
625
- summaryAttemptsPerPhase++;
626
-
627
- const { delaySeconds: regularDelaySeconds = 0, ...options } =
628
- attempts[summaryAttemptPhase];
629
-
630
- const summarizeProps: ISummarizeTelemetryProperties = {
631
- reason,
632
- summaryAttempts,
633
- summaryAttemptsPerPhase,
634
- summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
635
- ...options,
636
- };
637
-
638
- // Note: no need to account for cancellationToken.waitCancelled here, as
639
- // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
640
- const resultSummarize = this.generator.summarize(
641
- summarizeProps,
642
- options,
643
- cancellationToken,
644
- );
645
- const result = await resultSummarize.receivedSummaryAckOrNack;
646
-
647
- if (result.success) {
648
- return;
649
- }
650
-
651
- // Check for retryDelay that can come from summaryNack or upload summary flow.
652
- // Retry the same step only once per retryAfter response.
653
- overrideDelaySeconds = result.retryAfterSeconds;
654
- if (overrideDelaySeconds === undefined || summaryAttemptsPerPhase > 1) {
655
- summaryAttemptPhase++;
656
- summaryAttemptsPerPhase = 0;
657
- }
658
- lastResult = result;
659
-
660
- const delaySeconds = overrideDelaySeconds ?? regularDelaySeconds;
661
-
662
- if (delaySeconds > 0) {
663
- this.mc.logger.sendPerformanceEvent({
664
- eventName: "SummarizeAttemptDelay",
665
- duration: delaySeconds,
666
- summaryNackDelay: overrideDelaySeconds !== undefined,
667
- ...summarizeProps,
668
- });
669
- await delay(delaySeconds * 1000);
670
- }
671
- }
672
-
673
- // If all attempts failed, log error (with last attempt info) and close the summarizer container
674
- this.mc.logger.sendErrorEvent(
675
- {
676
- eventName: "FailToSummarize",
677
- reason,
678
- message: lastResult?.message,
679
- },
680
- lastResult?.error,
681
- );
682
-
683
- this.stopSummarizerCallback("failToSummarize");
604
+ return this.mc.config.getBoolean("Fluid.Summarizer.UseDynamicRetries")
605
+ ? this.trySummarizeWithRetries(reason)
606
+ : this.trySummarizeWithStaticAttempts(reason);
684
607
  },
685
608
  () => {
686
609
  this.afterSummaryAction();
@@ -690,10 +613,220 @@ export class RunningSummarizer implements IDisposable {
690
613
  });
691
614
  }
692
615
 
616
+ /**
617
+ * Tries to summarize 2 times with pre-defined summary options. If an attempt fails with "retryAfterSeconds"
618
+ * param, that attempt is tried once more.
619
+ */
620
+ private async trySummarizeWithStaticAttempts(reason: SummarizeReason) {
621
+ const attemptOptions: ISummarizeOptions[] = [
622
+ { refreshLatestAck: false, fullTree: false },
623
+ { refreshLatestAck: true, fullTree: false },
624
+ ];
625
+ let summaryAttempts = 0;
626
+ let summaryAttemptsPerPhase = 0;
627
+ let summaryAttemptPhase = 0;
628
+ while (summaryAttemptPhase < attemptOptions.length) {
629
+ if (this.cancellationToken.cancelled) {
630
+ return;
631
+ }
632
+
633
+ // We only want to attempt 1 summary when reason is "lastSummary"
634
+ if (++summaryAttempts > 1 && reason === "lastSummary") {
635
+ return;
636
+ }
637
+
638
+ summaryAttemptsPerPhase++;
639
+
640
+ const summarizeOptions = attemptOptions[summaryAttemptPhase];
641
+ const summarizeProps: ISummarizeTelemetryProperties = {
642
+ summarizeReason: reason,
643
+ summaryAttempts,
644
+ summaryAttemptsPerPhase,
645
+ summaryAttemptPhase: summaryAttemptPhase + 1, // make everything 1-based
646
+ ...summarizeOptions,
647
+ };
648
+ const summaryLogger = createChildLogger({
649
+ logger: this.mc.logger,
650
+ properties: { all: summarizeProps },
651
+ });
652
+ const summaryOptions: ISubmitSummaryOptions = {
653
+ ...summarizeOptions,
654
+ summaryLogger,
655
+ cancellationToken: this.cancellationToken,
656
+ };
657
+
658
+ // Note: no need to account for cancellationToken.waitCancelled here, as
659
+ // this is accounted SummaryGenerator.summarizeCore that controls receivedSummaryAckOrNack.
660
+ const resultSummarize = this.generator.summarize(summaryOptions);
661
+ const ackNackResult = await resultSummarize.receivedSummaryAckOrNack;
662
+ if (ackNackResult.success) {
663
+ return;
664
+ }
665
+
666
+ // Check for retryDelay that can come from summaryNack, upload summary or submit summary flows.
667
+ // Retry the same step only once per retryAfter response.
668
+ const submitResult = await resultSummarize.summarySubmitted;
669
+ const delaySeconds = !submitResult.success
670
+ ? submitResult.data?.retryAfterSeconds
671
+ : ackNackResult.data?.retryAfterSeconds;
672
+ if (delaySeconds === undefined || summaryAttemptsPerPhase > 1) {
673
+ summaryAttemptPhase++;
674
+ summaryAttemptsPerPhase = 0;
675
+ }
676
+
677
+ if (delaySeconds !== undefined) {
678
+ this.mc.logger.sendPerformanceEvent({
679
+ eventName: "SummarizeAttemptDelay",
680
+ duration: delaySeconds,
681
+ summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
682
+ ...summarizeProps,
683
+ });
684
+ await delay(delaySeconds * 1000);
685
+ }
686
+ }
687
+ this.stopSummarizerCallback("failToSummarize");
688
+ }
689
+
690
+ /**
691
+ * Tries to summarize with retries where retry is based on the failure params.
692
+ * For example, summarization may be retried for failures with "retryAfterSeconds" param.
693
+ */
694
+ private async trySummarizeWithRetries(reason: SummarizeReason) {
695
+ // Helper to set summarize options, telemetry properties and call summarize.
696
+ const attemptSummarize = (attemptNumber: number, finalAttempt: boolean) => {
697
+ const summarizeOptions: ISummarizeOptions = {
698
+ fullTree: false,
699
+ };
700
+ const summarizeProps: ISummarizeTelemetryProperties = {
701
+ summarizeReason: reason,
702
+ summaryAttempts: attemptNumber,
703
+ ...summarizeOptions,
704
+ finalAttempt,
705
+ };
706
+ const summaryLogger = createChildLogger({
707
+ logger: this.mc.logger,
708
+ properties: { all: summarizeProps },
709
+ });
710
+ const summaryOptions: ISubmitSummaryOptions = {
711
+ ...summarizeOptions,
712
+ summaryLogger,
713
+ cancellationToken: this.cancellationToken,
714
+ finalAttempt,
715
+ };
716
+ const summarizeResult = this.generator.summarize(summaryOptions);
717
+ return { summarizeProps, summarizeResult };
718
+ };
719
+
720
+ // The max number of attempts are based on the stage at which summarization failed. If it fails before it is
721
+ // submitted, a different value is used compared to if it fails after submission. Usually, in the former case,
722
+ // we would retry more often as its cheaper and retries are likely to succeed.
723
+ // This makes it harder to predict how many attempts would actually happen as that depends on how far an attempt
724
+ // made. To keep things simple, the max attempts is reset after every attempt based on where it failed. This may
725
+ // result in some failures not being retried depending on what happened before this attempt. That's fine because
726
+ // such scenarios are very unlikely and even if it happens, it would resolve when a new summarizer starts over.
727
+ // For example - When failure switches from one the submit failures to nack failure, only one more retry will
728
+ // happen irrespective of the value of `defaultMaxAttempts`.
729
+ let maxAttempts = defaultMaxAttempts;
730
+ let currentAttempt = 0;
731
+ let retryAfterSeconds: number | undefined;
732
+ let done = false;
733
+ let result: "success" | "failure" | "canceled" = "success";
734
+ do {
735
+ currentAttempt++;
736
+ if (this.cancellationToken.cancelled) {
737
+ result = "canceled";
738
+ done = true;
739
+ break;
740
+ }
741
+
742
+ const { summarizeProps, summarizeResult } = attemptSummarize(
743
+ currentAttempt,
744
+ false /* finalAttempt */,
745
+ );
746
+
747
+ // Ack / nack is the final step, so if it succeeds we're done.
748
+ const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
749
+ if (ackNackResult.success) {
750
+ result = "success";
751
+ done = true;
752
+ break;
753
+ }
754
+
755
+ // Update max attempts and retry params from the failure result.
756
+ // If submit summary failed, use the params from "summarySubmitted" result. Else, use the params
757
+ // from "receivedSummaryAckOrNack" result.
758
+ // Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
759
+ const submitSummaryResult = await summarizeResult.summarySubmitted;
760
+ if (!submitSummaryResult.success) {
761
+ maxAttempts = this.maxAttemptsForSubmitFailures;
762
+ retryAfterSeconds = submitSummaryResult.data?.retryAfterSeconds;
763
+ } else {
764
+ maxAttempts = defaultMaxAttempts;
765
+ retryAfterSeconds = ackNackResult.data?.retryAfterSeconds;
766
+ }
767
+
768
+ // Emit "summarize" event for this failed attempt.
769
+ result = "failure";
770
+ const eventProps: ISummarizeEventProps = {
771
+ result,
772
+ currentAttempt,
773
+ maxAttempts,
774
+ error: ackNackResult.error,
775
+ };
776
+ this.emit("summarize", eventProps);
777
+
778
+ // If the failure doesn't have "retryAfterSeconds" or the max number of attempts have been done, we're done.
779
+ if (retryAfterSeconds === undefined || currentAttempt >= maxAttempts - 1) {
780
+ done = true;
781
+ }
782
+
783
+ // If the failure has "retryAfterSeconds", add a delay of that time. In this case, a final attempt will
784
+ // take place and we need to wait for "retryAfterSeconds" before that.
785
+ if (retryAfterSeconds !== undefined) {
786
+ this.mc.logger.sendPerformanceEvent({
787
+ eventName: "SummarizeAttemptDelay",
788
+ duration: retryAfterSeconds,
789
+ summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
790
+ stage: submitSummaryResult.data?.stage,
791
+ dynamicRetries: true, // To differentiate this telemetry from regular retry logic
792
+ ...summarizeProps,
793
+ });
794
+ await delay(retryAfterSeconds * 1000);
795
+ }
796
+ } while (!done);
797
+
798
+ // If summarize attempt did not fail, emit "summarize" event and return. A failed attempt may be retried below.
799
+ if (result !== "failure") {
800
+ this.emit("summarize", { result, currentAttempt, maxAttempts });
801
+ return;
802
+ }
803
+
804
+ // If summarization wasn't successful above and the failure contains "retryAfterSeconds", perform one last
805
+ // attempt. This gives a chance to the runtime to perform additional steps in the last attempt.
806
+ if (retryAfterSeconds !== undefined) {
807
+ const { summarizeResult } = attemptSummarize(++currentAttempt, true /* finalAttempt */);
808
+ // Ack / nack is the final step, so if it succeeds we're done.
809
+ const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
810
+ result = ackNackResult.success ? "success" : "failure";
811
+ const eventProps: ISummarizeEventProps = {
812
+ result,
813
+ currentAttempt,
814
+ maxAttempts,
815
+ error: ackNackResult.success ? undefined : ackNackResult.error,
816
+ };
817
+ this.emit("summarize", eventProps);
818
+ }
819
+
820
+ // If summarization is still unsuccessful, stop the summarizer.
821
+ if (result === "failure") {
822
+ this.stopSummarizerCallback("failToSummarize");
823
+ }
824
+ }
825
+
693
826
  /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
694
827
  public summarizeOnDemand(
828
+ options: IOnDemandSummarizeOptions,
695
829
  resultsBuilder: SummarizeResultBuilder = new SummarizeResultBuilder(),
696
- { reason, ...options }: IOnDemandSummarizeOptions,
697
830
  ): ISummarizeResults {
698
831
  if (this.stopping) {
699
832
  resultsBuilder.fail("RunningSummarizer stopped or disposed", undefined);
@@ -706,23 +839,18 @@ export class RunningSummarizer implements IDisposable {
706
839
  throw new UsageError("Attempted to run an already-running summarizer on demand");
707
840
  }
708
841
 
842
+ const { reason, ...summarizeOptions } = options;
709
843
  const result = this.trySummarizeOnce(
710
- { reason: `onDemand/${reason}` },
711
- options,
712
- this.cancellationToken,
844
+ { summarizeReason: `onDemand/${reason}` },
845
+ summarizeOptions,
713
846
  resultsBuilder,
714
847
  );
715
848
  return result;
716
849
  }
717
850
 
718
851
  /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
719
- public enqueueSummarize({
720
- reason,
721
- afterSequenceNumber = 0,
722
- override = false,
723
- ...options
724
- }: IEnqueueSummarizeOptions): EnqueueSummarizeResult {
725
- const onDemandReason = `enqueue;${reason}` as const;
852
+ public enqueueSummarize(options: IEnqueueSummarizeOptions): EnqueueSummarizeResult {
853
+ const { reason, afterSequenceNumber = 0, override = false, ...summarizeOptions } = options;
726
854
  let overridden = false;
727
855
  if (this.enqueuedSummary !== undefined) {
728
856
  if (!override) {
@@ -736,10 +864,11 @@ export class RunningSummarizer implements IDisposable {
736
864
  this.enqueuedSummary = undefined;
737
865
  overridden = true;
738
866
  }
867
+
739
868
  this.enqueuedSummary = {
740
- reason: onDemandReason,
869
+ reason: `enqueue;${reason}`,
741
870
  afterSequenceNumber,
742
- options,
871
+ summarizeOptions,
743
872
  resultsBuilder: new SummarizeResultBuilder(),
744
873
  };
745
874
  const results = this.enqueuedSummary.resultsBuilder.build();
@@ -766,13 +895,12 @@ export class RunningSummarizer implements IDisposable {
766
895
  // If no enqueued summary is ready or a summary is already in progress, take no action.
767
896
  return false;
768
897
  }
769
- const { reason, resultsBuilder, options } = this.enqueuedSummary;
898
+ const { reason, resultsBuilder, summarizeOptions } = this.enqueuedSummary;
770
899
  // Set to undefined first, so that subsequent enqueue attempt while summarize will occur later.
771
900
  this.enqueuedSummary = undefined;
772
901
  this.trySummarizeOnce(
773
- { reason: `enqueuedSummary/${reason}` },
774
- options,
775
- this.cancellationToken,
902
+ { summarizeReason: `enqueuedSummary/${reason}` },
903
+ summarizeOptions,
776
904
  resultsBuilder,
777
905
  );
778
906
  return true;