@fluidframework/container-runtime 2.0.0-dev-rc.3.0.0.254866 → 2.0.0-dev-rc.5.0.0.263932

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 (338) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/api-report/container-runtime.api.md +93 -39
  3. package/dist/batchTracker.d.ts +1 -1
  4. package/dist/batchTracker.d.ts.map +1 -1
  5. package/dist/batchTracker.js.map +1 -1
  6. package/dist/blobManager.d.ts +7 -7
  7. package/dist/blobManager.d.ts.map +1 -1
  8. package/dist/blobManager.js +2 -4
  9. package/dist/blobManager.js.map +1 -1
  10. package/dist/channelCollection.d.ts +10 -6
  11. package/dist/channelCollection.d.ts.map +1 -1
  12. package/dist/channelCollection.js +85 -22
  13. package/dist/channelCollection.js.map +1 -1
  14. package/dist/connectionTelemetry.d.ts +2 -2
  15. package/dist/connectionTelemetry.d.ts.map +1 -1
  16. package/dist/connectionTelemetry.js +54 -5
  17. package/dist/connectionTelemetry.js.map +1 -1
  18. package/dist/containerRuntime.d.ts +22 -35
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +232 -174
  21. package/dist/containerRuntime.js.map +1 -1
  22. package/dist/dataStore.d.ts +1 -1
  23. package/dist/dataStore.d.ts.map +1 -1
  24. package/dist/dataStore.js.map +1 -1
  25. package/dist/dataStoreContext.d.ts +9 -6
  26. package/dist/dataStoreContext.d.ts.map +1 -1
  27. package/dist/dataStoreContext.js +19 -5
  28. package/dist/dataStoreContext.js.map +1 -1
  29. package/dist/dataStoreContexts.d.ts +2 -0
  30. package/dist/dataStoreContexts.d.ts.map +1 -1
  31. package/dist/dataStoreContexts.js +7 -0
  32. package/dist/dataStoreContexts.js.map +1 -1
  33. package/dist/deltaManagerProxies.d.ts +81 -0
  34. package/dist/deltaManagerProxies.d.ts.map +1 -0
  35. package/dist/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +75 -20
  36. package/dist/deltaManagerProxies.js.map +1 -0
  37. package/dist/deltaScheduler.d.ts +2 -2
  38. package/dist/deltaScheduler.d.ts.map +1 -1
  39. package/dist/deltaScheduler.js.map +1 -1
  40. package/dist/gc/garbageCollection.d.ts +5 -12
  41. package/dist/gc/garbageCollection.d.ts.map +1 -1
  42. package/dist/gc/garbageCollection.js +45 -29
  43. package/dist/gc/garbageCollection.js.map +1 -1
  44. package/dist/gc/gcDefinitions.d.ts +27 -6
  45. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  46. package/dist/gc/gcDefinitions.js.map +1 -1
  47. package/dist/gc/gcHelpers.d.ts +5 -4
  48. package/dist/gc/gcHelpers.d.ts.map +1 -1
  49. package/dist/gc/gcHelpers.js +14 -2
  50. package/dist/gc/gcHelpers.js.map +1 -1
  51. package/dist/gc/gcTelemetry.d.ts +14 -4
  52. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  53. package/dist/gc/gcTelemetry.js +24 -21
  54. package/dist/gc/gcTelemetry.js.map +1 -1
  55. package/dist/gc/index.d.ts +2 -2
  56. package/dist/gc/index.d.ts.map +1 -1
  57. package/dist/gc/index.js +2 -2
  58. package/dist/gc/index.js.map +1 -1
  59. package/dist/index.d.ts +3 -3
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +2 -1
  62. package/dist/index.js.map +1 -1
  63. package/dist/{alpha.d.ts → legacy.d.ts} +8 -1
  64. package/dist/messageTypes.d.ts +5 -2
  65. package/dist/messageTypes.d.ts.map +1 -1
  66. package/dist/messageTypes.js.map +1 -1
  67. package/dist/metadata.d.ts +2 -2
  68. package/dist/metadata.d.ts.map +1 -1
  69. package/dist/metadata.js.map +1 -1
  70. package/dist/opLifecycle/batchManager.d.ts +4 -1
  71. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  72. package/dist/opLifecycle/batchManager.js +0 -10
  73. package/dist/opLifecycle/batchManager.js.map +1 -1
  74. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  75. package/dist/opLifecycle/opDecompressor.js +6 -6
  76. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  77. package/dist/opLifecycle/opGroupingManager.js +2 -2
  78. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  79. package/dist/opLifecycle/opSplitter.js +1 -1
  80. package/dist/opLifecycle/opSplitter.js.map +1 -1
  81. package/dist/opLifecycle/outbox.d.ts +0 -4
  82. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  83. package/dist/opLifecycle/outbox.js +7 -38
  84. package/dist/opLifecycle/outbox.js.map +1 -1
  85. package/dist/packageVersion.d.ts +1 -1
  86. package/dist/packageVersion.js +1 -1
  87. package/dist/packageVersion.js.map +1 -1
  88. package/dist/pendingStateManager.d.ts +9 -2
  89. package/dist/pendingStateManager.d.ts.map +1 -1
  90. package/dist/pendingStateManager.js +26 -10
  91. package/dist/pendingStateManager.js.map +1 -1
  92. package/dist/public.d.ts +3 -0
  93. package/dist/scheduleManager.d.ts +2 -2
  94. package/dist/scheduleManager.d.ts.map +1 -1
  95. package/dist/scheduleManager.js.map +1 -1
  96. package/dist/summary/documentSchema.d.ts +3 -1
  97. package/dist/summary/documentSchema.d.ts.map +1 -1
  98. package/dist/summary/documentSchema.js +34 -16
  99. package/dist/summary/documentSchema.js.map +1 -1
  100. package/dist/summary/index.d.ts +1 -1
  101. package/dist/summary/index.d.ts.map +1 -1
  102. package/dist/summary/index.js.map +1 -1
  103. package/dist/summary/orderedClientElection.d.ts +2 -2
  104. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  105. package/dist/summary/orderedClientElection.js.map +1 -1
  106. package/dist/summary/runningSummarizer.js +10 -10
  107. package/dist/summary/runningSummarizer.js.map +1 -1
  108. package/dist/summary/summarizer.d.ts +1 -2
  109. package/dist/summary/summarizer.d.ts.map +1 -1
  110. package/dist/summary/summarizer.js.map +1 -1
  111. package/dist/summary/summarizerClientElection.d.ts +1 -1
  112. package/dist/summary/summarizerClientElection.d.ts.map +1 -1
  113. package/dist/summary/summarizerClientElection.js.map +1 -1
  114. package/dist/summary/summarizerHeuristics.d.ts +1 -1
  115. package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
  116. package/dist/summary/summarizerHeuristics.js.map +1 -1
  117. package/dist/summary/summarizerNode/summarizerNode.d.ts +4 -3
  118. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  119. package/dist/summary/summarizerNode/summarizerNode.js +4 -10
  120. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  121. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -3
  122. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  123. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  124. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -2
  125. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  126. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +2 -9
  127. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  128. package/dist/summary/summarizerTypes.d.ts +3 -5
  129. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  130. package/dist/summary/summarizerTypes.js.map +1 -1
  131. package/dist/summary/summaryCollection.d.ts +2 -2
  132. package/dist/summary/summaryCollection.d.ts.map +1 -1
  133. package/dist/summary/summaryCollection.js.map +1 -1
  134. package/dist/summary/summaryFormat.d.ts +25 -5
  135. package/dist/summary/summaryFormat.d.ts.map +1 -1
  136. package/dist/summary/summaryFormat.js.map +1 -1
  137. package/dist/summary/summaryGenerator.d.ts +1 -2
  138. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  139. package/dist/summary/summaryGenerator.js +12 -11
  140. package/dist/summary/summaryGenerator.js.map +1 -1
  141. package/dist/summary/summaryManager.d.ts.map +1 -1
  142. package/dist/summary/summaryManager.js +5 -5
  143. package/dist/summary/summaryManager.js.map +1 -1
  144. package/{lib/beta.d.ts → internal.d.ts} +2 -0
  145. package/{dist/beta.d.ts → legacy.d.ts} +2 -0
  146. package/lib/batchTracker.d.ts +1 -1
  147. package/lib/batchTracker.d.ts.map +1 -1
  148. package/lib/batchTracker.js.map +1 -1
  149. package/lib/blobManager.d.ts +7 -7
  150. package/lib/blobManager.d.ts.map +1 -1
  151. package/lib/blobManager.js +3 -5
  152. package/lib/blobManager.js.map +1 -1
  153. package/lib/channelCollection.d.ts +10 -6
  154. package/lib/channelCollection.d.ts.map +1 -1
  155. package/lib/channelCollection.js +88 -25
  156. package/lib/channelCollection.js.map +1 -1
  157. package/lib/connectionTelemetry.d.ts +2 -2
  158. package/lib/connectionTelemetry.d.ts.map +1 -1
  159. package/lib/connectionTelemetry.js +49 -0
  160. package/lib/connectionTelemetry.js.map +1 -1
  161. package/lib/containerRuntime.d.ts +22 -35
  162. package/lib/containerRuntime.d.ts.map +1 -1
  163. package/lib/containerRuntime.js +232 -174
  164. package/lib/containerRuntime.js.map +1 -1
  165. package/lib/dataStore.d.ts +1 -1
  166. package/lib/dataStore.d.ts.map +1 -1
  167. package/lib/dataStore.js +1 -1
  168. package/lib/dataStore.js.map +1 -1
  169. package/lib/dataStoreContext.d.ts +9 -6
  170. package/lib/dataStoreContext.d.ts.map +1 -1
  171. package/lib/dataStoreContext.js +21 -7
  172. package/lib/dataStoreContext.js.map +1 -1
  173. package/lib/dataStoreContexts.d.ts +2 -0
  174. package/lib/dataStoreContexts.d.ts.map +1 -1
  175. package/lib/dataStoreContexts.js +7 -0
  176. package/lib/dataStoreContexts.js.map +1 -1
  177. package/lib/deltaManagerProxies.d.ts +81 -0
  178. package/lib/deltaManagerProxies.d.ts.map +1 -0
  179. package/lib/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +72 -19
  180. package/lib/deltaManagerProxies.js.map +1 -0
  181. package/lib/deltaScheduler.d.ts +2 -2
  182. package/lib/deltaScheduler.d.ts.map +1 -1
  183. package/lib/deltaScheduler.js.map +1 -1
  184. package/lib/gc/garbageCollection.d.ts +5 -12
  185. package/lib/gc/garbageCollection.d.ts.map +1 -1
  186. package/lib/gc/garbageCollection.js +47 -31
  187. package/lib/gc/garbageCollection.js.map +1 -1
  188. package/lib/gc/gcDefinitions.d.ts +27 -6
  189. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  190. package/lib/gc/gcDefinitions.js.map +1 -1
  191. package/lib/gc/gcHelpers.d.ts +5 -4
  192. package/lib/gc/gcHelpers.d.ts.map +1 -1
  193. package/lib/gc/gcHelpers.js +12 -1
  194. package/lib/gc/gcHelpers.js.map +1 -1
  195. package/lib/gc/gcTelemetry.d.ts +14 -4
  196. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  197. package/lib/gc/gcTelemetry.js +24 -21
  198. package/lib/gc/gcTelemetry.js.map +1 -1
  199. package/lib/gc/index.d.ts +2 -2
  200. package/lib/gc/index.d.ts.map +1 -1
  201. package/lib/gc/index.js +1 -1
  202. package/lib/gc/index.js.map +1 -1
  203. package/lib/index.d.ts +3 -3
  204. package/lib/index.d.ts.map +1 -1
  205. package/lib/index.js +1 -1
  206. package/lib/index.js.map +1 -1
  207. package/lib/{alpha.d.ts → legacy.d.ts} +8 -1
  208. package/lib/messageTypes.d.ts +5 -2
  209. package/lib/messageTypes.d.ts.map +1 -1
  210. package/lib/messageTypes.js.map +1 -1
  211. package/lib/metadata.d.ts +2 -2
  212. package/lib/metadata.d.ts.map +1 -1
  213. package/lib/metadata.js.map +1 -1
  214. package/lib/opLifecycle/batchManager.d.ts +4 -1
  215. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  216. package/lib/opLifecycle/batchManager.js +0 -10
  217. package/lib/opLifecycle/batchManager.js.map +1 -1
  218. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  219. package/lib/opLifecycle/opDecompressor.js +6 -6
  220. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  221. package/lib/opLifecycle/opGroupingManager.js +2 -2
  222. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  223. package/lib/opLifecycle/opSplitter.js +1 -1
  224. package/lib/opLifecycle/opSplitter.js.map +1 -1
  225. package/lib/opLifecycle/outbox.d.ts +0 -4
  226. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  227. package/lib/opLifecycle/outbox.js +7 -38
  228. package/lib/opLifecycle/outbox.js.map +1 -1
  229. package/lib/packageVersion.d.ts +1 -1
  230. package/lib/packageVersion.js +1 -1
  231. package/lib/packageVersion.js.map +1 -1
  232. package/lib/pendingStateManager.d.ts +9 -2
  233. package/lib/pendingStateManager.d.ts.map +1 -1
  234. package/lib/pendingStateManager.js +27 -11
  235. package/lib/pendingStateManager.js.map +1 -1
  236. package/lib/public.d.ts +3 -0
  237. package/lib/scheduleManager.d.ts +2 -2
  238. package/lib/scheduleManager.d.ts.map +1 -1
  239. package/lib/scheduleManager.js.map +1 -1
  240. package/lib/summary/documentSchema.d.ts +3 -1
  241. package/lib/summary/documentSchema.d.ts.map +1 -1
  242. package/lib/summary/documentSchema.js +34 -16
  243. package/lib/summary/documentSchema.js.map +1 -1
  244. package/lib/summary/index.d.ts +1 -1
  245. package/lib/summary/index.d.ts.map +1 -1
  246. package/lib/summary/index.js.map +1 -1
  247. package/lib/summary/orderedClientElection.d.ts +2 -2
  248. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  249. package/lib/summary/orderedClientElection.js +1 -1
  250. package/lib/summary/orderedClientElection.js.map +1 -1
  251. package/lib/summary/runningSummarizer.js +1 -1
  252. package/lib/summary/runningSummarizer.js.map +1 -1
  253. package/lib/summary/summarizer.d.ts +1 -2
  254. package/lib/summary/summarizer.d.ts.map +1 -1
  255. package/lib/summary/summarizer.js.map +1 -1
  256. package/lib/summary/summarizerClientElection.d.ts +1 -1
  257. package/lib/summary/summarizerClientElection.d.ts.map +1 -1
  258. package/lib/summary/summarizerClientElection.js.map +1 -1
  259. package/lib/summary/summarizerHeuristics.d.ts +1 -1
  260. package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
  261. package/lib/summary/summarizerHeuristics.js.map +1 -1
  262. package/lib/summary/summarizerNode/summarizerNode.d.ts +4 -3
  263. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  264. package/lib/summary/summarizerNode/summarizerNode.js +4 -10
  265. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  266. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +2 -3
  267. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  268. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  269. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -2
  270. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  271. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +2 -9
  272. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  273. package/lib/summary/summarizerTypes.d.ts +3 -5
  274. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  275. package/lib/summary/summarizerTypes.js.map +1 -1
  276. package/lib/summary/summaryCollection.d.ts +2 -2
  277. package/lib/summary/summaryCollection.d.ts.map +1 -1
  278. package/lib/summary/summaryCollection.js.map +1 -1
  279. package/lib/summary/summaryFormat.d.ts +25 -5
  280. package/lib/summary/summaryFormat.d.ts.map +1 -1
  281. package/lib/summary/summaryFormat.js.map +1 -1
  282. package/lib/summary/summaryGenerator.d.ts +1 -2
  283. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  284. package/lib/summary/summaryGenerator.js +5 -4
  285. package/lib/summary/summaryGenerator.js.map +1 -1
  286. package/lib/summary/summaryManager.d.ts.map +1 -1
  287. package/lib/summary/summaryManager.js +2 -2
  288. package/lib/summary/summaryManager.js.map +1 -1
  289. package/lib/tsdoc-metadata.json +1 -1
  290. package/package.json +37 -59
  291. package/src/batchTracker.ts +1 -2
  292. package/src/blobManager.ts +11 -10
  293. package/src/channelCollection.ts +115 -47
  294. package/src/connectionTelemetry.ts +59 -4
  295. package/src/containerRuntime.ts +302 -270
  296. package/src/dataStore.ts +7 -4
  297. package/src/dataStoreContext.ts +57 -16
  298. package/src/dataStoreContexts.ts +13 -2
  299. package/src/{deltaManagerSummarizerProxy.ts → deltaManagerProxies.ts} +98 -24
  300. package/src/deltaScheduler.ts +2 -3
  301. package/src/gc/garbageCollection.ts +64 -42
  302. package/src/gc/gcDefinitions.ts +22 -10
  303. package/src/gc/gcHelpers.ts +14 -1
  304. package/src/gc/gcTelemetry.ts +57 -50
  305. package/src/gc/index.ts +2 -1
  306. package/src/index.ts +7 -0
  307. package/src/messageTypes.ts +4 -2
  308. package/src/metadata.ts +2 -2
  309. package/src/opLifecycle/README.md +4 -4
  310. package/src/opLifecycle/batchManager.ts +5 -14
  311. package/src/opLifecycle/opDecompressor.ts +12 -6
  312. package/src/opLifecycle/opGroupingManager.ts +2 -2
  313. package/src/opLifecycle/opSplitter.ts +1 -1
  314. package/src/opLifecycle/outbox.ts +7 -53
  315. package/src/packageVersion.ts +1 -1
  316. package/src/pendingStateManager.ts +38 -15
  317. package/src/scheduleManager.ts +2 -2
  318. package/src/summary/documentSchema.ts +52 -18
  319. package/src/summary/index.ts +4 -0
  320. package/src/summary/orderedClientElection.ts +6 -3
  321. package/src/summary/runningSummarizer.ts +1 -1
  322. package/src/summary/summarizer.ts +1 -1
  323. package/src/summary/summarizerClientElection.ts +1 -1
  324. package/src/summary/summarizerHeuristics.ts +1 -1
  325. package/src/summary/summarizerNode/summarizerNode.ts +3 -12
  326. package/src/summary/summarizerNode/summarizerNodeUtils.ts +2 -3
  327. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +1 -10
  328. package/src/summary/summarizerTypes.ts +6 -5
  329. package/src/summary/summaryCollection.ts +2 -2
  330. package/src/summary/summaryFormat.ts +30 -4
  331. package/src/summary/summaryGenerator.ts +20 -9
  332. package/src/summary/summaryManager.ts +6 -3
  333. package/dist/deltaManagerSummarizerProxy.d.ts +0 -44
  334. package/dist/deltaManagerSummarizerProxy.d.ts.map +0 -1
  335. package/dist/deltaManagerSummarizerProxy.js.map +0 -1
  336. package/lib/deltaManagerSummarizerProxy.d.ts +0 -44
  337. package/lib/deltaManagerSummarizerProxy.d.ts.map +0 -1
  338. package/lib/deltaManagerSummarizerProxy.js.map +0 -1
@@ -4,15 +4,16 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.DeltaManagerSummarizerProxy = void 0;
7
+ exports.DeltaManagerPendingOpsProxy = exports.DeltaManagerSummarizerProxy = exports.BaseDeltaManagerProxy = void 0;
8
8
  const client_utils_1 = require("@fluid-internal/client-utils");
9
9
  const index_js_1 = require("./summary/index.js");
10
10
  /**
11
- * Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:
12
- * - Summarizer client should be read-only to layers below the container runtime to restrict local changes.
13
- * - Summarizer client should not be active to layers below the container runtime to restrict local changes.
11
+ * Base class for DeltaManager proxy that proxy's access to the real DeltaManager.
12
+ *
13
+ * This class allows us to build proxy functionality without actually having to implement all the methods
14
+ * of the DeltaManager.
14
15
  */
15
- class DeltaManagerSummarizerProxy extends client_utils_1.TypedEventEmitter {
16
+ class BaseDeltaManagerProxy extends client_utils_1.TypedEventEmitter {
16
17
  get IDeltaSender() {
17
18
  return this;
18
19
  }
@@ -56,21 +57,9 @@ class DeltaManagerSummarizerProxy extends client_utils_1.TypedEventEmitter {
56
57
  return this.deltaManager.serviceConfiguration;
57
58
  }
58
59
  get active() {
59
- // Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer
60
- // except for the SummarizeOp which is generated by the runtime.
61
- return !this.isSummarizerClient && this.deltaManager.active;
60
+ return this.deltaManager.active;
62
61
  }
63
62
  get readOnlyInfo() {
64
- // Summarizer clients should be read-only as far as the runtime and layers below are concerned. There shouldn't
65
- // be any local changes (writes) in the summarizer except for the summarize op which is generated by the runtime.
66
- if (this.isSummarizerClient) {
67
- return {
68
- readonly: true,
69
- forced: false,
70
- permissions: undefined,
71
- storageOnly: false,
72
- };
73
- }
74
63
  return this.deltaManager.readOnlyInfo;
75
64
  }
76
65
  constructor(deltaManager) {
@@ -99,7 +88,6 @@ class DeltaManagerSummarizerProxy extends client_utils_1.TypedEventEmitter {
99
88
  };
100
89
  // We are expecting this class to have many listeners, so we suppress noisy "MaxListenersExceededWarning" logging.
101
90
  super.setMaxListeners(0);
102
- this.isSummarizerClient = this.deltaManager.clientDetails.type === index_js_1.summarizerClientType;
103
91
  this.deltaManager.on("prepareSend", this.onPrepareSend);
104
92
  this.deltaManager.on("submitOp", this.onSubmitOp);
105
93
  this.deltaManager.on("op", this.onOp);
@@ -124,5 +112,72 @@ class DeltaManagerSummarizerProxy extends client_utils_1.TypedEventEmitter {
124
112
  return this.deltaManager.flush();
125
113
  }
126
114
  }
115
+ exports.BaseDeltaManagerProxy = BaseDeltaManagerProxy;
116
+ /**
117
+ * Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:
118
+ * - Summarizer client should be read-only to layers below the container runtime to restrict local changes.
119
+ * - Summarizer client should not be active to layers below the container runtime to restrict local changes.
120
+ */
121
+ class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {
122
+ get active() {
123
+ // Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer
124
+ // except for the SummarizeOp which is generated by the runtime.
125
+ return !this.isSummarizerClient && this.deltaManager.active;
126
+ }
127
+ get readOnlyInfo() {
128
+ // Summarizer clients should be read-only as far as the runtime and layers below are concerned. There shouldn't
129
+ // be any local changes (writes) in the summarizer except for the summarize op which is generated by the runtime.
130
+ if (this.isSummarizerClient) {
131
+ return {
132
+ readonly: true,
133
+ forced: false,
134
+ permissions: undefined,
135
+ storageOnly: false,
136
+ };
137
+ }
138
+ return this.deltaManager.readOnlyInfo;
139
+ }
140
+ constructor(deltaManager) {
141
+ super(deltaManager);
142
+ this.deltaManager = deltaManager;
143
+ this.isSummarizerClient = this.deltaManager.clientDetails.type === index_js_1.summarizerClientType;
144
+ }
145
+ }
127
146
  exports.DeltaManagerSummarizerProxy = DeltaManagerSummarizerProxy;
128
- //# sourceMappingURL=deltaManagerSummarizerProxy.js.map
147
+ class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {
148
+ get minimumSequenceNumber() {
149
+ const minPendingSeqNum = this.pendingStateManager.minimumPendingMessageSequenceNumber;
150
+ // There is a chance that minPendingSeqNum is greater than minimum sequence number.
151
+ // minPendingSeqNum is based on the pending ops, so it's based on ref seq number.
152
+ // Imagine an op has just be sent while there's another client that has been lagging behind,
153
+ // it will likely have a ref seq number greater than the minimum seq number.
154
+ if (minPendingSeqNum !== undefined &&
155
+ minPendingSeqNum < this.deltaManager.minimumSequenceNumber) {
156
+ return minPendingSeqNum;
157
+ }
158
+ return this.deltaManager.minimumSequenceNumber;
159
+ }
160
+ get lastMessage() {
161
+ if (this.deltaManager.lastMessage === undefined) {
162
+ return this.deltaManager.lastMessage;
163
+ }
164
+ return {
165
+ ...this.deltaManager.lastMessage,
166
+ minimumSequenceNumber: this.minimumSequenceNumber,
167
+ };
168
+ }
169
+ constructor(deltaManager, pendingStateManager) {
170
+ super(deltaManager);
171
+ this.deltaManager = deltaManager;
172
+ this.pendingStateManager = pendingStateManager;
173
+ this.onOp = (message, processingTime) => {
174
+ const messageIntercept = {
175
+ ...message,
176
+ minimumSequenceNumber: this.minimumSequenceNumber,
177
+ };
178
+ this.emit("op", messageIntercept, processingTime);
179
+ };
180
+ }
181
+ }
182
+ exports.DeltaManagerPendingOpsProxy = DeltaManagerPendingOpsProxy;
183
+ //# sourceMappingURL=deltaManagerProxies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deltaManagerProxies.js","sourceRoot":"","sources":["../src/deltaManagerProxies.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport type {\n\tIConnectionDetails,\n\tIDeltaManager,\n\tIDeltaManagerEvents,\n\tIDeltaQueue,\n\tIDeltaSender,\n\tReadOnlyInfo,\n} from \"@fluidframework/container-definitions/internal\";\nimport type { IErrorBase } from \"@fluidframework/core-interfaces\";\nimport type { IAnyDriverError } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tIClientConfiguration,\n\tIClientDetails,\n\tIDocumentMessage,\n\tISequencedDocumentMessage,\n\tISignalMessage,\n} from \"@fluidframework/protocol-definitions\";\n\nimport { summarizerClientType } from \"./summary/index.js\";\nimport type { PendingStateManager } from \"./pendingStateManager.js\";\n\n/**\n * Base class for DeltaManager proxy that proxy's access to the real DeltaManager.\n *\n * This class allows us to build proxy functionality without actually having to implement all the methods\n * of the DeltaManager.\n */\nexport abstract class BaseDeltaManagerProxy\n\textends TypedEventEmitter<IDeltaManagerEvents>\n\timplements IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>\n{\n\tpublic get IDeltaSender(): IDeltaSender {\n\t\treturn this;\n\t}\n\n\tpublic get inbound(): IDeltaQueue<ISequencedDocumentMessage> {\n\t\treturn this.deltaManager.inbound;\n\t}\n\n\tpublic get outbound(): IDeltaQueue<IDocumentMessage[]> {\n\t\treturn this.deltaManager.outbound;\n\t}\n\n\tpublic get inboundSignal(): IDeltaQueue<ISignalMessage> {\n\t\treturn this.deltaManager.inboundSignal;\n\t}\n\n\tpublic get minimumSequenceNumber(): number {\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastSequenceNumber(): number {\n\t\treturn this.deltaManager.lastSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\treturn this.deltaManager.lastMessage;\n\t}\n\n\tpublic get lastKnownSeqNumber() {\n\t\treturn this.deltaManager.lastKnownSeqNumber;\n\t}\n\n\tpublic get initialSequenceNumber(): number {\n\t\treturn this.deltaManager.initialSequenceNumber;\n\t}\n\n\tpublic get hasCheckpointSequenceNumber() {\n\t\treturn this.deltaManager.hasCheckpointSequenceNumber;\n\t}\n\n\tpublic get clientDetails(): IClientDetails {\n\t\treturn this.deltaManager.clientDetails;\n\t}\n\n\tpublic get version(): string {\n\t\treturn this.deltaManager.version;\n\t}\n\n\tpublic get maxMessageSize(): number {\n\t\treturn this.deltaManager.maxMessageSize;\n\t}\n\n\tpublic get serviceConfiguration(): IClientConfiguration | undefined {\n\t\treturn this.deltaManager.serviceConfiguration;\n\t}\n\n\tpublic get active(): boolean {\n\t\treturn this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper();\n\n\t\t// We are expecting this class to have many listeners, so we suppress noisy \"MaxListenersExceededWarning\" logging.\n\t\tsuper.setMaxListeners(0);\n\n\t\tthis.deltaManager.on(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.on(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.on(\"op\", this.onOp);\n\t\tthis.deltaManager.on(\"pong\", this.onPong);\n\t\tthis.deltaManager.on(\"connect\", this.onConnect);\n\t\tthis.deltaManager.on(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.on(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic dispose(): void {\n\t\tthis.deltaManager.off(\"prepareSend\", this.onPrepareSend);\n\t\tthis.deltaManager.off(\"submitOp\", this.onSubmitOp);\n\t\tthis.deltaManager.off(\"op\", this.onOp);\n\t\tthis.deltaManager.off(\"pong\", this.onPong);\n\t\tthis.deltaManager.off(\"connect\", this.onConnect);\n\t\tthis.deltaManager.off(\"disconnect\", this.onDisconnect);\n\t\tthis.deltaManager.off(\"readonly\", this.onReadonly);\n\t}\n\n\tpublic submitSignal(content: string, targetClientId?: string): void {\n\t\treturn this.deltaManager.submitSignal(content, targetClientId);\n\t}\n\n\tpublic flush(): void {\n\t\treturn this.deltaManager.flush();\n\t}\n\n\tprivate readonly onPrepareSend = (messageBuffer: any[]): void => {\n\t\tthis.emit(\"prepareSend\", messageBuffer);\n\t};\n\tprivate readonly onSubmitOp = (message: IDocumentMessage): void => {\n\t\tthis.emit(\"submitOp\", message);\n\t};\n\tprotected readonly onOp = (\n\t\tmessage: ISequencedDocumentMessage,\n\t\tprocessingTime: number,\n\t): void => {\n\t\tthis.emit(\"op\", message, processingTime);\n\t};\n\tprivate readonly onPong = (latency: number): void => {\n\t\tthis.emit(\"pong\", latency);\n\t};\n\tprivate readonly onConnect = (details: IConnectionDetails, opsBehind?: number): void => {\n\t\tthis.emit(\"connect\", details, opsBehind);\n\t};\n\tprivate readonly onDisconnect = (reason: string, error?: IAnyDriverError): void => {\n\t\tthis.emit(\"disconnect\", reason, error);\n\t};\n\tprivate readonly onReadonly = (\n\t\treadonly: boolean,\n\t\treadonlyConnectionReason?: { reason: string; error?: IErrorBase },\n\t): void => {\n\t\tthis.emit(\"readonly\", readonly, readonlyConnectionReason);\n\t};\n}\n\n/**\n * Proxy to the real IDeltaManager for restricting certain access to layers below container runtime in summarizer clients:\n * - Summarizer client should be read-only to layers below the container runtime to restrict local changes.\n * - Summarizer client should not be active to layers below the container runtime to restrict local changes.\n */\nexport class DeltaManagerSummarizerProxy extends BaseDeltaManagerProxy {\n\tpublic get active(): boolean {\n\t\t// Summarize clients should not be active. There shouldn't be any local changes (writes) in the summarizer\n\t\t// except for the SummarizeOp which is generated by the runtime.\n\t\treturn !this.isSummarizerClient && this.deltaManager.active;\n\t}\n\n\tpublic get readOnlyInfo(): ReadOnlyInfo {\n\t\t// Summarizer clients should be read-only as far as the runtime and layers below are concerned. There shouldn't\n\t\t// be any local changes (writes) in the summarizer except for the summarize op which is generated by the runtime.\n\t\tif (this.isSummarizerClient) {\n\t\t\treturn {\n\t\t\t\treadonly: true,\n\t\t\t\tforced: false,\n\t\t\t\tpermissions: undefined,\n\t\t\t\tstorageOnly: false,\n\t\t\t};\n\t\t}\n\t\treturn this.deltaManager.readOnlyInfo;\n\t}\n\n\tprivate readonly isSummarizerClient: boolean;\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t) {\n\t\tsuper(deltaManager);\n\t\tthis.isSummarizerClient = this.deltaManager.clientDetails.type === summarizerClientType;\n\t}\n}\n\nexport class DeltaManagerPendingOpsProxy extends BaseDeltaManagerProxy {\n\tpublic get minimumSequenceNumber(): number {\n\t\tconst minPendingSeqNum = this.pendingStateManager.minimumPendingMessageSequenceNumber;\n\t\t// There is a chance that minPendingSeqNum is greater than minimum sequence number.\n\t\t// minPendingSeqNum is based on the pending ops, so it's based on ref seq number.\n\t\t// Imagine an op has just be sent while there's another client that has been lagging behind,\n\t\t// it will likely have a ref seq number greater than the minimum seq number.\n\t\tif (\n\t\t\tminPendingSeqNum !== undefined &&\n\t\t\tminPendingSeqNum < this.deltaManager.minimumSequenceNumber\n\t\t) {\n\t\t\treturn minPendingSeqNum;\n\t\t}\n\t\treturn this.deltaManager.minimumSequenceNumber;\n\t}\n\n\tpublic get lastMessage() {\n\t\tif (this.deltaManager.lastMessage === undefined) {\n\t\t\treturn this.deltaManager.lastMessage;\n\t\t}\n\t\treturn {\n\t\t\t...this.deltaManager.lastMessage,\n\t\t\tminimumSequenceNumber: this.minimumSequenceNumber,\n\t\t};\n\t}\n\n\tprotected readonly onOp = (\n\t\tmessage: ISequencedDocumentMessage,\n\t\tprocessingTime: number,\n\t): void => {\n\t\tconst messageIntercept = {\n\t\t\t...message,\n\t\t\tminimumSequenceNumber: this.minimumSequenceNumber,\n\t\t};\n\t\tthis.emit(\"op\", messageIntercept, processingTime);\n\t};\n\n\tconstructor(\n\t\tprotected readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly pendingStateManager: Pick<\n\t\t\tPendingStateManager,\n\t\t\t\"minimumPendingMessageSequenceNumber\"\n\t\t>,\n\t) {\n\t\tsuper(deltaManager);\n\t}\n}\n"]}
@@ -2,9 +2,9 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IDeltaManager } from "@fluidframework/container-definitions";
5
+ import { IDeltaManager } from "@fluidframework/container-definitions/internal";
6
6
  import { IDocumentMessage, ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
7
- import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
7
+ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
8
8
  /**
9
9
  * DeltaScheduler is responsible for the scheduling of inbound delta queue in cases where there
10
10
  * is more than one op a particular run of the queue. It does not schedule if there is just one
@@ -1 +1 @@
1
- {"version":3,"file":"deltaScheduler.d.ts","sourceRoot":"","sources":["../src/deltaScheduler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGtE;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IA8BzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IA7BxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6D;IAE1F,gBAAuB,cAAc,MAAM;IAG3C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAM;IAE9C,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,mCAAmC,CAAyC;IAKpF,OAAO,CAAC,eAAe,CAAa;IAEpC,OAAO,CAAC,aAAa,CAUR;gBAGZ,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,EACvD,MAAM,EAAE,mBAAmB;IAQtC,UAAU,CAAC,OAAO,EAAE,yBAAyB;IAmB7C,QAAQ,CAAC,OAAO,EAAE,yBAAyB;IAqDlD,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAK1B"}
1
+ {"version":3,"file":"deltaScheduler.d.ts","sourceRoot":"","sources":["../src/deltaScheduler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAc,MAAM,0CAA0C,CAAC;AAE3F;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IA8BzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IA7BxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6D;IAE1F,gBAAuB,cAAc,MAAM;IAG3C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAM;IAE9C,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,mCAAmC,CAAyC;IAKpF,OAAO,CAAC,eAAe,CAAa;IAEpC,OAAO,CAAC,aAAa,CAUR;gBAGZ,YAAY,EAAE,aAAa,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,EACvD,MAAM,EAAE,mBAAmB;IAQtC,UAAU,CAAC,OAAO,EAAE,yBAAyB;IAmB7C,QAAQ,CAAC,OAAO,EAAE,yBAAyB;IAqDlD,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAK1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"deltaScheduler.js","sourceRoot":"","sources":["../src/deltaScheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions\";\nimport { IDocumentMessage, ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt } from \"@fluidframework/telemetry-utils\";\nimport { formatTick } from \"@fluidframework/telemetry-utils/internal\";\n\n/**\n * DeltaScheduler is responsible for the scheduling of inbound delta queue in cases where there\n * is more than one op a particular run of the queue. It does not schedule if there is just one\n * op or just one batch in the run. It does the following two things:\n *\n * 1. If the ops have been processed for more than a specific amount of time, it pauses the queue\n * and calls setTimeout to schedule a resume of the queue. This ensures that we don't block\n * the JS thread for a long time processing ops synchronously (for example, when catching up\n * ops right after boot or catching up ops / delayed realizing data stores by summarizer).\n *\n * 2. If we scheduled a particular run of the queue, it logs telemetry for the number of ops\n * processed, the time and number of turns it took to process the ops.\n */\nexport class DeltaScheduler {\n\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\t// The time for processing ops in a single turn.\n\tpublic static readonly processingTime = 50;\n\n\t// The increase in time for processing ops after each turn.\n\tprivate readonly processingTimeIncrement = 10;\n\n\tprivate processingStartTime: number | undefined;\n\tprivate currentAllowedProcessingTimeForTurn: number = DeltaScheduler.processingTime;\n\n\t// This keeps track of the number of times inbound queue has been scheduled. After a particular\n\t// count, we log telemetry for the number of ops processed, the time and number of turns it took\n\t// to process the ops.\n\tprivate schedulingCount: number = 0;\n\n\tprivate schedulingLog:\n\t\t| {\n\t\t\t\topsRemainingToProcess: number;\n\t\t\t\ttotalProcessingTime: number;\n\t\t\t\tnumberOfTurns: number;\n\t\t\t\tnumberOfBatchesProcessed: number;\n\t\t\t\tlastSequenceNumber: number;\n\t\t\t\tfirstSequenceNumber: number;\n\t\t\t\tstartTime: number;\n\t\t }\n\t\t| undefined;\n\n\tconstructor(\n\t\tdeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.deltaManager = deltaManager;\n\t\tthis.deltaManager.inbound.on(\"idle\", () => {\n\t\t\tthis.inboundQueueIdle();\n\t\t});\n\t}\n\n\tpublic batchBegin(message: ISequencedDocumentMessage) {\n\t\tif (!this.processingStartTime) {\n\t\t\tthis.processingStartTime = performance.now();\n\t\t}\n\t\tif (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {\n\t\t\t// Every 500th time we are scheduling the inbound queue, we log telemetry for the\n\t\t\t// number of ops processed, the time and number of turns it took to process the ops.\n\t\t\tthis.schedulingLog = {\n\t\t\t\topsRemainingToProcess: 0,\n\t\t\t\tnumberOfTurns: 1,\n\t\t\t\ttotalProcessingTime: 0,\n\t\t\t\tnumberOfBatchesProcessed: 0,\n\t\t\t\tfirstSequenceNumber: message.sequenceNumber,\n\t\t\t\tlastSequenceNumber: message.sequenceNumber,\n\t\t\t\tstartTime: performance.now(),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic batchEnd(message: ISequencedDocumentMessage) {\n\t\tif (this.schedulingLog) {\n\t\t\tthis.schedulingLog.numberOfBatchesProcessed++;\n\t\t\tthis.schedulingLog.lastSequenceNumber = message.sequenceNumber;\n\t\t\tthis.schedulingLog.opsRemainingToProcess = this.deltaManager.inbound.length;\n\t\t}\n\n\t\tif (this.shouldRunScheduler()) {\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst elapsedTime = currentTime - this.processingStartTime!;\n\t\t\tif (elapsedTime > this.currentAllowedProcessingTimeForTurn) {\n\t\t\t\t// We have processed ops for more than the total processing time. So, pause the\n\t\t\t\t// queue, yield the thread and schedule a resume.\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\t\tthis.deltaManager.inbound.pause();\n\n\t\t\t\t// Increase the total processing time. Keep doing this after each turn until all the ops have\n\t\t\t\t// been processed. This way we keep the responsiveness at the beginning while also making sure\n\t\t\t\t// that all the ops process fairly quickly.\n\t\t\t\tthis.currentAllowedProcessingTimeForTurn += this.processingTimeIncrement;\n\n\t\t\t\t// If we are logging the telemetry this time, update the telemetry log object.\n\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\tthis.schedulingLog.numberOfTurns++;\n\t\t\t\t\tthis.schedulingLog.totalProcessingTime += elapsedTime;\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\t\teventName: \"InboundOpsPartialProcessingTime\",\n\t\t\t\t\t\t\tduration: formatTick(elapsedTime),\n\t\t\t\t\t\t\topsProcessed:\n\t\t\t\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\topsRemainingToProcess: this.deltaManager.inbound.length,\n\t\t\t\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\t\t\t\ttimeToResume: formatTick(performance.now() - currentTime),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.deltaManager.inbound.resume();\n\t\t\t\t});\n\n\t\t\t\tthis.processingStartTime = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate inboundQueueIdle() {\n\t\tif (this.schedulingLog) {\n\t\t\t// Add the time taken for processing the final ops to the total processing time in the\n\t\t\t// telemetry log object.\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tthis.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;\n\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"InboundOpsProcessingTime\",\n\t\t\t\topsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,\n\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\topsProcessed:\n\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t1,\n\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\tduration: formatTick(currentTime - this.schedulingLog.startTime),\n\t\t\t\tschedulingCount: this.schedulingCount,\n\t\t\t});\n\n\t\t\tthis.schedulingLog = undefined;\n\t\t}\n\n\t\t// If we scheduled this batch of the inbound queue, increment the counter that tracks the\n\t\t// number of times we have done this.\n\t\tthis.schedulingCount++;\n\n\t\t// Reset the processing times.\n\t\tthis.processingStartTime = undefined;\n\t\tthis.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;\n\t}\n\n\t/**\n\t * This function tells whether we should run the scheduler.\n\t */\n\tprivate shouldRunScheduler(): boolean {\n\t\t// If there are still ops in the queue after the one we are processing now, we should\n\t\t// run the scheduler.\n\t\treturn this.deltaManager.inbound.length > 0;\n\t}\n}\n"]}
1
+ {"version":3,"file":"deltaScheduler.js","sourceRoot":"","sources":["../src/deltaScheduler.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { IDeltaManager } from \"@fluidframework/container-definitions/internal\";\nimport { IDocumentMessage, ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLoggerExt, formatTick } from \"@fluidframework/telemetry-utils/internal\";\n\n/**\n * DeltaScheduler is responsible for the scheduling of inbound delta queue in cases where there\n * is more than one op a particular run of the queue. It does not schedule if there is just one\n * op or just one batch in the run. It does the following two things:\n *\n * 1. If the ops have been processed for more than a specific amount of time, it pauses the queue\n * and calls setTimeout to schedule a resume of the queue. This ensures that we don't block\n * the JS thread for a long time processing ops synchronously (for example, when catching up\n * ops right after boot or catching up ops / delayed realizing data stores by summarizer).\n *\n * 2. If we scheduled a particular run of the queue, it logs telemetry for the number of ops\n * processed, the time and number of turns it took to process the ops.\n */\nexport class DeltaScheduler {\n\tprivate readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;\n\t// The time for processing ops in a single turn.\n\tpublic static readonly processingTime = 50;\n\n\t// The increase in time for processing ops after each turn.\n\tprivate readonly processingTimeIncrement = 10;\n\n\tprivate processingStartTime: number | undefined;\n\tprivate currentAllowedProcessingTimeForTurn: number = DeltaScheduler.processingTime;\n\n\t// This keeps track of the number of times inbound queue has been scheduled. After a particular\n\t// count, we log telemetry for the number of ops processed, the time and number of turns it took\n\t// to process the ops.\n\tprivate schedulingCount: number = 0;\n\n\tprivate schedulingLog:\n\t\t| {\n\t\t\t\topsRemainingToProcess: number;\n\t\t\t\ttotalProcessingTime: number;\n\t\t\t\tnumberOfTurns: number;\n\t\t\t\tnumberOfBatchesProcessed: number;\n\t\t\t\tlastSequenceNumber: number;\n\t\t\t\tfirstSequenceNumber: number;\n\t\t\t\tstartTime: number;\n\t\t }\n\t\t| undefined;\n\n\tconstructor(\n\t\tdeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t) {\n\t\tthis.deltaManager = deltaManager;\n\t\tthis.deltaManager.inbound.on(\"idle\", () => {\n\t\t\tthis.inboundQueueIdle();\n\t\t});\n\t}\n\n\tpublic batchBegin(message: ISequencedDocumentMessage) {\n\t\tif (!this.processingStartTime) {\n\t\t\tthis.processingStartTime = performance.now();\n\t\t}\n\t\tif (this.schedulingLog === undefined && this.schedulingCount % 500 === 0) {\n\t\t\t// Every 500th time we are scheduling the inbound queue, we log telemetry for the\n\t\t\t// number of ops processed, the time and number of turns it took to process the ops.\n\t\t\tthis.schedulingLog = {\n\t\t\t\topsRemainingToProcess: 0,\n\t\t\t\tnumberOfTurns: 1,\n\t\t\t\ttotalProcessingTime: 0,\n\t\t\t\tnumberOfBatchesProcessed: 0,\n\t\t\t\tfirstSequenceNumber: message.sequenceNumber,\n\t\t\t\tlastSequenceNumber: message.sequenceNumber,\n\t\t\t\tstartTime: performance.now(),\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic batchEnd(message: ISequencedDocumentMessage) {\n\t\tif (this.schedulingLog) {\n\t\t\tthis.schedulingLog.numberOfBatchesProcessed++;\n\t\t\tthis.schedulingLog.lastSequenceNumber = message.sequenceNumber;\n\t\t\tthis.schedulingLog.opsRemainingToProcess = this.deltaManager.inbound.length;\n\t\t}\n\n\t\tif (this.shouldRunScheduler()) {\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tconst elapsedTime = currentTime - this.processingStartTime!;\n\t\t\tif (elapsedTime > this.currentAllowedProcessingTimeForTurn) {\n\t\t\t\t// We have processed ops for more than the total processing time. So, pause the\n\t\t\t\t// queue, yield the thread and schedule a resume.\n\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\t\t\tthis.deltaManager.inbound.pause();\n\n\t\t\t\t// Increase the total processing time. Keep doing this after each turn until all the ops have\n\t\t\t\t// been processed. This way we keep the responsiveness at the beginning while also making sure\n\t\t\t\t// that all the ops process fairly quickly.\n\t\t\t\tthis.currentAllowedProcessingTimeForTurn += this.processingTimeIncrement;\n\n\t\t\t\t// If we are logging the telemetry this time, update the telemetry log object.\n\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\tthis.schedulingLog.numberOfTurns++;\n\t\t\t\t\tthis.schedulingLog.totalProcessingTime += elapsedTime;\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (this.schedulingLog) {\n\t\t\t\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\t\t\t\teventName: \"InboundOpsPartialProcessingTime\",\n\t\t\t\t\t\t\tduration: formatTick(elapsedTime),\n\t\t\t\t\t\t\topsProcessed:\n\t\t\t\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\topsRemainingToProcess: this.deltaManager.inbound.length,\n\t\t\t\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\t\t\t\ttimeToResume: formatTick(performance.now() - currentTime),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.deltaManager.inbound.resume();\n\t\t\t\t});\n\n\t\t\t\tthis.processingStartTime = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate inboundQueueIdle() {\n\t\tif (this.schedulingLog) {\n\t\t\t// Add the time taken for processing the final ops to the total processing time in the\n\t\t\t// telemetry log object.\n\t\t\tconst currentTime = performance.now();\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\tthis.schedulingLog.totalProcessingTime += currentTime - this.processingStartTime!;\n\n\t\t\tthis.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"InboundOpsProcessingTime\",\n\t\t\t\topsRemainingToProcess: this.schedulingLog.opsRemainingToProcess,\n\t\t\t\tnumberOfTurns: this.schedulingLog.numberOfTurns,\n\t\t\t\tprocessingTime: formatTick(this.schedulingLog.totalProcessingTime),\n\t\t\t\topsProcessed:\n\t\t\t\t\tthis.schedulingLog.lastSequenceNumber -\n\t\t\t\t\tthis.schedulingLog.firstSequenceNumber +\n\t\t\t\t\t1,\n\t\t\t\tbatchesProcessed: this.schedulingLog.numberOfBatchesProcessed,\n\t\t\t\tduration: formatTick(currentTime - this.schedulingLog.startTime),\n\t\t\t\tschedulingCount: this.schedulingCount,\n\t\t\t});\n\n\t\t\tthis.schedulingLog = undefined;\n\t\t}\n\n\t\t// If we scheduled this batch of the inbound queue, increment the counter that tracks the\n\t\t// number of times we have done this.\n\t\tthis.schedulingCount++;\n\n\t\t// Reset the processing times.\n\t\tthis.processingStartTime = undefined;\n\t\tthis.currentAllowedProcessingTimeForTurn = DeltaScheduler.processingTime;\n\t}\n\n\t/**\n\t * This function tells whether we should run the scheduler.\n\t */\n\tprivate shouldRunScheduler(): boolean {\n\t\t// If there are still ops in the queue after the one we are processing now, we should\n\t\t// run the scheduler.\n\t\treturn this.deltaManager.inbound.length > 0;\n\t}\n}\n"]}
@@ -2,14 +2,12 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { IRequest } from "@fluidframework/core-interfaces";
6
5
  import { ITelemetryContext } from "@fluidframework/runtime-definitions";
7
6
  import { IGarbageCollectionDetailsBase, ISummarizeResult } from "@fluidframework/runtime-definitions/internal";
8
- import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
9
- import { RuntimeHeaderData } from "../containerRuntime.js";
7
+ import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils/internal";
10
8
  import { ContainerRuntimeGCMessage } from "../messageTypes.js";
11
9
  import { IRefreshSummaryResult } from "../summary/index.js";
12
- import { IGCMetadata, IGCStats, IGarbageCollector, IGarbageCollectorCreateParams } from "./gcDefinitions.js";
10
+ import { IGCMetadata, IGCStats, IGarbageCollector, IGarbageCollectorCreateParams, type IGCNodeUpdatedProps } from "./gcDefinitions.js";
13
11
  /**
14
12
  * The garbage collector for the container runtime. It consolidates the garbage collection functionality and maintains
15
13
  * its state across summaries.
@@ -195,14 +193,9 @@ export declare class GarbageCollector implements IGarbageCollector {
195
193
  /**
196
194
  * Called when a node with the given id is updated. If the node is inactive or tombstoned, this will log an error
197
195
  * or throw an error if failing on incorrect usage is configured.
198
- * @param nodePath - The path of the node that changed.
199
- * @param reason - Whether the node was loaded or changed.
200
- * @param timestampMs - The timestamp when the node changed.
201
- * @param packagePath - The package path of the node. This may not be available if the node hasn't been loaded yet.
202
- * @param request - The original request for loads to preserve it in telemetry.
203
- * @param requestHeaders - If the node was loaded via request path, the headers in the request.
204
- */
205
- nodeUpdated(nodePath: string, reason: "Loaded" | "Changed", timestampMs?: number, packagePath?: readonly string[], request?: IRequest, headerData?: RuntimeHeaderData): void;
196
+ * @param IGCNodeUpdatedProps - Details about the node and how it was updated
197
+ */
198
+ nodeUpdated({ node, reason, timestampMs, packagePath, request, headerData, }: IGCNodeUpdatedProps): void;
206
199
  /**
207
200
  * The given node should have its unreferenced state reset in the next GC,
208
201
  * even if the true GC graph shows it is unreferenced. This will
@@ -1 +1 @@
1
- {"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAA0B,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAChG,OAAO,EACN,6BAA6B,EAC7B,gBAAgB,EAEhB,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EACN,mBAAmB,EAOnB,MAAM,0CAA0C,CAAC;AAKlD,OAAO,EAAwB,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EAIN,WAAW,EAEX,QAAQ,EAER,iBAAiB,EAEjB,6BAA6B,EAK7B,KAAK,mBAAmB,EACxB,MAAM,oBAAoB,CAAC;AAkB5B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;WAC3C,MAAM,CAAC,YAAY,EAAE,6BAA6B,GAAG,iBAAiB;IAIpF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IAEvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,SAAgB,yBAAyB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE9D,OAAO,CAAC,iBAAiB,CAAqC;IAG9D,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAoC;IAE9E,OAAO,CAAC,UAAU,CAAgB;IAElC,OAAO,CAAC,YAAY,CAA0B;IAG9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsD;IAExF,OAAO,CAAC,QAAQ,CAAC,kCAAkC,CAAgB;IAEnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyC;IAExE;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CACJ;IAGnC,OAAO,CAAC,kBAAkB,CAAoB;IAG9C,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAE7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwB;IAC5D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqB;IAEtD,iFAAiF;IACjF,IAAW,2BAA2B,IAAI,OAAO,CAEhD;IACD,uEAAuE;IACvE,IAAW,oBAAoB,IAAI,OAAO,CAEzC;IACD,kEAAkE;IAClE,IAAW,qBAAqB,IAAI,OAAO,CAE1C;IAED,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAES;IAC5C,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAA2B;IAErE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+C;IAE7E,IAAW,sBAAsB,IAAI,OAAO,CAE3C;IAED,sFAAsF;IACtF,IAAW,8BAA8B,IAAI,MAAM,CAElD;IAED,SAAS,aAAa,YAAY,EAAE,6BAA6B;IA4LjE;;;;;OAKG;IACU,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BjD;;;OAGG;YACW,yBAAyB;IA6BvC;;;;;OAKG;IACI,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAwBlF;;;OAGG;IACU,gBAAgB,IAAI,OAAO,CAAC,6BAA6B,CAAC;IAIvE;;;OAGG;IACU,cAAc,CAC1B,OAAO,EAAE;QACR,0CAA0C;QAC1C,MAAM,CAAC,EAAE,mBAAmB,CAAC;QAC7B,sDAAsD;QACtD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,oCAAoC;QACpC,MAAM,CAAC,EAAE,OAAO,CAAC;KACjB,EACD,gBAAgB,CAAC,EAAE,iBAAiB,GAClC,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IA6EhC;;;;;;;;;;;;OAYG;YACW,KAAK;IA4CnB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,YAAY;IA+CpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,aAAa;IA+ErB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,gCAAgC;IAqExC;;;;OAIG;IACI,SAAS,CACf,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,OAAO,EACnB,gBAAgB,CAAC,EAAE,iBAAiB,GAClC,gBAAgB,GAAG,SAAS;IAsBxB,WAAW,IAAI,WAAW;IAcjC;;OAEG;IACU,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/E;;;;OAIG;IACI,cAAc,CAAC,OAAO,EAAE,yBAAyB,EAAE,KAAK,EAAE,OAAO;IAyCxE;;;;;;;;OAQG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;;;OAIG;IACI,WAAW,CAAC,EAClB,IAAI,EACJ,MAAM,EACN,WAAW,EACX,WAAW,EACX,OAAO,EACP,UAAU,GACV,EAAE,mBAAmB;IA0EtB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;;;OAOG;IACI,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI;IAgD3F;;;OAGG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxC,OAAO,IAAI,IAAI;IAKtB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA0DzB;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;CAkE1B"}
@@ -255,16 +255,22 @@ class GarbageCollector {
255
255
  if (currentReferenceTimestampMs === undefined) {
256
256
  return;
257
257
  }
258
- // If the GC state hasn't been initialized yet, initialize it and return.
259
- if (this.gcDataFromLastRun === undefined) {
260
- await this.initializeGCStateFromBaseSnapshotP;
261
- return;
262
- }
263
- // If the GC state has been initialized, update the tracking of unreferenced nodes as per the current
264
- // reference timestamp.
265
- for (const [, nodeStateTracker] of this.unreferencedNodesState) {
266
- nodeStateTracker.updateTracking(currentReferenceTimestampMs);
267
- }
258
+ const initialized = this.gcDataFromLastRun !== undefined;
259
+ await internal_4.PerformanceEvent.timedExecAsync(this.mc.logger, {
260
+ eventName: "InitializeOrUpdateGCState",
261
+ details: { initialized, unrefNodeCount: this.unreferencedNodesState.size },
262
+ }, async () => {
263
+ // If the GC state hasn't been initialized yet, initialize it and return.
264
+ if (!initialized) {
265
+ await this.initializeGCStateFromBaseSnapshotP;
266
+ return;
267
+ }
268
+ // If the GC state has been initialized, update the tracking of unreferenced nodes as per the current
269
+ // reference timestamp.
270
+ for (const [, nodeStateTracker] of this.unreferencedNodesState) {
271
+ nodeStateTracker.updateTracking(currentReferenceTimestampMs);
272
+ }
273
+ });
268
274
  }
269
275
  /**
270
276
  * Called when the connection state of the runtime changes, i.e., it connects or disconnects. GC subscribes to this
@@ -711,21 +717,20 @@ class GarbageCollector {
711
717
  /**
712
718
  * Called when a node with the given id is updated. If the node is inactive or tombstoned, this will log an error
713
719
  * or throw an error if failing on incorrect usage is configured.
714
- * @param nodePath - The path of the node that changed.
715
- * @param reason - Whether the node was loaded or changed.
716
- * @param timestampMs - The timestamp when the node changed.
717
- * @param packagePath - The package path of the node. This may not be available if the node hasn't been loaded yet.
718
- * @param request - The original request for loads to preserve it in telemetry.
719
- * @param requestHeaders - If the node was loaded via request path, the headers in the request.
720
+ * @param IGCNodeUpdatedProps - Details about the node and how it was updated
720
721
  */
721
- nodeUpdated(nodePath, reason, timestampMs, packagePath, request, headerData) {
722
+ nodeUpdated({ node, reason, timestampMs, packagePath, request, headerData, }) {
722
723
  if (!this.configs.shouldRunGC) {
723
724
  return;
724
725
  }
725
- const isTombstoned = this.tombstones.includes(nodePath);
726
+ // trackedId will be either DataStore or Blob ID (not sub-DataStore ID, since some of those are unrecognized by GC)
727
+ const trackedId = node.path;
728
+ const isTombstoned = this.tombstones.includes(trackedId);
729
+ const isInactive = this.unreferencedNodesState.get(trackedId)?.state === "Inactive";
730
+ const fullPath = request !== undefined ? (0, gcHelpers_js_1.urlToGCNodePath)(request.url) : trackedId;
726
731
  // This will log if appropriate
727
- this.telemetryTracker.nodeUsed({
728
- id: nodePath,
732
+ this.telemetryTracker.nodeUsed(trackedId, {
733
+ id: fullPath,
729
734
  usageType: reason,
730
735
  currentReferenceTimestampMs: timestampMs ?? this.runtime.getCurrentReferenceTimestampMs(),
731
736
  packagePath,
@@ -733,6 +738,8 @@ class GarbageCollector {
733
738
  isTombstoned,
734
739
  lastSummaryTime: this.getLastSummaryTimestampMs(),
735
740
  headers: headerData,
741
+ requestUrl: request?.url,
742
+ requestHeaders: JSON.stringify(request?.headers),
736
743
  });
737
744
  // Any time we log a Tombstone Loaded error (via Telemetry Tracker),
738
745
  // we want to also trigger autorecovery to avoid the object being deleted
@@ -740,14 +747,16 @@ class GarbageCollector {
740
747
  // to be loaded by the Summarizer, and auto-recovery will be triggered then.
741
748
  if (isTombstoned && reason === "Loaded") {
742
749
  // Note that when a DataStore and its DDS are all loaded, each will trigger AutoRecovery for itself.
743
- this.triggerAutoRecovery(nodePath);
750
+ this.triggerAutoRecovery(fullPath);
744
751
  }
745
- const nodeType = this.runtime.getNodeType(nodePath);
752
+ const nodeType = this.runtime.getNodeType(fullPath);
746
753
  // Unless this is a Loaded event for a Blob or DataStore, we're done after telemetry tracking
747
- if (reason !== "Loaded" || ![gcDefinitions_js_1.GCNodeType.Blob, gcDefinitions_js_1.GCNodeType.DataStore].includes(nodeType)) {
754
+ const loadedBlobOrDataStore = reason === "Loaded" &&
755
+ (nodeType === gcDefinitions_js_1.GCNodeType.Blob || nodeType === gcDefinitions_js_1.GCNodeType.DataStore);
756
+ if (!loadedBlobOrDataStore) {
748
757
  return;
749
758
  }
750
- const errorRequest = request ?? { url: nodePath };
759
+ const errorRequest = request ?? { url: fullPath };
751
760
  if (isTombstoned && this.throwOnTombstoneLoad && headerData?.allowTombstone !== true) {
752
761
  // The requested data store is removed by gc. Create a 404 gc response exception.
753
762
  throw (0, internal_3.responseToException)((0, internal_3.createResponseError)(404, `${nodeType} was tombstoned`, errorRequest, {
@@ -755,7 +764,7 @@ class GarbageCollector {
755
764
  }), errorRequest);
756
765
  }
757
766
  // If the object is inactive and inactive enforcement is configured, throw an error.
758
- if (this.unreferencedNodesState.get(nodePath)?.state === "Inactive") {
767
+ if (isInactive) {
759
768
  const shouldThrowOnInactiveLoad = !this.isSummarizerClient &&
760
769
  this.configs.throwOnInactiveLoad === true &&
761
770
  headerData?.allowInactive !== true;
@@ -816,21 +825,28 @@ class GarbageCollector {
816
825
  const outboundRoutes = this.newReferencesSinceLastRun.get(fromNodePath) ?? [];
817
826
  outboundRoutes.push(toNodePath);
818
827
  this.newReferencesSinceLastRun.set(fromNodePath, outboundRoutes);
819
- this.telemetryTracker.nodeUsed({
828
+ // GC won't recognize some subDataStore paths that we encounter (e.g. a path suited for a custom request handler)
829
+ // So for subDataStore paths we need to check the parent dataStore for current tombstone/inactive status.
830
+ const trackedId = this.runtime.getNodeType(toNodePath) === "SubDataStore"
831
+ ? (0, gcHelpers_js_1.dataStoreNodePathOnly)(toNodePath)
832
+ : toNodePath;
833
+ this.telemetryTracker.nodeUsed(trackedId, {
820
834
  id: toNodePath,
835
+ fromId: fromNodePath,
821
836
  usageType: "Revived",
822
837
  currentReferenceTimestampMs: this.runtime.getCurrentReferenceTimestampMs(),
823
838
  packagePath: undefined,
824
839
  completedGCRuns: this.completedRuns,
825
- isTombstoned: this.tombstones.includes(toNodePath),
840
+ isTombstoned: this.tombstones.includes(trackedId),
826
841
  lastSummaryTime: this.getLastSummaryTimestampMs(),
827
- fromId: fromNodePath,
828
842
  autorecovery,
829
843
  });
830
- // This node is referenced - Clear its unreferenced state
844
+ // This node is referenced - Clear its unreferenced state if present
831
845
  // But don't delete the node id from the map yet.
832
846
  // When generating GC stats, the set of nodes in here is used as the baseline for
833
847
  // what was unreferenced in the last GC run.
848
+ // NOTE: We use toNodePath not trackedId even though it may be an unrecognized subDataStore route (hence no-op),
849
+ // because a reference to such a path is not sufficient to consider the DataStore referenced.
834
850
  this.unreferencedNodesState.get(toNodePath)?.stopTracking();
835
851
  }
836
852
  /**