@fluidframework/container-runtime 2.0.0-internal.3.1.0 → 2.0.0-internal.3.2.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 (351) hide show
  1. package/dist/blobManager.d.ts +6 -0
  2. package/dist/blobManager.d.ts.map +1 -1
  3. package/dist/blobManager.js +31 -6
  4. package/dist/blobManager.js.map +1 -1
  5. package/dist/containerRuntime.d.ts +17 -15
  6. package/dist/containerRuntime.d.ts.map +1 -1
  7. package/dist/containerRuntime.js +158 -121
  8. package/dist/containerRuntime.js.map +1 -1
  9. package/dist/dataStoreContext.d.ts +21 -12
  10. package/dist/dataStoreContext.d.ts.map +1 -1
  11. package/dist/dataStoreContext.js +76 -50
  12. package/dist/dataStoreContext.js.map +1 -1
  13. package/dist/dataStores.d.ts +9 -10
  14. package/dist/dataStores.d.ts.map +1 -1
  15. package/dist/dataStores.js +42 -49
  16. package/dist/dataStores.js.map +1 -1
  17. package/dist/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +5 -200
  18. package/dist/gc/garbageCollection.d.ts.map +1 -0
  19. package/dist/{garbageCollection.js → gc/garbageCollection.js} +77 -353
  20. package/dist/gc/garbageCollection.js.map +1 -0
  21. package/dist/gc/gcDefinitions.d.ts +189 -0
  22. package/dist/gc/gcDefinitions.d.ts.map +1 -0
  23. package/dist/{garbageCollectionConstants.js → gc/gcDefinitions.js} +24 -2
  24. package/dist/gc/gcDefinitions.js.map +1 -0
  25. package/{lib/garbageCollectionHelpers.d.ts → dist/gc/gcHelpers.d.ts} +5 -1
  26. package/dist/gc/gcHelpers.d.ts.map +1 -0
  27. package/dist/{garbageCollectionHelpers.js → gc/gcHelpers.js} +27 -7
  28. package/dist/gc/gcHelpers.js.map +1 -0
  29. package/dist/gc/gcSummaryStateTracker.d.ts +86 -0
  30. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
  31. package/dist/gc/gcSummaryStateTracker.js +246 -0
  32. package/dist/gc/gcSummaryStateTracker.js.map +1 -0
  33. package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  34. package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +2 -2
  35. package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
  36. package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
  37. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  38. package/dist/gc/gcUnreferencedStateTracker.js +94 -0
  39. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
  40. package/dist/gc/index.d.ts +11 -0
  41. package/dist/gc/index.d.ts.map +1 -0
  42. package/dist/gc/index.js +40 -0
  43. package/dist/gc/index.js.map +1 -0
  44. package/dist/index.d.ts +2 -5
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +6 -9
  47. package/dist/index.js.map +1 -1
  48. package/dist/opLifecycle/batchManager.d.ts +2 -13
  49. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  50. package/dist/opLifecycle/batchManager.js +7 -36
  51. package/dist/opLifecycle/batchManager.js.map +1 -1
  52. package/dist/opLifecycle/definitions.d.ts +4 -0
  53. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  54. package/dist/opLifecycle/definitions.js.map +1 -1
  55. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  56. package/dist/opLifecycle/opCompressor.js +1 -0
  57. package/dist/opLifecycle/opCompressor.js.map +1 -1
  58. package/dist/opLifecycle/opSplitter.d.ts +1 -1
  59. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  60. package/dist/opLifecycle/opSplitter.js +20 -12
  61. package/dist/opLifecycle/opSplitter.js.map +1 -1
  62. package/dist/opLifecycle/outbox.d.ts +19 -3
  63. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  64. package/dist/opLifecycle/outbox.js +59 -28
  65. package/dist/opLifecycle/outbox.js.map +1 -1
  66. package/dist/packageVersion.d.ts +1 -1
  67. package/dist/packageVersion.js +1 -1
  68. package/dist/packageVersion.js.map +1 -1
  69. package/dist/pendingStateManager.d.ts +1 -2
  70. package/dist/pendingStateManager.d.ts.map +1 -1
  71. package/dist/pendingStateManager.js +14 -9
  72. package/dist/pendingStateManager.js.map +1 -1
  73. package/dist/summary/index.d.ts +17 -0
  74. package/dist/summary/index.d.ts.map +1 -0
  75. package/dist/summary/index.js +47 -0
  76. package/dist/summary/index.js.map +1 -0
  77. package/dist/summary/orderedClientElection.d.ts.map +1 -0
  78. package/dist/summary/orderedClientElection.js.map +1 -0
  79. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  80. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
  81. package/{lib → dist/summary}/runningSummarizer.d.ts +19 -18
  82. package/dist/summary/runningSummarizer.d.ts.map +1 -0
  83. package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +158 -56
  84. package/dist/summary/runningSummarizer.js.map +1 -0
  85. package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +2 -4
  86. package/dist/summary/summarizer.d.ts.map +1 -0
  87. package/dist/{summarizer.js → summary/summarizer.js} +1 -61
  88. package/dist/summary/summarizer.js.map +1 -0
  89. package/dist/summary/summarizerClientElection.d.ts.map +1 -0
  90. package/dist/summary/summarizerClientElection.js.map +1 -0
  91. package/dist/summary/summarizerHandle.d.ts.map +1 -0
  92. package/dist/summary/summarizerHandle.js.map +1 -0
  93. package/dist/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +1 -1
  94. package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
  95. package/dist/summary/summarizerHeuristics.js.map +1 -0
  96. package/{lib → dist/summary}/summarizerTypes.d.ts +1 -1
  97. package/dist/summary/summarizerTypes.d.ts.map +1 -0
  98. package/dist/summary/summarizerTypes.js.map +1 -0
  99. package/dist/summary/summaryCollection.d.ts.map +1 -0
  100. package/dist/summary/summaryCollection.js.map +1 -0
  101. package/{lib → dist/summary}/summaryFormat.d.ts +1 -43
  102. package/dist/summary/summaryFormat.d.ts.map +1 -0
  103. package/dist/{summaryFormat.js → summary/summaryFormat.js} +1 -10
  104. package/dist/summary/summaryFormat.js.map +1 -0
  105. package/dist/summary/summaryGenerator.d.ts.map +1 -0
  106. package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +1 -2
  107. package/dist/summary/summaryGenerator.js.map +1 -0
  108. package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  109. package/dist/summary/summaryManager.d.ts.map +1 -0
  110. package/dist/summary/summaryManager.js.map +1 -0
  111. package/lib/blobManager.d.ts +6 -0
  112. package/lib/blobManager.d.ts.map +1 -1
  113. package/lib/blobManager.js +28 -3
  114. package/lib/blobManager.js.map +1 -1
  115. package/lib/containerRuntime.d.ts +17 -15
  116. package/lib/containerRuntime.d.ts.map +1 -1
  117. package/lib/containerRuntime.js +127 -90
  118. package/lib/containerRuntime.js.map +1 -1
  119. package/lib/dataStoreContext.d.ts +21 -12
  120. package/lib/dataStoreContext.d.ts.map +1 -1
  121. package/lib/dataStoreContext.js +64 -38
  122. package/lib/dataStoreContext.js.map +1 -1
  123. package/lib/dataStores.d.ts +9 -10
  124. package/lib/dataStores.d.ts.map +1 -1
  125. package/lib/dataStores.js +33 -40
  126. package/lib/dataStores.js.map +1 -1
  127. package/lib/{garbageCollection.d.ts → gc/garbageCollection.d.ts} +5 -200
  128. package/lib/gc/garbageCollection.d.ts.map +1 -0
  129. package/lib/{garbageCollection.js → gc/garbageCollection.js} +44 -319
  130. package/lib/gc/garbageCollection.js.map +1 -0
  131. package/lib/gc/gcDefinitions.d.ts +189 -0
  132. package/lib/gc/gcDefinitions.d.ts.map +1 -0
  133. package/lib/{garbageCollectionConstants.js → gc/gcDefinitions.js} +23 -1
  134. package/lib/gc/gcDefinitions.js.map +1 -0
  135. package/{dist/garbageCollectionHelpers.d.ts → lib/gc/gcHelpers.d.ts} +5 -1
  136. package/lib/gc/gcHelpers.d.ts.map +1 -0
  137. package/lib/{garbageCollectionHelpers.js → gc/gcHelpers.js} +20 -2
  138. package/lib/gc/gcHelpers.js.map +1 -0
  139. package/lib/gc/gcSummaryStateTracker.d.ts +86 -0
  140. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
  141. package/lib/gc/gcSummaryStateTracker.js +242 -0
  142. package/lib/gc/gcSummaryStateTracker.js.map +1 -0
  143. package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  144. package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +1 -1
  145. package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
  146. package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
  147. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  148. package/lib/gc/gcUnreferencedStateTracker.js +90 -0
  149. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
  150. package/lib/gc/index.d.ts +11 -0
  151. package/lib/gc/index.d.ts.map +1 -0
  152. package/lib/gc/index.js +11 -0
  153. package/lib/gc/index.js.map +1 -0
  154. package/lib/index.d.ts +2 -5
  155. package/lib/index.d.ts.map +1 -1
  156. package/lib/index.js +1 -4
  157. package/lib/index.js.map +1 -1
  158. package/lib/opLifecycle/batchManager.d.ts +2 -13
  159. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  160. package/lib/opLifecycle/batchManager.js +7 -36
  161. package/lib/opLifecycle/batchManager.js.map +1 -1
  162. package/lib/opLifecycle/definitions.d.ts +4 -0
  163. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  164. package/lib/opLifecycle/definitions.js.map +1 -1
  165. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  166. package/lib/opLifecycle/opCompressor.js +1 -0
  167. package/lib/opLifecycle/opCompressor.js.map +1 -1
  168. package/lib/opLifecycle/opSplitter.d.ts +1 -1
  169. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  170. package/lib/opLifecycle/opSplitter.js +20 -12
  171. package/lib/opLifecycle/opSplitter.js.map +1 -1
  172. package/lib/opLifecycle/outbox.d.ts +19 -3
  173. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  174. package/lib/opLifecycle/outbox.js +60 -29
  175. package/lib/opLifecycle/outbox.js.map +1 -1
  176. package/lib/packageVersion.d.ts +1 -1
  177. package/lib/packageVersion.js +1 -1
  178. package/lib/packageVersion.js.map +1 -1
  179. package/lib/pendingStateManager.d.ts +1 -2
  180. package/lib/pendingStateManager.d.ts.map +1 -1
  181. package/lib/pendingStateManager.js +14 -9
  182. package/lib/pendingStateManager.js.map +1 -1
  183. package/lib/summary/index.d.ts +17 -0
  184. package/lib/summary/index.d.ts.map +1 -0
  185. package/lib/summary/index.js +16 -0
  186. package/lib/summary/index.js.map +1 -0
  187. package/lib/summary/orderedClientElection.d.ts.map +1 -0
  188. package/lib/summary/orderedClientElection.js.map +1 -0
  189. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  190. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
  191. package/{dist → lib/summary}/runningSummarizer.d.ts +19 -18
  192. package/lib/summary/runningSummarizer.d.ts.map +1 -0
  193. package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +159 -57
  194. package/lib/summary/runningSummarizer.js.map +1 -0
  195. package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +2 -4
  196. package/lib/summary/summarizer.d.ts.map +1 -0
  197. package/lib/{summarizer.js → summary/summarizer.js} +3 -63
  198. package/lib/summary/summarizer.js.map +1 -0
  199. package/lib/summary/summarizerClientElection.d.ts.map +1 -0
  200. package/lib/summary/summarizerClientElection.js.map +1 -0
  201. package/lib/summary/summarizerHandle.d.ts.map +1 -0
  202. package/lib/summary/summarizerHandle.js.map +1 -0
  203. package/lib/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +1 -1
  204. package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
  205. package/lib/summary/summarizerHeuristics.js.map +1 -0
  206. package/{dist → lib/summary}/summarizerTypes.d.ts +1 -1
  207. package/lib/summary/summarizerTypes.d.ts.map +1 -0
  208. package/lib/summary/summarizerTypes.js.map +1 -0
  209. package/lib/summary/summaryCollection.d.ts.map +1 -0
  210. package/lib/summary/summaryCollection.js.map +1 -0
  211. package/{dist → lib/summary}/summaryFormat.d.ts +1 -43
  212. package/lib/summary/summaryFormat.d.ts.map +1 -0
  213. package/lib/{summaryFormat.js → summary/summaryFormat.js} +0 -8
  214. package/lib/summary/summaryFormat.js.map +1 -0
  215. package/lib/summary/summaryGenerator.d.ts.map +1 -0
  216. package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +1 -2
  217. package/lib/summary/summaryGenerator.js.map +1 -0
  218. package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  219. package/lib/summary/summaryManager.d.ts.map +1 -0
  220. package/lib/summary/summaryManager.js.map +1 -0
  221. package/package.json +125 -122
  222. package/src/blobManager.ts +33 -3
  223. package/src/containerRuntime.ts +178 -106
  224. package/src/dataStoreContext.ts +90 -49
  225. package/src/dataStores.ts +44 -51
  226. package/{garbageCollection.md → src/gc/garbageCollection.md} +2 -2
  227. package/src/{garbageCollection.ts → gc/garbageCollection.ts} +90 -560
  228. package/src/gc/gcDefinitions.ts +244 -0
  229. package/src/{garbageCollectionHelpers.ts → gc/gcHelpers.ts} +26 -1
  230. package/src/gc/gcSummaryStateTracker.ts +339 -0
  231. package/src/{gcSweepReadyUsageDetection.ts → gc/gcSweepReadyUsageDetection.ts} +1 -1
  232. package/src/gc/gcUnreferencedStateTracker.ts +114 -0
  233. package/src/gc/index.ts +40 -0
  234. package/src/index.ts +10 -14
  235. package/src/opLifecycle/batchManager.ts +7 -54
  236. package/src/opLifecycle/definitions.ts +4 -0
  237. package/src/opLifecycle/opCompressor.ts +1 -0
  238. package/src/opLifecycle/opSplitter.ts +33 -14
  239. package/src/opLifecycle/outbox.ts +84 -38
  240. package/src/packageVersion.ts +1 -1
  241. package/src/pendingStateManager.ts +26 -14
  242. package/src/summary/index.ts +99 -0
  243. package/src/{runningSummarizer.ts → summary/runningSummarizer.ts} +279 -139
  244. package/src/{summarizer.ts → summary/summarizer.ts} +5 -76
  245. package/src/{summarizerHeuristics.ts → summary/summarizerHeuristics.ts} +1 -1
  246. package/src/{summarizerTypes.ts → summary/summarizerTypes.ts} +1 -1
  247. package/src/{summaryFormat.ts → summary/summaryFormat.ts} +1 -53
  248. package/src/{summaryGenerator.ts → summary/summaryGenerator.ts} +9 -9
  249. package/src/{summaryManager.ts → summary/summaryManager.ts} +1 -1
  250. package/dist/garbageCollection.d.ts.map +0 -1
  251. package/dist/garbageCollection.js.map +0 -1
  252. package/dist/garbageCollectionConstants.d.ts +0 -26
  253. package/dist/garbageCollectionConstants.d.ts.map +0 -1
  254. package/dist/garbageCollectionConstants.js.map +0 -1
  255. package/dist/garbageCollectionHelpers.d.ts.map +0 -1
  256. package/dist/garbageCollectionHelpers.js.map +0 -1
  257. package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
  258. package/dist/gcSweepReadyUsageDetection.js.map +0 -1
  259. package/dist/orderedClientElection.d.ts.map +0 -1
  260. package/dist/orderedClientElection.js.map +0 -1
  261. package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
  262. package/dist/runWhileConnectedCoordinator.js.map +0 -1
  263. package/dist/runningSummarizer.d.ts.map +0 -1
  264. package/dist/runningSummarizer.js.map +0 -1
  265. package/dist/summarizer.d.ts.map +0 -1
  266. package/dist/summarizer.js.map +0 -1
  267. package/dist/summarizerClientElection.d.ts.map +0 -1
  268. package/dist/summarizerClientElection.js.map +0 -1
  269. package/dist/summarizerHandle.d.ts.map +0 -1
  270. package/dist/summarizerHandle.js.map +0 -1
  271. package/dist/summarizerHeuristics.d.ts.map +0 -1
  272. package/dist/summarizerHeuristics.js.map +0 -1
  273. package/dist/summarizerTypes.d.ts.map +0 -1
  274. package/dist/summarizerTypes.js.map +0 -1
  275. package/dist/summaryCollection.d.ts.map +0 -1
  276. package/dist/summaryCollection.js.map +0 -1
  277. package/dist/summaryFormat.d.ts.map +0 -1
  278. package/dist/summaryFormat.js.map +0 -1
  279. package/dist/summaryGenerator.d.ts.map +0 -1
  280. package/dist/summaryGenerator.js.map +0 -1
  281. package/dist/summaryManager.d.ts.map +0 -1
  282. package/dist/summaryManager.js.map +0 -1
  283. package/lib/garbageCollection.d.ts.map +0 -1
  284. package/lib/garbageCollection.js.map +0 -1
  285. package/lib/garbageCollectionConstants.d.ts +0 -26
  286. package/lib/garbageCollectionConstants.d.ts.map +0 -1
  287. package/lib/garbageCollectionConstants.js.map +0 -1
  288. package/lib/garbageCollectionHelpers.d.ts.map +0 -1
  289. package/lib/garbageCollectionHelpers.js.map +0 -1
  290. package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
  291. package/lib/gcSweepReadyUsageDetection.js.map +0 -1
  292. package/lib/orderedClientElection.d.ts.map +0 -1
  293. package/lib/orderedClientElection.js.map +0 -1
  294. package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
  295. package/lib/runWhileConnectedCoordinator.js.map +0 -1
  296. package/lib/runningSummarizer.d.ts.map +0 -1
  297. package/lib/runningSummarizer.js.map +0 -1
  298. package/lib/summarizer.d.ts.map +0 -1
  299. package/lib/summarizer.js.map +0 -1
  300. package/lib/summarizerClientElection.d.ts.map +0 -1
  301. package/lib/summarizerClientElection.js.map +0 -1
  302. package/lib/summarizerHandle.d.ts.map +0 -1
  303. package/lib/summarizerHandle.js.map +0 -1
  304. package/lib/summarizerHeuristics.d.ts.map +0 -1
  305. package/lib/summarizerHeuristics.js.map +0 -1
  306. package/lib/summarizerTypes.d.ts.map +0 -1
  307. package/lib/summarizerTypes.js.map +0 -1
  308. package/lib/summaryCollection.d.ts.map +0 -1
  309. package/lib/summaryCollection.js.map +0 -1
  310. package/lib/summaryFormat.d.ts.map +0 -1
  311. package/lib/summaryFormat.js.map +0 -1
  312. package/lib/summaryGenerator.d.ts.map +0 -1
  313. package/lib/summaryGenerator.js.map +0 -1
  314. package/lib/summaryManager.d.ts.map +0 -1
  315. package/lib/summaryManager.js.map +0 -1
  316. package/src/garbageCollectionConstants.ts +0 -44
  317. /package/dist/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
  318. /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  319. /package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
  320. /package/dist/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
  321. /package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +0 -0
  322. /package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  323. /package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  324. /package/dist/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
  325. /package/dist/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
  326. /package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +0 -0
  327. /package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -0
  328. /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  329. /package/dist/{summaryCollection.js → summary/summaryCollection.js} +0 -0
  330. /package/dist/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
  331. /package/dist/{summaryManager.js → summary/summaryManager.js} +0 -0
  332. /package/lib/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
  333. /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  334. /package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
  335. /package/lib/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +0 -0
  336. /package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +0 -0
  337. /package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  338. /package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  339. /package/lib/{summarizerHandle.d.ts → summary/summarizerHandle.d.ts} +0 -0
  340. /package/lib/{summarizerHandle.js → summary/summarizerHandle.js} +0 -0
  341. /package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +0 -0
  342. /package/lib/{summarizerTypes.js → summary/summarizerTypes.js} +0 -0
  343. /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  344. /package/lib/{summaryCollection.js → summary/summaryCollection.js} +0 -0
  345. /package/lib/{summaryGenerator.d.ts → summary/summaryGenerator.d.ts} +0 -0
  346. /package/lib/{summaryManager.js → summary/summaryManager.js} +0 -0
  347. /package/src/{orderedClientElection.ts → summary/orderedClientElection.ts} +0 -0
  348. /package/src/{runWhileConnectedCoordinator.ts → summary/runWhileConnectedCoordinator.ts} +0 -0
  349. /package/src/{summarizerClientElection.ts → summary/summarizerClientElection.ts} +0 -0
  350. /package/src/{summarizerHandle.ts → summary/summarizerHandle.ts} +0 -0
  351. /package/src/{summaryCollection.ts → summary/summaryCollection.ts} +0 -0
@@ -29,7 +29,6 @@ import {
29
29
  } from "@fluidframework/protocol-definitions";
30
30
  import { IContainerRuntime } from "@fluidframework/container-runtime-definitions";
31
31
  import {
32
- BindState,
33
32
  channelsTreeName,
34
33
  CreateChildSummarizerNodeFn,
35
34
  CreateChildSummarizerNodeParam,
@@ -49,10 +48,16 @@ import {
49
48
  ISummarizerNodeWithGC,
50
49
  SummarizeInternalFn,
51
50
  ITelemetryContext,
51
+ VisibilityState,
52
52
  } from "@fluidframework/runtime-definitions";
53
- import { addBlobToSummary, convertSummaryTreeToITree } from "@fluidframework/runtime-utils";
53
+ import {
54
+ addBlobToSummary,
55
+ convertSummaryTreeToITree,
56
+ packagePathToTelemetryProperty,
57
+ } from "@fluidframework/runtime-utils";
54
58
  import {
55
59
  ChildLogger,
60
+ generateStack,
56
61
  loggerToMonitoringContext,
57
62
  LoggingError,
58
63
  MonitoringContext,
@@ -65,7 +70,6 @@ import {
65
70
  extractSafePropertiesFromMessage,
66
71
  } from "@fluidframework/container-utils";
67
72
 
68
- import { ContainerRuntime } from "./containerRuntime";
69
73
  import {
70
74
  dataStoreAttributesBlobName,
71
75
  hasIsolatedChannels,
@@ -74,10 +78,10 @@ import {
74
78
  WriteFluidDataStoreAttributes,
75
79
  getAttributesFormatVersion,
76
80
  getFluidDataStoreAttributes,
77
- } from "./summaryFormat";
78
- import { throwOnTombstoneUsageKey } from "./garbageCollectionConstants";
79
- import { sendGCUnexpectedUsageEvent } from "./garbageCollectionHelpers";
80
- import { summarizerClientType } from "./summarizerClientElection";
81
+ summarizerClientType,
82
+ } from "./summary";
83
+ import { ContainerRuntime } from "./containerRuntime";
84
+ import { sendGCUnexpectedUsageEvent, throwOnTombstoneUsageKey } from "./gc";
81
85
 
82
86
  function createAttributes(
83
87
  pkg: readonly string[],
@@ -131,7 +135,6 @@ export interface ILocalFluidDataStoreContextProps extends IFluidDataStoreContext
131
135
  /** Properties necessary for creating a remote FluidDataStoreContext */
132
136
  export interface IRemoteFluidDataStoreContextProps extends IFluidDataStoreContextProps {
133
137
  readonly snapshotTree: ISnapshotTree | undefined;
134
- readonly getBaseGCDetails: () => Promise<IGarbageCollectionDetailsBase | undefined>;
135
138
  }
136
139
 
137
140
  /**
@@ -241,8 +244,6 @@ export abstract class FluidDataStoreContext
241
244
  protected registry: IFluidDataStoreRegistry | undefined;
242
245
 
243
246
  protected detachedRuntimeCreation = false;
244
- /** @deprecated - To be replaced by calling makeLocallyVisible directly */
245
- public readonly bindToContext: () => void;
246
247
  protected channel: IFluidDataStoreChannel | undefined;
247
248
  private loaded = false;
248
249
  protected pending: ISequencedDocumentMessage[] | undefined = [];
@@ -255,6 +256,13 @@ export abstract class FluidDataStoreContext
255
256
  private readonly thresholdOpsCounter: ThresholdCounter;
256
257
  private static readonly pendingOpsCountThreshold = 1000;
257
258
 
259
+ /**
260
+ * If the summarizer makes local changes, a telemetry event is logged. This has the potential to be very noisy.
261
+ * So, adding a count of how many telemetry events are logged per data store context. This can be
262
+ * controlled via feature flags.
263
+ */
264
+ private localChangesTelemetryCount: number;
265
+
258
266
  // The used routes of this node as per the last GC run. This is used to update the used routes of the channel
259
267
  // if it realizes after GC is run.
260
268
  private lastUsedRoutes: string[] | undefined;
@@ -268,7 +276,6 @@ export abstract class FluidDataStoreContext
268
276
  constructor(
269
277
  props: IFluidDataStoreContextProps,
270
278
  private readonly existing: boolean,
271
- private bindState: BindState, // Used to assert for state tracking purposes
272
279
  public readonly isLocalDataStore: boolean,
273
280
  private readonly makeLocallyVisibleFn: () => void,
274
281
  ) {
@@ -289,20 +296,6 @@ export abstract class FluidDataStoreContext
289
296
  ? this.containerRuntime.attachState
290
297
  : AttachState.Detached;
291
298
 
292
- this.bindToContext = () => {
293
- assert(
294
- this.bindState === BindState.NotBound,
295
- 0x13b /* "datastore context is already in bound state" */,
296
- );
297
- this.bindState = BindState.Binding;
298
- assert(
299
- this.channel !== undefined,
300
- 0x13c /* "undefined channel on datastore context" */,
301
- );
302
- this.makeLocallyVisible();
303
- this.bindState = BindState.Bound;
304
- };
305
-
306
299
  const thisSummarizeInternal = async (
307
300
  fullTree: boolean,
308
301
  trackState: boolean,
@@ -312,7 +305,6 @@ export abstract class FluidDataStoreContext
312
305
  this.summarizerNode = props.createSummarizerNodeFn(
313
306
  thisSummarizeInternal,
314
307
  async (fullGC?: boolean) => this.getGCDataInternal(fullGC),
315
- async () => this.getBaseGCDetails(),
316
308
  );
317
309
 
318
310
  this.mc = loggerToMonitoringContext(
@@ -328,6 +320,10 @@ export abstract class FluidDataStoreContext
328
320
  this.mc.config.getBoolean(throwOnTombstoneUsageKey) === true &&
329
321
  this._containerRuntime.gcTombstoneEnforcementAllowed &&
330
322
  this.clientDetails.type !== summarizerClientType;
323
+
324
+ // By default, a data store can log maximum 10 local changes telemetry in summarizer.
325
+ this.localChangesTelemetryCount =
326
+ this.mc.config.getNumber("Fluid.Telemetry.LocalChangesTelemetryCount") ?? 10;
331
327
  }
332
328
 
333
329
  public dispose(): void {
@@ -364,9 +360,14 @@ export abstract class FluidDataStoreContext
364
360
  this._tombstoned = tombstone;
365
361
  }
366
362
 
367
- private rejectDeferredRealize(reason: string, packageName?: string): never {
363
+ private rejectDeferredRealize(
364
+ reason: string,
365
+ failedPkgPath?: string,
366
+ fullPackageName?: readonly string[],
367
+ ): never {
368
368
  throw new LoggingError(reason, {
369
- packageName: { value: packageName, tag: TelemetryDataTag.CodeArtifact },
369
+ failedPkgPath: { value: failedPkgPath, tag: TelemetryDataTag.CodeArtifact },
370
+ fullPackageName: packagePathToTelemetryProperty(fullPackageName),
370
371
  });
371
372
  }
372
373
 
@@ -384,6 +385,7 @@ export abstract class FluidDataStoreContext
384
385
  value: this.id,
385
386
  tag: TelemetryDataTag.CodeArtifact,
386
387
  },
388
+ packageName: packagePathToTelemetryProperty(this.pkg),
387
389
  });
388
390
  this.channelDeferred?.reject(errorWrapped);
389
391
  this.logger.sendErrorEvent({ eventName: "RealizeError" }, errorWrapped);
@@ -404,18 +406,22 @@ export abstract class FluidDataStoreContext
404
406
  let lastPkg: string | undefined;
405
407
  for (const pkg of packages) {
406
408
  if (!registry) {
407
- this.rejectDeferredRealize("No registry for package", lastPkg);
409
+ this.rejectDeferredRealize("No registry for package", lastPkg, packages);
408
410
  }
409
411
  lastPkg = pkg;
410
412
  entry = await registry.get(pkg);
411
413
  if (!entry) {
412
- this.rejectDeferredRealize("Registry does not contain entry for the package", pkg);
414
+ this.rejectDeferredRealize(
415
+ "Registry does not contain entry for the package",
416
+ pkg,
417
+ packages,
418
+ );
413
419
  }
414
420
  registry = entry.IFluidDataStoreRegistry;
415
421
  }
416
422
  const factory = entry?.IFluidDataStoreFactory;
417
423
  if (factory === undefined) {
418
- this.rejectDeferredRealize("Can't find factory for package", lastPkg);
424
+ this.rejectDeferredRealize("Can't find factory for package", lastPkg, packages);
419
425
  }
420
426
 
421
427
  return { factory, registry };
@@ -671,6 +677,10 @@ export abstract class FluidDataStoreContext
671
677
  content,
672
678
  type,
673
679
  };
680
+
681
+ // Summarizer clients should not submit messages.
682
+ this.identifyLocalChangeInSummarizer("DataStoreMessageSubmittedInSummarizer", type);
683
+
674
684
  this._containerRuntime.submitDataStoreOp(this.id, fluidDataStoreContent, localOpMetadata);
675
685
  }
676
686
 
@@ -711,6 +721,15 @@ export abstract class FluidDataStoreContext
711
721
  */
712
722
  public makeLocallyVisible() {
713
723
  assert(this.channel !== undefined, 0x2cf /* "undefined channel on datastore context" */);
724
+ assert(
725
+ this.channel.visibilityState === VisibilityState.LocallyVisible,
726
+ 0x590 /* Channel must be locally visible */,
727
+ );
728
+ this.makeLocallyVisibleFn();
729
+ }
730
+
731
+ /** @deprecated - To be replaced by calling makeLocallyVisible directly */
732
+ public bindToContext() {
714
733
  this.makeLocallyVisibleFn();
715
734
  }
716
735
 
@@ -792,7 +811,12 @@ export abstract class FluidDataStoreContext
792
811
  this._isInMemoryRoot = true;
793
812
  }
794
813
 
795
- public abstract getBaseGCDetails(): Promise<IGarbageCollectionDetailsBase>;
814
+ /**
815
+ * @deprecated - The functionality to get base GC details has been moved to summarizer node.
816
+ */
817
+ public async getBaseGCDetails(): Promise<IGarbageCollectionDetailsBase> {
818
+ return {};
819
+ }
796
820
 
797
821
  public reSubmit(contents: any, localOpMetadata: unknown) {
798
822
  assert(!!this.channel, 0x14b /* "Channel must exist when resubmitting ops" */);
@@ -865,11 +889,40 @@ export abstract class FluidDataStoreContext
865
889
  }
866
890
  }
867
891
 
892
+ /**
893
+ * Summarizer client should not have local changes. These changes can become part of the summary and can break
894
+ * eventual consistency. For example, the next summary (say at ref seq# 100) may contain these changes whereas
895
+ * other clients that are up-to-date till seq# 100 may not have them yet.
896
+ */
897
+ protected identifyLocalChangeInSummarizer(eventName: string, type?: string) {
898
+ if (
899
+ this.clientDetails.type !== summarizerClientType ||
900
+ this.localChangesTelemetryCount <= 0
901
+ ) {
902
+ return;
903
+ }
904
+
905
+ // Log a telemetry if there are local changes in the summarizer. This will give us data on how often
906
+ // this is happening and which data stores do this. The eventual goal is to disallow local changes
907
+ // in the summarizer and the data will help us plan this.
908
+ this.mc.logger.sendTelemetryEvent({
909
+ eventName,
910
+ type,
911
+ fluidDataStoreId: {
912
+ value: this.id,
913
+ tag: TelemetryDataTag.CodeArtifact,
914
+ },
915
+ packageName: packagePathToTelemetryProperty(this.pkg),
916
+ isSummaryInProgress: this.summarizerNode.isSummaryInProgress?.(),
917
+ stack: generateStack(),
918
+ });
919
+ this.localChangesTelemetryCount--;
920
+ }
921
+
868
922
  public getCreateChildSummarizerNodeFn(id: string, createParam: CreateChildSummarizerNodeParam) {
869
923
  return (
870
924
  summarizeInternal: SummarizeInternalFn,
871
925
  getGCDataFn: (fullGC?: boolean) => Promise<IGarbageCollectionData>,
872
- getBaseGCDetailsFn?: () => Promise<IGarbageCollectionDetailsBase>,
873
926
  ) =>
874
927
  this.summarizerNode.createChild(
875
928
  summarizeInternal,
@@ -878,7 +931,6 @@ export abstract class FluidDataStoreContext
878
931
  // DDS will not create failure summaries
879
932
  { throwOnFailure: true },
880
933
  getGCDataFn,
881
- getBaseGCDetailsFn,
882
934
  );
883
935
  }
884
936
 
@@ -889,17 +941,13 @@ export abstract class FluidDataStoreContext
889
941
 
890
942
  export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
891
943
  private readonly initSnapshotValue: ISnapshotTree | undefined;
892
- private readonly baseGCDetailsP: Promise<IGarbageCollectionDetailsBase>;
893
944
 
894
945
  constructor(props: IRemoteFluidDataStoreContextProps) {
895
- super(props, true /* existing */, BindState.Bound, false /* isLocalDataStore */, () => {
946
+ super(props, true /* existing */, false /* isLocalDataStore */, () => {
896
947
  throw new Error("Already attached");
897
948
  });
898
949
 
899
950
  this.initSnapshotValue = props.snapshotTree;
900
- this.baseGCDetailsP = new LazyPromise<IGarbageCollectionDetailsBase>(async () => {
901
- return (await props.getBaseGCDetails()) ?? {};
902
- });
903
951
 
904
952
  if (props.snapshotTree !== undefined) {
905
953
  this.summarizerNode.updateBaseSummaryState(props.snapshotTree);
@@ -959,10 +1007,6 @@ export class RemoteFluidDataStoreContext extends FluidDataStoreContext {
959
1007
  return this.initialSnapshotDetailsP;
960
1008
  }
961
1009
 
962
- public async getBaseGCDetails(): Promise<IGarbageCollectionDetailsBase> {
963
- return this.baseGCDetailsP;
964
- }
965
-
966
1010
  public generateAttachMessage(): IAttachMessage {
967
1011
  throw new Error("Cannot attach remote store");
968
1012
  }
@@ -982,11 +1026,13 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
982
1026
  super(
983
1027
  props,
984
1028
  props.snapshotTree !== undefined ? true : false /* existing */,
985
- props.snapshotTree ? BindState.Bound : BindState.NotBound,
986
1029
  true /* isLocalDataStore */,
987
1030
  props.makeLocallyVisibleFn,
988
1031
  );
989
1032
 
1033
+ // Summarizer client should not create local data stores.
1034
+ this.identifyLocalChangeInSummarizer("DataStoreCreatedInSummarizer");
1035
+
990
1036
  this.snapshotTree = props.snapshotTree;
991
1037
  if (props.isRootDataStore === true) {
992
1038
  this.setInMemoryRoot();
@@ -1078,11 +1124,6 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
1078
1124
  };
1079
1125
  }
1080
1126
 
1081
- public async getBaseGCDetails(): Promise<IGarbageCollectionDetailsBase> {
1082
- // Local data store does not have initial summary.
1083
- return {};
1084
- }
1085
-
1086
1127
  /**
1087
1128
  * A context should only be marked as deleted when its a remote context.
1088
1129
  * Session Expiry at the runtime level should have closed the container creating the local data store context
package/src/dataStores.ts CHANGED
@@ -21,7 +21,6 @@ import {
21
21
  IEnvelope,
22
22
  IFluidDataStoreContextDetached,
23
23
  IGarbageCollectionData,
24
- IGarbageCollectionDetailsBase,
25
24
  IInboundSignalMessage,
26
25
  InboundAttachMessage,
27
26
  ISummarizeResult,
@@ -45,13 +44,9 @@ import {
45
44
  } from "@fluidframework/telemetry-utils";
46
45
  import { AttachState } from "@fluidframework/container-definitions";
47
46
  import { BlobCacheStorageService, buildSnapshotTree } from "@fluidframework/driver-utils";
48
- import { assert, Lazy, LazyPromise } from "@fluidframework/common-utils";
47
+ import { assert, Lazy } from "@fluidframework/common-utils";
49
48
  import { v4 as uuid } from "uuid";
50
- import {
51
- GCDataBuilder,
52
- unpackChildNodesGCDetails,
53
- unpackChildNodesUsedRoutes,
54
- } from "@fluidframework/garbage-collector";
49
+ import { GCDataBuilder, unpackChildNodesUsedRoutes } from "@fluidframework/garbage-collector";
55
50
  import { DataStoreContexts } from "./dataStoreContexts";
56
51
  import {
57
52
  ContainerRuntime,
@@ -66,16 +61,19 @@ import {
66
61
  createAttributesBlob,
67
62
  LocalDetachedFluidDataStoreContext,
68
63
  } from "./dataStoreContext";
64
+ import { IDataStoreAliasMessage, isDataStoreAliasMessage } from "./dataStore";
65
+ import {
66
+ GCNodeType,
67
+ sweepDatastoresKey,
68
+ throwOnTombstoneLoadKey,
69
+ sendGCUnexpectedUsageEvent,
70
+ } from "./gc";
69
71
  import {
72
+ summarizerClientType,
70
73
  IContainerRuntimeMetadata,
71
74
  nonDataStorePaths,
72
75
  rootHasIsolatedChannels,
73
- } from "./summaryFormat";
74
- import { IDataStoreAliasMessage, isDataStoreAliasMessage } from "./dataStore";
75
- import { GCNodeType } from "./garbageCollection";
76
- import { sweepDatastoresKey, throwOnTombstoneLoadKey } from "./garbageCollectionConstants";
77
- import { summarizerClientType } from "./summarizerClientElection";
78
- import { sendGCUnexpectedUsageEvent } from "./garbageCollectionHelpers";
76
+ } from "./summary";
79
77
 
80
78
  type PendingAliasResolve = (success: boolean) => void;
81
79
 
@@ -123,7 +121,6 @@ export class DataStores implements IDisposable {
123
121
  ) => CreateChildSummarizerNodeFn,
124
122
  private readonly deleteChildSummarizerNodeFn: (id: string) => void,
125
123
  baseLogger: ITelemetryBaseLogger,
126
- getBaseGCDetails: () => Promise<IGarbageCollectionDetailsBase>,
127
124
  private readonly gcNodeUpdated: (
128
125
  nodePath: string,
129
126
  timestampMs: number,
@@ -140,15 +137,6 @@ export class DataStores implements IDisposable {
140
137
  this.runtime.IFluidHandleContext,
141
138
  );
142
139
 
143
- const baseGCDetailsP = new LazyPromise(async () => {
144
- const baseGCDetails = await getBaseGCDetails();
145
- return unpackChildNodesGCDetails(baseGCDetails);
146
- });
147
- // Returns the base GC details for the data store with the given id.
148
- const dataStoreBaseGCDetails = async (dataStoreId: string) => {
149
- const baseGCDetails = await baseGCDetailsP;
150
- return baseGCDetails.get(dataStoreId);
151
- };
152
140
  // Tombstone should only throw when the feature flag is enabled and the client isn't a summarizer
153
141
  this.throwOnTombstoneLoad =
154
142
  this.mc.config.getBoolean(throwOnTombstoneLoadKey) === true &&
@@ -177,7 +165,6 @@ export class DataStores implements IDisposable {
177
165
  dataStoreContext = new RemoteFluidDataStoreContext({
178
166
  id: key,
179
167
  snapshotTree: value,
180
- getBaseGCDetails: async () => dataStoreBaseGCDetails(key),
181
168
  runtime: this.runtime,
182
169
  storage: this.runtime.storage,
183
170
  scope: this.runtime.scope,
@@ -270,10 +257,6 @@ export class DataStores implements IDisposable {
270
257
  const remoteFluidDataStoreContext = new RemoteFluidDataStoreContext({
271
258
  id: attachMessage.id,
272
259
  snapshotTree,
273
- // New data stores begin with empty GC details since GC hasn't run on them yet.
274
- getBaseGCDetails: async () => {
275
- return {};
276
- },
277
260
  runtime: this.runtime,
278
261
  storage: new BlobCacheStorageService(this.runtime.storage, flatBlobs),
279
262
  scope: this.runtime.scope,
@@ -448,6 +431,8 @@ export class DataStores implements IDisposable {
448
431
  ) {
449
432
  const envelope = message.contents as IEnvelope;
450
433
  const transformed = { ...message, contents: envelope.contents };
434
+ const request = { url: envelope.address };
435
+ this.validateNotDeleted(envelope.address, request);
451
436
  const context = this.contexts.get(envelope.address);
452
437
  assert(!!context, 0x162 /* "There should be a store context for the op" */);
453
438
  context.process(transformed, local, localMessageMetadata);
@@ -491,7 +476,7 @@ export class DataStores implements IDisposable {
491
476
  private validateNotDeleted(
492
477
  id: string,
493
478
  request: IRequest,
494
- requestHeaderData: RuntimeHeaderData,
479
+ requestHeaderData?: RuntimeHeaderData,
495
480
  ) {
496
481
  const dataStoreNodePath = `/${id}`;
497
482
  if (this.isDataStoreDeleted(dataStoreNodePath)) {
@@ -562,6 +547,8 @@ export class DataStores implements IDisposable {
562
547
  }
563
548
 
564
549
  public processSignal(address: string, message: IInboundSignalMessage, local: boolean) {
550
+ const request = { url: address };
551
+ this.validateNotDeleted(address, request);
565
552
  const context = this.contexts.get(address);
566
553
  if (!context) {
567
554
  // Attach message may not have been processed yet
@@ -621,10 +608,11 @@ export class DataStores implements IDisposable {
621
608
  await Promise.all(
622
609
  Array.from(this.contexts)
623
610
  .filter(([_, context]) => {
624
- // Summarizer works only with clients with no local changes!
611
+ // Summarizer works only with clients with no local changes. A data store in attaching
612
+ // state indicates an op was sent to attach a local data store.
625
613
  assert(
626
614
  context.attachState !== AttachState.Attaching,
627
- 0x165 /* "Summarizer cannot work if client has local changes" */,
615
+ 0x588 /* Local data store detected in attaching state during summarize */,
628
616
  );
629
617
  return context.attachState === AttachState.Attached;
630
618
  })
@@ -722,8 +710,12 @@ export class DataStores implements IDisposable {
722
710
  await Promise.all(
723
711
  Array.from(this.contexts)
724
712
  .filter(([_, context]) => {
725
- // Get GC data only for attached contexts. Detached contexts are not connected in the GC reference
726
- // graph so any references they might have won't be connected as well.
713
+ // Summarizer client and hence GC works only with clients with no local changes. A data store in
714
+ // attaching state indicates an op was sent to attach a local data store.
715
+ assert(
716
+ context.attachState !== AttachState.Attaching,
717
+ 0x589 /* Local data store detected in attaching state while running GC */,
718
+ );
727
719
  return context.attachState === AttachState.Attached;
728
720
  })
729
721
  .map(async ([contextId, context]) => {
@@ -783,43 +775,44 @@ export class DataStores implements IDisposable {
783
775
  }
784
776
 
785
777
  /**
786
- * This is called to delete unused nodes and returns that list so that other
787
- * systems can remove those nodes from their states (i.e. garbage collection when sweep is run)
788
- * @param unusedRoutes - The routes of data stores and DDSes that should be deleted
789
- * @returns - routes of deleted nodes such that garbage collection can delete those nodes from its reference graph
790
- * and other state
778
+ * Delete data stores and its objects that are sweep ready.
779
+ * @param sweepReadyDataStoreRoutes - The routes of data stores and its objects that are sweep ready and should
780
+ * be deleted.
781
+ * @returns - The routes of data stores and its objects that were deleted.
791
782
  */
792
- public deleteUnusedNodes(unusedRoutes: string[]): string[] {
783
+ public deleteSweepReadyNodes(sweepReadyDataStoreRoutes: string[]): string[] {
784
+ // If sweep for data stores is not enabled, return empty list indicating nothing is deleted.
793
785
  if (this.mc.config.getBoolean(sweepDatastoresKey) !== true) {
794
786
  return [];
795
787
  }
796
- const deletedRoutes = new Set<string>();
797
-
798
- for (const route of unusedRoutes) {
788
+ for (const route of sweepReadyDataStoreRoutes) {
799
789
  const pathParts = route.split("/");
800
790
  const dataStoreId = pathParts[1];
801
791
 
802
792
  // TODO: GC:Validation - Skip any routes already deleted
803
-
804
- // Push all deleted DataStore (/datastoreId) and sub DataStore (/datastoreId/...) routes to deleted routes
805
- deletedRoutes.add(route);
806
-
807
- // Ignore sub-data store routes because a data store and its sub-routes are deleted together, so, we only need to delete the data store.
793
+ // Ignore sub-data store routes because a data store and its sub-routes are deleted together, so, we only
794
+ // need to delete the data store.
808
795
  if (pathParts.length > 2) {
809
796
  continue;
810
797
  }
811
798
 
799
+ if (!this.contexts.has(dataStoreId)) {
800
+ this.mc.logger.sendErrorEvent({
801
+ eventName: "DeletedDataStoreNotFound",
802
+ dataStoreId,
803
+ });
804
+ }
805
+
812
806
  const dataStore = this.contexts.get(dataStoreId);
813
807
  assert(dataStore !== undefined, 0x571 /* Attempting to delete unknown dataStore */);
814
808
  dataStore.delete();
815
809
 
816
- // Delete the contexts of unused data stores.
810
+ // Delete the contexts of sweep ready data stores.
817
811
  this.contexts.delete(dataStoreId);
818
- // Delete the summarizer node of the unused data stores.
812
+ // Delete the summarizer node of the sweep ready data stores.
819
813
  this.deleteChildSummarizerNodeFn(dataStoreId);
820
814
  }
821
-
822
- return Array.from(deletedRoutes);
815
+ return Array.from(sweepReadyDataStoreRoutes);
823
816
  }
824
817
 
825
818
  /**
@@ -18,7 +18,7 @@ Currently, the only Fluid objects that are eligible for GC are data stores and a
18
18
 
19
19
  There are 2 ways to reference a data store:
20
20
 
21
- - Store the data stores's handle (see [IFluidHandle](../../../common/lib/core-interfaces/src/handles.ts)) in a referenced DDS that supports handle in its data. For example, a data store's handle can be stored in a referenced `SharedMap` DDS.
21
+ - Store the data stores's handle (see [IFluidHandle](../../../../../packages/common/core-interfaces/src/handles.ts) in a referenced DDS that supports handle in its data. For example, a data store's handle can be stored in a referenced `SharedMap` DDS.
22
22
 
23
23
  Note that storing a handle of any of a data store's DDS will also mark the data store as referenced.
24
24
 
@@ -50,7 +50,7 @@ Mark phase is enabled by default for a container. It is enabled during creation
50
50
 
51
51
  If you wish to disable this, set the `gcAllowed` option to `false` in `IGCRuntimeOptions`. These options are under `IContainerRuntimeOptions` and are passed to the container runtime during its creation. Note that this will disable GC permanently (including the sweep phase) for the container during its lifetime.
52
52
 
53
- See `IGCRuntimeOptions` in [containerRuntime.ts](./src/containerRuntime.ts) for more options to control GC behavior.
53
+ See `IGCRuntimeOptions` in [containerRuntime.ts](../containerRuntime.ts) for more options to control GC behavior.
54
54
 
55
55
  ### Sweep phase
56
56