@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
@@ -7,7 +7,9 @@ import { IDocumentStorageService } from "@fluidframework/driver-definitions";
7
7
  import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
8
8
  import { TypedEventEmitter } from "@fluidframework/common-utils";
9
9
  import { IContainerRuntime, IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions";
10
+ import { ICriticalContainerError } from "@fluidframework/container-definitions";
10
11
  import { IGarbageCollectionData, ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
12
+ import { ContainerRuntime } from "./containerRuntime";
11
13
  /**
12
14
  * This class represents blob (long string)
13
15
  * This object is used only when creating (writing) new blob and serialization purposes.
@@ -34,10 +36,12 @@ export interface IBlobManagerLoadInfo {
34
36
  ids?: string[];
35
37
  redirectTable?: [string, string][];
36
38
  }
37
- export declare type IBlobManagerRuntime = Pick<IContainerRuntime, "attachState" | "connected" | "logger" | "clientDetails"> & TypedEventEmitter<IContainerRuntimeEvents>;
39
+ export declare type IBlobManagerRuntime = Pick<IContainerRuntime, "attachState" | "connected" | "logger" | "clientDetails"> & Pick<ContainerRuntime, "gcTombstoneEnforcementAllowed"> & TypedEventEmitter<IContainerRuntimeEvents>;
38
40
  export interface IPendingBlobs {
39
41
  [id: string]: {
40
42
  blob: string;
43
+ uploadTime?: number;
44
+ minTTLInSeconds?: number;
41
45
  };
42
46
  }
43
47
  export interface IBlobManagerEvents {
@@ -46,22 +50,10 @@ export interface IBlobManagerEvents {
46
50
  export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
47
51
  private readonly routeContext;
48
52
  private readonly getStorage;
49
- /**
50
- * Submit a BlobAttach op. When a blob is uploaded, there is a short grace period before which the blob is
51
- * deleted. The BlobAttach op notifies the server that blob is in use. The server will then not delete the
52
- * the blob as long as it is listed as referenced in future summaries. The summarizing client will know to
53
- * include the storage ID in the summary when it sees the op.
54
- *
55
- * The op will also include a local ID to inform all clients of the relation to the storage ID, without
56
- * knowledge of which they cannot request the blob from storage. It's important that this op is sequenced
57
- * before any ops that reference the local ID, otherwise, an invalid handle could be added to the document.
58
- */
59
- private readonly sendBlobAttachOp;
60
53
  private readonly blobRequested;
61
- private readonly addedBlobReference;
62
54
  private readonly isBlobDeleted;
63
55
  private readonly runtime;
64
- private readonly getCurrentReferenceTimestampMs;
56
+ private readonly closeContainer;
65
57
  static readonly basePath = "_blobs";
66
58
  private static readonly redirectTableBlobName;
67
59
  private readonly mc;
@@ -93,6 +85,7 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
93
85
  * Tombstone is a temporary feature that imitates a blob getting swept by garbage collection.
94
86
  */
95
87
  private readonly tombstonedBlobs;
88
+ private readonly sendBlobAttachOp;
96
89
  constructor(routeContext: IFluidHandleContext, snapshot: IBlobManagerLoadInfo, getStorage: () => IDocumentStorageService,
97
90
  /**
98
91
  * Submit a BlobAttach op. When a blob is uploaded, there is a short grace period before which the blob is
@@ -104,7 +97,7 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
104
97
  * knowledge of which they cannot request the blob from storage. It's important that this op is sequenced
105
98
  * before any ops that reference the local ID, otherwise, an invalid handle could be added to the document.
106
99
  */
107
- sendBlobAttachOp: (localId: string, storageId?: string) => void, blobRequested: (blobPath: string) => void, addedBlobReference: (fromNodePath: string, toNodePath: string) => void, isBlobDeleted: (blobPath: string) => boolean, runtime: IBlobManagerRuntime, stashedBlobs: IPendingBlobs | undefined, getCurrentReferenceTimestampMs: () => number | undefined);
100
+ sendBlobAttachOp: (localId: string, storageId?: string) => void, blobRequested: (blobPath: string) => void, isBlobDeleted: (blobPath: string) => boolean, runtime: IBlobManagerRuntime, stashedBlobs: IPendingBlobs | undefined, closeContainer: (error?: ICriticalContainerError) => void);
108
101
  private get pendingOfflineUploads();
109
102
  get hasPendingOfflineUploads(): boolean;
110
103
  get hasPendingBlobs(): boolean;
@@ -117,12 +110,6 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
117
110
  * again
118
111
  */
119
112
  private onDisconnected;
120
- /**
121
- * For a blobId, returns its path in GC's graph. The node path is of the format `/<BlobManager.basePath>/<blobId>`
122
- * This path must match the path of the blob handle returned by the createBlob API because blobs are marked
123
- * referenced by storing these handles in a referenced DDS.
124
- */
125
- private getBlobGCNodePath;
126
113
  /**
127
114
  * Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
128
115
  * detached or there are no (non-pending) attachment blobs in the document
@@ -148,7 +135,6 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
148
135
  * @param metadata - op metadata containing storage and/or local IDs
149
136
  */
150
137
  reSubmit(metadata: Record<string, unknown> | undefined): void;
151
- private logTimeInfo;
152
138
  processBlobAttachOp(message: ISequencedDocumentMessage, local: boolean): void;
153
139
  /**
154
140
  * Reads blobs needed to load BlobManager from storage.
@@ -161,6 +147,7 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
161
147
  * Load a set of previously attached blob IDs and redirect table from a previous snapshot.
162
148
  */
163
149
  private load;
150
+ summarize(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats;
164
151
  /**
165
152
  * Generates data used for garbage collection. Each blob uploaded represents a node in the GC graph as it can be
166
153
  * individually referenced by storing its handle in a referenced DDS. Returns the list of blob ids as GC nodes.
@@ -170,9 +157,28 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
170
157
  getGCData(fullGC?: boolean): IGarbageCollectionData;
171
158
  /**
172
159
  * This is called to update blobs whose routes are unused. The unused blobs are deleted.
173
- * @param unusedRoutes - The routes of the blob nodes that are unused.
160
+ * @param unusedRoutes - The routes of the blob nodes that are unused. These routes will be based off of local ids.
174
161
  */
175
162
  updateUnusedRoutes(unusedRoutes: string[]): void;
163
+ /**
164
+ * Delete attachment blobs that are sweep ready.
165
+ * @param sweepReadyBlobRoutes - The routes of blobs that are sweep ready and should be deleted. These routes will
166
+ * be based off of local ids.
167
+ * @returns - The routes of blobs that were deleted.
168
+ */
169
+ deleteSweepReadyNodes(sweepReadyBlobRoutes: string[]): string[];
170
+ /**
171
+ * Delete blobs with the given routes from the redirect table.
172
+ * The routes are GC nodes paths of format -`/<BlobManager.basePath>/<blobId>`. The blob ids are all local ids.
173
+ * Deleting the blobs involves 2 steps:
174
+ * 1. The redirect table entry for the local ids are deleted.
175
+ * 2. If the storage ids corresponding to the deleted local ids are not in-use anymore, the redirect table entries
176
+ * for the storage ids are deleted as well.
177
+ *
178
+ * Note that this does not delete the blobs from storage service immediately. Deleting the blobs from redirect table
179
+ * will remove them the next summary. The service would them delete them some time in the future.
180
+ */
181
+ private deleteBlobsFromRedirectTable;
176
182
  /**
177
183
  * This is called to update blobs whose routes are tombstones. Tombstoned blobs enable testing scenarios with
178
184
  * accessing deleted content without actually deleting content from summaries.
@@ -184,7 +190,6 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
184
190
  * log an error and throw if necessary.
185
191
  */
186
192
  private verifyBlobValidity;
187
- summarize(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats;
188
193
  setRedirectTable(table: Map<string, string>): void;
189
194
  getPendingBlobs(): IPendingBlobs;
190
195
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blobManager.d.ts","sourceRoot":"","sources":["../src/blobManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blobManager.d.ts","sourceRoot":"","sources":["../src/blobManager.ts"],"names":[],"mappings":"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"}
@@ -7,11 +7,11 @@ import { createResponseError, generateHandleContextPath, responseToException, Su
7
7
  import { assert, bufferToString, Deferred, stringToBuffer, TypedEventEmitter, } from "@fluidframework/common-utils";
8
8
  import { AttachState } from "@fluidframework/container-definitions";
9
9
  import { ChildLogger, loggerToMonitoringContext, PerformanceEvent, } from "@fluidframework/telemetry-utils";
10
+ import { GenericError } from "@fluidframework/container-utils";
10
11
  import { TombstoneResponseHeaderKey } from "./containerRuntime";
12
+ import { sendGCUnexpectedUsageEvent, sweepAttachmentBlobsKey, throwOnTombstoneLoadKey } from "./gc";
11
13
  import { Throttler, formExponentialFn } from "./throttler";
12
- import { summarizerClientType } from "./summarizerClientElection";
13
- import { throwOnTombstoneLoadKey } from "./garbageCollectionConstants";
14
- import { sendGCUnexpectedUsageEvent } from "./garbageCollectionHelpers";
14
+ import { summarizerClientType } from "./summary";
15
15
  /**
16
16
  * This class represents blob (long string)
17
17
  * This object is used only when creating (writing) new blob and serialization purposes.
@@ -81,22 +81,16 @@ export class BlobManager extends TypedEventEmitter {
81
81
  // Called when a blob node is requested. blobPath is the path of the blob's node in GC's graph.
82
82
  // blobPath's format - `/<BlobManager.basePath>/<blobId>`.
83
83
  blobRequested,
84
- // Called when a reference is added to a blob. For instance, when creating a localId / storageId to storageId
85
- // mapping in the redirect table.
86
- // Node path formats - `/<BlobManager.basePath>/<blobId>`.
87
- addedBlobReference,
88
84
  // Called to check if a blob has been deleted by GC.
89
85
  // blobPath's format - `/<BlobManager.basePath>/<blobId>`.
90
- isBlobDeleted, runtime, stashedBlobs = {}, getCurrentReferenceTimestampMs) {
86
+ isBlobDeleted, runtime, stashedBlobs = {}, closeContainer) {
91
87
  super();
92
88
  this.routeContext = routeContext;
93
89
  this.getStorage = getStorage;
94
- this.sendBlobAttachOp = sendBlobAttachOp;
95
90
  this.blobRequested = blobRequested;
96
- this.addedBlobReference = addedBlobReference;
97
91
  this.isBlobDeleted = isBlobDeleted;
98
92
  this.runtime = runtime;
99
- this.getCurrentReferenceTimestampMs = getCurrentReferenceTimestampMs;
93
+ this.closeContainer = closeContainer;
100
94
  /**
101
95
  * Blobs which have not been uploaded or for which we have not yet seen a BlobAttach op round-trip.
102
96
  * Until we see the op round-trip, there is a possibility we may need to re-upload the blob, so
@@ -122,12 +116,28 @@ export class BlobManager extends TypedEventEmitter {
122
116
  // Read the feature flag that tells whether to throw when a tombstone blob is requested.
123
117
  this.throwOnTombstoneLoad =
124
118
  this.mc.config.getBoolean(throwOnTombstoneLoadKey) === true &&
119
+ this.runtime.gcTombstoneEnforcementAllowed &&
125
120
  this.runtime.clientDetails.type !== summarizerClientType;
126
121
  this.runtime.on("disconnected", () => this.onDisconnected());
127
122
  this.redirectTable = this.load(snapshot);
128
123
  // Begin uploading stashed blobs from previous container instance
129
124
  Object.entries(stashedBlobs).forEach(([localId, entry]) => {
130
125
  const blob = stringToBuffer(entry.blob, "base64");
126
+ if (entry.minTTLInSeconds && entry.uploadTime) {
127
+ const timeLapseSinceLocalUpload = (Date.now() - entry.uploadTime) / 1000;
128
+ // stashed entries with more than half-life in storage will not be reuploaded
129
+ if (entry.minTTLInSeconds - timeLapseSinceLocalUpload > entry.minTTLInSeconds / 2) {
130
+ this.pendingBlobs.set(localId, {
131
+ blob,
132
+ status: PendingBlobStatus.OfflinePendingOp,
133
+ handleP: new Deferred(),
134
+ uploadP: undefined,
135
+ uploadTime: entry.uploadTime,
136
+ minTTLInSeconds: entry.minTTLInSeconds,
137
+ });
138
+ return;
139
+ }
140
+ }
131
141
  this.pendingBlobs.set(localId, {
132
142
  blob,
133
143
  status: PendingBlobStatus.OfflinePendingUpload,
@@ -135,6 +145,30 @@ export class BlobManager extends TypedEventEmitter {
135
145
  uploadP: this.uploadBlob(localId, blob),
136
146
  });
137
147
  });
148
+ this.sendBlobAttachOp = (localId, blobId) => {
149
+ const pendingEntry = this.pendingBlobs.get(localId);
150
+ if ((pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.uploadTime) && (pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.minTTLInSeconds)) {
151
+ const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
152
+ const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
153
+ this.mc.logger.sendTelemetryEvent({
154
+ eventName: "sendBlobAttach",
155
+ entryStatus: pendingEntry.status,
156
+ secondsSinceUpload,
157
+ minTTLInSeconds: pendingEntry.minTTLInSeconds,
158
+ expired,
159
+ });
160
+ if (expired) {
161
+ // we want to avoid submitting ops with broken handles
162
+ this.closeContainer(new GenericError("Trying to submit a BlobAttach for expired blob", undefined, {
163
+ localId,
164
+ blobId,
165
+ entryStatus: pendingEntry.status,
166
+ secondsSinceUpload,
167
+ }));
168
+ }
169
+ }
170
+ return sendBlobAttachOp(localId, blobId);
171
+ };
138
172
  }
139
173
  get pendingOfflineUploads() {
140
174
  return Array.from(this.pendingBlobs.values()).filter((e) => e.status === PendingBlobStatus.OfflinePendingUpload);
@@ -170,14 +204,6 @@ export class BlobManager extends TypedEventEmitter {
170
204
  }
171
205
  }
172
206
  }
173
- /**
174
- * For a blobId, returns its path in GC's graph. The node path is of the format `/<BlobManager.basePath>/<blobId>`
175
- * This path must match the path of the blob handle returned by the createBlob API because blobs are marked
176
- * referenced by storing these handles in a referenced DDS.
177
- */
178
- getBlobGCNodePath(blobId) {
179
- return `/${BlobManager.basePath}/${blobId}`;
180
- }
181
207
  /**
182
208
  * Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
183
209
  * detached or there are no (non-pending) attachment blobs in the document
@@ -213,7 +239,7 @@ export class BlobManager extends TypedEventEmitter {
213
239
  storageId = attachedStorageId;
214
240
  }
215
241
  // Let runtime know that the corresponding GC node was requested.
216
- this.blobRequested(this.getBlobGCNodePath(blobId));
242
+ this.blobRequested(getGCNodePathFromBlobId(blobId));
217
243
  return PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "AttachmentReadBlob", id: storageId }, async () => {
218
244
  return this.getStorage().readBlob(storageId);
219
245
  }, { end: true, cancel: "error" });
@@ -260,11 +286,6 @@ export class BlobManager extends TypedEventEmitter {
260
286
  */
261
287
  setRedirection(fromId, toId) {
262
288
  this.redirectTable.set(fromId, toId);
263
- // Notify runtime of a reference added if toId is not undefined. It can be undefined when a blob is uploaded in
264
- // detached mode. In this case, the entry will be updated when the blob is updated.
265
- if (toId !== undefined) {
266
- this.addedBlobReference(this.getBlobGCNodePath(fromId), this.getBlobGCNodePath(toId));
267
- }
268
289
  }
269
290
  deleteAndEmitsIfEmpty(id) {
270
291
  if (this.pendingBlobs.has(id)) {
@@ -280,9 +301,8 @@ export class BlobManager extends TypedEventEmitter {
280
301
  assert((entry === null || entry === void 0 ? void 0 : entry.status) === PendingBlobStatus.OnlinePendingUpload ||
281
302
  (entry === null || entry === void 0 ? void 0 : entry.status) === PendingBlobStatus.OfflinePendingUpload, 0x386 /* Must have pending blob entry for uploaded blob */);
282
303
  entry.storageId = response.id;
283
- entry.localUploadTime = Date.now();
304
+ entry.uploadTime = Date.now();
284
305
  entry.minTTLInSeconds = response.minTTLInSeconds;
285
- entry.serverUploadTime = this.getCurrentReferenceTimestampMs();
286
306
  if (this.runtime.connected) {
287
307
  if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
288
308
  // Send a blob attach op. This serves two purposes:
@@ -290,7 +310,6 @@ export class BlobManager extends TypedEventEmitter {
290
310
  // until its storage ID is added to the next summary.
291
311
  // 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
292
312
  // blob from the server via the storage ID.
293
- this.logTimeInfo(entry, "sendBlobAttachResolveTTL");
294
313
  this.sendBlobAttachOp(localId, response.id);
295
314
  if (this.storageIds.has(response.id)) {
296
315
  // The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
@@ -354,7 +373,6 @@ export class BlobManager extends TypedEventEmitter {
354
373
  * is called on reconnection.
355
374
  */
356
375
  if (entry.status !== PendingBlobStatus.OnlinePendingOp) {
357
- this.logTimeInfo(entry, "sendBlobAttachTransitionOfflineTTL");
358
376
  this.sendBlobAttachOp(localId, entry.storageId);
359
377
  }
360
378
  entry.status =
@@ -373,9 +391,6 @@ export class BlobManager extends TypedEventEmitter {
373
391
  const { localId, blobId } = metadata;
374
392
  assert(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
375
393
  const pendingEntry = this.pendingBlobs.get(localId);
376
- if (pendingEntry) {
377
- this.logTimeInfo(pendingEntry, "sendBlobAttachResubmitTTL");
378
- }
379
394
  if (!blobId) {
380
395
  // We submitted this op while offline. The blob should have been uploaded by now.
381
396
  assert((pendingEntry === null || pendingEntry === void 0 ? void 0 : pendingEntry.status) === PendingBlobStatus.OfflinePendingOp &&
@@ -384,32 +399,6 @@ export class BlobManager extends TypedEventEmitter {
384
399
  }
385
400
  return this.sendBlobAttachOp(localId, blobId);
386
401
  }
387
- logTimeInfo(pendingEntry, eventName) {
388
- var _a, _b;
389
- let timeLapseSinceLocalUpload = 0;
390
- let timeLapseSinceServerUpload = 0;
391
- let expiredUsingLocalTime;
392
- let expiredUsingServerTime;
393
- if (pendingEntry.localUploadTime) {
394
- timeLapseSinceLocalUpload = (Date.now() - pendingEntry.localUploadTime) / 1000;
395
- expiredUsingLocalTime =
396
- ((_a = pendingEntry.minTTLInSeconds) !== null && _a !== void 0 ? _a : 0) - timeLapseSinceLocalUpload < 0 ? true : false;
397
- }
398
- if (pendingEntry.serverUploadTime) {
399
- timeLapseSinceServerUpload = (Date.now() - pendingEntry.serverUploadTime) / 1000;
400
- expiredUsingServerTime =
401
- ((_b = pendingEntry.minTTLInSeconds) !== null && _b !== void 0 ? _b : 0) - timeLapseSinceServerUpload < 0 ? true : false;
402
- }
403
- this.mc.logger.sendTelemetryEvent({
404
- eventName,
405
- entryStatus: pendingEntry.status,
406
- timeLapseSinceLocalUpload,
407
- timeLapseSinceServerUpload,
408
- minTTLInSeconds: pendingEntry.minTTLInSeconds,
409
- expiredUsingLocalTime,
410
- expiredUsingServerTime,
411
- });
412
- }
413
402
  processBlobAttachOp(message, local) {
414
403
  var _a, _b;
415
404
  const localId = (_a = message.metadata) === null || _a === void 0 ? void 0 : _a.localId;
@@ -486,6 +475,23 @@ export class BlobManager extends TypedEventEmitter {
486
475
  }
487
476
  return table;
488
477
  }
478
+ summarize(telemetryContext) {
479
+ // if storageIds is empty, it means we are detached and have only local IDs, or that there are no blobs attached
480
+ const blobIds = this.storageIds.size > 0
481
+ ? Array.from(this.storageIds)
482
+ : Array.from(this.redirectTable.keys());
483
+ const builder = new SummaryTreeBuilder();
484
+ blobIds.forEach((blobId) => {
485
+ builder.addAttachment(blobId);
486
+ });
487
+ // Any non-identity entries in the table need to be saved in the summary
488
+ if (this.redirectTable.size > blobIds.length) {
489
+ builder.addBlob(BlobManager.redirectTableBlobName,
490
+ // filter out identity entries
491
+ JSON.stringify(Array.from(this.redirectTable.entries()).filter(([localId, storageId]) => localId !== storageId)));
492
+ }
493
+ return builder.getSummaryTree();
494
+ }
489
495
  /**
490
496
  * Generates data used for garbage collection. Each blob uploaded represents a node in the GC graph as it can be
491
497
  * individually referenced by storing its handle in a referenced DDS. Returns the list of blob ids as GC nodes.
@@ -496,23 +502,83 @@ export class BlobManager extends TypedEventEmitter {
496
502
  const gcData = { gcNodes: {} };
497
503
  for (const [localId, storageId] of this.redirectTable) {
498
504
  assert(!!storageId, 0x390 /* Must be attached to get GC data */);
499
- gcData.gcNodes[this.getBlobGCNodePath(localId)] = [this.getBlobGCNodePath(storageId)];
505
+ // Only return local ids as GC nodes because a blob can only be referenced via its local id. The storage
506
+ // id entries have the same key and value, ignore them.
507
+ // The outbound routes are empty because a blob node cannot reference other nodes. It can only be referenced
508
+ // by adding its handle to a referenced DDS.
509
+ if (localId !== storageId) {
510
+ gcData.gcNodes[getGCNodePathFromBlobId(localId)] = [];
511
+ }
500
512
  }
501
513
  return gcData;
502
514
  }
503
515
  /**
504
516
  * This is called to update blobs whose routes are unused. The unused blobs are deleted.
505
- * @param unusedRoutes - The routes of the blob nodes that are unused.
517
+ * @param unusedRoutes - The routes of the blob nodes that are unused. These routes will be based off of local ids.
506
518
  */
507
519
  updateUnusedRoutes(unusedRoutes) {
508
- // The routes or blob node paths are in the same format as returned in getGCData -
509
- // `/<BlobManager.basePath>/<blobId>`.
510
- for (const route of unusedRoutes) {
511
- const pathParts = route.split("/");
512
- assert(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x2d5 /* "Invalid blob node id in unused routes." */);
513
- const blobId = pathParts[2];
520
+ this.deleteBlobsFromRedirectTable(unusedRoutes);
521
+ }
522
+ /**
523
+ * Delete attachment blobs that are sweep ready.
524
+ * @param sweepReadyBlobRoutes - The routes of blobs that are sweep ready and should be deleted. These routes will
525
+ * be based off of local ids.
526
+ * @returns - The routes of blobs that were deleted.
527
+ */
528
+ deleteSweepReadyNodes(sweepReadyBlobRoutes) {
529
+ // If sweep for attachment blobs is not enabled, return empty list indicating nothing is deleted.
530
+ if (this.mc.config.getBoolean(sweepAttachmentBlobsKey) !== true) {
531
+ return [];
532
+ }
533
+ this.deleteBlobsFromRedirectTable(sweepReadyBlobRoutes);
534
+ return Array.from(sweepReadyBlobRoutes);
535
+ }
536
+ /**
537
+ * Delete blobs with the given routes from the redirect table.
538
+ * The routes are GC nodes paths of format -`/<BlobManager.basePath>/<blobId>`. The blob ids are all local ids.
539
+ * Deleting the blobs involves 2 steps:
540
+ * 1. The redirect table entry for the local ids are deleted.
541
+ * 2. If the storage ids corresponding to the deleted local ids are not in-use anymore, the redirect table entries
542
+ * for the storage ids are deleted as well.
543
+ *
544
+ * Note that this does not delete the blobs from storage service immediately. Deleting the blobs from redirect table
545
+ * will remove them the next summary. The service would them delete them some time in the future.
546
+ */
547
+ deleteBlobsFromRedirectTable(blobRoutes) {
548
+ if (blobRoutes.length === 0) {
549
+ return;
550
+ }
551
+ // This tracks the storage ids of local ids that are deleted. After the local ids have been deleted, if any of
552
+ // these storage ids are unused, they will be deleted as well.
553
+ const maybeUnusedStorageIds = new Set();
554
+ for (const route of blobRoutes) {
555
+ const blobId = getBlobIdFromGCNodePath(route);
556
+ if (!this.redirectTable.has(blobId)) {
557
+ this.mc.logger.sendErrorEvent({
558
+ eventName: "DeletedAttachmentBlobNotFound",
559
+ blobId,
560
+ });
561
+ continue;
562
+ }
563
+ const storageId = this.redirectTable.get(blobId);
564
+ assert(!!storageId, 0x5bb /* Must be attached to run GC */);
565
+ maybeUnusedStorageIds.add(storageId);
514
566
  this.redirectTable.delete(blobId);
515
567
  }
568
+ // Find out storage ids that are in-use and remove them from maybeUnusedStorageIds. A storage id is in-use if
569
+ // the redirect table has a local id -> storage id entry for it.
570
+ for (const [localId, storageId] of this.redirectTable.entries()) {
571
+ assert(!!storageId, 0x5bc /* Must be attached to run GC */);
572
+ // For every storage id, the redirect table has a id -> id entry. These do not make the storage id in-use.
573
+ if (maybeUnusedStorageIds.has(storageId) && localId !== storageId) {
574
+ maybeUnusedStorageIds.delete(storageId);
575
+ }
576
+ }
577
+ // For unused storage ids, delete their id -> id entries from the redirect table.
578
+ // This way they'll be absent from the next summary, and the service is free to delete them from storage.
579
+ for (const storageId of maybeUnusedStorageIds) {
580
+ this.redirectTable.delete(storageId);
581
+ }
516
582
  }
517
583
  /**
518
584
  * This is called to update blobs whose routes are tombstones. Tombstoned blobs enable testing scenarios with
@@ -524,9 +590,8 @@ export class BlobManager extends TypedEventEmitter {
524
590
  // The routes or blob node paths are in the same format as returned in getGCData -
525
591
  // `/<BlobManager.basePath>/<blobId>`.
526
592
  for (const route of tombstonedRoutes) {
527
- const pathParts = route.split("/");
528
- assert(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x50f /* Invalid blob node id in tombstoned routes. */);
529
- tombstonedBlobsSet.add(pathParts[2]);
593
+ const blobId = getBlobIdFromGCNodePath(route);
594
+ tombstonedBlobsSet.add(blobId);
530
595
  }
531
596
  // Remove blobs from the tombstone list that were tombstoned but aren't anymore as per the tombstoneRoutes.
532
597
  for (const blobId of this.tombstonedBlobs) {
@@ -551,7 +616,7 @@ export class BlobManager extends TypedEventEmitter {
551
616
  * 3. "valid" - It has not been deleted or tombstoned.
552
617
  */
553
618
  let state = "valid";
554
- if (this.isBlobDeleted(this.getBlobGCNodePath(blobId))) {
619
+ if (this.isBlobDeleted(getGCNodePathFromBlobId(blobId))) {
555
620
  state = "deleted";
556
621
  }
557
622
  else if (this.tombstonedBlobs.has(blobId)) {
@@ -570,29 +635,12 @@ export class BlobManager extends TypedEventEmitter {
570
635
  ? "GC_Tombstone_Blob_Requested"
571
636
  : "GC_Deleted_Blob_Requested",
572
637
  category: shouldFail ? "error" : "generic",
573
- isSummarizerClient: this.runtime.clientDetails.type === summarizerClientType,
638
+ gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
574
639
  }, [BlobManager.basePath], error);
575
640
  if (shouldFail) {
576
641
  throw error;
577
642
  }
578
643
  }
579
- summarize(telemetryContext) {
580
- // if storageIds is empty, it means we are detached and have only local IDs, or that there are no blobs attached
581
- const blobIds = this.storageIds.size > 0
582
- ? Array.from(this.storageIds)
583
- : Array.from(this.redirectTable.keys());
584
- const builder = new SummaryTreeBuilder();
585
- blobIds.forEach((blobId) => {
586
- builder.addAttachment(blobId);
587
- });
588
- // Any non-identity entries in the table need to be saved in the summary
589
- if (this.redirectTable.size > blobIds.length) {
590
- builder.addBlob(BlobManager.redirectTableBlobName,
591
- // filter out identity entries
592
- JSON.stringify(Array.from(this.redirectTable.entries()).filter(([localId, storageId]) => localId !== storageId)));
593
- }
594
- return builder.getSummaryTree();
595
- }
596
644
  setRedirectTable(table) {
597
645
  assert(this.runtime.attachState === AttachState.Detached, 0x252 /* "redirect table can only be set in detached container" */);
598
646
  assert(this.redirectTable.size === table.size, 0x391 /* Redirect table size must match BlobManager's local ID count */);
@@ -606,11 +654,33 @@ export class BlobManager extends TypedEventEmitter {
606
654
  getPendingBlobs() {
607
655
  const blobs = {};
608
656
  for (const [key, entry] of this.pendingBlobs) {
609
- blobs[key] = { blob: bufferToString(entry.blob, "base64") };
657
+ blobs[key] = entry.minTTLInSeconds
658
+ ? {
659
+ blob: bufferToString(entry.blob, "base64"),
660
+ uploadTime: entry.uploadTime,
661
+ minTTLInSeconds: entry.minTTLInSeconds,
662
+ }
663
+ : { blob: bufferToString(entry.blob, "base64") };
610
664
  }
611
665
  return blobs;
612
666
  }
613
667
  }
614
668
  BlobManager.basePath = "_blobs";
615
669
  BlobManager.redirectTableBlobName = ".redirectTable";
670
+ /**
671
+ * For a blobId, returns its path in GC's graph. The node path is of the format `/<BlobManager.basePath>/<blobId>`.
672
+ * This path must match the path of the blob handle returned by the createBlob API because blobs are marked
673
+ * referenced by storing these handles in a referenced DDS.
674
+ */
675
+ function getGCNodePathFromBlobId(blobId) {
676
+ return `/${BlobManager.basePath}/${blobId}`;
677
+ }
678
+ /**
679
+ * For a given GC node path, return the blobId. The node path is of the format `/<BlobManager.basePath>/<blobId>`.
680
+ */
681
+ function getBlobIdFromGCNodePath(nodePath) {
682
+ const pathParts = nodePath.split("/");
683
+ assert(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x5bd /* Invalid blob node path */);
684
+ return pathParts[2];
685
+ }
616
686
  //# sourceMappingURL=blobManager.js.map