@fluidframework/container-runtime 2.0.0-dev.3.1.0.125672 → 2.0.0-dev.4.2.0.153917

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +69 -0
  3. package/dist/blobManager.d.ts +29 -24
  4. package/dist/blobManager.d.ts.map +1 -1
  5. package/dist/blobManager.js +162 -92
  6. package/dist/blobManager.js.map +1 -1
  7. package/dist/containerRuntime.d.ts +74 -76
  8. package/dist/containerRuntime.d.ts.map +1 -1
  9. package/dist/containerRuntime.js +328 -264
  10. package/dist/containerRuntime.js.map +1 -1
  11. package/dist/dataStoreContext.d.ts +39 -13
  12. package/dist/dataStoreContext.d.ts.map +1 -1
  13. package/dist/dataStoreContext.js +112 -49
  14. package/dist/dataStoreContext.js.map +1 -1
  15. package/dist/dataStores.d.ts +28 -4
  16. package/dist/dataStores.d.ts.map +1 -1
  17. package/dist/dataStores.js +107 -41
  18. package/dist/dataStores.js.map +1 -1
  19. package/dist/deltaManagerSummarizerProxy.d.ts +19 -0
  20. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -0
  21. package/dist/deltaManagerSummarizerProxy.js +40 -0
  22. package/dist/deltaManagerSummarizerProxy.js.map +1 -0
  23. package/dist/gc/garbageCollection.d.ts +204 -0
  24. package/dist/gc/garbageCollection.d.ts.map +1 -0
  25. package/dist/{garbageCollection.js → gc/garbageCollection.js} +190 -554
  26. package/dist/gc/garbageCollection.js.map +1 -0
  27. package/dist/gc/gcConfigs.d.ts +22 -0
  28. package/dist/gc/gcConfigs.d.ts.map +1 -0
  29. package/dist/gc/gcConfigs.js +143 -0
  30. package/dist/gc/gcConfigs.js.map +1 -0
  31. package/dist/gc/gcDefinitions.d.ts +320 -0
  32. package/dist/gc/gcDefinitions.d.ts.map +1 -0
  33. package/dist/gc/gcDefinitions.js +81 -0
  34. package/dist/gc/gcDefinitions.js.map +1 -0
  35. package/dist/gc/gcHelpers.d.ts +86 -0
  36. package/dist/gc/gcHelpers.d.ts.map +1 -0
  37. package/dist/gc/gcHelpers.js +268 -0
  38. package/dist/gc/gcHelpers.js.map +1 -0
  39. package/dist/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
  40. package/dist/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
  41. package/dist/gc/gcReferenceGraphAlgorithm.js +49 -0
  42. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
  43. package/dist/gc/gcSummaryDefinitions.d.ts +52 -0
  44. package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -0
  45. package/dist/gc/gcSummaryDefinitions.js +7 -0
  46. package/dist/gc/gcSummaryDefinitions.js.map +1 -0
  47. package/dist/gc/gcSummaryStateTracker.d.ts +93 -0
  48. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -0
  49. package/dist/gc/gcSummaryStateTracker.js +239 -0
  50. package/dist/gc/gcSummaryStateTracker.js.map +1 -0
  51. package/dist/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  52. package/dist/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +2 -2
  53. package/dist/gc/gcSweepReadyUsageDetection.js.map +1 -0
  54. package/dist/gc/gcUnreferencedStateTracker.d.ts +34 -0
  55. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  56. package/dist/gc/gcUnreferencedStateTracker.js +94 -0
  57. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
  58. package/dist/gc/index.d.ts +13 -0
  59. package/dist/gc/index.d.ts.map +1 -0
  60. package/dist/gc/index.js +50 -0
  61. package/dist/gc/index.js.map +1 -0
  62. package/dist/index.d.ts +3 -7
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +5 -9
  65. package/dist/index.js.map +1 -1
  66. package/dist/opLifecycle/batchManager.d.ts +11 -13
  67. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  68. package/dist/opLifecycle/batchManager.js +26 -38
  69. package/dist/opLifecycle/batchManager.js.map +1 -1
  70. package/dist/opLifecycle/definitions.d.ts +4 -0
  71. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  72. package/dist/opLifecycle/definitions.js.map +1 -1
  73. package/dist/opLifecycle/index.d.ts +2 -1
  74. package/dist/opLifecycle/index.d.ts.map +1 -1
  75. package/dist/opLifecycle/index.js +4 -1
  76. package/dist/opLifecycle/index.js.map +1 -1
  77. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  78. package/dist/opLifecycle/opCompressor.js +25 -10
  79. package/dist/opLifecycle/opCompressor.js.map +1 -1
  80. package/dist/opLifecycle/opDecompressor.d.ts +4 -0
  81. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  82. package/dist/opLifecycle/opDecompressor.js +43 -4
  83. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  84. package/dist/opLifecycle/opGroupingManager.d.ts +14 -0
  85. package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -0
  86. package/dist/opLifecycle/opGroupingManager.js +56 -0
  87. package/dist/opLifecycle/opGroupingManager.js.map +1 -0
  88. package/dist/opLifecycle/opSplitter.d.ts +16 -4
  89. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  90. package/dist/opLifecycle/opSplitter.js +39 -15
  91. package/dist/opLifecycle/opSplitter.js.map +1 -1
  92. package/dist/opLifecycle/outbox.d.ts +21 -3
  93. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  94. package/dist/opLifecycle/outbox.js +90 -51
  95. package/dist/opLifecycle/outbox.js.map +1 -1
  96. package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -2
  97. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  98. package/dist/opLifecycle/remoteMessageProcessor.js +30 -20
  99. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  100. package/dist/packageVersion.d.ts +1 -1
  101. package/dist/packageVersion.js +1 -1
  102. package/dist/packageVersion.js.map +1 -1
  103. package/dist/pendingStateManager.d.ts +3 -3
  104. package/dist/pendingStateManager.d.ts.map +1 -1
  105. package/dist/pendingStateManager.js +20 -21
  106. package/dist/pendingStateManager.js.map +1 -1
  107. package/dist/storageServiceWithAttachBlobs.d.ts +17 -0
  108. package/dist/storageServiceWithAttachBlobs.d.ts.map +1 -0
  109. package/dist/storageServiceWithAttachBlobs.js +32 -0
  110. package/dist/storageServiceWithAttachBlobs.js.map +1 -0
  111. package/dist/summary/index.d.ts +17 -0
  112. package/dist/summary/index.d.ts.map +1 -0
  113. package/dist/summary/index.js +48 -0
  114. package/dist/summary/index.js.map +1 -0
  115. package/dist/summary/orderedClientElection.d.ts.map +1 -0
  116. package/dist/summary/orderedClientElection.js.map +1 -0
  117. package/dist/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +3 -2
  118. package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  119. package/dist/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
  120. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
  121. package/{lib → dist/summary}/runningSummarizer.d.ts +23 -20
  122. package/dist/summary/runningSummarizer.d.ts.map +1 -0
  123. package/dist/{runningSummarizer.js → summary/runningSummarizer.js} +191 -74
  124. package/dist/summary/runningSummarizer.js.map +1 -0
  125. package/dist/{summarizer.d.ts → summary/summarizer.d.ts} +4 -9
  126. package/dist/summary/summarizer.d.ts.map +1 -0
  127. package/dist/{summarizer.js → summary/summarizer.js} +10 -79
  128. package/dist/summary/summarizer.js.map +1 -0
  129. package/dist/summary/summarizerClientElection.d.ts.map +1 -0
  130. package/dist/summary/summarizerClientElection.js.map +1 -0
  131. package/dist/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +2 -1
  132. package/dist/summary/summarizerHeuristics.d.ts.map +1 -0
  133. package/dist/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -3
  134. package/dist/summary/summarizerHeuristics.js.map +1 -0
  135. package/dist/summary/summarizerNode/index.d.ts +8 -0
  136. package/dist/summary/summarizerNode/index.d.ts.map +1 -0
  137. package/dist/summary/summarizerNode/index.js +12 -0
  138. package/dist/summary/summarizerNode/index.js.map +1 -0
  139. package/dist/summary/summarizerNode/summarizerNode.d.ts +149 -0
  140. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
  141. package/dist/summary/summarizerNode/summarizerNode.js +531 -0
  142. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
  143. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
  144. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
  145. package/dist/summary/summarizerNode/summarizerNodeUtils.js +132 -0
  146. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
  147. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +148 -0
  148. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
  149. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +424 -0
  150. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
  151. package/{lib → dist/summary}/summarizerTypes.d.ts +21 -19
  152. package/dist/summary/summarizerTypes.d.ts.map +1 -0
  153. package/dist/{summarizerTypes.js → summary/summarizerTypes.js} +0 -5
  154. package/dist/summary/summarizerTypes.js.map +1 -0
  155. package/dist/summary/summaryCollection.d.ts.map +1 -0
  156. package/dist/summary/summaryCollection.js.map +1 -0
  157. package/{lib → dist/summary}/summaryFormat.d.ts +3 -21
  158. package/dist/summary/summaryFormat.d.ts.map +1 -0
  159. package/dist/{summaryFormat.js → summary/summaryFormat.js} +1 -10
  160. package/dist/summary/summaryFormat.js.map +1 -0
  161. package/{lib → dist/summary}/summaryGenerator.d.ts +28 -2
  162. package/dist/summary/summaryGenerator.d.ts.map +1 -0
  163. package/dist/{summaryGenerator.js → summary/summaryGenerator.js} +23 -20
  164. package/dist/summary/summaryGenerator.js.map +1 -0
  165. package/dist/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  166. package/dist/summary/summaryManager.d.ts.map +1 -0
  167. package/dist/summary/summaryManager.js.map +1 -0
  168. package/lib/blobManager.d.ts +29 -24
  169. package/lib/blobManager.d.ts.map +1 -1
  170. package/lib/blobManager.js +159 -89
  171. package/lib/blobManager.js.map +1 -1
  172. package/lib/containerRuntime.d.ts +74 -76
  173. package/lib/containerRuntime.d.ts.map +1 -1
  174. package/lib/containerRuntime.js +301 -237
  175. package/lib/containerRuntime.js.map +1 -1
  176. package/lib/dataStoreContext.d.ts +39 -13
  177. package/lib/dataStoreContext.d.ts.map +1 -1
  178. package/lib/dataStoreContext.js +101 -38
  179. package/lib/dataStoreContext.js.map +1 -1
  180. package/lib/dataStores.d.ts +28 -4
  181. package/lib/dataStores.d.ts.map +1 -1
  182. package/lib/dataStores.js +100 -34
  183. package/lib/dataStores.js.map +1 -1
  184. package/lib/deltaManagerSummarizerProxy.d.ts +19 -0
  185. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -0
  186. package/lib/deltaManagerSummarizerProxy.js +36 -0
  187. package/lib/deltaManagerSummarizerProxy.js.map +1 -0
  188. package/lib/gc/garbageCollection.d.ts +204 -0
  189. package/lib/gc/garbageCollection.d.ts.map +1 -0
  190. package/lib/{garbageCollection.js → gc/garbageCollection.js} +172 -535
  191. package/lib/gc/garbageCollection.js.map +1 -0
  192. package/lib/gc/gcConfigs.d.ts +22 -0
  193. package/lib/gc/gcConfigs.d.ts.map +1 -0
  194. package/lib/gc/gcConfigs.js +139 -0
  195. package/lib/gc/gcConfigs.js.map +1 -0
  196. package/lib/gc/gcDefinitions.d.ts +320 -0
  197. package/lib/gc/gcDefinitions.d.ts.map +1 -0
  198. package/lib/gc/gcDefinitions.js +78 -0
  199. package/lib/gc/gcDefinitions.js.map +1 -0
  200. package/lib/gc/gcHelpers.d.ts +86 -0
  201. package/lib/gc/gcHelpers.d.ts.map +1 -0
  202. package/lib/gc/gcHelpers.js +254 -0
  203. package/lib/gc/gcHelpers.js.map +1 -0
  204. package/lib/gc/gcReferenceGraphAlgorithm.d.ts +16 -0
  205. package/lib/gc/gcReferenceGraphAlgorithm.d.ts.map +1 -0
  206. package/lib/gc/gcReferenceGraphAlgorithm.js +45 -0
  207. package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -0
  208. package/lib/gc/gcSummaryDefinitions.d.ts +52 -0
  209. package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -0
  210. package/lib/gc/gcSummaryDefinitions.js +6 -0
  211. package/lib/gc/gcSummaryDefinitions.js.map +1 -0
  212. package/lib/gc/gcSummaryStateTracker.d.ts +93 -0
  213. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -0
  214. package/lib/gc/gcSummaryStateTracker.js +235 -0
  215. package/lib/gc/gcSummaryStateTracker.js.map +1 -0
  216. package/lib/gc/gcSweepReadyUsageDetection.d.ts.map +1 -0
  217. package/lib/{gcSweepReadyUsageDetection.js → gc/gcSweepReadyUsageDetection.js} +1 -1
  218. package/lib/gc/gcSweepReadyUsageDetection.js.map +1 -0
  219. package/lib/gc/gcUnreferencedStateTracker.d.ts +34 -0
  220. package/lib/gc/gcUnreferencedStateTracker.d.ts.map +1 -0
  221. package/lib/gc/gcUnreferencedStateTracker.js +90 -0
  222. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -0
  223. package/lib/gc/index.d.ts +13 -0
  224. package/lib/gc/index.d.ts.map +1 -0
  225. package/lib/gc/index.js +12 -0
  226. package/lib/gc/index.js.map +1 -0
  227. package/lib/index.d.ts +3 -7
  228. package/lib/index.d.ts.map +1 -1
  229. package/lib/index.js +1 -4
  230. package/lib/index.js.map +1 -1
  231. package/lib/opLifecycle/batchManager.d.ts +11 -13
  232. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  233. package/lib/opLifecycle/batchManager.js +24 -37
  234. package/lib/opLifecycle/batchManager.js.map +1 -1
  235. package/lib/opLifecycle/definitions.d.ts +4 -0
  236. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  237. package/lib/opLifecycle/definitions.js.map +1 -1
  238. package/lib/opLifecycle/index.d.ts +2 -1
  239. package/lib/opLifecycle/index.d.ts.map +1 -1
  240. package/lib/opLifecycle/index.js +2 -1
  241. package/lib/opLifecycle/index.js.map +1 -1
  242. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  243. package/lib/opLifecycle/opCompressor.js +26 -11
  244. package/lib/opLifecycle/opCompressor.js.map +1 -1
  245. package/lib/opLifecycle/opDecompressor.d.ts +4 -0
  246. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  247. package/lib/opLifecycle/opDecompressor.js +43 -4
  248. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  249. package/lib/opLifecycle/opGroupingManager.d.ts +14 -0
  250. package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -0
  251. package/lib/opLifecycle/opGroupingManager.js +52 -0
  252. package/lib/opLifecycle/opGroupingManager.js.map +1 -0
  253. package/lib/opLifecycle/opSplitter.d.ts +16 -4
  254. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  255. package/lib/opLifecycle/opSplitter.js +39 -15
  256. package/lib/opLifecycle/opSplitter.js.map +1 -1
  257. package/lib/opLifecycle/outbox.d.ts +21 -3
  258. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  259. package/lib/opLifecycle/outbox.js +92 -53
  260. package/lib/opLifecycle/outbox.js.map +1 -1
  261. package/lib/opLifecycle/remoteMessageProcessor.d.ts +4 -2
  262. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  263. package/lib/opLifecycle/remoteMessageProcessor.js +30 -20
  264. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  265. package/lib/packageVersion.d.ts +1 -1
  266. package/lib/packageVersion.js +1 -1
  267. package/lib/packageVersion.js.map +1 -1
  268. package/lib/pendingStateManager.d.ts +3 -3
  269. package/lib/pendingStateManager.d.ts.map +1 -1
  270. package/lib/pendingStateManager.js +20 -21
  271. package/lib/pendingStateManager.js.map +1 -1
  272. package/lib/storageServiceWithAttachBlobs.d.ts +17 -0
  273. package/lib/storageServiceWithAttachBlobs.d.ts.map +1 -0
  274. package/lib/storageServiceWithAttachBlobs.js +28 -0
  275. package/lib/storageServiceWithAttachBlobs.js.map +1 -0
  276. package/lib/summary/index.d.ts +17 -0
  277. package/lib/summary/index.d.ts.map +1 -0
  278. package/lib/summary/index.js +16 -0
  279. package/lib/summary/index.js.map +1 -0
  280. package/lib/summary/orderedClientElection.d.ts.map +1 -0
  281. package/lib/summary/orderedClientElection.js.map +1 -0
  282. package/lib/{runWhileConnectedCoordinator.d.ts → summary/runWhileConnectedCoordinator.d.ts} +3 -2
  283. package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -0
  284. package/lib/{runWhileConnectedCoordinator.js → summary/runWhileConnectedCoordinator.js} +5 -4
  285. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -0
  286. package/{dist → lib/summary}/runningSummarizer.d.ts +23 -20
  287. package/lib/summary/runningSummarizer.d.ts.map +1 -0
  288. package/lib/{runningSummarizer.js → summary/runningSummarizer.js} +192 -75
  289. package/lib/summary/runningSummarizer.js.map +1 -0
  290. package/lib/{summarizer.d.ts → summary/summarizer.d.ts} +4 -9
  291. package/lib/summary/summarizer.d.ts.map +1 -0
  292. package/lib/{summarizer.js → summary/summarizer.js} +12 -81
  293. package/lib/summary/summarizer.js.map +1 -0
  294. package/lib/summary/summarizerClientElection.d.ts.map +1 -0
  295. package/lib/summary/summarizerClientElection.js.map +1 -0
  296. package/lib/{summarizerHeuristics.d.ts → summary/summarizerHeuristics.d.ts} +2 -1
  297. package/lib/summary/summarizerHeuristics.d.ts.map +1 -0
  298. package/lib/{summarizerHeuristics.js → summary/summarizerHeuristics.js} +6 -3
  299. package/lib/summary/summarizerHeuristics.js.map +1 -0
  300. package/lib/summary/summarizerNode/index.d.ts +8 -0
  301. package/lib/summary/summarizerNode/index.d.ts.map +1 -0
  302. package/lib/summary/summarizerNode/index.js +7 -0
  303. package/lib/summary/summarizerNode/index.js.map +1 -0
  304. package/lib/summary/summarizerNode/summarizerNode.d.ts +149 -0
  305. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -0
  306. package/lib/summary/summarizerNode/summarizerNode.js +526 -0
  307. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -0
  308. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +125 -0
  309. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -0
  310. package/lib/summary/summarizerNode/summarizerNodeUtils.js +125 -0
  311. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
  312. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +148 -0
  313. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -0
  314. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +419 -0
  315. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
  316. package/{dist → lib/summary}/summarizerTypes.d.ts +21 -19
  317. package/lib/summary/summarizerTypes.d.ts.map +1 -0
  318. package/lib/summary/summarizerTypes.js +6 -0
  319. package/lib/summary/summarizerTypes.js.map +1 -0
  320. package/lib/summary/summaryCollection.d.ts.map +1 -0
  321. package/lib/summary/summaryCollection.js.map +1 -0
  322. package/{dist → lib/summary}/summaryFormat.d.ts +3 -21
  323. package/lib/summary/summaryFormat.d.ts.map +1 -0
  324. package/lib/{summaryFormat.js → summary/summaryFormat.js} +0 -8
  325. package/lib/summary/summaryFormat.js.map +1 -0
  326. package/{dist → lib/summary}/summaryGenerator.d.ts +28 -2
  327. package/lib/summary/summaryGenerator.d.ts.map +1 -0
  328. package/lib/{summaryGenerator.js → summary/summaryGenerator.js} +21 -19
  329. package/lib/summary/summaryGenerator.js.map +1 -0
  330. package/lib/{summaryManager.d.ts → summary/summaryManager.d.ts} +1 -1
  331. package/lib/summary/summaryManager.d.ts.map +1 -0
  332. package/lib/summary/summaryManager.js.map +1 -0
  333. package/package.json +66 -60
  334. package/src/blobManager.ts +196 -110
  335. package/src/containerRuntime.ts +491 -391
  336. package/src/dataStoreContext.ts +140 -49
  337. package/src/dataStores.ts +139 -41
  338. package/src/deltaManagerSummarizerProxy.ts +46 -0
  339. package/{garbageCollection.md → src/gc/garbageCollection.md} +2 -2
  340. package/src/{garbageCollection.ts → gc/garbageCollection.ts} +245 -890
  341. package/src/gc/gcConfigs.ts +193 -0
  342. package/src/gc/gcDefinitions.ts +387 -0
  343. package/src/gc/gcHelpers.ts +335 -0
  344. package/src/gc/gcReferenceGraphAlgorithm.ts +52 -0
  345. package/src/gc/gcSummaryDefinitions.ts +54 -0
  346. package/src/gc/gcSummaryStateTracker.ts +329 -0
  347. package/src/{gcSweepReadyUsageDetection.ts → gc/gcSweepReadyUsageDetection.ts} +1 -1
  348. package/src/gc/gcUnreferencedStateTracker.ts +114 -0
  349. package/src/gc/index.ts +65 -0
  350. package/src/index.ts +10 -22
  351. package/src/opLifecycle/README.md +263 -0
  352. package/src/opLifecycle/batchManager.ts +26 -55
  353. package/src/opLifecycle/definitions.ts +4 -0
  354. package/src/opLifecycle/index.ts +2 -1
  355. package/src/opLifecycle/opCompressor.ts +32 -12
  356. package/src/opLifecycle/opDecompressor.ts +50 -5
  357. package/src/opLifecycle/opGroupingManager.ts +78 -0
  358. package/src/opLifecycle/opSplitter.ts +56 -17
  359. package/src/opLifecycle/outbox.ts +126 -62
  360. package/src/opLifecycle/remoteMessageProcessor.ts +38 -22
  361. package/src/packageVersion.ts +1 -1
  362. package/src/pendingStateManager.ts +34 -27
  363. package/src/storageServiceWithAttachBlobs.ts +38 -0
  364. package/src/summary/index.ts +105 -0
  365. package/src/{runWhileConnectedCoordinator.ts → summary/runWhileConnectedCoordinator.ts} +7 -7
  366. package/src/{runningSummarizer.ts → summary/runningSummarizer.ts} +318 -156
  367. package/src/{summarizer.ts → summary/summarizer.ts} +12 -105
  368. package/src/{summarizerHeuristics.ts → summary/summarizerHeuristics.ts} +13 -4
  369. package/src/summary/summarizerNode/index.ts +12 -0
  370. package/src/summary/summarizerNode/summarizerNode.ts +766 -0
  371. package/src/summary/summarizerNode/summarizerNodeUtils.ts +214 -0
  372. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +644 -0
  373. package/src/{summarizerTypes.ts → summary/summarizerTypes.ts} +28 -25
  374. package/src/{summaryFormat.ts → summary/summaryFormat.ts} +3 -29
  375. package/src/{summaryGenerator.ts → summary/summaryGenerator.ts} +34 -27
  376. package/src/{summaryManager.ts → summary/summaryManager.ts} +1 -1
  377. package/dist/garbageCollection.d.ts +0 -411
  378. package/dist/garbageCollection.d.ts.map +0 -1
  379. package/dist/garbageCollection.js.map +0 -1
  380. package/dist/garbageCollectionConstants.d.ts +0 -23
  381. package/dist/garbageCollectionConstants.d.ts.map +0 -1
  382. package/dist/garbageCollectionConstants.js +0 -36
  383. package/dist/garbageCollectionConstants.js.map +0 -1
  384. package/dist/garbageCollectionHelpers.d.ts +0 -15
  385. package/dist/garbageCollectionHelpers.d.ts.map +0 -1
  386. package/dist/garbageCollectionHelpers.js +0 -27
  387. package/dist/garbageCollectionHelpers.js.map +0 -1
  388. package/dist/gcSweepReadyUsageDetection.d.ts.map +0 -1
  389. package/dist/gcSweepReadyUsageDetection.js.map +0 -1
  390. package/dist/orderedClientElection.d.ts.map +0 -1
  391. package/dist/orderedClientElection.js.map +0 -1
  392. package/dist/runWhileConnectedCoordinator.d.ts.map +0 -1
  393. package/dist/runWhileConnectedCoordinator.js.map +0 -1
  394. package/dist/runningSummarizer.d.ts.map +0 -1
  395. package/dist/runningSummarizer.js.map +0 -1
  396. package/dist/serializedSnapshotStorage.d.ts +0 -58
  397. package/dist/serializedSnapshotStorage.d.ts.map +0 -1
  398. package/dist/serializedSnapshotStorage.js +0 -110
  399. package/dist/serializedSnapshotStorage.js.map +0 -1
  400. package/dist/summarizer.d.ts.map +0 -1
  401. package/dist/summarizer.js.map +0 -1
  402. package/dist/summarizerClientElection.d.ts.map +0 -1
  403. package/dist/summarizerClientElection.js.map +0 -1
  404. package/dist/summarizerHandle.d.ts +0 -12
  405. package/dist/summarizerHandle.d.ts.map +0 -1
  406. package/dist/summarizerHandle.js +0 -22
  407. package/dist/summarizerHandle.js.map +0 -1
  408. package/dist/summarizerHeuristics.d.ts.map +0 -1
  409. package/dist/summarizerHeuristics.js.map +0 -1
  410. package/dist/summarizerTypes.d.ts.map +0 -1
  411. package/dist/summarizerTypes.js.map +0 -1
  412. package/dist/summaryCollection.d.ts.map +0 -1
  413. package/dist/summaryCollection.js.map +0 -1
  414. package/dist/summaryFormat.d.ts.map +0 -1
  415. package/dist/summaryFormat.js.map +0 -1
  416. package/dist/summaryGenerator.d.ts.map +0 -1
  417. package/dist/summaryGenerator.js.map +0 -1
  418. package/dist/summaryManager.d.ts.map +0 -1
  419. package/dist/summaryManager.js.map +0 -1
  420. package/lib/garbageCollection.d.ts +0 -411
  421. package/lib/garbageCollection.d.ts.map +0 -1
  422. package/lib/garbageCollection.js.map +0 -1
  423. package/lib/garbageCollectionConstants.d.ts +0 -23
  424. package/lib/garbageCollectionConstants.d.ts.map +0 -1
  425. package/lib/garbageCollectionConstants.js +0 -33
  426. package/lib/garbageCollectionConstants.js.map +0 -1
  427. package/lib/garbageCollectionHelpers.d.ts +0 -15
  428. package/lib/garbageCollectionHelpers.d.ts.map +0 -1
  429. package/lib/garbageCollectionHelpers.js +0 -23
  430. package/lib/garbageCollectionHelpers.js.map +0 -1
  431. package/lib/gcSweepReadyUsageDetection.d.ts.map +0 -1
  432. package/lib/gcSweepReadyUsageDetection.js.map +0 -1
  433. package/lib/orderedClientElection.d.ts.map +0 -1
  434. package/lib/orderedClientElection.js.map +0 -1
  435. package/lib/runWhileConnectedCoordinator.d.ts.map +0 -1
  436. package/lib/runWhileConnectedCoordinator.js.map +0 -1
  437. package/lib/runningSummarizer.d.ts.map +0 -1
  438. package/lib/runningSummarizer.js.map +0 -1
  439. package/lib/serializedSnapshotStorage.d.ts +0 -58
  440. package/lib/serializedSnapshotStorage.d.ts.map +0 -1
  441. package/lib/serializedSnapshotStorage.js +0 -106
  442. package/lib/serializedSnapshotStorage.js.map +0 -1
  443. package/lib/summarizer.d.ts.map +0 -1
  444. package/lib/summarizer.js.map +0 -1
  445. package/lib/summarizerClientElection.d.ts.map +0 -1
  446. package/lib/summarizerClientElection.js.map +0 -1
  447. package/lib/summarizerHandle.d.ts +0 -12
  448. package/lib/summarizerHandle.d.ts.map +0 -1
  449. package/lib/summarizerHandle.js +0 -18
  450. package/lib/summarizerHandle.js.map +0 -1
  451. package/lib/summarizerHeuristics.d.ts.map +0 -1
  452. package/lib/summarizerHeuristics.js.map +0 -1
  453. package/lib/summarizerTypes.d.ts.map +0 -1
  454. package/lib/summarizerTypes.js +0 -9
  455. package/lib/summarizerTypes.js.map +0 -1
  456. package/lib/summaryCollection.d.ts.map +0 -1
  457. package/lib/summaryCollection.js.map +0 -1
  458. package/lib/summaryFormat.d.ts.map +0 -1
  459. package/lib/summaryFormat.js.map +0 -1
  460. package/lib/summaryGenerator.d.ts.map +0 -1
  461. package/lib/summaryGenerator.js.map +0 -1
  462. package/lib/summaryManager.d.ts.map +0 -1
  463. package/lib/summaryManager.js.map +0 -1
  464. package/src/garbageCollectionConstants.ts +0 -38
  465. package/src/garbageCollectionHelpers.ts +0 -37
  466. package/src/serializedSnapshotStorage.ts +0 -151
  467. package/src/summarizerHandle.ts +0 -23
  468. /package/dist/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
  469. /package/dist/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  470. /package/dist/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
  471. /package/dist/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  472. /package/dist/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  473. /package/dist/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  474. /package/dist/{summaryCollection.js → summary/summaryCollection.js} +0 -0
  475. /package/dist/{summaryManager.js → summary/summaryManager.js} +0 -0
  476. /package/lib/{gcSweepReadyUsageDetection.d.ts → gc/gcSweepReadyUsageDetection.d.ts} +0 -0
  477. /package/lib/{orderedClientElection.d.ts → summary/orderedClientElection.d.ts} +0 -0
  478. /package/lib/{orderedClientElection.js → summary/orderedClientElection.js} +0 -0
  479. /package/lib/{summarizerClientElection.d.ts → summary/summarizerClientElection.d.ts} +0 -0
  480. /package/lib/{summarizerClientElection.js → summary/summarizerClientElection.js} +0 -0
  481. /package/lib/{summaryCollection.d.ts → summary/summaryCollection.d.ts} +0 -0
  482. /package/lib/{summaryCollection.js → summary/summaryCollection.js} +0 -0
  483. /package/lib/{summaryManager.js → summary/summaryManager.js} +0 -0
  484. /package/src/{orderedClientElection.ts → summary/orderedClientElection.ts} +0 -0
  485. /package/src/{summarizerClientElection.ts → summary/summarizerClientElection.ts} +0 -0
  486. /package/src/{summaryCollection.ts → summary/summaryCollection.ts} +0 -0
@@ -10,11 +10,11 @@ const runtime_utils_1 = require("@fluidframework/runtime-utils");
10
10
  const common_utils_1 = require("@fluidframework/common-utils");
11
11
  const container_definitions_1 = require("@fluidframework/container-definitions");
12
12
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
13
+ const container_utils_1 = require("@fluidframework/container-utils");
13
14
  const containerRuntime_1 = require("./containerRuntime");
15
+ const gc_1 = require("./gc");
14
16
  const throttler_1 = require("./throttler");
15
- const summarizerClientElection_1 = require("./summarizerClientElection");
16
- const garbageCollectionConstants_1 = require("./garbageCollectionConstants");
17
- const garbageCollectionHelpers_1 = require("./garbageCollectionHelpers");
17
+ const summary_1 = require("./summary");
18
18
  /**
19
19
  * This class represents blob (long string)
20
20
  * This object is used only when creating (writing) new blob and serialization purposes.
@@ -85,22 +85,16 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
85
85
  // Called when a blob node is requested. blobPath is the path of the blob's node in GC's graph.
86
86
  // blobPath's format - `/<BlobManager.basePath>/<blobId>`.
87
87
  blobRequested,
88
- // Called when a reference is added to a blob. For instance, when creating a localId / storageId to storageId
89
- // mapping in the redirect table.
90
- // Node path formats - `/<BlobManager.basePath>/<blobId>`.
91
- addedBlobReference,
92
88
  // Called to check if a blob has been deleted by GC.
93
89
  // blobPath's format - `/<BlobManager.basePath>/<blobId>`.
94
- isBlobDeleted, runtime, stashedBlobs = {}, getCurrentReferenceTimestampMs) {
90
+ isBlobDeleted, runtime, stashedBlobs = {}, closeContainer) {
95
91
  super();
96
92
  this.routeContext = routeContext;
97
93
  this.getStorage = getStorage;
98
- this.sendBlobAttachOp = sendBlobAttachOp;
99
94
  this.blobRequested = blobRequested;
100
- this.addedBlobReference = addedBlobReference;
101
95
  this.isBlobDeleted = isBlobDeleted;
102
96
  this.runtime = runtime;
103
- this.getCurrentReferenceTimestampMs = getCurrentReferenceTimestampMs;
97
+ this.closeContainer = closeContainer;
104
98
  /**
105
99
  * Blobs which have not been uploaded or for which we have not yet seen a BlobAttach op round-trip.
106
100
  * Until we see the op round-trip, there is a possibility we may need to re-upload the blob, so
@@ -125,13 +119,29 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
125
119
  this.mc = (0, telemetry_utils_1.loggerToMonitoringContext)(telemetry_utils_1.ChildLogger.create(this.runtime.logger, "BlobManager"));
126
120
  // Read the feature flag that tells whether to throw when a tombstone blob is requested.
127
121
  this.throwOnTombstoneLoad =
128
- this.mc.config.getBoolean(garbageCollectionConstants_1.throwOnTombstoneLoadKey) === true &&
129
- this.runtime.clientDetails.type !== summarizerClientElection_1.summarizerClientType;
122
+ this.mc.config.getBoolean(gc_1.throwOnTombstoneLoadKey) === true &&
123
+ this.runtime.gcTombstoneEnforcementAllowed &&
124
+ this.runtime.clientDetails.type !== summary_1.summarizerClientType;
130
125
  this.runtime.on("disconnected", () => this.onDisconnected());
131
126
  this.redirectTable = this.load(snapshot);
132
127
  // Begin uploading stashed blobs from previous container instance
133
128
  Object.entries(stashedBlobs).forEach(([localId, entry]) => {
134
129
  const blob = (0, common_utils_1.stringToBuffer)(entry.blob, "base64");
130
+ if (entry.minTTLInSeconds && entry.uploadTime) {
131
+ const timeLapseSinceLocalUpload = (Date.now() - entry.uploadTime) / 1000;
132
+ // stashed entries with more than half-life in storage will not be reuploaded
133
+ if (entry.minTTLInSeconds - timeLapseSinceLocalUpload > entry.minTTLInSeconds / 2) {
134
+ this.pendingBlobs.set(localId, {
135
+ blob,
136
+ status: PendingBlobStatus.OfflinePendingOp,
137
+ handleP: new common_utils_1.Deferred(),
138
+ uploadP: undefined,
139
+ uploadTime: entry.uploadTime,
140
+ minTTLInSeconds: entry.minTTLInSeconds,
141
+ });
142
+ return;
143
+ }
144
+ }
135
145
  this.pendingBlobs.set(localId, {
136
146
  blob,
137
147
  status: PendingBlobStatus.OfflinePendingUpload,
@@ -139,6 +149,30 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
139
149
  uploadP: this.uploadBlob(localId, blob),
140
150
  });
141
151
  });
152
+ this.sendBlobAttachOp = (localId, blobId) => {
153
+ const pendingEntry = this.pendingBlobs.get(localId);
154
+ if ((pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.uploadTime) && (pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.minTTLInSeconds)) {
155
+ const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
156
+ const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
157
+ this.mc.logger.sendTelemetryEvent({
158
+ eventName: "sendBlobAttach",
159
+ entryStatus: pendingEntry.status,
160
+ secondsSinceUpload,
161
+ minTTLInSeconds: pendingEntry.minTTLInSeconds,
162
+ expired,
163
+ });
164
+ if (expired) {
165
+ // we want to avoid submitting ops with broken handles
166
+ this.closeContainer(new container_utils_1.GenericError("Trying to submit a BlobAttach for expired blob", undefined, {
167
+ localId,
168
+ blobId,
169
+ entryStatus: pendingEntry.status,
170
+ secondsSinceUpload,
171
+ }));
172
+ }
173
+ }
174
+ return sendBlobAttachOp(localId, blobId);
175
+ };
142
176
  }
143
177
  get pendingOfflineUploads() {
144
178
  return Array.from(this.pendingBlobs.values()).filter((e) => e.status === PendingBlobStatus.OfflinePendingUpload);
@@ -174,14 +208,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
174
208
  }
175
209
  }
176
210
  }
177
- /**
178
- * For a blobId, returns its path in GC's graph. The node path is of the format `/<BlobManager.basePath>/<blobId>`
179
- * This path must match the path of the blob handle returned by the createBlob API because blobs are marked
180
- * referenced by storing these handles in a referenced DDS.
181
- */
182
- getBlobGCNodePath(blobId) {
183
- return `/${BlobManager.basePath}/${blobId}`;
184
- }
185
211
  /**
186
212
  * Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
187
213
  * detached or there are no (non-pending) attachment blobs in the document
@@ -217,7 +243,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
217
243
  storageId = attachedStorageId;
218
244
  }
219
245
  // Let runtime know that the corresponding GC node was requested.
220
- this.blobRequested(this.getBlobGCNodePath(blobId));
246
+ this.blobRequested(getGCNodePathFromBlobId(blobId));
221
247
  return telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "AttachmentReadBlob", id: storageId }, async () => {
222
248
  return this.getStorage().readBlob(storageId);
223
249
  }, { end: true, cancel: "error" });
@@ -264,11 +290,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
264
290
  */
265
291
  setRedirection(fromId, toId) {
266
292
  this.redirectTable.set(fromId, toId);
267
- // Notify runtime of a reference added if toId is not undefined. It can be undefined when a blob is uploaded in
268
- // detached mode. In this case, the entry will be updated when the blob is updated.
269
- if (toId !== undefined) {
270
- this.addedBlobReference(this.getBlobGCNodePath(fromId), this.getBlobGCNodePath(toId));
271
- }
272
293
  }
273
294
  deleteAndEmitsIfEmpty(id) {
274
295
  if (this.pendingBlobs.has(id)) {
@@ -284,9 +305,8 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
284
305
  (0, common_utils_1.assert)((entry === null || entry === void 0 ? void 0 : entry.status) === PendingBlobStatus.OnlinePendingUpload ||
285
306
  (entry === null || entry === void 0 ? void 0 : entry.status) === PendingBlobStatus.OfflinePendingUpload, 0x386 /* Must have pending blob entry for uploaded blob */);
286
307
  entry.storageId = response.id;
287
- entry.localUploadTime = Date.now();
308
+ entry.uploadTime = Date.now();
288
309
  entry.minTTLInSeconds = response.minTTLInSeconds;
289
- entry.serverUploadTime = this.getCurrentReferenceTimestampMs();
290
310
  if (this.runtime.connected) {
291
311
  if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
292
312
  // Send a blob attach op. This serves two purposes:
@@ -294,7 +314,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
294
314
  // until its storage ID is added to the next summary.
295
315
  // 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
296
316
  // blob from the server via the storage ID.
297
- this.logTimeInfo(entry, "sendBlobAttachResolveTTL");
298
317
  this.sendBlobAttachOp(localId, response.id);
299
318
  if (this.storageIds.has(response.id)) {
300
319
  // The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
@@ -358,7 +377,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
358
377
  * is called on reconnection.
359
378
  */
360
379
  if (entry.status !== PendingBlobStatus.OnlinePendingOp) {
361
- this.logTimeInfo(entry, "sendBlobAttachTransitionOfflineTTL");
362
380
  this.sendBlobAttachOp(localId, entry.storageId);
363
381
  }
364
382
  entry.status =
@@ -377,9 +395,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
377
395
  const { localId, blobId } = metadata;
378
396
  (0, common_utils_1.assert)(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
379
397
  const pendingEntry = this.pendingBlobs.get(localId);
380
- if (pendingEntry) {
381
- this.logTimeInfo(pendingEntry, "sendBlobAttachResubmitTTL");
382
- }
383
398
  if (!blobId) {
384
399
  // We submitted this op while offline. The blob should have been uploaded by now.
385
400
  (0, common_utils_1.assert)((pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.status) === PendingBlobStatus.OfflinePendingOp &&
@@ -388,32 +403,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
388
403
  }
389
404
  return this.sendBlobAttachOp(localId, blobId);
390
405
  }
391
- logTimeInfo(pendingEntry, eventName) {
392
- var _a, _b;
393
- let timeLapseSinceLocalUpload = 0;
394
- let timeLapseSinceServerUpload = 0;
395
- let expiredUsingLocalTime;
396
- let expiredUsingServerTime;
397
- if (pendingEntry.localUploadTime) {
398
- timeLapseSinceLocalUpload = (Date.now() - pendingEntry.localUploadTime) / 1000;
399
- expiredUsingLocalTime =
400
- ((_a = pendingEntry.minTTLInSeconds) !== null && _a !== void 0 ? _a : 0) - timeLapseSinceLocalUpload < 0 ? true : false;
401
- }
402
- if (pendingEntry.serverUploadTime) {
403
- timeLapseSinceServerUpload = (Date.now() - pendingEntry.serverUploadTime) / 1000;
404
- expiredUsingServerTime =
405
- ((_b = pendingEntry.minTTLInSeconds) !== null && _b !== void 0 ? _b : 0) - timeLapseSinceServerUpload < 0 ? true : false;
406
- }
407
- this.mc.logger.sendTelemetryEvent({
408
- eventName,
409
- entryStatus: pendingEntry.status,
410
- timeLapseSinceLocalUpload,
411
- timeLapseSinceServerUpload,
412
- minTTLInSeconds: pendingEntry.minTTLInSeconds,
413
- expiredUsingLocalTime,
414
- expiredUsingServerTime,
415
- });
416
- }
417
406
  processBlobAttachOp(message, local) {
418
407
  var _a, _b;
419
408
  const localId = (_a = message.metadata) === null || _a === void 0 ? void 0 : _a.localId;
@@ -490,6 +479,23 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
490
479
  }
491
480
  return table;
492
481
  }
482
+ summarize(telemetryContext) {
483
+ // if storageIds is empty, it means we are detached and have only local IDs, or that there are no blobs attached
484
+ const blobIds = this.storageIds.size > 0
485
+ ? Array.from(this.storageIds)
486
+ : Array.from(this.redirectTable.keys());
487
+ const builder = new runtime_utils_1.SummaryTreeBuilder();
488
+ blobIds.forEach((blobId) => {
489
+ builder.addAttachment(blobId);
490
+ });
491
+ // Any non-identity entries in the table need to be saved in the summary
492
+ if (this.redirectTable.size > blobIds.length) {
493
+ builder.addBlob(BlobManager.redirectTableBlobName,
494
+ // filter out identity entries
495
+ JSON.stringify(Array.from(this.redirectTable.entries()).filter(([localId, storageId]) => localId !== storageId)));
496
+ }
497
+ return builder.getSummaryTree();
498
+ }
493
499
  /**
494
500
  * Generates data used for garbage collection. Each blob uploaded represents a node in the GC graph as it can be
495
501
  * individually referenced by storing its handle in a referenced DDS. Returns the list of blob ids as GC nodes.
@@ -500,23 +506,83 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
500
506
  const gcData = { gcNodes: {} };
501
507
  for (const [localId, storageId] of this.redirectTable) {
502
508
  (0, common_utils_1.assert)(!!storageId, 0x390 /* Must be attached to get GC data */);
503
- gcData.gcNodes[this.getBlobGCNodePath(localId)] = [this.getBlobGCNodePath(storageId)];
509
+ // Only return local ids as GC nodes because a blob can only be referenced via its local id. The storage
510
+ // id entries have the same key and value, ignore them.
511
+ // The outbound routes are empty because a blob node cannot reference other nodes. It can only be referenced
512
+ // by adding its handle to a referenced DDS.
513
+ if (localId !== storageId) {
514
+ gcData.gcNodes[getGCNodePathFromBlobId(localId)] = [];
515
+ }
504
516
  }
505
517
  return gcData;
506
518
  }
507
519
  /**
508
520
  * This is called to update blobs whose routes are unused. The unused blobs are deleted.
509
- * @param unusedRoutes - The routes of the blob nodes that are unused.
521
+ * @param unusedRoutes - The routes of the blob nodes that are unused. These routes will be based off of local ids.
510
522
  */
511
523
  updateUnusedRoutes(unusedRoutes) {
512
- // The routes or blob node paths are in the same format as returned in getGCData -
513
- // `/<BlobManager.basePath>/<blobId>`.
514
- for (const route of unusedRoutes) {
515
- const pathParts = route.split("/");
516
- (0, common_utils_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x2d5 /* "Invalid blob node id in unused routes." */);
517
- const blobId = pathParts[2];
524
+ this.deleteBlobsFromRedirectTable(unusedRoutes);
525
+ }
526
+ /**
527
+ * Delete attachment blobs that are sweep ready.
528
+ * @param sweepReadyBlobRoutes - The routes of blobs that are sweep ready and should be deleted. These routes will
529
+ * be based off of local ids.
530
+ * @returns - The routes of blobs that were deleted.
531
+ */
532
+ deleteSweepReadyNodes(sweepReadyBlobRoutes) {
533
+ // If sweep for attachment blobs is not enabled, return empty list indicating nothing is deleted.
534
+ if (this.mc.config.getBoolean(gc_1.sweepAttachmentBlobsKey) !== true) {
535
+ return [];
536
+ }
537
+ this.deleteBlobsFromRedirectTable(sweepReadyBlobRoutes);
538
+ return Array.from(sweepReadyBlobRoutes);
539
+ }
540
+ /**
541
+ * Delete blobs with the given routes from the redirect table.
542
+ * The routes are GC nodes paths of format -`/<BlobManager.basePath>/<blobId>`. The blob ids are all local ids.
543
+ * Deleting the blobs involves 2 steps:
544
+ * 1. The redirect table entry for the local ids are deleted.
545
+ * 2. If the storage ids corresponding to the deleted local ids are not in-use anymore, the redirect table entries
546
+ * for the storage ids are deleted as well.
547
+ *
548
+ * Note that this does not delete the blobs from storage service immediately. Deleting the blobs from redirect table
549
+ * will remove them the next summary. The service would them delete them some time in the future.
550
+ */
551
+ deleteBlobsFromRedirectTable(blobRoutes) {
552
+ if (blobRoutes.length === 0) {
553
+ return;
554
+ }
555
+ // This tracks the storage ids of local ids that are deleted. After the local ids have been deleted, if any of
556
+ // these storage ids are unused, they will be deleted as well.
557
+ const maybeUnusedStorageIds = new Set();
558
+ for (const route of blobRoutes) {
559
+ const blobId = getBlobIdFromGCNodePath(route);
560
+ if (!this.redirectTable.has(blobId)) {
561
+ this.mc.logger.sendErrorEvent({
562
+ eventName: "DeletedAttachmentBlobNotFound",
563
+ blobId,
564
+ });
565
+ continue;
566
+ }
567
+ const storageId = this.redirectTable.get(blobId);
568
+ (0, common_utils_1.assert)(!!storageId, 0x5bb /* Must be attached to run GC */);
569
+ maybeUnusedStorageIds.add(storageId);
518
570
  this.redirectTable.delete(blobId);
519
571
  }
572
+ // Find out storage ids that are in-use and remove them from maybeUnusedStorageIds. A storage id is in-use if
573
+ // the redirect table has a local id -> storage id entry for it.
574
+ for (const [localId, storageId] of this.redirectTable.entries()) {
575
+ (0, common_utils_1.assert)(!!storageId, 0x5bc /* Must be attached to run GC */);
576
+ // For every storage id, the redirect table has a id -> id entry. These do not make the storage id in-use.
577
+ if (maybeUnusedStorageIds.has(storageId) && localId !== storageId) {
578
+ maybeUnusedStorageIds.delete(storageId);
579
+ }
580
+ }
581
+ // For unused storage ids, delete their id -> id entries from the redirect table.
582
+ // This way they'll be absent from the next summary, and the service is free to delete them from storage.
583
+ for (const storageId of maybeUnusedStorageIds) {
584
+ this.redirectTable.delete(storageId);
585
+ }
520
586
  }
521
587
  /**
522
588
  * This is called to update blobs whose routes are tombstones. Tombstoned blobs enable testing scenarios with
@@ -528,9 +594,8 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
528
594
  // The routes or blob node paths are in the same format as returned in getGCData -
529
595
  // `/<BlobManager.basePath>/<blobId>`.
530
596
  for (const route of tombstonedRoutes) {
531
- const pathParts = route.split("/");
532
- (0, common_utils_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x50f /* Invalid blob node id in tombstoned routes. */);
533
- tombstonedBlobsSet.add(pathParts[2]);
597
+ const blobId = getBlobIdFromGCNodePath(route);
598
+ tombstonedBlobsSet.add(blobId);
534
599
  }
535
600
  // Remove blobs from the tombstone list that were tombstoned but aren't anymore as per the tombstoneRoutes.
536
601
  for (const blobId of this.tombstonedBlobs) {
@@ -555,7 +620,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
555
620
  * 3. "valid" - It has not been deleted or tombstoned.
556
621
  */
557
622
  let state = "valid";
558
- if (this.isBlobDeleted(this.getBlobGCNodePath(blobId))) {
623
+ if (this.isBlobDeleted(getGCNodePathFromBlobId(blobId))) {
559
624
  state = "deleted";
560
625
  }
561
626
  else if (this.tombstonedBlobs.has(blobId)) {
@@ -569,34 +634,17 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
569
634
  const shouldFail = state === "deleted" || this.throwOnTombstoneLoad;
570
635
  const request = { url: blobId };
571
636
  const error = (0, runtime_utils_1.responseToException)((0, runtime_utils_1.createResponseError)(404, "Blob was deleted", request, state === "tombstoned" ? { [containerRuntime_1.TombstoneResponseHeaderKey]: true } : undefined), request);
572
- (0, garbageCollectionHelpers_1.sendGCUnexpectedUsageEvent)(this.mc, {
637
+ (0, gc_1.sendGCUnexpectedUsageEvent)(this.mc, {
573
638
  eventName: state === "tombstoned"
574
639
  ? "GC_Tombstone_Blob_Requested"
575
640
  : "GC_Deleted_Blob_Requested",
576
641
  category: shouldFail ? "error" : "generic",
577
- isSummarizerClient: this.runtime.clientDetails.type === summarizerClientElection_1.summarizerClientType,
642
+ gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
578
643
  }, [BlobManager.basePath], error);
579
644
  if (shouldFail) {
580
645
  throw error;
581
646
  }
582
647
  }
583
- summarize(telemetryContext) {
584
- // if storageIds is empty, it means we are detached and have only local IDs, or that there are no blobs attached
585
- const blobIds = this.storageIds.size > 0
586
- ? Array.from(this.storageIds)
587
- : Array.from(this.redirectTable.keys());
588
- const builder = new runtime_utils_1.SummaryTreeBuilder();
589
- blobIds.forEach((blobId) => {
590
- builder.addAttachment(blobId);
591
- });
592
- // Any non-identity entries in the table need to be saved in the summary
593
- if (this.redirectTable.size > blobIds.length) {
594
- builder.addBlob(BlobManager.redirectTableBlobName,
595
- // filter out identity entries
596
- JSON.stringify(Array.from(this.redirectTable.entries()).filter(([localId, storageId]) => localId !== storageId)));
597
- }
598
- return builder.getSummaryTree();
599
- }
600
648
  setRedirectTable(table) {
601
649
  (0, common_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Detached, 0x252 /* "redirect table can only be set in detached container" */);
602
650
  (0, common_utils_1.assert)(this.redirectTable.size === table.size, 0x391 /* Redirect table size must match BlobManager's local ID count */);
@@ -610,7 +658,13 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
610
658
  getPendingBlobs() {
611
659
  const blobs = {};
612
660
  for (const [key, entry] of this.pendingBlobs) {
613
- blobs[key] = { blob: (0, common_utils_1.bufferToString)(entry.blob, "base64") };
661
+ blobs[key] = entry.minTTLInSeconds
662
+ ? {
663
+ blob: (0, common_utils_1.bufferToString)(entry.blob, "base64"),
664
+ uploadTime: entry.uploadTime,
665
+ minTTLInSeconds: entry.minTTLInSeconds,
666
+ }
667
+ : { blob: (0, common_utils_1.bufferToString)(entry.blob, "base64") };
614
668
  }
615
669
  return blobs;
616
670
  }
@@ -618,4 +672,20 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
618
672
  exports.BlobManager = BlobManager;
619
673
  BlobManager.basePath = "_blobs";
620
674
  BlobManager.redirectTableBlobName = ".redirectTable";
675
+ /**
676
+ * For a blobId, returns its path in GC's graph. The node path is of the format `/<BlobManager.basePath>/<blobId>`.
677
+ * This path must match the path of the blob handle returned by the createBlob API because blobs are marked
678
+ * referenced by storing these handles in a referenced DDS.
679
+ */
680
+ function getGCNodePathFromBlobId(blobId) {
681
+ return `/${BlobManager.basePath}/${blobId}`;
682
+ }
683
+ /**
684
+ * For a given GC node path, return the blobId. The node path is of the format `/<BlobManager.basePath>/<blobId>`.
685
+ */
686
+ function getBlobIdFromGCNodePath(nodePath) {
687
+ const pathParts = nodePath.split("/");
688
+ (0, common_utils_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x5bd /* Invalid blob node path */);
689
+ return pathParts[2];
690
+ }
621
691
  //# sourceMappingURL=blobManager.js.map