@fluidframework/container-runtime 2.0.0-rc.2.0.1 → 2.0.0-rc.3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api-report/container-runtime.api.md +471 -52
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js +4 -4
  6. package/dist/batchTracker.js.map +1 -1
  7. package/dist/blobManager.d.ts +33 -30
  8. package/dist/blobManager.d.ts.map +1 -1
  9. package/dist/blobManager.js +82 -107
  10. package/dist/blobManager.js.map +1 -1
  11. package/dist/channelCollection.d.ts +27 -22
  12. package/dist/channelCollection.d.ts.map +1 -1
  13. package/dist/channelCollection.js +189 -165
  14. package/dist/channelCollection.js.map +1 -1
  15. package/dist/connectionTelemetry.d.ts +3 -3
  16. package/dist/connectionTelemetry.d.ts.map +1 -1
  17. package/dist/connectionTelemetry.js +17 -17
  18. package/dist/connectionTelemetry.js.map +1 -1
  19. package/dist/containerHandleContext.d.ts.map +1 -1
  20. package/dist/containerHandleContext.js +2 -2
  21. package/dist/containerHandleContext.js.map +1 -1
  22. package/dist/containerRuntime.d.ts +42 -39
  23. package/dist/containerRuntime.d.ts.map +1 -1
  24. package/dist/containerRuntime.js +425 -292
  25. package/dist/containerRuntime.js.map +1 -1
  26. package/dist/dataStore.d.ts +1 -1
  27. package/dist/dataStore.d.ts.map +1 -1
  28. package/dist/dataStore.js +8 -8
  29. package/dist/dataStore.js.map +1 -1
  30. package/dist/dataStoreContext.d.ts +58 -19
  31. package/dist/dataStoreContext.d.ts.map +1 -1
  32. package/dist/dataStoreContext.js +171 -114
  33. package/dist/dataStoreContext.js.map +1 -1
  34. package/dist/dataStoreContexts.d.ts +1 -0
  35. package/dist/dataStoreContexts.d.ts.map +1 -1
  36. package/dist/dataStoreContexts.js +12 -11
  37. package/dist/dataStoreContexts.js.map +1 -1
  38. package/dist/dataStoreRegistry.d.ts +5 -1
  39. package/dist/dataStoreRegistry.d.ts.map +1 -1
  40. package/dist/dataStoreRegistry.js +4 -4
  41. package/dist/dataStoreRegistry.js.map +1 -1
  42. package/dist/deltaManagerSummarizerProxy.d.ts +1 -1
  43. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  44. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  45. package/dist/deltaScheduler.d.ts +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 +3 -2
  54. package/dist/gc/garbageCollection.d.ts.map +1 -1
  55. package/dist/gc/garbageCollection.js +23 -23
  56. package/dist/gc/garbageCollection.js.map +1 -1
  57. package/dist/gc/gcConfigs.d.ts +2 -2
  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 +4 -5
  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 +2 -2
  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/index.d.ts +5 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +12 -2
  86. package/dist/index.js.map +1 -1
  87. package/dist/legacy.d.ts +91 -0
  88. package/dist/messageTypes.d.ts +11 -5
  89. package/dist/messageTypes.d.ts.map +1 -1
  90. package/dist/messageTypes.js +4 -0
  91. package/dist/messageTypes.js.map +1 -1
  92. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  93. package/dist/opLifecycle/batchManager.js.map +1 -1
  94. package/dist/opLifecycle/definitions.d.ts +2 -20
  95. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  96. package/dist/opLifecycle/definitions.js.map +1 -1
  97. package/dist/opLifecycle/index.d.ts +3 -3
  98. package/dist/opLifecycle/index.d.ts.map +1 -1
  99. package/dist/opLifecycle/index.js +3 -1
  100. package/dist/opLifecycle/index.js.map +1 -1
  101. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  102. package/dist/opLifecycle/opCompressor.js +5 -6
  103. package/dist/opLifecycle/opCompressor.js.map +1 -1
  104. package/dist/opLifecycle/opDecompressor.d.ts +15 -4
  105. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  106. package/dist/opLifecycle/opDecompressor.js +62 -63
  107. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  108. package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
  109. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
  110. package/dist/opLifecycle/opGroupingManager.js +14 -16
  111. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  112. package/dist/opLifecycle/opSplitter.d.ts +12 -4
  113. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  114. package/dist/opLifecycle/opSplitter.js +63 -53
  115. package/dist/opLifecycle/opSplitter.js.map +1 -1
  116. package/dist/opLifecycle/outbox.d.ts +2 -1
  117. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  118. package/dist/opLifecycle/outbox.js +30 -29
  119. package/dist/opLifecycle/outbox.js.map +1 -1
  120. package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  121. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  122. package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
  123. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  124. package/dist/packageVersion.d.ts +1 -1
  125. package/dist/packageVersion.js +1 -1
  126. package/dist/packageVersion.js.map +1 -1
  127. package/dist/pendingStateManager.d.ts +1 -1
  128. package/dist/pendingStateManager.d.ts.map +1 -1
  129. package/dist/pendingStateManager.js +18 -18
  130. package/dist/pendingStateManager.js.map +1 -1
  131. package/dist/public.d.ts +12 -0
  132. package/dist/scheduleManager.d.ts +1 -1
  133. package/dist/scheduleManager.d.ts.map +1 -1
  134. package/dist/scheduleManager.js +28 -24
  135. package/dist/scheduleManager.js.map +1 -1
  136. package/dist/storageServiceWithAttachBlobs.d.ts +2 -2
  137. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -1
  138. package/dist/storageServiceWithAttachBlobs.js +2 -2
  139. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  140. package/dist/summary/documentSchema.d.ts +209 -0
  141. package/dist/summary/documentSchema.d.ts.map +1 -0
  142. package/dist/summary/documentSchema.js +390 -0
  143. package/dist/summary/documentSchema.js.map +1 -0
  144. package/dist/summary/index.d.ts +2 -1
  145. package/dist/summary/index.d.ts.map +1 -1
  146. package/dist/summary/index.js +4 -1
  147. package/dist/summary/index.js.map +1 -1
  148. package/dist/summary/orderedClientElection.d.ts +2 -2
  149. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  150. package/dist/summary/orderedClientElection.js +12 -7
  151. package/dist/summary/orderedClientElection.js.map +1 -1
  152. package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
  153. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  154. package/dist/summary/runWhileConnectedCoordinator.js +3 -3
  155. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  156. package/dist/summary/runningSummarizer.d.ts +3 -3
  157. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  158. package/dist/summary/runningSummarizer.js +16 -16
  159. package/dist/summary/runningSummarizer.js.map +1 -1
  160. package/dist/summary/summarizer.d.ts +3 -2
  161. package/dist/summary/summarizer.d.ts.map +1 -1
  162. package/dist/summary/summarizer.js +13 -13
  163. package/dist/summary/summarizer.js.map +1 -1
  164. package/dist/summary/summarizerClientElection.d.ts +2 -2
  165. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  166. package/dist/summary/summarizerClientElection.js.map +1 -1
  167. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  168. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  169. package/dist/summary/summarizerHeuristics.js +2 -2
  170. package/dist/summary/summarizerHeuristics.js.map +1 -1
  171. package/dist/summary/summarizerNode/summarizerNode.d.ts +3 -2
  172. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  173. package/dist/summary/summarizerNode/summarizerNode.js +28 -28
  174. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  175. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  176. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  177. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  178. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  179. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  180. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  181. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +14 -14
  182. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  183. package/dist/summary/summarizerTypes.d.ts +5 -3
  184. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  185. package/dist/summary/summarizerTypes.js.map +1 -1
  186. package/dist/summary/summaryCollection.d.ts +2 -2
  187. package/dist/summary/summaryCollection.d.ts.map +1 -1
  188. package/dist/summary/summaryCollection.js +7 -7
  189. package/dist/summary/summaryCollection.js.map +1 -1
  190. package/dist/summary/summaryFormat.d.ts +6 -17
  191. package/dist/summary/summaryFormat.d.ts.map +1 -1
  192. package/dist/summary/summaryFormat.js +8 -8
  193. package/dist/summary/summaryFormat.js.map +1 -1
  194. package/dist/summary/summaryGenerator.d.ts +4 -3
  195. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  196. package/dist/summary/summaryGenerator.js +17 -17
  197. package/dist/summary/summaryGenerator.js.map +1 -1
  198. package/dist/summary/summaryManager.d.ts +1 -1
  199. package/dist/summary/summaryManager.d.ts.map +1 -1
  200. package/dist/summary/summaryManager.js +15 -14
  201. package/dist/summary/summaryManager.js.map +1 -1
  202. package/internal.d.ts +11 -0
  203. package/legacy.d.ts +11 -0
  204. package/lib/batchTracker.d.ts +1 -1
  205. package/lib/batchTracker.d.ts.map +1 -1
  206. package/lib/batchTracker.js +2 -2
  207. package/lib/batchTracker.js.map +1 -1
  208. package/lib/blobManager.d.ts +33 -30
  209. package/lib/blobManager.d.ts.map +1 -1
  210. package/lib/blobManager.js +48 -73
  211. package/lib/blobManager.js.map +1 -1
  212. package/lib/channelCollection.d.ts +27 -22
  213. package/lib/channelCollection.d.ts.map +1 -1
  214. package/lib/channelCollection.js +132 -108
  215. package/lib/channelCollection.js.map +1 -1
  216. package/lib/connectionTelemetry.d.ts +3 -3
  217. package/lib/connectionTelemetry.d.ts.map +1 -1
  218. package/lib/connectionTelemetry.js +3 -3
  219. package/lib/connectionTelemetry.js.map +1 -1
  220. package/lib/containerHandleContext.d.ts.map +1 -1
  221. package/lib/containerHandleContext.js +1 -1
  222. package/lib/containerHandleContext.js.map +1 -1
  223. package/lib/containerRuntime.d.ts +42 -39
  224. package/lib/containerRuntime.d.ts.map +1 -1
  225. package/lib/containerRuntime.js +276 -141
  226. package/lib/containerRuntime.js.map +1 -1
  227. package/lib/dataStore.d.ts +1 -1
  228. package/lib/dataStore.d.ts.map +1 -1
  229. package/lib/dataStore.js +3 -3
  230. package/lib/dataStore.js.map +1 -1
  231. package/lib/dataStoreContext.d.ts +58 -19
  232. package/lib/dataStoreContext.d.ts.map +1 -1
  233. package/lib/dataStoreContext.js +110 -53
  234. package/lib/dataStoreContext.js.map +1 -1
  235. package/lib/dataStoreContexts.d.ts +1 -0
  236. package/lib/dataStoreContexts.d.ts.map +1 -1
  237. package/lib/dataStoreContexts.js +3 -2
  238. package/lib/dataStoreContexts.js.map +1 -1
  239. package/lib/dataStoreRegistry.d.ts +5 -1
  240. package/lib/dataStoreRegistry.d.ts.map +1 -1
  241. package/lib/dataStoreRegistry.js +1 -1
  242. package/lib/dataStoreRegistry.js.map +1 -1
  243. package/lib/deltaManagerSummarizerProxy.d.ts +1 -1
  244. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  245. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  246. package/lib/deltaScheduler.d.ts +1 -1
  247. package/lib/deltaScheduler.d.ts.map +1 -1
  248. package/lib/deltaScheduler.js +1 -1
  249. package/lib/deltaScheduler.js.map +1 -1
  250. package/lib/error.d.ts +1 -1
  251. package/lib/error.d.ts.map +1 -1
  252. package/lib/error.js +2 -2
  253. package/lib/error.js.map +1 -1
  254. package/lib/gc/garbageCollection.d.ts +3 -2
  255. package/lib/gc/garbageCollection.d.ts.map +1 -1
  256. package/lib/gc/garbageCollection.js +8 -8
  257. package/lib/gc/garbageCollection.js.map +1 -1
  258. package/lib/gc/gcConfigs.d.ts +2 -2
  259. package/lib/gc/gcConfigs.d.ts.map +1 -1
  260. package/lib/gc/gcConfigs.js +4 -5
  261. package/lib/gc/gcConfigs.js.map +1 -1
  262. package/lib/gc/gcDefinitions.d.ts +4 -5
  263. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  264. package/lib/gc/gcDefinitions.js.map +1 -1
  265. package/lib/gc/gcHelpers.d.ts +5 -1
  266. package/lib/gc/gcHelpers.d.ts.map +1 -1
  267. package/lib/gc/gcHelpers.js +10 -2
  268. package/lib/gc/gcHelpers.js.map +1 -1
  269. package/lib/gc/gcSummaryStateTracker.d.ts +2 -2
  270. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  271. package/lib/gc/gcSummaryStateTracker.js +2 -2
  272. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  273. package/lib/gc/gcTelemetry.d.ts +2 -1
  274. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  275. package/lib/gc/gcTelemetry.js +4 -2
  276. package/lib/gc/gcTelemetry.js.map +1 -1
  277. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  278. package/lib/gc/gcUnreferencedStateTracker.js +2 -2
  279. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  280. package/lib/gc/index.d.ts +1 -1
  281. package/lib/gc/index.d.ts.map +1 -1
  282. package/lib/gc/index.js +1 -1
  283. package/lib/gc/index.js.map +1 -1
  284. package/lib/index.d.ts +5 -2
  285. package/lib/index.d.ts.map +1 -1
  286. package/lib/index.js +5 -2
  287. package/lib/index.js.map +1 -1
  288. package/lib/legacy.d.ts +91 -0
  289. package/lib/messageTypes.d.ts +11 -5
  290. package/lib/messageTypes.d.ts.map +1 -1
  291. package/lib/messageTypes.js +4 -0
  292. package/lib/messageTypes.js.map +1 -1
  293. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  294. package/lib/opLifecycle/batchManager.js.map +1 -1
  295. package/lib/opLifecycle/definitions.d.ts +2 -20
  296. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  297. package/lib/opLifecycle/definitions.js.map +1 -1
  298. package/lib/opLifecycle/index.d.ts +3 -3
  299. package/lib/opLifecycle/index.d.ts.map +1 -1
  300. package/lib/opLifecycle/index.js +2 -2
  301. package/lib/opLifecycle/index.js.map +1 -1
  302. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  303. package/lib/opLifecycle/opCompressor.js +2 -3
  304. package/lib/opLifecycle/opCompressor.js.map +1 -1
  305. package/lib/opLifecycle/opDecompressor.d.ts +15 -4
  306. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  307. package/lib/opLifecycle/opDecompressor.js +61 -62
  308. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  309. package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
  310. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
  311. package/lib/opLifecycle/opGroupingManager.js +9 -12
  312. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  313. package/lib/opLifecycle/opSplitter.d.ts +12 -4
  314. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  315. package/lib/opLifecycle/opSplitter.js +47 -38
  316. package/lib/opLifecycle/opSplitter.js.map +1 -1
  317. package/lib/opLifecycle/outbox.d.ts +2 -1
  318. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  319. package/lib/opLifecycle/outbox.js +19 -18
  320. package/lib/opLifecycle/outbox.js.map +1 -1
  321. package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
  322. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  323. package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
  324. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  325. package/lib/packageVersion.d.ts +1 -1
  326. package/lib/packageVersion.js +1 -1
  327. package/lib/packageVersion.js.map +1 -1
  328. package/lib/pendingStateManager.d.ts +1 -1
  329. package/lib/pendingStateManager.d.ts.map +1 -1
  330. package/lib/pendingStateManager.js +2 -2
  331. package/lib/pendingStateManager.js.map +1 -1
  332. package/lib/public.d.ts +12 -0
  333. package/lib/scheduleManager.d.ts +1 -1
  334. package/lib/scheduleManager.d.ts.map +1 -1
  335. package/lib/scheduleManager.js +7 -3
  336. package/lib/scheduleManager.js.map +1 -1
  337. package/lib/storageServiceWithAttachBlobs.d.ts +2 -2
  338. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -1
  339. package/lib/storageServiceWithAttachBlobs.js +1 -1
  340. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  341. package/lib/summary/documentSchema.d.ts +209 -0
  342. package/lib/summary/documentSchema.d.ts.map +1 -0
  343. package/lib/summary/documentSchema.js +386 -0
  344. package/lib/summary/documentSchema.js.map +1 -0
  345. package/lib/summary/index.d.ts +2 -1
  346. package/lib/summary/index.d.ts.map +1 -1
  347. package/lib/summary/index.js +1 -0
  348. package/lib/summary/index.js.map +1 -1
  349. package/lib/summary/orderedClientElection.d.ts +2 -2
  350. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  351. package/lib/summary/orderedClientElection.js +7 -2
  352. package/lib/summary/orderedClientElection.js.map +1 -1
  353. package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
  354. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
  355. package/lib/summary/runWhileConnectedCoordinator.js +1 -1
  356. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  357. package/lib/summary/runningSummarizer.d.ts +3 -3
  358. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  359. package/lib/summary/runningSummarizer.js +3 -3
  360. package/lib/summary/runningSummarizer.js.map +1 -1
  361. package/lib/summary/summarizer.d.ts +3 -2
  362. package/lib/summary/summarizer.d.ts.map +1 -1
  363. package/lib/summary/summarizer.js +3 -3
  364. package/lib/summary/summarizer.js.map +1 -1
  365. package/lib/summary/summarizerClientElection.d.ts +2 -2
  366. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  367. package/lib/summary/summarizerClientElection.js.map +1 -1
  368. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  369. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  370. package/lib/summary/summarizerHeuristics.js +1 -1
  371. package/lib/summary/summarizerHeuristics.js.map +1 -1
  372. package/lib/summary/summarizerNode/summarizerNode.d.ts +3 -2
  373. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  374. package/lib/summary/summarizerNode/summarizerNode.js +5 -5
  375. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  376. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -1
  377. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  378. package/lib/summary/summarizerNode/summarizerNodeUtils.js +1 -1
  379. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  380. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -1
  381. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  382. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
  383. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  384. package/lib/summary/summarizerTypes.d.ts +5 -3
  385. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  386. package/lib/summary/summarizerTypes.js.map +1 -1
  387. package/lib/summary/summaryCollection.d.ts +2 -2
  388. package/lib/summary/summaryCollection.d.ts.map +1 -1
  389. package/lib/summary/summaryCollection.js +1 -1
  390. package/lib/summary/summaryCollection.js.map +1 -1
  391. package/lib/summary/summaryFormat.d.ts +6 -17
  392. package/lib/summary/summaryFormat.d.ts.map +1 -1
  393. package/lib/summary/summaryFormat.js +3 -3
  394. package/lib/summary/summaryFormat.js.map +1 -1
  395. package/lib/summary/summaryGenerator.d.ts +4 -3
  396. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  397. package/lib/summary/summaryGenerator.js +4 -4
  398. package/lib/summary/summaryGenerator.js.map +1 -1
  399. package/lib/summary/summaryManager.d.ts +1 -1
  400. package/lib/summary/summaryManager.d.ts.map +1 -1
  401. package/lib/summary/summaryManager.js +9 -8
  402. package/lib/summary/summaryManager.js.map +1 -1
  403. package/package.json +57 -65
  404. package/src/batchTracker.ts +4 -3
  405. package/src/blobManager.ts +100 -77
  406. package/src/channelCollection.ts +223 -167
  407. package/src/connectionTelemetry.ts +12 -12
  408. package/src/containerHandleContext.ts +3 -2
  409. package/src/containerRuntime.ts +481 -277
  410. package/src/dataStore.ts +9 -4
  411. package/src/dataStoreContext.ts +201 -97
  412. package/src/dataStoreContexts.ts +5 -2
  413. package/src/dataStoreRegistry.ts +3 -2
  414. package/src/deltaManagerSummarizerProxy.ts +1 -1
  415. package/src/deltaScheduler.ts +2 -1
  416. package/src/error.ts +2 -2
  417. package/src/gc/garbageCollection.ts +21 -20
  418. package/src/gc/gcConfigs.ts +15 -18
  419. package/src/gc/gcDefinitions.ts +6 -8
  420. package/src/gc/gcHelpers.ts +22 -5
  421. package/src/gc/gcSummaryStateTracker.ts +7 -5
  422. package/src/gc/gcTelemetry.ts +13 -7
  423. package/src/gc/gcUnreferencedStateTracker.ts +3 -2
  424. package/src/gc/index.ts +1 -0
  425. package/src/index.ts +22 -1
  426. package/src/messageTypes.ts +20 -6
  427. package/src/opLifecycle/README.md +89 -0
  428. package/src/opLifecycle/batchManager.ts +1 -0
  429. package/src/opLifecycle/definitions.ts +3 -21
  430. package/src/opLifecycle/index.ts +3 -9
  431. package/src/opLifecycle/opCompressor.ts +6 -5
  432. package/src/opLifecycle/opDecompressor.ts +90 -100
  433. package/src/opLifecycle/opGroupingManager.ts +12 -14
  434. package/src/opLifecycle/opSplitter.ts +76 -48
  435. package/src/opLifecycle/outbox.ts +30 -38
  436. package/src/opLifecycle/remoteMessageProcessor.ts +43 -55
  437. package/src/packageVersion.ts +1 -1
  438. package/src/pendingStateManager.ts +6 -6
  439. package/src/scheduleManager.ts +10 -8
  440. package/src/storageServiceWithAttachBlobs.ts +2 -2
  441. package/src/summary/documentSchema.ts +631 -0
  442. package/src/summary/index.ts +10 -1
  443. package/src/summary/orderedClientElection.ts +7 -7
  444. package/src/summary/runWhileConnectedCoordinator.ts +3 -2
  445. package/src/summary/runningSummarizer.ts +22 -20
  446. package/src/summary/summarizer.ts +17 -15
  447. package/src/summary/summarizerClientElection.ts +3 -2
  448. package/src/summary/summarizerHeuristics.ts +4 -2
  449. package/src/summary/summarizerNode/summarizerNode.ts +20 -18
  450. package/src/summary/summarizerNode/summarizerNodeUtils.ts +3 -2
  451. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +16 -8
  452. package/src/summary/summarizerTypes.ts +7 -3
  453. package/src/summary/summaryCollection.ts +3 -3
  454. package/src/summary/summaryFormat.ts +14 -26
  455. package/src/summary/summaryGenerator.ts +12 -15
  456. package/src/summary/summaryManager.ts +16 -13
  457. package/api-extractor-cjs.json +0 -8
  458. package/dist/container-runtime-alpha.d.ts +0 -1753
  459. package/dist/container-runtime-beta.d.ts +0 -268
  460. package/dist/container-runtime-public.d.ts +0 -268
  461. package/dist/container-runtime-untrimmed.d.ts +0 -1893
  462. package/lib/container-runtime-alpha.d.ts +0 -1753
  463. package/lib/container-runtime-beta.d.ts +0 -268
  464. package/lib/container-runtime-public.d.ts +0 -268
  465. package/lib/container-runtime-untrimmed.d.ts +0 -1893
  466. package/lib/test/batchTracker.spec.js +0 -88
  467. package/lib/test/batchTracker.spec.js.map +0 -1
  468. package/lib/test/blobManager.spec.js +0 -835
  469. package/lib/test/blobManager.spec.js.map +0 -1
  470. package/lib/test/channelCollection.spec.js +0 -141
  471. package/lib/test/channelCollection.spec.js.map +0 -1
  472. package/lib/test/containerRuntime.spec.js +0 -1748
  473. package/lib/test/containerRuntime.spec.js.map +0 -1
  474. package/lib/test/dataStoreContext.spec.js +0 -801
  475. package/lib/test/dataStoreContext.spec.js.map +0 -1
  476. package/lib/test/dataStoreCreation.spec.js +0 -312
  477. package/lib/test/dataStoreCreation.spec.js.map +0 -1
  478. package/lib/test/dataStoreRegistry.spec.js +0 -26
  479. package/lib/test/dataStoreRegistry.spec.js.map +0 -1
  480. package/lib/test/fuzz/fuzzUtils.js +0 -66
  481. package/lib/test/fuzz/fuzzUtils.js.map +0 -1
  482. package/lib/test/fuzz/summarizer.fuzz.spec.js +0 -31
  483. package/lib/test/fuzz/summarizer.fuzz.spec.js.map +0 -1
  484. package/lib/test/fuzz/summarizerFuzzMocks.js +0 -162
  485. package/lib/test/fuzz/summarizerFuzzMocks.js.map +0 -1
  486. package/lib/test/fuzz/summarizerFuzzSuite.js +0 -106
  487. package/lib/test/fuzz/summarizerFuzzSuite.js.map +0 -1
  488. package/lib/test/gc/garbageCollection.spec.js +0 -1465
  489. package/lib/test/gc/garbageCollection.spec.js.map +0 -1
  490. package/lib/test/gc/gcConfigs.spec.js +0 -690
  491. package/lib/test/gc/gcConfigs.spec.js.map +0 -1
  492. package/lib/test/gc/gcHelpers.spec.js +0 -110
  493. package/lib/test/gc/gcHelpers.spec.js.map +0 -1
  494. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js +0 -68
  495. package/lib/test/gc/gcReferenceGraphAlgorithm.spec.js.map +0 -1
  496. package/lib/test/gc/gcStats.spec.js +0 -391
  497. package/lib/test/gc/gcStats.spec.js.map +0 -1
  498. package/lib/test/gc/gcSummaryStateTracker.spec.js +0 -228
  499. package/lib/test/gc/gcSummaryStateTracker.spec.js.map +0 -1
  500. package/lib/test/gc/gcTelemetry.spec.js +0 -530
  501. package/lib/test/gc/gcTelemetry.spec.js.map +0 -1
  502. package/lib/test/gc/gcUnitTestHelpers.js +0 -29
  503. package/lib/test/gc/gcUnitTestHelpers.js.map +0 -1
  504. package/lib/test/gc/gcUnreferencedStateTracker.spec.js +0 -192
  505. package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +0 -1
  506. package/lib/test/getPendingBlobs.spec.js +0 -193
  507. package/lib/test/getPendingBlobs.spec.js.map +0 -1
  508. package/lib/test/hardwareStats.spec.js +0 -93
  509. package/lib/test/hardwareStats.spec.js.map +0 -1
  510. package/lib/test/index.js +0 -6
  511. package/lib/test/index.js.map +0 -1
  512. package/lib/test/opLifecycle/OpGroupingManager.spec.js +0 -225
  513. package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +0 -1
  514. package/lib/test/opLifecycle/batchManager.spec.js +0 -189
  515. package/lib/test/opLifecycle/batchManager.spec.js.map +0 -1
  516. package/lib/test/opLifecycle/opCompressor.spec.js +0 -74
  517. package/lib/test/opLifecycle/opCompressor.spec.js.map +0 -1
  518. package/lib/test/opLifecycle/opDecompressor.spec.js +0 -218
  519. package/lib/test/opLifecycle/opDecompressor.spec.js.map +0 -1
  520. package/lib/test/opLifecycle/opSplitter.spec.js +0 -272
  521. package/lib/test/opLifecycle/opSplitter.spec.js.map +0 -1
  522. package/lib/test/opLifecycle/outbox.spec.js +0 -675
  523. package/lib/test/opLifecycle/outbox.spec.js.map +0 -1
  524. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +0 -196
  525. package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +0 -1
  526. package/lib/test/pendingStateManager.spec.js +0 -329
  527. package/lib/test/pendingStateManager.spec.js.map +0 -1
  528. package/lib/test/scheduleManager.spec.js +0 -270
  529. package/lib/test/scheduleManager.spec.js.map +0 -1
  530. package/lib/test/summarizerNode.spec.js +0 -326
  531. package/lib/test/summarizerNode.spec.js.map +0 -1
  532. package/lib/test/summarizerNodeWithGc.spec.js +0 -318
  533. package/lib/test/summarizerNodeWithGc.spec.js.map +0 -1
  534. package/lib/test/summary/orderedClientElection.spec.js +0 -535
  535. package/lib/test/summary/orderedClientElection.spec.js.map +0 -1
  536. package/lib/test/summary/runningSummarizer.spec.js +0 -1349
  537. package/lib/test/summary/runningSummarizer.spec.js.map +0 -1
  538. package/lib/test/summary/summarizer.spec.js +0 -29
  539. package/lib/test/summary/summarizer.spec.js.map +0 -1
  540. package/lib/test/summary/summarizerClientElection.spec.js +0 -436
  541. package/lib/test/summary/summarizerClientElection.spec.js.map +0 -1
  542. package/lib/test/summary/summarizerHeuristics.spec.js +0 -289
  543. package/lib/test/summary/summarizerHeuristics.spec.js.map +0 -1
  544. package/lib/test/summary/summaryCollection.spec.js +0 -200
  545. package/lib/test/summary/summaryCollection.spec.js.map +0 -1
  546. package/lib/test/summary/summaryManager.spec.js +0 -430
  547. package/lib/test/summary/summaryManager.spec.js.map +0 -1
  548. package/lib/test/summary/testQuorumClients.js +0 -34
  549. package/lib/test/summary/testQuorumClients.js.map +0 -1
  550. package/lib/test/throttler.spec.js +0 -175
  551. package/lib/test/throttler.spec.js.map +0 -1
  552. package/lib/test/types/validateContainerRuntimePrevious.generated.js +0 -180
  553. package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +0 -1
  554. /package/{dist → lib}/tsdoc-metadata.json +0 -0
@@ -1,391 +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 { useFakeTimers } from "sinon";
7
- import { MockLogger, mixinMonitoringContext, createChildLogger, } from "@fluidframework/telemetry-utils";
8
- import { GarbageCollector, GCNodeType, defaultSessionExpiryDurationMs, oneDayMs, stableGCVersion, defaultSweepGracePeriodMs, } from "../../gc/index.js";
9
- import { pkgVersion } from "../../packageVersion.js";
10
- describe("Garbage Collection Stats", () => {
11
- // Nodes in the reference graph.
12
- const nodes = ["/node1", "/node2", "/node3", "/node4", "/node5", "/node6"];
13
- const testPkgPath = ["testPkg"];
14
- let mockLogger;
15
- let mc;
16
- let clock;
17
- let lastGCMessage;
18
- let gcMessagesCount = 0;
19
- // The default GC data returned by `getGCData` on which GC is run. Update this to update the referenced graph.
20
- let defaultGCData = { gcNodes: {} };
21
- /**
22
- * Called when sweep runs. It deleted the nodes from defaultGCData.
23
- */
24
- function deleteSweepReadyNodes(sweepReadyRoutes) {
25
- for (const nodeId of sweepReadyRoutes) {
26
- assert(defaultGCData.gcNodes[nodeId] !== undefined, `Deleted node ${nodeId} doesn't exist`);
27
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
28
- delete defaultGCData.gcNodes[nodeId];
29
- }
30
- return sweepReadyRoutes;
31
- }
32
- function createGarbageCollector(createParams = {}, gcBlobsMap = new Map(), gcMetadata = {}, closeFn = () => { }, isSummarizerClient = true) {
33
- const getNodeType = (nodePath) => {
34
- if (nodePath.split("/").length !== 2) {
35
- return GCNodeType.Other;
36
- }
37
- return GCNodeType.DataStore;
38
- };
39
- // The runtime to be passed to the garbage collector.
40
- const gcRuntime = {
41
- updateStateBeforeGC: async () => { },
42
- getGCData: async (fullGC) => defaultGCData,
43
- updateUsedRoutes: (usedRoutes) => {
44
- return { totalNodeCount: 0, unusedNodeCount: 0 };
45
- },
46
- updateUnusedRoutes: (unusedRoutes) => { },
47
- deleteSweepReadyNodes,
48
- updateTombstonedRoutes: (tombstoneRoutes) => { },
49
- getNodeType,
50
- getCurrentReferenceTimestampMs: () => Date.now(),
51
- closeFn,
52
- };
53
- let metadata = createParams.metadata;
54
- const existing = createParams.baseSnapshot !== undefined;
55
- // For existing, add container runtime metadata which is required for GC to be enabled.
56
- if (existing) {
57
- metadata = {
58
- ...metadata,
59
- ...gcMetadata,
60
- gcFeature: gcMetadata.gcFeature ?? stableGCVersion,
61
- summaryFormatVersion: 1,
62
- message: undefined,
63
- };
64
- }
65
- return GarbageCollector.create({
66
- ...createParams,
67
- runtime: gcRuntime,
68
- gcOptions: createParams.gcOptions ?? {},
69
- baseSnapshot: createParams.baseSnapshot,
70
- baseLogger: createChildLogger({ logger: mc.logger }),
71
- existing,
72
- metadata,
73
- createContainerMetadata: {
74
- createContainerRuntimeVersion: pkgVersion,
75
- createContainerTimestamp: Date.now(),
76
- },
77
- isSummarizerClient,
78
- readAndParseBlob: async (id) => gcBlobsMap.get(id),
79
- getNodePackagePath: async (nodeId) => testPkgPath,
80
- getLastSummaryTimestampMs: () => Date.now(),
81
- submitMessage: (message) => {
82
- gcMessagesCount++;
83
- lastGCMessage = message;
84
- },
85
- });
86
- }
87
- before(() => {
88
- clock = useFakeTimers();
89
- });
90
- beforeEach(() => {
91
- lastGCMessage = undefined;
92
- mockLogger = new MockLogger();
93
- mc = mixinMonitoringContext(mockLogger);
94
- // Set up initial GC graph with 5 nodes and 2 are unreferenced.
95
- defaultGCData.gcNodes["/"] = [nodes[0]];
96
- defaultGCData.gcNodes[nodes[0]] = [nodes[1]];
97
- defaultGCData.gcNodes[nodes[1]] = [];
98
- defaultGCData.gcNodes[nodes[2]] = [];
99
- defaultGCData.gcNodes[nodes[3]] = [];
100
- // Set up the initial GC stats based on the initial GC graph.
101
- initialStats = {
102
- nodeCount: 5,
103
- unrefNodeCount: 2,
104
- updatedNodeCount: 5,
105
- dataStoreCount: 5,
106
- unrefDataStoreCount: 2,
107
- updatedDataStoreCount: 5,
108
- attachmentBlobCount: 0,
109
- unrefAttachmentBlobCount: 0,
110
- updatedAttachmentBlobCount: 0,
111
- lifetimeNodeCount: 5,
112
- lifetimeDataStoreCount: 5,
113
- lifetimeAttachmentBlobCount: 0,
114
- deletedNodeCount: 0,
115
- deletedDataStoreCount: 0,
116
- deletedAttachmentBlobCount: 0,
117
- };
118
- });
119
- afterEach(() => {
120
- clock.reset();
121
- mockLogger.clear();
122
- defaultGCData = { gcNodes: {} };
123
- });
124
- after(() => {
125
- clock.restore();
126
- });
127
- let garbageCollector;
128
- let initialStats;
129
- /** Helper function that makes the garbage collector process the last GC message */
130
- function processLastGCMessage() {
131
- if (lastGCMessage === undefined) {
132
- return;
133
- }
134
- garbageCollector.processMessage(lastGCMessage, true /* local */);
135
- }
136
- describe("Mark phase stats", () => {
137
- beforeEach(() => {
138
- garbageCollector = createGarbageCollector({});
139
- });
140
- it("can generate initial stats", async () => {
141
- const gcStats = await garbageCollector.collectGarbage({});
142
- assert.deepStrictEqual(gcStats, initialStats, "The stats for first GC run should be same as initial stats");
143
- });
144
- it("can generate stats with unreferenced nodes", async () => {
145
- const expectedStats = initialStats;
146
- let gcStats = await garbageCollector.collectGarbage({});
147
- assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
148
- // Unreference another data store node.
149
- defaultGCData.gcNodes[nodes[0]] = [];
150
- // There should be 1 more unreferenced node / data store.
151
- // There should be 1 node / data store whose reference state got updated.
152
- expectedStats.unrefNodeCount++;
153
- expectedStats.unrefDataStoreCount++;
154
- expectedStats.updatedNodeCount = 1;
155
- expectedStats.updatedDataStoreCount = 1;
156
- gcStats = await garbageCollector.collectGarbage({});
157
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 1");
158
- // Unreference another data store node
159
- defaultGCData.gcNodes["/"] = [];
160
- // There should be 1 more unreferenced node / data store.
161
- // There should be 1 node / data store whose reference state got updated.
162
- expectedStats.unrefNodeCount++;
163
- expectedStats.unrefDataStoreCount++;
164
- expectedStats.updatedNodeCount = 1;
165
- expectedStats.updatedDataStoreCount = 1;
166
- gcStats = await garbageCollector.collectGarbage({});
167
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
168
- });
169
- it("can generate stats with re-referenced nodes", async () => {
170
- const expectedStats = initialStats;
171
- let gcStats = await garbageCollector.collectGarbage({});
172
- assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
173
- // Unreference another data store node.
174
- defaultGCData.gcNodes[nodes[0]] = [];
175
- // There should be 1 more unreferenced node / data store.
176
- // There should be 1 node / data store whose reference state got updated.
177
- expectedStats.unrefNodeCount++;
178
- expectedStats.unrefDataStoreCount++;
179
- expectedStats.updatedNodeCount = 1;
180
- expectedStats.updatedDataStoreCount = 1;
181
- gcStats = await garbageCollector.collectGarbage({});
182
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 1");
183
- // Add a new reference.
184
- defaultGCData.gcNodes[nodes[0]] = [nodes[2]];
185
- // There should be 1 less unreferenced node / data store.
186
- // There should be 1 node / data store whose reference state got updated.
187
- expectedStats.unrefNodeCount--;
188
- expectedStats.unrefDataStoreCount--;
189
- expectedStats.updatedNodeCount = 1;
190
- expectedStats.updatedDataStoreCount = 1;
191
- gcStats = await garbageCollector.collectGarbage({});
192
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
193
- });
194
- it("can generate stats with new nodes", async () => {
195
- const expectedStats = initialStats;
196
- let gcStats = await garbageCollector.collectGarbage({});
197
- assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
198
- // Add 2 new nodes and make one of them unreferenced.
199
- defaultGCData.gcNodes["/"].push(nodes[4]);
200
- defaultGCData.gcNodes[nodes[4]] = [];
201
- defaultGCData.gcNodes[nodes[5]] = [];
202
- // There should be 2 more nodes / data stores.
203
- // There should be 1 more unreferenced node / data store.
204
- // There should be 1 node / data store whose referenced state got updated.
205
- expectedStats.nodeCount += 2;
206
- expectedStats.dataStoreCount += 2;
207
- expectedStats.lifetimeNodeCount += 2;
208
- expectedStats.lifetimeDataStoreCount += 2;
209
- expectedStats.unrefNodeCount++;
210
- expectedStats.unrefDataStoreCount++;
211
- expectedStats.updatedNodeCount = 1;
212
- expectedStats.updatedDataStoreCount = 1;
213
- gcStats = await garbageCollector.collectGarbage({});
214
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats");
215
- });
216
- });
217
- /**
218
- * Note that the life time and deleted stats are the same whether sweep is enabled or not.
219
- */
220
- describe("Sweep phase stats", () => {
221
- const defaultSnapshotCacheExpiryMs = 5 * oneDayMs;
222
- const sweepTimeoutMs =
223
- // Tombstone timeout
224
- defaultSessionExpiryDurationMs +
225
- defaultSnapshotCacheExpiryMs +
226
- oneDayMs +
227
- // + Grace Period
228
- defaultSweepGracePeriodMs;
229
- /**
230
- * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become
231
- * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.
232
- */
233
- it("can generate stats with deleted nodes - sweep enabled", async () => {
234
- // Create garbage collector with sweep enabled.
235
- garbageCollector = createGarbageCollector({
236
- gcOptions: { enableGCSweep: true },
237
- });
238
- let previousGCMessagesCount = gcMessagesCount;
239
- const expectedStats = initialStats;
240
- let gcStats = await garbageCollector.collectGarbage({});
241
- assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
242
- assert(gcMessagesCount === previousGCMessagesCount, "There shouldn't be new GC messages");
243
- // Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.
244
- clock.tick(sweepTimeoutMs + 1);
245
- // There shouldn't be any nodes whose reference state updated.
246
- expectedStats.updatedNodeCount = 0;
247
- expectedStats.updatedDataStoreCount = 0;
248
- // Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)
249
- // but we account for them in the deleted stats now.
250
- expectedStats.deletedNodeCount += 2;
251
- expectedStats.deletedDataStoreCount += 2;
252
- gcStats = await garbageCollector.collectGarbage({});
253
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 1");
254
- assert(gcMessagesCount === ++previousGCMessagesCount, "There should be one new GC message");
255
- // Process the GC message so that the sweep ready nodes are deleted.
256
- processLastGCMessage();
257
- // The 2 sweep ready nodes / data stores should now be truly deleted.
258
- // They should be removed from the total node and unreferenced counts.
259
- expectedStats.nodeCount -= 2;
260
- expectedStats.dataStoreCount -= 2;
261
- expectedStats.unrefNodeCount -= 2;
262
- expectedStats.unrefDataStoreCount -= 2;
263
- gcStats = await garbageCollector.collectGarbage({});
264
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
265
- });
266
- /**
267
- * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become
268
- * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.
269
- */
270
- it("can generate stats with deleted nodes after multiple sweep runs - sweep enabled", async () => {
271
- garbageCollector = createGarbageCollector({
272
- gcOptions: { enableGCSweep: true },
273
- });
274
- const expectedStats = initialStats;
275
- let gcStats = await garbageCollector.collectGarbage({});
276
- assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
277
- let previousGCMessagesCount = gcMessagesCount;
278
- // Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.
279
- clock.tick(sweepTimeoutMs + 1);
280
- // There shouldn't be any nodes whose reference state updated.
281
- expectedStats.updatedNodeCount = 0;
282
- expectedStats.updatedDataStoreCount = 0;
283
- // Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)
284
- // but we account for them in the deleted stats now.
285
- expectedStats.deletedNodeCount += 2;
286
- expectedStats.deletedDataStoreCount += 2;
287
- gcStats = await garbageCollector.collectGarbage({});
288
- assert(gcMessagesCount === ++previousGCMessagesCount, "There should be one new GC message");
289
- // Process the GC message so that the sweep ready nodes are deleted.
290
- processLastGCMessage();
291
- // Unreference one more data store node (nodes[1])
292
- defaultGCData.gcNodes[nodes[0]] = [];
293
- // The 2 sweep ready nodes / data stores should now be deleted.
294
- // They should be removed from the total node and unreferenced counts.
295
- expectedStats.nodeCount -= 2;
296
- expectedStats.dataStoreCount -= 2;
297
- expectedStats.unrefNodeCount -= 2;
298
- expectedStats.unrefDataStoreCount -= 2;
299
- // There should 1 new unreferenced node / data store and its reference state is updated.
300
- expectedStats.unrefNodeCount++;
301
- expectedStats.unrefDataStoreCount++;
302
- expectedStats.updatedNodeCount = 1;
303
- expectedStats.updatedDataStoreCount = 1;
304
- gcStats = await garbageCollector.collectGarbage({});
305
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
306
- // Advance the clock past sweep timeout again so that unreferenced node is sweep ready.
307
- clock.tick(sweepTimeoutMs + 1);
308
- // No nodes are updated since the last run.
309
- expectedStats.updatedNodeCount = 0;
310
- expectedStats.updatedDataStoreCount = 0;
311
- // Note that the new sweep-ready node won't actually be deleted yet (until the GC op is processed)
312
- // but we account for it in the deleted stats now.
313
- expectedStats.deletedNodeCount += 1;
314
- expectedStats.deletedDataStoreCount += 1;
315
- gcStats = await garbageCollector.collectGarbage({});
316
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 3");
317
- assert(gcMessagesCount === ++previousGCMessagesCount, "There should be one new GC message");
318
- // Process the GC message so that the sweep ready node is deleted.
319
- processLastGCMessage();
320
- // The sweep ready node / data store should now be truly deleted.
321
- // It should be removed from the total node and unreferenced counts.
322
- expectedStats.nodeCount--;
323
- expectedStats.dataStoreCount--;
324
- expectedStats.unrefNodeCount--;
325
- expectedStats.unrefDataStoreCount--;
326
- gcStats = await garbageCollector.collectGarbage({});
327
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 4");
328
- });
329
- /**
330
- * When sweep is disabled, deleted stats are updated in the same GC run where the objects become
331
- * sweep ready. This is because the stats are based on sweep ready state.
332
- */
333
- it("can generate stats with deleted nodes - sweep disabled", async () => {
334
- garbageCollector = createGarbageCollector({});
335
- const expectedStats = initialStats;
336
- let gcStats = await garbageCollector.collectGarbage({});
337
- assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
338
- // Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.
339
- clock.tick(sweepTimeoutMs + 1);
340
- // The 2 sweep ready nodes / data stores should now show up deleted.
341
- // There shouldn't be any nodes whose reference state updated.
342
- expectedStats.deletedNodeCount = 2;
343
- expectedStats.deletedDataStoreCount = 2;
344
- expectedStats.updatedNodeCount = 0;
345
- expectedStats.updatedDataStoreCount = 0;
346
- gcStats = await garbageCollector.collectGarbage({});
347
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats");
348
- });
349
- /**
350
- * When sweep is disabled, deleted stats are updated in the same GC run where the objects become
351
- * sweep ready. This is because the stats are based on sweep ready state.
352
- */
353
- it("can generate stats with deleted nodes after multiple sweep runs - sweep disabled", async () => {
354
- garbageCollector = createGarbageCollector({});
355
- const expectedStats = initialStats;
356
- let gcStats = await garbageCollector.collectGarbage({});
357
- assert.deepStrictEqual(gcStats, expectedStats, "The stats for first GC run should be same as initial stats");
358
- // Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.
359
- clock.tick(sweepTimeoutMs + 1);
360
- // The 2 sweep ready nodes / data stores should now show up deleted.
361
- // There shouldn't be any nodes whose reference state updated.
362
- expectedStats.deletedNodeCount = 2;
363
- expectedStats.deletedDataStoreCount = 2;
364
- expectedStats.updatedNodeCount = 0;
365
- expectedStats.updatedDataStoreCount = 0;
366
- gcStats = await garbageCollector.collectGarbage({});
367
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 1");
368
- // Unreference another data store node.
369
- defaultGCData.gcNodes[nodes[0]] = [];
370
- // There should be 1 more unreferenced node / data store and its referenced
371
- // state is updated.
372
- expectedStats.unrefNodeCount++;
373
- expectedStats.unrefDataStoreCount++;
374
- expectedStats.updatedNodeCount = 1;
375
- expectedStats.updatedDataStoreCount = 1;
376
- gcStats = await garbageCollector.collectGarbage({});
377
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 2");
378
- // Advance the clock past sweep timeout again so that unreferenced node is sweep ready.
379
- clock.tick(sweepTimeoutMs + 1);
380
- // No nodes are updated since the last run.
381
- // The sweep ready node / data store should show up as deleted.
382
- expectedStats.updatedNodeCount = 0;
383
- expectedStats.updatedDataStoreCount = 0;
384
- expectedStats.deletedNodeCount++;
385
- expectedStats.deletedDataStoreCount++;
386
- gcStats = await garbageCollector.collectGarbage({});
387
- assert.deepStrictEqual(gcStats, expectedStats, "Incorrect GC stats 3");
388
- });
389
- });
390
- });
391
- //# sourceMappingURL=gcStats.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gcStats.spec.js","sourceRoot":"","sources":["../../../src/test/gc/gcStats.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 { SinonFakeTimers, useFakeTimers } from \"sinon\";\nimport { ICriticalContainerError } from \"@fluidframework/container-definitions\";\nimport { IGarbageCollectionData } from \"@fluidframework/runtime-definitions\";\nimport {\n\tMockLogger,\n\tmixinMonitoringContext,\n\tMonitoringContext,\n\tcreateChildLogger,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tGarbageCollector,\n\tGCNodeType,\n\tIGarbageCollectionRuntime,\n\tIGarbageCollector,\n\tIGarbageCollectorCreateParams,\n\tIGCMetadata,\n\tdefaultSessionExpiryDurationMs,\n\toneDayMs,\n\tstableGCVersion,\n\tIGCStats,\n\tdefaultSweepGracePeriodMs,\n} from \"../../gc/index.js\";\nimport { ContainerRuntimeGCMessage } from \"../../messageTypes.js\";\nimport { pkgVersion } from \"../../packageVersion.js\";\n\ndescribe(\"Garbage Collection Stats\", () => {\n\t// Nodes in the reference graph.\n\tconst nodes: string[] = [\"/node1\", \"/node2\", \"/node3\", \"/node4\", \"/node5\", \"/node6\"];\n\tconst testPkgPath = [\"testPkg\"];\n\n\tlet mockLogger: MockLogger;\n\tlet mc: MonitoringContext<MockLogger>;\n\tlet clock: SinonFakeTimers;\n\tlet lastGCMessage: ContainerRuntimeGCMessage | undefined;\n\tlet gcMessagesCount: number = 0;\n\n\t// The default GC data returned by `getGCData` on which GC is run. Update this to update the referenced graph.\n\tlet defaultGCData: IGarbageCollectionData = { gcNodes: {} };\n\n\t/**\n\t * Called when sweep runs. It deleted the nodes from defaultGCData.\n\t */\n\tfunction deleteSweepReadyNodes(sweepReadyRoutes: string[]): string[] {\n\t\tfor (const nodeId of sweepReadyRoutes) {\n\t\t\tassert(\n\t\t\t\tdefaultGCData.gcNodes[nodeId] !== undefined,\n\t\t\t\t`Deleted node ${nodeId} doesn't exist`,\n\t\t\t);\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\tdelete defaultGCData.gcNodes[nodeId];\n\t\t}\n\t\treturn sweepReadyRoutes;\n\t}\n\n\tfunction createGarbageCollector(\n\t\tcreateParams: Partial<IGarbageCollectorCreateParams> = {},\n\t\tgcBlobsMap: Map<string, any> = new Map(),\n\t\tgcMetadata: IGCMetadata = {},\n\t\tcloseFn: (error?: ICriticalContainerError) => void = () => {},\n\t\tisSummarizerClient: boolean = true,\n\t) {\n\t\tconst getNodeType = (nodePath: string) => {\n\t\t\tif (nodePath.split(\"/\").length !== 2) {\n\t\t\t\treturn GCNodeType.Other;\n\t\t\t}\n\t\t\treturn GCNodeType.DataStore;\n\t\t};\n\n\t\t// The runtime to be passed to the garbage collector.\n\t\tconst gcRuntime: IGarbageCollectionRuntime = {\n\t\t\tupdateStateBeforeGC: async () => {},\n\t\t\tgetGCData: async (fullGC?: boolean) => defaultGCData,\n\t\t\tupdateUsedRoutes: (usedRoutes: string[]) => {\n\t\t\t\treturn { totalNodeCount: 0, unusedNodeCount: 0 };\n\t\t\t},\n\t\t\tupdateUnusedRoutes: (unusedRoutes: string[]) => {},\n\t\t\tdeleteSweepReadyNodes,\n\t\t\tupdateTombstonedRoutes: (tombstoneRoutes: string[]) => {},\n\t\t\tgetNodeType,\n\t\t\tgetCurrentReferenceTimestampMs: () => Date.now(),\n\t\t\tcloseFn,\n\t\t};\n\n\t\tlet metadata = createParams.metadata;\n\t\tconst existing = createParams.baseSnapshot !== undefined;\n\t\t// For existing, add container runtime metadata which is required for GC to be enabled.\n\t\tif (existing) {\n\t\t\tmetadata = {\n\t\t\t\t...metadata,\n\t\t\t\t...gcMetadata,\n\t\t\t\tgcFeature: gcMetadata.gcFeature ?? stableGCVersion,\n\t\t\t\tsummaryFormatVersion: 1,\n\t\t\t\tmessage: undefined,\n\t\t\t};\n\t\t}\n\n\t\treturn GarbageCollector.create({\n\t\t\t...createParams,\n\t\t\truntime: gcRuntime,\n\t\t\tgcOptions: createParams.gcOptions ?? {},\n\t\t\tbaseSnapshot: createParams.baseSnapshot,\n\t\t\tbaseLogger: createChildLogger({ logger: mc.logger }),\n\t\t\texisting,\n\t\t\tmetadata,\n\t\t\tcreateContainerMetadata: {\n\t\t\t\tcreateContainerRuntimeVersion: pkgVersion,\n\t\t\t\tcreateContainerTimestamp: Date.now(),\n\t\t\t},\n\t\t\tisSummarizerClient,\n\t\t\treadAndParseBlob: async <T>(id: string) => gcBlobsMap.get(id) as T,\n\t\t\tgetNodePackagePath: async (nodeId: string) => testPkgPath,\n\t\t\tgetLastSummaryTimestampMs: () => Date.now(),\n\t\t\tsubmitMessage: (message: ContainerRuntimeGCMessage) => {\n\t\t\t\tgcMessagesCount++;\n\t\t\t\tlastGCMessage = message;\n\t\t\t},\n\t\t});\n\t}\n\n\tbefore(() => {\n\t\tclock = useFakeTimers();\n\t});\n\n\tbeforeEach(() => {\n\t\tlastGCMessage = undefined;\n\t\tmockLogger = new MockLogger();\n\t\tmc = mixinMonitoringContext(mockLogger);\n\n\t\t// Set up initial GC graph with 5 nodes and 2 are unreferenced.\n\t\tdefaultGCData.gcNodes[\"/\"] = [nodes[0]];\n\t\tdefaultGCData.gcNodes[nodes[0]] = [nodes[1]];\n\t\tdefaultGCData.gcNodes[nodes[1]] = [];\n\t\tdefaultGCData.gcNodes[nodes[2]] = [];\n\t\tdefaultGCData.gcNodes[nodes[3]] = [];\n\n\t\t// Set up the initial GC stats based on the initial GC graph.\n\t\tinitialStats = {\n\t\t\tnodeCount: 5,\n\t\t\tunrefNodeCount: 2,\n\t\t\tupdatedNodeCount: 5,\n\t\t\tdataStoreCount: 5,\n\t\t\tunrefDataStoreCount: 2,\n\t\t\tupdatedDataStoreCount: 5,\n\t\t\tattachmentBlobCount: 0,\n\t\t\tunrefAttachmentBlobCount: 0,\n\t\t\tupdatedAttachmentBlobCount: 0,\n\t\t\tlifetimeNodeCount: 5,\n\t\t\tlifetimeDataStoreCount: 5,\n\t\t\tlifetimeAttachmentBlobCount: 0,\n\t\t\tdeletedNodeCount: 0,\n\t\t\tdeletedDataStoreCount: 0,\n\t\t\tdeletedAttachmentBlobCount: 0,\n\t\t};\n\t});\n\n\tafterEach(() => {\n\t\tclock.reset();\n\t\tmockLogger.clear();\n\t\tdefaultGCData = { gcNodes: {} };\n\t});\n\n\tafter(() => {\n\t\tclock.restore();\n\t});\n\n\tlet garbageCollector: IGarbageCollector;\n\tlet initialStats: IGCStats;\n\n\t/** Helper function that makes the garbage collector process the last GC message */\n\tfunction processLastGCMessage() {\n\t\tif (lastGCMessage === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tgarbageCollector.processMessage(lastGCMessage, true /* local */);\n\t}\n\n\tdescribe(\"Mark phase stats\", () => {\n\t\tbeforeEach(() => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\t\t});\n\n\t\tit(\"can generate initial stats\", async () => {\n\t\t\tconst gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\tinitialStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can generate stats with unreferenced nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Unreference another data store node\n\t\t\tdefaultGCData.gcNodes[\"/\"] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\tit(\"can generate stats with re-referenced nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Add a new reference.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [nodes[2]];\n\n\t\t\t// There should be 1 less unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose reference state got updated.\n\t\t\texpectedStats.unrefNodeCount--;\n\t\t\texpectedStats.unrefDataStoreCount--;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\tit(\"can generate stats with new nodes\", async () => {\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Add 2 new nodes and make one of them unreferenced.\n\t\t\tdefaultGCData.gcNodes[\"/\"].push(nodes[4]);\n\t\t\tdefaultGCData.gcNodes[nodes[4]] = [];\n\t\t\tdefaultGCData.gcNodes[nodes[5]] = [];\n\n\t\t\t// There should be 2 more nodes / data stores.\n\t\t\t// There should be 1 more unreferenced node / data store.\n\t\t\t// There should be 1 node / data store whose referenced state got updated.\n\t\t\texpectedStats.nodeCount += 2;\n\t\t\texpectedStats.dataStoreCount += 2;\n\t\t\texpectedStats.lifetimeNodeCount += 2;\n\t\t\texpectedStats.lifetimeDataStoreCount += 2;\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats\");\n\t\t});\n\t});\n\n\t/**\n\t * Note that the life time and deleted stats are the same whether sweep is enabled or not.\n\t */\n\tdescribe(\"Sweep phase stats\", () => {\n\t\tconst defaultSnapshotCacheExpiryMs = 5 * oneDayMs;\n\t\tconst sweepTimeoutMs =\n\t\t\t// Tombstone timeout\n\t\t\tdefaultSessionExpiryDurationMs +\n\t\t\tdefaultSnapshotCacheExpiryMs +\n\t\t\toneDayMs +\n\t\t\t// + Grace Period\n\t\t\tdefaultSweepGracePeriodMs;\n\n\t\t/**\n\t\t * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become\n\t\t * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes - sweep enabled\", async () => {\n\t\t\t// Create garbage collector with sweep enabled.\n\t\t\tgarbageCollector = createGarbageCollector({\n\t\t\t\tgcOptions: { enableGCSweep: true },\n\t\t\t});\n\n\t\t\tlet previousGCMessagesCount = gcMessagesCount;\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === previousGCMessagesCount,\n\t\t\t\t\"There shouldn't be new GC messages\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for them in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 2;\n\t\t\texpectedStats.deletedDataStoreCount += 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready nodes are deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// The 2 sweep ready nodes / data stores should now be truly deleted.\n\t\t\t// They should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount -= 2;\n\t\t\texpectedStats.dataStoreCount -= 2;\n\t\t\texpectedStats.unrefNodeCount -= 2;\n\t\t\texpectedStats.unrefDataStoreCount -= 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is enabled, deleted stats are updated in the GC run next to the one where the objects become\n\t\t * sweep ready. This is because the objects are deleted when the GC op sent during GC is ack'd.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes after multiple sweep runs - sweep enabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({\n\t\t\t\tgcOptions: { enableGCSweep: true },\n\t\t\t});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\tlet previousGCMessagesCount = gcMessagesCount;\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are marked sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the 2 sweep-ready nodes won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for them in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 2;\n\t\t\texpectedStats.deletedDataStoreCount += 2;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready nodes are deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// Unreference one more data store node (nodes[1])\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// The 2 sweep ready nodes / data stores should now be deleted.\n\t\t\t// They should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount -= 2;\n\t\t\texpectedStats.dataStoreCount -= 2;\n\t\t\texpectedStats.unrefNodeCount -= 2;\n\t\t\texpectedStats.unrefDataStoreCount -= 2;\n\t\t\t// There should 1 new unreferenced node / data store and its reference state is updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\n\t\t\t// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// No nodes are updated since the last run.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\t// Note that the new sweep-ready node won't actually be deleted yet (until the GC op is processed)\n\t\t\t// but we account for it in the deleted stats now.\n\t\t\texpectedStats.deletedNodeCount += 1;\n\t\t\texpectedStats.deletedDataStoreCount += 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 3\");\n\n\t\t\tassert(\n\t\t\t\tgcMessagesCount === ++previousGCMessagesCount,\n\t\t\t\t\"There should be one new GC message\",\n\t\t\t);\n\n\t\t\t// Process the GC message so that the sweep ready node is deleted.\n\t\t\tprocessLastGCMessage();\n\n\t\t\t// The sweep ready node / data store should now be truly deleted.\n\t\t\t// It should be removed from the total node and unreferenced counts.\n\t\t\texpectedStats.nodeCount--;\n\t\t\texpectedStats.dataStoreCount--;\n\t\t\texpectedStats.unrefNodeCount--;\n\t\t\texpectedStats.unrefDataStoreCount--;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 4\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is disabled, deleted stats are updated in the same GC run where the objects become\n\t\t * sweep ready. This is because the stats are based on sweep ready state.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes - sweep disabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// The 2 sweep ready nodes / data stores should now show up deleted.\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.deletedNodeCount = 2;\n\t\t\texpectedStats.deletedDataStoreCount = 2;\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats\");\n\t\t});\n\n\t\t/**\n\t\t * When sweep is disabled, deleted stats are updated in the same GC run where the objects become\n\t\t * sweep ready. This is because the stats are based on sweep ready state.\n\t\t */\n\t\tit(\"can generate stats with deleted nodes after multiple sweep runs - sweep disabled\", async () => {\n\t\t\tgarbageCollector = createGarbageCollector({});\n\n\t\t\tconst expectedStats = initialStats;\n\t\t\tlet gcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tgcStats,\n\t\t\t\texpectedStats,\n\t\t\t\t\"The stats for first GC run should be same as initial stats\",\n\t\t\t);\n\n\t\t\t// Advance the clock past sweep timeout so that unreferenced nodes are sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// The 2 sweep ready nodes / data stores should now show up deleted.\n\t\t\t// There shouldn't be any nodes whose reference state updated.\n\t\t\texpectedStats.deletedNodeCount = 2;\n\t\t\texpectedStats.deletedDataStoreCount = 2;\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 1\");\n\n\t\t\t// Unreference another data store node.\n\t\t\tdefaultGCData.gcNodes[nodes[0]] = [];\n\n\t\t\t// There should be 1 more unreferenced node / data store and its referenced\n\t\t\t// state is updated.\n\t\t\texpectedStats.unrefNodeCount++;\n\t\t\texpectedStats.unrefDataStoreCount++;\n\t\t\texpectedStats.updatedNodeCount = 1;\n\t\t\texpectedStats.updatedDataStoreCount = 1;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 2\");\n\n\t\t\t// Advance the clock past sweep timeout again so that unreferenced node is sweep ready.\n\t\t\tclock.tick(sweepTimeoutMs + 1);\n\n\t\t\t// No nodes are updated since the last run.\n\t\t\t// The sweep ready node / data store should show up as deleted.\n\t\t\texpectedStats.updatedNodeCount = 0;\n\t\t\texpectedStats.updatedDataStoreCount = 0;\n\t\t\texpectedStats.deletedNodeCount++;\n\t\t\texpectedStats.deletedDataStoreCount++;\n\n\t\t\tgcStats = await garbageCollector.collectGarbage({});\n\t\t\tassert.deepStrictEqual(gcStats, expectedStats, \"Incorrect GC stats 3\");\n\t\t});\n\t});\n});\n"]}