@fluidframework/container-runtime 2.0.0-dev-rc.3.0.0.250606 → 2.0.0-dev-rc.3.0.0.253463

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/api-report/container-runtime.api.md +34 -33
  2. package/dist/batchTracker.d.ts.map +1 -1
  3. package/dist/batchTracker.js +4 -4
  4. package/dist/batchTracker.js.map +1 -1
  5. package/dist/blobManager.d.ts +31 -23
  6. package/dist/blobManager.d.ts.map +1 -1
  7. package/dist/blobManager.js +81 -99
  8. package/dist/blobManager.js.map +1 -1
  9. package/dist/channelCollection.d.ts +3 -2
  10. package/dist/channelCollection.d.ts.map +1 -1
  11. package/dist/channelCollection.js +71 -71
  12. package/dist/channelCollection.js.map +1 -1
  13. package/dist/connectionTelemetry.d.ts +1 -1
  14. package/dist/connectionTelemetry.d.ts.map +1 -1
  15. package/dist/connectionTelemetry.js +16 -16
  16. package/dist/connectionTelemetry.js.map +1 -1
  17. package/dist/container-runtime-alpha.d.ts +64 -36
  18. package/dist/container-runtime-beta.d.ts +28 -28
  19. package/dist/container-runtime-public.d.ts +28 -28
  20. package/dist/container-runtime-untrimmed.d.ts +66 -38
  21. package/dist/containerHandleContext.d.ts.map +1 -1
  22. package/dist/containerHandleContext.js +2 -2
  23. package/dist/containerHandleContext.js.map +1 -1
  24. package/dist/containerRuntime.d.ts +12 -8
  25. package/dist/containerRuntime.d.ts.map +1 -1
  26. package/dist/containerRuntime.js +177 -150
  27. package/dist/containerRuntime.js.map +1 -1
  28. package/dist/dataStore.d.ts +1 -1
  29. package/dist/dataStore.d.ts.map +1 -1
  30. package/dist/dataStore.js +7 -7
  31. package/dist/dataStore.js.map +1 -1
  32. package/dist/dataStoreContext.d.ts +8 -8
  33. package/dist/dataStoreContext.d.ts.map +1 -1
  34. package/dist/dataStoreContext.js +60 -60
  35. package/dist/dataStoreContext.js.map +1 -1
  36. package/dist/dataStoreContexts.d.ts.map +1 -1
  37. package/dist/dataStoreContexts.js +11 -11
  38. package/dist/dataStoreContexts.js.map +1 -1
  39. package/dist/dataStoreRegistry.d.ts +1 -1
  40. package/dist/dataStoreRegistry.d.ts.map +1 -1
  41. package/dist/dataStoreRegistry.js +2 -2
  42. package/dist/dataStoreRegistry.js.map +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  44. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  45. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  46. package/dist/deltaScheduler.d.ts.map +1 -1
  47. package/dist/deltaScheduler.js +6 -6
  48. package/dist/deltaScheduler.js.map +1 -1
  49. package/dist/error.d.ts +1 -1
  50. package/dist/error.d.ts.map +1 -1
  51. package/dist/error.js +4 -4
  52. package/dist/error.js.map +1 -1
  53. package/dist/gc/garbageCollection.d.ts +2 -1
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +20 -20
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +1 -1
  58. package/dist/gc/gcConfigs.d.ts.map +1 -1
  59. package/dist/gc/gcConfigs.js +4 -5
  60. package/dist/gc/gcConfigs.js.map +1 -1
  61. package/dist/gc/gcDefinitions.d.ts +3 -2
  62. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  63. package/dist/gc/gcDefinitions.js.map +1 -1
  64. package/dist/gc/gcHelpers.d.ts +5 -1
  65. package/dist/gc/gcHelpers.d.ts.map +1 -1
  66. package/dist/gc/gcHelpers.js +21 -12
  67. package/dist/gc/gcHelpers.js.map +1 -1
  68. package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
  69. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  70. package/dist/gc/gcSummaryStateTracker.js +11 -11
  71. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  72. package/dist/gc/gcTelemetry.d.ts +2 -1
  73. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  74. package/dist/gc/gcTelemetry.js +11 -9
  75. package/dist/gc/gcTelemetry.js.map +1 -1
  76. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  77. package/dist/gc/gcUnreferencedStateTracker.js +6 -6
  78. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  79. package/dist/gc/index.d.ts +1 -1
  80. package/dist/gc/index.d.ts.map +1 -1
  81. package/dist/gc/index.js +2 -1
  82. package/dist/gc/index.js.map +1 -1
  83. package/dist/messageTypes.d.ts +2 -2
  84. package/dist/messageTypes.d.ts.map +1 -1
  85. package/dist/messageTypes.js.map +1 -1
  86. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  87. package/dist/opLifecycle/batchManager.js.map +1 -1
  88. package/dist/opLifecycle/definitions.d.ts +1 -1
  89. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  90. package/dist/opLifecycle/definitions.js.map +1 -1
  91. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  92. package/dist/opLifecycle/opCompressor.js +5 -5
  93. package/dist/opLifecycle/opCompressor.js.map +1 -1
  94. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  95. package/dist/opLifecycle/opDecompressor.js +12 -12
  96. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  97. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  98. package/dist/opLifecycle/opGroupingManager.js +7 -7
  99. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  100. package/dist/opLifecycle/opSplitter.d.ts +1 -1
  101. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  102. package/dist/opLifecycle/opSplitter.js +17 -17
  103. package/dist/opLifecycle/opSplitter.js.map +1 -1
  104. package/dist/opLifecycle/outbox.d.ts +2 -1
  105. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  106. package/dist/opLifecycle/outbox.js +13 -13
  107. package/dist/opLifecycle/outbox.js.map +1 -1
  108. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  109. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  110. package/dist/packageVersion.d.ts +1 -1
  111. package/dist/packageVersion.js +1 -1
  112. package/dist/packageVersion.js.map +1 -1
  113. package/dist/pendingStateManager.d.ts.map +1 -1
  114. package/dist/pendingStateManager.js +18 -18
  115. package/dist/pendingStateManager.js.map +1 -1
  116. package/dist/scheduleManager.d.ts.map +1 -1
  117. package/dist/scheduleManager.js +24 -24
  118. package/dist/scheduleManager.js.map +1 -1
  119. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  120. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  121. package/dist/storageServiceWithAttachBlobs.js +2 -2
  122. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  123. package/dist/summary/documentSchema.d.ts +37 -6
  124. package/dist/summary/documentSchema.d.ts.map +1 -1
  125. package/dist/summary/documentSchema.js +58 -21
  126. package/dist/summary/documentSchema.js.map +1 -1
  127. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  128. package/dist/summary/orderedClientElection.js +7 -7
  129. package/dist/summary/orderedClientElection.js.map +1 -1
  130. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  131. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  132. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  133. package/dist/summary/runningSummarizer.d.ts +1 -1
  134. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  135. package/dist/summary/runningSummarizer.js +16 -16
  136. package/dist/summary/runningSummarizer.js.map +1 -1
  137. package/dist/summary/summarizer.d.ts +2 -1
  138. package/dist/summary/summarizer.d.ts.map +1 -1
  139. package/dist/summary/summarizer.js +12 -12
  140. package/dist/summary/summarizer.js.map +1 -1
  141. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  142. package/dist/summary/summarizerClientElection.js.map +1 -1
  143. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  144. package/dist/summary/summarizerHeuristics.js +2 -2
  145. package/dist/summary/summarizerHeuristics.js.map +1 -1
  146. package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -1
  147. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  148. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  149. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  150. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  151. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  152. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  153. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  154. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  155. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  156. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  157. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  158. package/dist/summary/summarizerTypes.d.ts +4 -2
  159. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  160. package/dist/summary/summarizerTypes.js.map +1 -1
  161. package/dist/summary/summaryCollection.js +7 -7
  162. package/dist/summary/summaryCollection.js.map +1 -1
  163. package/dist/summary/summaryFormat.d.ts +1 -1
  164. package/dist/summary/summaryFormat.d.ts.map +1 -1
  165. package/dist/summary/summaryFormat.js +8 -8
  166. package/dist/summary/summaryFormat.js.map +1 -1
  167. package/dist/summary/summaryGenerator.d.ts +3 -2
  168. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  169. package/dist/summary/summaryGenerator.js +16 -16
  170. package/dist/summary/summaryGenerator.js.map +1 -1
  171. package/dist/summary/summaryManager.d.ts.map +1 -1
  172. package/dist/summary/summaryManager.js +15 -14
  173. package/dist/summary/summaryManager.js.map +1 -1
  174. package/lib/batchTracker.d.ts.map +1 -1
  175. package/lib/batchTracker.js +2 -2
  176. package/lib/batchTracker.js.map +1 -1
  177. package/lib/blobManager.d.ts +31 -23
  178. package/lib/blobManager.d.ts.map +1 -1
  179. package/lib/blobManager.js +46 -64
  180. package/lib/blobManager.js.map +1 -1
  181. package/lib/channelCollection.d.ts +3 -2
  182. package/lib/channelCollection.d.ts.map +1 -1
  183. package/lib/channelCollection.js +6 -6
  184. package/lib/channelCollection.js.map +1 -1
  185. package/lib/connectionTelemetry.d.ts +1 -1
  186. package/lib/connectionTelemetry.d.ts.map +1 -1
  187. package/lib/connectionTelemetry.js +2 -2
  188. package/lib/connectionTelemetry.js.map +1 -1
  189. package/lib/container-runtime-alpha.d.ts +64 -36
  190. package/lib/container-runtime-beta.d.ts +28 -28
  191. package/lib/container-runtime-public.d.ts +28 -28
  192. package/lib/container-runtime-untrimmed.d.ts +66 -38
  193. package/lib/containerHandleContext.d.ts.map +1 -1
  194. package/lib/containerHandleContext.js +1 -1
  195. package/lib/containerHandleContext.js.map +1 -1
  196. package/lib/containerRuntime.d.ts +12 -8
  197. package/lib/containerRuntime.d.ts.map +1 -1
  198. package/lib/containerRuntime.js +56 -27
  199. package/lib/containerRuntime.js.map +1 -1
  200. package/lib/dataStore.d.ts +1 -1
  201. package/lib/dataStore.d.ts.map +1 -1
  202. package/lib/dataStore.js +2 -2
  203. package/lib/dataStore.js.map +1 -1
  204. package/lib/dataStoreContext.d.ts +8 -8
  205. package/lib/dataStoreContext.d.ts.map +1 -1
  206. package/lib/dataStoreContext.js +6 -6
  207. package/lib/dataStoreContext.js.map +1 -1
  208. package/lib/dataStoreContexts.d.ts.map +1 -1
  209. package/lib/dataStoreContexts.js +2 -2
  210. package/lib/dataStoreContexts.js.map +1 -1
  211. package/lib/dataStoreRegistry.d.ts +1 -1
  212. package/lib/dataStoreRegistry.d.ts.map +1 -1
  213. package/lib/dataStoreRegistry.js +1 -1
  214. package/lib/dataStoreRegistry.js.map +1 -1
  215. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  216. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  217. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  218. package/lib/deltaScheduler.d.ts.map +1 -1
  219. package/lib/deltaScheduler.js +1 -1
  220. package/lib/deltaScheduler.js.map +1 -1
  221. package/lib/error.d.ts +1 -1
  222. package/lib/error.d.ts.map +1 -1
  223. package/lib/error.js +2 -2
  224. package/lib/error.js.map +1 -1
  225. package/lib/gc/garbageCollection.d.ts +2 -1
  226. package/lib/gc/garbageCollection.d.ts.map +1 -1
  227. package/lib/gc/garbageCollection.js +4 -4
  228. package/lib/gc/garbageCollection.js.map +1 -1
  229. package/lib/gc/gcConfigs.d.ts +1 -1
  230. package/lib/gc/gcConfigs.d.ts.map +1 -1
  231. package/lib/gc/gcConfigs.js +4 -5
  232. package/lib/gc/gcConfigs.js.map +1 -1
  233. package/lib/gc/gcDefinitions.d.ts +3 -2
  234. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  235. package/lib/gc/gcDefinitions.js.map +1 -1
  236. package/lib/gc/gcHelpers.d.ts +5 -1
  237. package/lib/gc/gcHelpers.d.ts.map +1 -1
  238. package/lib/gc/gcHelpers.js +10 -2
  239. package/lib/gc/gcHelpers.js.map +1 -1
  240. package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
  241. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  242. package/lib/gc/gcSummaryStateTracker.js +2 -2
  243. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  244. package/lib/gc/gcTelemetry.d.ts +2 -1
  245. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  246. package/lib/gc/gcTelemetry.js +3 -1
  247. package/lib/gc/gcTelemetry.js.map +1 -1
  248. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  249. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  250. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  251. package/lib/gc/index.d.ts +1 -1
  252. package/lib/gc/index.d.ts.map +1 -1
  253. package/lib/gc/index.js +1 -1
  254. package/lib/gc/index.js.map +1 -1
  255. package/lib/messageTypes.d.ts +2 -2
  256. package/lib/messageTypes.d.ts.map +1 -1
  257. package/lib/messageTypes.js.map +1 -1
  258. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  259. package/lib/opLifecycle/batchManager.js.map +1 -1
  260. package/lib/opLifecycle/definitions.d.ts +1 -1
  261. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  262. package/lib/opLifecycle/definitions.js.map +1 -1
  263. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  264. package/lib/opLifecycle/opCompressor.js +2 -2
  265. package/lib/opLifecycle/opCompressor.js.map +1 -1
  266. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  267. package/lib/opLifecycle/opDecompressor.js +2 -2
  268. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  269. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  270. package/lib/opLifecycle/opGroupingManager.js +2 -2
  271. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  272. package/lib/opLifecycle/opSplitter.d.ts +1 -1
  273. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  274. package/lib/opLifecycle/opSplitter.js +2 -2
  275. package/lib/opLifecycle/opSplitter.js.map +1 -1
  276. package/lib/opLifecycle/outbox.d.ts +2 -1
  277. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  278. package/lib/opLifecycle/outbox.js +2 -2
  279. package/lib/opLifecycle/outbox.js.map +1 -1
  280. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  281. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  282. package/lib/packageVersion.d.ts +1 -1
  283. package/lib/packageVersion.js +1 -1
  284. package/lib/packageVersion.js.map +1 -1
  285. package/lib/pendingStateManager.d.ts.map +1 -1
  286. package/lib/pendingStateManager.js +2 -2
  287. package/lib/pendingStateManager.js.map +1 -1
  288. package/lib/scheduleManager.d.ts.map +1 -1
  289. package/lib/scheduleManager.js +3 -3
  290. package/lib/scheduleManager.js.map +1 -1
  291. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  292. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  293. package/lib/storageServiceWithAttachBlobs.js +1 -1
  294. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  295. package/lib/summary/documentSchema.d.ts +37 -6
  296. package/lib/summary/documentSchema.d.ts.map +1 -1
  297. package/lib/summary/documentSchema.js +48 -11
  298. package/lib/summary/documentSchema.js.map +1 -1
  299. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  300. package/lib/summary/orderedClientElection.js +2 -2
  301. package/lib/summary/orderedClientElection.js.map +1 -1
  302. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  303. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  304. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  305. package/lib/summary/runningSummarizer.d.ts +1 -1
  306. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  307. package/lib/summary/runningSummarizer.js +2 -2
  308. package/lib/summary/runningSummarizer.js.map +1 -1
  309. package/lib/summary/summarizer.d.ts +2 -1
  310. package/lib/summary/summarizer.d.ts.map +1 -1
  311. package/lib/summary/summarizer.js +2 -2
  312. package/lib/summary/summarizer.js.map +1 -1
  313. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  314. package/lib/summary/summarizerClientElection.js.map +1 -1
  315. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  316. package/lib/summary/summarizerHeuristics.js +1 -1
  317. package/lib/summary/summarizerHeuristics.js.map +1 -1
  318. package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -1
  319. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  320. package/lib/summary/summarizerNode/summarizerNode.js +4 -4
  321. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  322. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  323. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  324. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  325. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  326. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  327. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  328. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  329. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  330. package/lib/summary/summarizerTypes.d.ts +4 -2
  331. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  332. package/lib/summary/summarizerTypes.js.map +1 -1
  333. package/lib/summary/summaryCollection.js +1 -1
  334. package/lib/summary/summaryCollection.js.map +1 -1
  335. package/lib/summary/summaryFormat.d.ts +1 -1
  336. package/lib/summary/summaryFormat.d.ts.map +1 -1
  337. package/lib/summary/summaryFormat.js +3 -3
  338. package/lib/summary/summaryFormat.js.map +1 -1
  339. package/lib/summary/summaryGenerator.d.ts +3 -2
  340. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  341. package/lib/summary/summaryGenerator.js +3 -3
  342. package/lib/summary/summaryGenerator.js.map +1 -1
  343. package/lib/summary/summaryManager.d.ts.map +1 -1
  344. package/lib/summary/summaryManager.js +9 -8
  345. package/lib/summary/summaryManager.js.map +1 -1
  346. package/lib/tsdoc-metadata.json +11 -0
  347. package/package.json +18 -30
  348. package/src/batchTracker.ts +3 -2
  349. package/src/blobManager.ts +87 -56
  350. package/src/channelCollection.ts +14 -11
  351. package/src/connectionTelemetry.ts +4 -4
  352. package/src/containerHandleContext.ts +2 -1
  353. package/src/containerRuntime.ts +90 -58
  354. package/src/dataStore.ts +5 -3
  355. package/src/dataStoreContext.ts +16 -13
  356. package/src/dataStoreContexts.ts +4 -2
  357. package/src/dataStoreRegistry.ts +2 -2
  358. package/src/deltaManagerSummarizerProxy.ts +1 -1
  359. package/src/deltaScheduler.ts +2 -1
  360. package/src/error.ts +2 -2
  361. package/src/gc/garbageCollection.ts +8 -7
  362. package/src/gc/gcConfigs.ts +5 -8
  363. package/src/gc/gcDefinitions.ts +4 -4
  364. package/src/gc/gcHelpers.ts +21 -4
  365. package/src/gc/gcSummaryStateTracker.ts +5 -3
  366. package/src/gc/gcTelemetry.ts +7 -1
  367. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  368. package/src/gc/index.ts +1 -0
  369. package/src/messageTypes.ts +3 -2
  370. package/src/opLifecycle/batchManager.ts +1 -0
  371. package/src/opLifecycle/definitions.ts +2 -1
  372. package/src/opLifecycle/opCompressor.ts +4 -2
  373. package/src/opLifecycle/opDecompressor.ts +3 -2
  374. package/src/opLifecycle/opGroupingManager.ts +3 -2
  375. package/src/opLifecycle/opSplitter.ts +5 -3
  376. package/src/opLifecycle/outbox.ts +6 -3
  377. package/src/opLifecycle/remoteMessageProcessor.ts +2 -0
  378. package/src/packageVersion.ts +1 -1
  379. package/src/pendingStateManager.ts +4 -4
  380. package/src/scheduleManager.ts +5 -4
  381. package/src/storageServiceWithAttachBlobs.ts +2 -2
  382. package/src/summary/documentSchema.ts +71 -12
  383. package/src/summary/orderedClientElection.ts +4 -6
  384. package/src/summary/runWhileConnectedCoordinator.ts +2 -1
  385. package/src/summary/runningSummarizer.ts +4 -2
  386. package/src/summary/summarizer.ts +5 -3
  387. package/src/summary/summarizerClientElection.ts +1 -0
  388. package/src/summary/summarizerHeuristics.ts +3 -1
  389. package/src/summary/summarizerNode/summarizerNode.ts +10 -8
  390. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  391. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +14 -6
  392. package/src/summary/summarizerTypes.ts +6 -2
  393. package/src/summary/summaryCollection.ts +1 -1
  394. package/src/summary/summaryFormat.ts +7 -8
  395. package/src/summary/summaryGenerator.ts +5 -8
  396. package/src/summary/summaryManager.ts +14 -11
  397. package/lib/test/batchTracker.spec.js +0 -88
  398. package/lib/test/batchTracker.spec.js.map +0 -1
  399. package/lib/test/blobManager.spec.js +0 -835
  400. package/lib/test/blobManager.spec.js.map +0 -1
  401. package/lib/test/channelCollection.spec.js +0 -138
  402. package/lib/test/channelCollection.spec.js.map +0 -1
  403. package/lib/test/containerRuntime.spec.js +0 -1750
  404. package/lib/test/containerRuntime.spec.js.map +0 -1
  405. package/lib/test/dataStoreContext.spec.js +0 -771
  406. package/lib/test/dataStoreContext.spec.js.map +0 -1
  407. package/lib/test/dataStoreCreation.spec.js +0 -303
  408. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  409. package/lib/test/dataStoreRegistry.spec.js +0 -26
  410. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  411. package/lib/test/documentSchema.spec.js +0 -282
  412. package/lib/test/documentSchema.spec.js.map +0 -1
  413. package/lib/test/fuzz/fuzzUtils.js +0 -70
  414. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  415. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -33
  416. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  417. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -180
  418. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  419. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -109
  420. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  421. package/lib/test/gc/garbageCollection.spec.js +0 -1464
  422. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  423. package/lib/test/gc/gcConfigs.spec.js +0 -689
  424. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  425. package/lib/test/gc/gcHelpers.spec.js +0 -110
  426. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  427. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  428. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  429. package/lib/test/gc/gcStats.spec.js +0 -390
  430. package/lib/test/gc/gcStats.spec.js.map +0 -1
  431. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  432. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  433. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  434. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  435. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  436. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  437. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  438. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  439. package/lib/test/getPendingBlobs.spec.js +0 -193
  440. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  441. package/lib/test/hardwareStats.spec.js +0 -93
  442. package/lib/test/hardwareStats.spec.js.map +0 -1
  443. package/lib/test/index.js +0 -6
  444. package/lib/test/index.js.map +0 -1
  445. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -202
  446. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  447. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  448. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  449. package/lib/test/opLifecycle/opCompressor.spec.js +0 -73
  450. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  451. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -223
  452. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  453. package/lib/test/opLifecycle/opSplitter.spec.js +0 -287
  454. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  455. package/lib/test/opLifecycle/outbox.spec.js +0 -783
  456. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  457. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -220
  458. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  459. package/lib/test/pendingStateManager.spec.js +0 -329
  460. package/lib/test/pendingStateManager.spec.js.map +0 -1
  461. package/lib/test/scheduleManager.spec.js +0 -270
  462. package/lib/test/scheduleManager.spec.js.map +0 -1
  463. package/lib/test/summarizerNode.spec.js +0 -326
  464. package/lib/test/summarizerNode.spec.js.map +0 -1
  465. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  466. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  467. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  468. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  469. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  470. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  471. package/lib/test/summary/summarizer.spec.js +0 -29
  472. package/lib/test/summary/summarizer.spec.js.map +0 -1
  473. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  474. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  475. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  476. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  477. package/lib/test/summary/summaryCollection.spec.js +0 -200
  478. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  479. package/lib/test/summary/summaryManager.spec.js +0 -430
  480. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  481. package/lib/test/summary/testQuorumClients.js +0 -34
  482. package/lib/test/summary/testQuorumClients.js.map +0 -1
  483. package/lib/test/throttler.spec.js +0 -175
  484. package/lib/test/throttler.spec.js.map +0 -1
  485. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -182
  486. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
@@ -1,228 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { strict as assert } from "assert";
6
- import { SummaryType } from "@fluidframework/protocol-definitions";
7
- import { gcDeletedBlobKey, gcTombstoneBlobKey } from "@fluidframework/runtime-definitions";
8
- import { GCSummaryStateTracker, gcStateBlobKey, nextGCVersion, } from "../../gc/index.js";
9
- describe("GCSummaryStateTracker tests", () => {
10
- describe("Summary state reset", () => {
11
- // In these tests, Persisted = gcVersionInBaseSnapshot. Current = gcVersionInEffect.
12
- it("Persisted < Current: Do Need Reset", async () => {
13
- const tracker = new GCSummaryStateTracker({
14
- shouldRunGC: true,
15
- tombstoneMode: false,
16
- gcVersionInBaseSnapshot: 0,
17
- gcVersionInEffect: 1,
18
- }, true /* wasGCRunInBaseSnapshot */);
19
- assert.equal(tracker.doesGCStateNeedReset, false, "Precondition 1");
20
- assert.equal(tracker.doesSummaryStateNeedReset, true, "Should need reset: Persisted GC Version was old");
21
- // After the first summary succeeds (refreshLatestSummary called), the state should not need reset.
22
- await tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });
23
- assert.equal(tracker.doesSummaryStateNeedReset, false, "Shouldn't need reset after first summary");
24
- });
25
- it("Persisted === Current: Don't Need Reset", () => {
26
- const tracker = new GCSummaryStateTracker({
27
- shouldRunGC: true,
28
- tombstoneMode: false,
29
- gcVersionInBaseSnapshot: 1,
30
- gcVersionInEffect: 1,
31
- }, true /* wasGCRunInBaseSnapshot */);
32
- assert.equal(tracker.doesGCStateNeedReset, false, "Precondition 1");
33
- assert.equal(tracker.doesSummaryStateNeedReset, false, "Shouldn't need reset: GC Versions match");
34
- });
35
- it("Persisted > Current: Do Need Reset", async () => {
36
- const tracker = new GCSummaryStateTracker({
37
- shouldRunGC: true,
38
- tombstoneMode: false,
39
- gcVersionInBaseSnapshot: 2,
40
- gcVersionInEffect: 1,
41
- }, true /* wasGCRunInBaseSnapshot */);
42
- assert.equal(tracker.doesGCStateNeedReset, false, "Precondition 1");
43
- // This covers the case where we rolled back an upgrade. Containers that successfully "upgraded" (reset)
44
- // shouldn't need to do it again.
45
- assert.equal(tracker.doesSummaryStateNeedReset, true, "Should need reset: Persisted GC Version is not old");
46
- // After the first summary succeeds (refreshLatestSummary called), the state should not need reset.
47
- await tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });
48
- assert.equal(tracker.doesSummaryStateNeedReset, false, "Shouldn't need reset after first summary");
49
- });
50
- });
51
- describe("GC state reset", () => {
52
- it("wasGCRunInBaseSnapshot = false, shouldRunGC = false: Don't Need Reset", () => {
53
- const tracker = new GCSummaryStateTracker({
54
- shouldRunGC: false,
55
- tombstoneMode: false,
56
- gcVersionInBaseSnapshot: 1,
57
- gcVersionInEffect: 1,
58
- }, false /* wasGCRunInBaseSnapshot */);
59
- assert.equal(tracker.doesGCStateNeedReset, false, "Shouldn't need reset");
60
- });
61
- it("wasGCRunInBaseSnapshot = true, shouldRunGC = false: Do Need Reset", async () => {
62
- const tracker = new GCSummaryStateTracker({
63
- shouldRunGC: false,
64
- tombstoneMode: false,
65
- gcVersionInBaseSnapshot: 1,
66
- gcVersionInEffect: 1,
67
- }, true /* wasGCRunInBaseSnapshot */);
68
- assert.equal(tracker.doesGCStateNeedReset, true, "Should need reset");
69
- // After the first summary succeeds (refreshLatestSummary called), the state should not need reset.
70
- await tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });
71
- assert.equal(tracker.doesGCStateNeedReset, false, "Shouldn't need reset after first summary");
72
- });
73
- it("wasGCRunInBaseSnapshot = false, shouldRunGC = true: Do Need Reset", async () => {
74
- const tracker = new GCSummaryStateTracker({
75
- shouldRunGC: true,
76
- tombstoneMode: false,
77
- gcVersionInBaseSnapshot: 1,
78
- gcVersionInEffect: 1,
79
- }, false /* wasGCRunInBaseSnapshot */);
80
- assert.equal(tracker.doesGCStateNeedReset, true, "Should need reset");
81
- // After the first summary succeeds (refreshLatestSummary called), the state should not need reset.
82
- await tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });
83
- assert.equal(tracker.doesGCStateNeedReset, false, "Shouldn't need reset after first summary");
84
- });
85
- it("wasGCRunInBaseSnapshot = true, shouldRunGC = true: Don't Need Reset", () => {
86
- const tracker = new GCSummaryStateTracker({
87
- shouldRunGC: true,
88
- tombstoneMode: false,
89
- gcVersionInBaseSnapshot: 1,
90
- gcVersionInEffect: 1,
91
- }, true /* wasGCRunInBaseSnapshot */);
92
- assert.equal(tracker.doesGCStateNeedReset, false, "Shouldn't need reset");
93
- });
94
- });
95
- it("Autorecovery: requesting Full GC", async () => {
96
- const tracker = new GCSummaryStateTracker({
97
- shouldRunGC: true,
98
- tombstoneMode: false,
99
- gcVersionInBaseSnapshot: 1,
100
- gcVersionInEffect: 1,
101
- }, false /* wasGCRunInBaseSnapshot */);
102
- assert.equal(tracker.autoRecovery.fullGCRequested(), false, "Should be false by default");
103
- tracker.autoRecovery.requestFullGCOnNextRun();
104
- assert.equal(tracker.autoRecovery.fullGCRequested(), true, "Should be true after requesting full GC");
105
- // After the first summary succeeds (refreshLatestSummary called), the state should be reset.
106
- await tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });
107
- assert.equal(tracker.autoRecovery.fullGCRequested(), false, "Should be false after Summary Ack");
108
- });
109
- /**
110
- * These tests validate that the GC data is written in summary incrementally. Basically, only parts of the GC
111
- * data that has changed since the last successful summary is re-written, rest is written as SummaryHandle.
112
- */
113
- describe("Incremental summary of GC data", () => {
114
- const nodes = ["node1", "node2", "node3"];
115
- const initialGCState = {
116
- gcNodes: {
117
- "/": { outboundRoutes: [] },
118
- [nodes[0]]: { outboundRoutes: [] },
119
- [nodes[1]]: { outboundRoutes: [] },
120
- },
121
- };
122
- const initialTombstones = [nodes[0], nodes[1]];
123
- const initialDeletedNodes = new Set([nodes[1]]);
124
- let summaryStateTracker;
125
- beforeEach(async () => {
126
- // Creates a summary state tracker and initialize it.
127
- summaryStateTracker = new GCSummaryStateTracker({
128
- shouldRunGC: true,
129
- tombstoneMode: true,
130
- gcVersionInBaseSnapshot: nextGCVersion,
131
- gcVersionInEffect: nextGCVersion,
132
- }, false /* wasGCRunInBaseSnapshot */);
133
- summaryStateTracker.initializeBaseState({
134
- gcState: initialGCState,
135
- tombstones: initialTombstones,
136
- deletedNodes: Array.from(initialDeletedNodes),
137
- });
138
- });
139
- it("does incremental summary when nothing changes", async () => {
140
- // Summarize with the same GC state, tombstone state and deleted nodes as in the initial state.
141
- // The GC data should be summarized as a summary handle.
142
- const summary = summaryStateTracker.summarize(true /* trackState */, initialGCState, initialDeletedNodes, initialTombstones);
143
- assert(summary?.summary.type === SummaryType.Handle, "GC summary should be a handle");
144
- });
145
- it("does incremental summary when only GC state changes", async () => {
146
- // Summarize with the same tombstone state and deleted nodes but different GC state as in the initial.
147
- // state. The GC state should be summarized as a summary handle.
148
- const newGCState = {
149
- gcNodes: {
150
- ...initialGCState.gcNodes,
151
- [nodes[2]]: { outboundRoutes: [] },
152
- },
153
- };
154
- const summary = summaryStateTracker.summarize(true /* trackState */, newGCState, initialDeletedNodes, initialTombstones);
155
- assert(summary?.summary.type === SummaryType.Tree, "GC summary should be a tree");
156
- assert(summary.summary.tree[gcStateBlobKey].type === SummaryType.Blob, "GC state should be written as a blob");
157
- assert(summary.summary.tree[gcTombstoneBlobKey].type === SummaryType.Handle, "Tombstone state should be written as handle");
158
- assert(summary.summary.tree[gcDeletedBlobKey].type === SummaryType.Handle, "Deleted nodes should be written as handle");
159
- });
160
- it("does incremental summary when only tombstone state changes", async () => {
161
- // Summarize with the same GC state and deleted nodes but different tombstone state as in the initial.
162
- // state. The tombstone state should be summarized as a summary handle.
163
- const newTombstones = Array.from([...initialTombstones, nodes[2]]);
164
- const summary = summaryStateTracker.summarize(true /* trackState */, initialGCState, initialDeletedNodes, newTombstones);
165
- assert(summary?.summary.type === SummaryType.Tree, "GC summary should be a tree");
166
- assert(summary.summary.tree[gcStateBlobKey].type === SummaryType.Handle, "GC state should be written as handle");
167
- assert(summary.summary.tree[gcTombstoneBlobKey].type === SummaryType.Blob, "Tombstone state should be written as a blob");
168
- assert(summary.summary.tree[gcDeletedBlobKey].type === SummaryType.Handle, "Deleted nodes should be written as handle");
169
- });
170
- it("does incremental summary when only deleted nodes change", async () => {
171
- // Summarize with the same GC state and tombstone state but different deleted nodes as in the initial.
172
- // state. The deleted nodes should be summarized as a summary handle.
173
- const newDeletedNodes = new Set(...initialDeletedNodes, nodes[2]);
174
- const summary = summaryStateTracker.summarize(true /* trackState */, initialGCState, newDeletedNodes, initialTombstones);
175
- assert(summary?.summary.type === SummaryType.Tree, "GC summary should be a tree");
176
- assert(summary.summary.tree[gcStateBlobKey].type === SummaryType.Handle, "GC state should be written as handle");
177
- assert(summary.summary.tree[gcTombstoneBlobKey].type === SummaryType.Handle, "Tombstone state should be written as handle");
178
- assert(summary.summary.tree[gcDeletedBlobKey].type === SummaryType.Blob, "Deleted nodes should be written as a blob");
179
- });
180
- });
181
- it("updates state updated data store count correctly", async () => {
182
- const updatedDataStoreCount = 10;
183
- const gcStats = {
184
- nodeCount: 0,
185
- unrefNodeCount: 0,
186
- updatedNodeCount: 0,
187
- dataStoreCount: 0,
188
- unrefDataStoreCount: 0,
189
- updatedDataStoreCount,
190
- attachmentBlobCount: 0,
191
- unrefAttachmentBlobCount: 0,
192
- updatedAttachmentBlobCount: 0,
193
- lifetimeNodeCount: 0,
194
- lifetimeDataStoreCount: 0,
195
- lifetimeAttachmentBlobCount: 0,
196
- deletedNodeCount: 0,
197
- deletedDataStoreCount: 0,
198
- deletedAttachmentBlobCount: 0,
199
- };
200
- const summaryStateTracker = new GCSummaryStateTracker({
201
- shouldRunGC: true,
202
- tombstoneMode: true,
203
- gcVersionInBaseSnapshot: nextGCVersion,
204
- gcVersionInEffect: nextGCVersion,
205
- }, false /* wasGCRunInBaseSnapshot */);
206
- let expectedUpdatedDataStoreCount = updatedDataStoreCount;
207
- // Update the state from GC stats and validate it's the same as updatedDataStoreCount.
208
- summaryStateTracker.updateStateFromGCRunStats(gcStats);
209
- assert.strictEqual(summaryStateTracker.updatedDSCountSinceLastSummary, expectedUpdatedDataStoreCount, "Updated DS count is not correct");
210
- // Call summarize but do not refresh latest summary. This mimics scenarios where summary generation fails
211
- // sometime after summarize. This means updatedDSCountSinceLastSummary should be updated incrementally
212
- // without resetting it.
213
- summaryStateTracker.summarize(true /* trackState */, { gcNodes: {} }, new Set(), []);
214
- // Update the stat from GC state again mimicking a GC run after a failed summary.
215
- expectedUpdatedDataStoreCount += updatedDataStoreCount;
216
- summaryStateTracker.updateStateFromGCRunStats(gcStats);
217
- assert.strictEqual(summaryStateTracker.updatedDSCountSinceLastSummary, expectedUpdatedDataStoreCount, "Updated DS count should have been incrementally updated");
218
- // Call summarize and refresh latest summary. This mimics a successful summary after a failed one. After
219
- // this, updatedDSCountSinceLastSummary should be reset to 0.
220
- summaryStateTracker.summarize(true /* trackState */, { gcNodes: {} }, new Set(), []);
221
- await summaryStateTracker.refreshLatestSummary({
222
- isSummaryTracked: true,
223
- isSummaryNewer: true,
224
- });
225
- assert.strictEqual(summaryStateTracker.updatedDSCountSinceLastSummary, 0, "Updated DS count should be reset after refresh latest summary");
226
- });
227
- });
228
- //# sourceMappingURL=gcSummaryStateTracker.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gcSummaryStateTracker.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcSummaryStateTracker.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { SummaryType } from \"@fluidframework/protocol-definitions\";\nimport { gcDeletedBlobKey, gcTombstoneBlobKey } from \"@fluidframework/runtime-definitions\";\nimport {\n\tGCSummaryStateTracker,\n\tGCVersion,\n\tIGCStats,\n\tIGarbageCollectionState,\n\tgcStateBlobKey,\n\tnextGCVersion,\n} from \"../../gc/index.js\";\n\ntype GCSummaryStateTrackerWithPrivates = Omit<GCSummaryStateTracker, \"latestSummaryGCVersion\"> & {\n\tlatestSummaryGCVersion: GCVersion;\n};\n\ndescribe(\"GCSummaryStateTracker tests\", () => {\n\tdescribe(\"Summary state reset\", () => {\n\t\t// In these tests, Persisted = gcVersionInBaseSnapshot. Current = gcVersionInEffect.\n\t\tit(\"Persisted < Current: Do Need Reset\", async () => {\n\t\t\tconst tracker: GCSummaryStateTrackerWithPrivates = new GCSummaryStateTracker(\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\ttombstoneMode: false,\n\t\t\t\t\tgcVersionInBaseSnapshot: 0,\n\t\t\t\t\tgcVersionInEffect: 1,\n\t\t\t\t},\n\t\t\t\ttrue /* wasGCRunInBaseSnapshot */,\n\t\t\t) as any;\n\t\t\tassert.equal(tracker.doesGCStateNeedReset, false, \"Precondition 1\");\n\t\t\tassert.equal(\n\t\t\t\ttracker.doesSummaryStateNeedReset,\n\t\t\t\ttrue,\n\t\t\t\t\"Should need reset: Persisted GC Version was old\",\n\t\t\t);\n\n\t\t\t// After the first summary succeeds (refreshLatestSummary called), the state should not need reset.\n\t\t\tawait tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });\n\n\t\t\tassert.equal(\n\t\t\t\ttracker.doesSummaryStateNeedReset,\n\t\t\t\tfalse,\n\t\t\t\t\"Shouldn't need reset after first summary\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Persisted === Current: Don't Need Reset\", () => {\n\t\t\tconst tracker: GCSummaryStateTrackerWithPrivates = new GCSummaryStateTracker(\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\ttombstoneMode: false,\n\t\t\t\t\tgcVersionInBaseSnapshot: 1,\n\t\t\t\t\tgcVersionInEffect: 1,\n\t\t\t\t},\n\t\t\t\ttrue /* wasGCRunInBaseSnapshot */,\n\t\t\t) as any;\n\t\t\tassert.equal(tracker.doesGCStateNeedReset, false, \"Precondition 1\");\n\t\t\tassert.equal(\n\t\t\t\ttracker.doesSummaryStateNeedReset,\n\t\t\t\tfalse,\n\t\t\t\t\"Shouldn't need reset: GC Versions match\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"Persisted > Current: Do Need Reset\", async () => {\n\t\t\tconst tracker: GCSummaryStateTrackerWithPrivates = new GCSummaryStateTracker(\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\ttombstoneMode: false,\n\t\t\t\t\tgcVersionInBaseSnapshot: 2,\n\t\t\t\t\tgcVersionInEffect: 1,\n\t\t\t\t},\n\t\t\t\ttrue /* wasGCRunInBaseSnapshot */,\n\t\t\t) as any;\n\t\t\tassert.equal(tracker.doesGCStateNeedReset, false, \"Precondition 1\");\n\n\t\t\t// This covers the case where we rolled back an upgrade. Containers that successfully \"upgraded\" (reset)\n\t\t\t// shouldn't need to do it again.\n\t\t\tassert.equal(\n\t\t\t\ttracker.doesSummaryStateNeedReset,\n\t\t\t\ttrue,\n\t\t\t\t\"Should need reset: Persisted GC Version is not old\",\n\t\t\t);\n\n\t\t\t// After the first summary succeeds (refreshLatestSummary called), the state should not need reset.\n\t\t\tawait tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });\n\t\t\tassert.equal(\n\t\t\t\ttracker.doesSummaryStateNeedReset,\n\t\t\t\tfalse,\n\t\t\t\t\"Shouldn't need reset after first summary\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"GC state reset\", () => {\n\t\tit(\"wasGCRunInBaseSnapshot = false, shouldRunGC = false: Don't Need Reset\", () => {\n\t\t\tconst tracker: GCSummaryStateTrackerWithPrivates = new GCSummaryStateTracker(\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: false,\n\t\t\t\t\ttombstoneMode: false,\n\t\t\t\t\tgcVersionInBaseSnapshot: 1,\n\t\t\t\t\tgcVersionInEffect: 1,\n\t\t\t\t},\n\t\t\t\tfalse /* wasGCRunInBaseSnapshot */,\n\t\t\t) as any;\n\t\t\tassert.equal(tracker.doesGCStateNeedReset, false, \"Shouldn't need reset\");\n\t\t});\n\n\t\tit(\"wasGCRunInBaseSnapshot = true, shouldRunGC = false: Do Need Reset\", async () => {\n\t\t\tconst tracker: GCSummaryStateTrackerWithPrivates = new GCSummaryStateTracker(\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: false,\n\t\t\t\t\ttombstoneMode: false,\n\t\t\t\t\tgcVersionInBaseSnapshot: 1,\n\t\t\t\t\tgcVersionInEffect: 1,\n\t\t\t\t},\n\t\t\t\ttrue /* wasGCRunInBaseSnapshot */,\n\t\t\t) as any;\n\t\t\tassert.equal(tracker.doesGCStateNeedReset, true, \"Should need reset\");\n\n\t\t\t// After the first summary succeeds (refreshLatestSummary called), the state should not need reset.\n\t\t\tawait tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });\n\t\t\tassert.equal(\n\t\t\t\ttracker.doesGCStateNeedReset,\n\t\t\t\tfalse,\n\t\t\t\t\"Shouldn't need reset after first summary\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"wasGCRunInBaseSnapshot = false, shouldRunGC = true: Do Need Reset\", async () => {\n\t\t\tconst tracker: GCSummaryStateTrackerWithPrivates = new GCSummaryStateTracker(\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\ttombstoneMode: false,\n\t\t\t\t\tgcVersionInBaseSnapshot: 1,\n\t\t\t\t\tgcVersionInEffect: 1,\n\t\t\t\t},\n\t\t\t\tfalse /* wasGCRunInBaseSnapshot */,\n\t\t\t) as any;\n\t\t\tassert.equal(tracker.doesGCStateNeedReset, true, \"Should need reset\");\n\n\t\t\t// After the first summary succeeds (refreshLatestSummary called), the state should not need reset.\n\t\t\tawait tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });\n\n\t\t\tassert.equal(\n\t\t\t\ttracker.doesGCStateNeedReset,\n\t\t\t\tfalse,\n\t\t\t\t\"Shouldn't need reset after first summary\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"wasGCRunInBaseSnapshot = true, shouldRunGC = true: Don't Need Reset\", () => {\n\t\t\tconst tracker: GCSummaryStateTrackerWithPrivates = new GCSummaryStateTracker(\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\ttombstoneMode: false,\n\t\t\t\t\tgcVersionInBaseSnapshot: 1,\n\t\t\t\t\tgcVersionInEffect: 1,\n\t\t\t\t},\n\t\t\t\ttrue /* wasGCRunInBaseSnapshot */,\n\t\t\t) as any;\n\t\t\tassert.equal(tracker.doesGCStateNeedReset, false, \"Shouldn't need reset\");\n\t\t});\n\t});\n\n\tit(\"Autorecovery: requesting Full GC\", async () => {\n\t\tconst tracker: GCSummaryStateTrackerWithPrivates = new GCSummaryStateTracker(\n\t\t\t{\n\t\t\t\tshouldRunGC: true,\n\t\t\t\ttombstoneMode: false,\n\t\t\t\tgcVersionInBaseSnapshot: 1,\n\t\t\t\tgcVersionInEffect: 1,\n\t\t\t},\n\t\t\tfalse /* wasGCRunInBaseSnapshot */,\n\t\t) as any;\n\t\tassert.equal(tracker.autoRecovery.fullGCRequested(), false, \"Should be false by default\");\n\n\t\ttracker.autoRecovery.requestFullGCOnNextRun();\n\n\t\tassert.equal(\n\t\t\ttracker.autoRecovery.fullGCRequested(),\n\t\t\ttrue,\n\t\t\t\"Should be true after requesting full GC\",\n\t\t);\n\n\t\t// After the first summary succeeds (refreshLatestSummary called), the state should be reset.\n\t\tawait tracker.refreshLatestSummary({ isSummaryTracked: true, isSummaryNewer: true });\n\n\t\tassert.equal(\n\t\t\ttracker.autoRecovery.fullGCRequested(),\n\t\t\tfalse,\n\t\t\t\"Should be false after Summary Ack\",\n\t\t);\n\t});\n\n\t/**\n\t * These tests validate that the GC data is written in summary incrementally. Basically, only parts of the GC\n\t * data that has changed since the last successful summary is re-written, rest is written as SummaryHandle.\n\t */\n\tdescribe(\"Incremental summary of GC data\", () => {\n\t\tconst nodes = [\"node1\", \"node2\", \"node3\"];\n\t\tconst initialGCState: IGarbageCollectionState = {\n\t\t\tgcNodes: {\n\t\t\t\t\"/\": { outboundRoutes: [] },\n\t\t\t\t[nodes[0]]: { outboundRoutes: [] },\n\t\t\t\t[nodes[1]]: { outboundRoutes: [] },\n\t\t\t},\n\t\t};\n\t\tconst initialTombstones: string[] = [nodes[0], nodes[1]];\n\t\tconst initialDeletedNodes: Set<string> = new Set([nodes[1]]);\n\t\tlet summaryStateTracker: GCSummaryStateTracker;\n\n\t\tbeforeEach(async () => {\n\t\t\t// Creates a summary state tracker and initialize it.\n\t\t\tsummaryStateTracker = new GCSummaryStateTracker(\n\t\t\t\t{\n\t\t\t\t\tshouldRunGC: true,\n\t\t\t\t\ttombstoneMode: true,\n\t\t\t\t\tgcVersionInBaseSnapshot: nextGCVersion,\n\t\t\t\t\tgcVersionInEffect: nextGCVersion,\n\t\t\t\t},\n\t\t\t\tfalse /* wasGCRunInBaseSnapshot */,\n\t\t\t);\n\n\t\t\tsummaryStateTracker.initializeBaseState({\n\t\t\t\tgcState: initialGCState,\n\t\t\t\ttombstones: initialTombstones,\n\t\t\t\tdeletedNodes: Array.from(initialDeletedNodes),\n\t\t\t});\n\t\t});\n\n\t\tit(\"does incremental summary when nothing changes\", async () => {\n\t\t\t// Summarize with the same GC state, tombstone state and deleted nodes as in the initial state.\n\t\t\t// The GC data should be summarized as a summary handle.\n\t\t\tconst summary = summaryStateTracker.summarize(\n\t\t\t\ttrue /* trackState */,\n\t\t\t\tinitialGCState,\n\t\t\t\tinitialDeletedNodes,\n\t\t\t\tinitialTombstones,\n\t\t\t);\n\t\t\tassert(summary?.summary.type === SummaryType.Handle, \"GC summary should be a handle\");\n\t\t});\n\n\t\tit(\"does incremental summary when only GC state changes\", async () => {\n\t\t\t// Summarize with the same tombstone state and deleted nodes but different GC state as in the initial.\n\t\t\t// state. The GC state should be summarized as a summary handle.\n\t\t\tconst newGCState: IGarbageCollectionState = {\n\t\t\t\tgcNodes: {\n\t\t\t\t\t...initialGCState.gcNodes,\n\t\t\t\t\t[nodes[2]]: { outboundRoutes: [] },\n\t\t\t\t},\n\t\t\t};\n\t\t\tconst summary = summaryStateTracker.summarize(\n\t\t\t\ttrue /* trackState */,\n\t\t\t\tnewGCState,\n\t\t\t\tinitialDeletedNodes,\n\t\t\t\tinitialTombstones,\n\t\t\t);\n\t\t\tassert(summary?.summary.type === SummaryType.Tree, \"GC summary should be a tree\");\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcStateBlobKey].type === SummaryType.Blob,\n\t\t\t\t\"GC state should be written as a blob\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcTombstoneBlobKey].type === SummaryType.Handle,\n\t\t\t\t\"Tombstone state should be written as handle\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcDeletedBlobKey].type === SummaryType.Handle,\n\t\t\t\t\"Deleted nodes should be written as handle\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"does incremental summary when only tombstone state changes\", async () => {\n\t\t\t// Summarize with the same GC state and deleted nodes but different tombstone state as in the initial.\n\t\t\t// state. The tombstone state should be summarized as a summary handle.\n\t\t\tconst newTombstones: string[] = Array.from([...initialTombstones, nodes[2]]);\n\t\t\tconst summary = summaryStateTracker.summarize(\n\t\t\t\ttrue /* trackState */,\n\t\t\t\tinitialGCState,\n\t\t\t\tinitialDeletedNodes,\n\t\t\t\tnewTombstones,\n\t\t\t);\n\t\t\tassert(summary?.summary.type === SummaryType.Tree, \"GC summary should be a tree\");\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcStateBlobKey].type === SummaryType.Handle,\n\t\t\t\t\"GC state should be written as handle\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcTombstoneBlobKey].type === SummaryType.Blob,\n\t\t\t\t\"Tombstone state should be written as a blob\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcDeletedBlobKey].type === SummaryType.Handle,\n\t\t\t\t\"Deleted nodes should be written as handle\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"does incremental summary when only deleted nodes change\", async () => {\n\t\t\t// Summarize with the same GC state and tombstone state but different deleted nodes as in the initial.\n\t\t\t// state. The deleted nodes should be summarized as a summary handle.\n\t\t\tconst newDeletedNodes: Set<string> = new Set(...initialDeletedNodes, nodes[2]);\n\t\t\tconst summary = summaryStateTracker.summarize(\n\t\t\t\ttrue /* trackState */,\n\t\t\t\tinitialGCState,\n\t\t\t\tnewDeletedNodes,\n\t\t\t\tinitialTombstones,\n\t\t\t);\n\t\t\tassert(summary?.summary.type === SummaryType.Tree, \"GC summary should be a tree\");\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcStateBlobKey].type === SummaryType.Handle,\n\t\t\t\t\"GC state should be written as handle\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcTombstoneBlobKey].type === SummaryType.Handle,\n\t\t\t\t\"Tombstone state should be written as handle\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsummary.summary.tree[gcDeletedBlobKey].type === SummaryType.Blob,\n\t\t\t\t\"Deleted nodes should be written as a blob\",\n\t\t\t);\n\t\t});\n\t});\n\n\tit(\"updates state updated data store count correctly\", async () => {\n\t\tconst updatedDataStoreCount = 10;\n\t\tconst gcStats: IGCStats = {\n\t\t\tnodeCount: 0,\n\t\t\tunrefNodeCount: 0,\n\t\t\tupdatedNodeCount: 0,\n\t\t\tdataStoreCount: 0,\n\t\t\tunrefDataStoreCount: 0,\n\t\t\tupdatedDataStoreCount,\n\t\t\tattachmentBlobCount: 0,\n\t\t\tunrefAttachmentBlobCount: 0,\n\t\t\tupdatedAttachmentBlobCount: 0,\n\t\t\tlifetimeNodeCount: 0,\n\t\t\tlifetimeDataStoreCount: 0,\n\t\t\tlifetimeAttachmentBlobCount: 0,\n\t\t\tdeletedNodeCount: 0,\n\t\t\tdeletedDataStoreCount: 0,\n\t\t\tdeletedAttachmentBlobCount: 0,\n\t\t};\n\n\t\tconst summaryStateTracker = new GCSummaryStateTracker(\n\t\t\t{\n\t\t\t\tshouldRunGC: true,\n\t\t\t\ttombstoneMode: true,\n\t\t\t\tgcVersionInBaseSnapshot: nextGCVersion,\n\t\t\t\tgcVersionInEffect: nextGCVersion,\n\t\t\t},\n\t\t\tfalse /* wasGCRunInBaseSnapshot */,\n\t\t);\n\n\t\tlet expectedUpdatedDataStoreCount = updatedDataStoreCount;\n\t\t// Update the state from GC stats and validate it's the same as updatedDataStoreCount.\n\t\tsummaryStateTracker.updateStateFromGCRunStats(gcStats);\n\t\tassert.strictEqual(\n\t\t\tsummaryStateTracker.updatedDSCountSinceLastSummary,\n\t\t\texpectedUpdatedDataStoreCount,\n\t\t\t\"Updated DS count is not correct\",\n\t\t);\n\n\t\t// Call summarize but do not refresh latest summary. This mimics scenarios where summary generation fails\n\t\t// sometime after summarize. This means updatedDSCountSinceLastSummary should be updated incrementally\n\t\t// without resetting it.\n\t\tsummaryStateTracker.summarize(true /* trackState */, { gcNodes: {} }, new Set(), []);\n\n\t\t// Update the stat from GC state again mimicking a GC run after a failed summary.\n\t\texpectedUpdatedDataStoreCount += updatedDataStoreCount;\n\t\tsummaryStateTracker.updateStateFromGCRunStats(gcStats);\n\t\tassert.strictEqual(\n\t\t\tsummaryStateTracker.updatedDSCountSinceLastSummary,\n\t\t\texpectedUpdatedDataStoreCount,\n\t\t\t\"Updated DS count should have been incrementally updated\",\n\t\t);\n\n\t\t// Call summarize and refresh latest summary. This mimics a successful summary after a failed one. After\n\t\t// this, updatedDSCountSinceLastSummary should be reset to 0.\n\t\tsummaryStateTracker.summarize(true /* trackState */, { gcNodes: {} }, new Set(), []);\n\n\t\tawait summaryStateTracker.refreshLatestSummary({\n\t\t\tisSummaryTracked: true,\n\t\t\tisSummaryNewer: true,\n\t\t});\n\t\tassert.strictEqual(\n\t\t\tsummaryStateTracker.updatedDSCountSinceLastSummary,\n\t\t\t0,\n\t\t\t\"Updated DS count should be reset after refresh latest summary\",\n\t\t);\n\t});\n});\n"]}