@fluidframework/container-runtime 2.0.0-dev-rc.1.0.0.225277 → 2.0.0-dev-rc.1.0.0.228517

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 (244) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +1 -7
  3. package/api-report/container-runtime.api.md +1 -0
  4. package/dist/{batchTracker.cjs → batchTracker.js} +1 -1
  5. package/dist/batchTracker.js.map +1 -0
  6. package/dist/blobManager.d.ts.map +1 -1
  7. package/dist/{blobManager.cjs → blobManager.js} +9 -3
  8. package/dist/blobManager.js.map +1 -0
  9. package/dist/{connectionTelemetry.cjs → connectionTelemetry.js} +1 -1
  10. package/dist/connectionTelemetry.js.map +1 -0
  11. package/dist/container-runtime-alpha.d.ts +2 -0
  12. package/dist/container-runtime-untrimmed.d.ts +2 -0
  13. package/dist/{containerHandleContext.cjs → containerHandleContext.js} +1 -1
  14. package/dist/containerHandleContext.js.map +1 -0
  15. package/dist/containerRuntime.d.ts.map +1 -1
  16. package/dist/{containerRuntime.cjs → containerRuntime.js} +23 -18
  17. package/dist/containerRuntime.js.map +1 -0
  18. package/dist/{dataStore.cjs → dataStore.js} +1 -1
  19. package/dist/dataStore.js.map +1 -0
  20. package/dist/dataStoreContext.d.ts +3 -0
  21. package/dist/dataStoreContext.d.ts.map +1 -1
  22. package/dist/{dataStoreContext.cjs → dataStoreContext.js} +11 -4
  23. package/dist/dataStoreContext.js.map +1 -0
  24. package/dist/{dataStoreContexts.cjs → dataStoreContexts.js} +1 -1
  25. package/dist/dataStoreContexts.js.map +1 -0
  26. package/dist/{dataStoreRegistry.cjs → dataStoreRegistry.js} +1 -1
  27. package/dist/dataStoreRegistry.js.map +1 -0
  28. package/dist/dataStores.d.ts +5 -1
  29. package/dist/dataStores.d.ts.map +1 -1
  30. package/dist/{dataStores.cjs → dataStores.js} +54 -14
  31. package/dist/dataStores.js.map +1 -0
  32. package/dist/{deltaManagerProxyBase.cjs → deltaManagerProxyBase.js} +1 -1
  33. package/dist/deltaManagerProxyBase.js.map +1 -0
  34. package/dist/{deltaManagerSummarizerProxy.cjs → deltaManagerSummarizerProxy.js} +3 -3
  35. package/dist/deltaManagerSummarizerProxy.js.map +1 -0
  36. package/dist/{deltaScheduler.cjs → deltaScheduler.js} +1 -1
  37. package/dist/deltaScheduler.js.map +1 -0
  38. package/dist/{error.cjs → error.js} +1 -1
  39. package/dist/error.js.map +1 -0
  40. package/dist/gc/garbageCollection.d.ts.map +1 -1
  41. package/dist/gc/{garbageCollection.cjs → garbageCollection.js} +39 -13
  42. package/dist/gc/garbageCollection.js.map +1 -0
  43. package/dist/gc/{gcConfigs.cjs → gcConfigs.js} +3 -3
  44. package/dist/gc/gcConfigs.js.map +1 -0
  45. package/dist/gc/gcDefinitions.d.ts +2 -0
  46. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  47. package/dist/gc/{gcDefinitions.cjs → gcDefinitions.js} +4 -2
  48. package/dist/gc/gcDefinitions.js.map +1 -0
  49. package/dist/gc/{gcHelpers.cjs → gcHelpers.js} +1 -1
  50. package/dist/gc/gcHelpers.js.map +1 -0
  51. package/dist/gc/{gcReferenceGraphAlgorithm.cjs → gcReferenceGraphAlgorithm.js} +1 -1
  52. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
  53. package/dist/gc/{gcSummaryDefinitions.cjs → gcSummaryDefinitions.js} +1 -1
  54. package/dist/gc/gcSummaryDefinitions.js.map +1 -0
  55. package/dist/gc/{gcSummaryStateTracker.cjs → gcSummaryStateTracker.js} +2 -2
  56. package/dist/gc/gcSummaryStateTracker.js.map +1 -0
  57. package/dist/gc/{gcTelemetry.cjs → gcTelemetry.js} +2 -2
  58. package/dist/gc/gcTelemetry.js.map +1 -0
  59. package/dist/gc/{gcUnreferencedStateTracker.cjs → gcUnreferencedStateTracker.js} +2 -2
  60. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
  61. package/dist/gc/index.d.ts +1 -1
  62. package/dist/gc/index.d.ts.map +1 -1
  63. package/dist/gc/{index.cjs → index.js} +10 -9
  64. package/dist/gc/index.js.map +1 -0
  65. package/dist/{index.cjs → index.js} +7 -7
  66. package/dist/index.js.map +1 -0
  67. package/dist/{messageTypes.cjs → messageTypes.js} +1 -1
  68. package/dist/messageTypes.js.map +1 -0
  69. package/dist/{metadata.cjs → metadata.js} +1 -1
  70. package/dist/metadata.js.map +1 -0
  71. package/dist/opLifecycle/{batchManager.cjs → batchManager.js} +1 -1
  72. package/dist/opLifecycle/batchManager.js.map +1 -0
  73. package/dist/opLifecycle/{definitions.cjs → definitions.js} +1 -1
  74. package/dist/opLifecycle/definitions.js.map +1 -0
  75. package/dist/opLifecycle/{index.cjs → index.js} +8 -8
  76. package/dist/opLifecycle/index.js.map +1 -0
  77. package/dist/opLifecycle/{opCompressor.cjs → opCompressor.js} +3 -3
  78. package/dist/opLifecycle/opCompressor.js.map +1 -0
  79. package/dist/opLifecycle/{opDecompressor.cjs → opDecompressor.js} +2 -2
  80. package/dist/opLifecycle/opDecompressor.js.map +1 -0
  81. package/dist/opLifecycle/{opGroupingManager.cjs → opGroupingManager.js} +1 -1
  82. package/dist/opLifecycle/opGroupingManager.js.map +1 -0
  83. package/dist/opLifecycle/{opSplitter.cjs → opSplitter.js} +3 -3
  84. package/dist/opLifecycle/opSplitter.js.map +1 -0
  85. package/dist/opLifecycle/{outbox.cjs → outbox.js} +2 -2
  86. package/dist/opLifecycle/outbox.js.map +1 -0
  87. package/dist/opLifecycle/{remoteMessageProcessor.cjs → remoteMessageProcessor.js} +2 -2
  88. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -0
  89. package/dist/{opProperties.cjs → opProperties.js} +1 -1
  90. package/dist/opProperties.js.map +1 -0
  91. package/dist/packageVersion.d.ts +1 -1
  92. package/dist/{packageVersion.cjs → packageVersion.js} +2 -2
  93. package/dist/packageVersion.js.map +1 -0
  94. package/dist/{pendingStateManager.cjs → pendingStateManager.js} +2 -2
  95. package/dist/pendingStateManager.js.map +1 -0
  96. package/dist/{scheduleManager.cjs → scheduleManager.js} +3 -3
  97. package/dist/scheduleManager.js.map +1 -0
  98. package/dist/{storageServiceWithAttachBlobs.cjs → storageServiceWithAttachBlobs.js} +1 -1
  99. package/dist/storageServiceWithAttachBlobs.js.map +1 -0
  100. package/dist/summary/{index.cjs → index.js} +12 -12
  101. package/dist/summary/index.js.map +1 -0
  102. package/dist/summary/{orderedClientElection.cjs → orderedClientElection.js} +2 -2
  103. package/dist/summary/orderedClientElection.js.map +1 -0
  104. package/dist/summary/{runWhileConnectedCoordinator.cjs → runWhileConnectedCoordinator.js} +1 -1
  105. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
  106. package/dist/summary/runningSummarizer.d.ts +5 -0
  107. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  108. package/dist/summary/{runningSummarizer.cjs → runningSummarizer.js} +50 -21
  109. package/dist/summary/runningSummarizer.js.map +1 -0
  110. package/dist/summary/{summarizer.cjs → summarizer.js} +4 -4
  111. package/dist/summary/summarizer.js.map +1 -0
  112. package/dist/summary/{summarizerClientElection.cjs → summarizerClientElection.js} +1 -1
  113. package/dist/summary/summarizerClientElection.js.map +1 -0
  114. package/dist/summary/{summarizerHeuristics.cjs → summarizerHeuristics.js} +1 -1
  115. package/dist/summary/summarizerHeuristics.js.map +1 -0
  116. package/dist/summary/summarizerNode/{index.cjs → index.js} +3 -3
  117. package/dist/summary/summarizerNode/index.js.map +1 -0
  118. package/dist/summary/summarizerNode/{summarizerNode.cjs → summarizerNode.js} +2 -2
  119. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
  120. package/dist/summary/summarizerNode/{summarizerNodeUtils.cjs → summarizerNodeUtils.js} +1 -1
  121. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
  122. package/dist/summary/summarizerNode/{summarizerNodeWithGc.cjs → summarizerNodeWithGc.js} +4 -4
  123. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
  124. package/dist/summary/summarizerTypes.d.ts +2 -0
  125. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  126. package/dist/summary/{summarizerTypes.cjs → summarizerTypes.js} +1 -1
  127. package/dist/summary/summarizerTypes.js.map +1 -0
  128. package/dist/summary/{summaryCollection.cjs → summaryCollection.js} +1 -1
  129. package/dist/summary/summaryCollection.js.map +1 -0
  130. package/dist/summary/{summaryFormat.cjs → summaryFormat.js} +1 -1
  131. package/dist/summary/summaryFormat.js.map +1 -0
  132. package/dist/summary/{summaryGenerator.cjs → summaryGenerator.js} +1 -1
  133. package/dist/summary/summaryGenerator.js.map +1 -0
  134. package/dist/summary/{summaryManager.cjs → summaryManager.js} +2 -2
  135. package/dist/summary/summaryManager.js.map +1 -0
  136. package/dist/{throttler.cjs → throttler.js} +1 -1
  137. package/dist/throttler.js.map +1 -0
  138. package/lib/blobManager.d.mts.map +1 -1
  139. package/lib/blobManager.mjs +7 -1
  140. package/lib/blobManager.mjs.map +1 -1
  141. package/lib/container-runtime-alpha.d.mts +2 -0
  142. package/lib/container-runtime-untrimmed.d.mts +2 -0
  143. package/lib/containerRuntime.d.mts.map +1 -1
  144. package/lib/containerRuntime.mjs +6 -1
  145. package/lib/containerRuntime.mjs.map +1 -1
  146. package/lib/dataStoreContext.d.mts +3 -0
  147. package/lib/dataStoreContext.d.mts.map +1 -1
  148. package/lib/dataStoreContext.mjs +9 -2
  149. package/lib/dataStoreContext.mjs.map +1 -1
  150. package/lib/dataStores.d.mts +5 -1
  151. package/lib/dataStores.d.mts.map +1 -1
  152. package/lib/dataStores.mjs +46 -7
  153. package/lib/dataStores.mjs.map +1 -1
  154. package/lib/gc/garbageCollection.d.mts.map +1 -1
  155. package/lib/gc/garbageCollection.mjs +29 -3
  156. package/lib/gc/garbageCollection.mjs.map +1 -1
  157. package/lib/gc/gcDefinitions.d.mts +2 -0
  158. package/lib/gc/gcDefinitions.d.mts.map +1 -1
  159. package/lib/gc/gcDefinitions.mjs +2 -0
  160. package/lib/gc/gcDefinitions.mjs.map +1 -1
  161. package/lib/gc/index.d.mts +1 -1
  162. package/lib/gc/index.d.mts.map +1 -1
  163. package/lib/gc/index.mjs +1 -1
  164. package/lib/gc/index.mjs.map +1 -1
  165. package/lib/packageVersion.d.mts +1 -1
  166. package/lib/packageVersion.mjs +1 -1
  167. package/lib/packageVersion.mjs.map +1 -1
  168. package/lib/summary/runningSummarizer.d.mts +5 -0
  169. package/lib/summary/runningSummarizer.d.mts.map +1 -1
  170. package/lib/summary/runningSummarizer.mjs +46 -17
  171. package/lib/summary/runningSummarizer.mjs.map +1 -1
  172. package/lib/summary/summarizerTypes.d.mts +2 -0
  173. package/lib/summary/summarizerTypes.d.mts.map +1 -1
  174. package/lib/summary/summarizerTypes.mjs.map +1 -1
  175. package/package.json +40 -36
  176. package/src/blobManager.ts +7 -1
  177. package/src/containerRuntime.ts +7 -0
  178. package/src/dataStoreContext.ts +9 -2
  179. package/src/dataStores.ts +56 -5
  180. package/src/gc/garbageCollection.ts +32 -2
  181. package/src/gc/gcDefinitions.ts +2 -0
  182. package/src/gc/index.ts +2 -0
  183. package/src/packageVersion.ts +1 -1
  184. package/src/summary/runningSummarizer.ts +58 -25
  185. package/src/summary/summarizerTypes.ts +2 -0
  186. package/dist/batchTracker.cjs.map +0 -1
  187. package/dist/blobManager.cjs.map +0 -1
  188. package/dist/connectionTelemetry.cjs.map +0 -1
  189. package/dist/containerHandleContext.cjs.map +0 -1
  190. package/dist/containerRuntime.cjs.map +0 -1
  191. package/dist/dataStore.cjs.map +0 -1
  192. package/dist/dataStoreContext.cjs.map +0 -1
  193. package/dist/dataStoreContexts.cjs.map +0 -1
  194. package/dist/dataStoreRegistry.cjs.map +0 -1
  195. package/dist/dataStores.cjs.map +0 -1
  196. package/dist/deltaManagerProxyBase.cjs.map +0 -1
  197. package/dist/deltaManagerSummarizerProxy.cjs.map +0 -1
  198. package/dist/deltaScheduler.cjs.map +0 -1
  199. package/dist/error.cjs.map +0 -1
  200. package/dist/gc/garbageCollection.cjs.map +0 -1
  201. package/dist/gc/gcConfigs.cjs.map +0 -1
  202. package/dist/gc/gcDefinitions.cjs.map +0 -1
  203. package/dist/gc/gcHelpers.cjs.map +0 -1
  204. package/dist/gc/gcReferenceGraphAlgorithm.cjs.map +0 -1
  205. package/dist/gc/gcSummaryDefinitions.cjs.map +0 -1
  206. package/dist/gc/gcSummaryStateTracker.cjs.map +0 -1
  207. package/dist/gc/gcTelemetry.cjs.map +0 -1
  208. package/dist/gc/gcUnreferencedStateTracker.cjs.map +0 -1
  209. package/dist/gc/index.cjs.map +0 -1
  210. package/dist/index.cjs.map +0 -1
  211. package/dist/messageTypes.cjs.map +0 -1
  212. package/dist/metadata.cjs.map +0 -1
  213. package/dist/opLifecycle/batchManager.cjs.map +0 -1
  214. package/dist/opLifecycle/definitions.cjs.map +0 -1
  215. package/dist/opLifecycle/index.cjs.map +0 -1
  216. package/dist/opLifecycle/opCompressor.cjs.map +0 -1
  217. package/dist/opLifecycle/opDecompressor.cjs.map +0 -1
  218. package/dist/opLifecycle/opGroupingManager.cjs.map +0 -1
  219. package/dist/opLifecycle/opSplitter.cjs.map +0 -1
  220. package/dist/opLifecycle/outbox.cjs.map +0 -1
  221. package/dist/opLifecycle/remoteMessageProcessor.cjs.map +0 -1
  222. package/dist/opProperties.cjs.map +0 -1
  223. package/dist/packageVersion.cjs.map +0 -1
  224. package/dist/pendingStateManager.cjs.map +0 -1
  225. package/dist/scheduleManager.cjs.map +0 -1
  226. package/dist/storageServiceWithAttachBlobs.cjs.map +0 -1
  227. package/dist/summary/index.cjs.map +0 -1
  228. package/dist/summary/orderedClientElection.cjs.map +0 -1
  229. package/dist/summary/runWhileConnectedCoordinator.cjs.map +0 -1
  230. package/dist/summary/runningSummarizer.cjs.map +0 -1
  231. package/dist/summary/summarizer.cjs.map +0 -1
  232. package/dist/summary/summarizerClientElection.cjs.map +0 -1
  233. package/dist/summary/summarizerHeuristics.cjs.map +0 -1
  234. package/dist/summary/summarizerNode/index.cjs.map +0 -1
  235. package/dist/summary/summarizerNode/summarizerNode.cjs.map +0 -1
  236. package/dist/summary/summarizerNode/summarizerNodeUtils.cjs.map +0 -1
  237. package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs.map +0 -1
  238. package/dist/summary/summarizerTypes.cjs.map +0 -1
  239. package/dist/summary/summaryCollection.cjs.map +0 -1
  240. package/dist/summary/summaryFormat.cjs.map +0 -1
  241. package/dist/summary/summaryGenerator.cjs.map +0 -1
  242. package/dist/summary/summaryManager.cjs.map +0 -1
  243. package/dist/throttler.cjs.map +0 -1
  244. package/tsc-multi.test.json +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/container-runtime",
3
- "version": "2.0.0-dev-rc.1.0.0.225277",
3
+ "version": "2.0.0-dev-rc.1.0.0.228517",
4
4
  "description": "Fluid container runtime",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -14,7 +14,7 @@
14
14
  "exports": {
15
15
  ".": {
16
16
  "types": "./dist/index.d.ts",
17
- "default": "./dist/index.cjs"
17
+ "default": "./dist/index.js"
18
18
  },
19
19
  "./test/containerRuntime": {
20
20
  "import": {
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "require": {
25
25
  "types": "./dist/containerRuntime.d.ts",
26
- "default": "./dist/containerRuntime.cjs"
26
+ "default": "./dist/containerRuntime.js"
27
27
  }
28
28
  },
29
29
  "./test/deltaScheduler": {
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "require": {
35
35
  "types": "./dist/deltaScheduler.d.ts",
36
- "default": "./dist/deltaScheduler.cjs"
36
+ "default": "./dist/deltaScheduler.js"
37
37
  }
38
38
  },
39
39
  "./test/scheduleManager": {
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "require": {
45
45
  "types": "./dist/scheduleManager.d.ts",
46
- "default": "./dist/scheduleManager.cjs"
46
+ "default": "./dist/scheduleManager.js"
47
47
  }
48
48
  },
49
49
  "./test/blobManager": {
@@ -53,7 +53,7 @@
53
53
  },
54
54
  "require": {
55
55
  "types": "./dist/blobManager.d.ts",
56
- "default": "./dist/blobManager.cjs"
56
+ "default": "./dist/blobManager.js"
57
57
  }
58
58
  },
59
59
  "./test/summary": {
@@ -63,7 +63,7 @@
63
63
  },
64
64
  "require": {
65
65
  "types": "./dist/summary/index.d.ts",
66
- "default": "./dist/summary/index.cjs"
66
+ "default": "./dist/summary/index.js"
67
67
  }
68
68
  },
69
69
  "./test/gc": {
@@ -73,7 +73,7 @@
73
73
  },
74
74
  "require": {
75
75
  "types": "./gc/index.d.ts",
76
- "default": "./gc/index.cjs"
76
+ "default": "./gc/index.js"
77
77
  }
78
78
  },
79
79
  "./alpha": {
@@ -83,7 +83,7 @@
83
83
  },
84
84
  "require": {
85
85
  "types": "./dist/container-runtime-alpha.d.ts",
86
- "default": "./dist/index.cjs"
86
+ "default": "./dist/index.js"
87
87
  }
88
88
  },
89
89
  "./beta": {
@@ -93,7 +93,7 @@
93
93
  },
94
94
  "require": {
95
95
  "types": "./dist/container-runtime-beta.d.ts",
96
- "default": "./dist/index.cjs"
96
+ "default": "./dist/index.js"
97
97
  }
98
98
  },
99
99
  "./internal": {
@@ -103,7 +103,7 @@
103
103
  },
104
104
  "require": {
105
105
  "types": "./dist/index.d.ts",
106
- "default": "./dist/index.cjs"
106
+ "default": "./dist/index.js"
107
107
  }
108
108
  },
109
109
  "./public": {
@@ -113,11 +113,11 @@
113
113
  },
114
114
  "require": {
115
115
  "types": "./dist/container-runtime-public.d.ts",
116
- "default": "./dist/index.cjs"
116
+ "default": "./dist/index.js"
117
117
  }
118
118
  }
119
119
  },
120
- "main": "dist/index.cjs",
120
+ "main": "dist/index.js",
121
121
  "module": "lib/index.mjs",
122
122
  "types": "dist/index.d.ts",
123
123
  "c8": {
@@ -141,36 +141,36 @@
141
141
  "temp-directory": "nyc/.nyc_output"
142
142
  },
143
143
  "dependencies": {
144
- "@fluid-internal/client-utils": "2.0.0-dev-rc.1.0.0.225277",
145
- "@fluidframework/container-definitions": "2.0.0-dev-rc.1.0.0.225277",
146
- "@fluidframework/container-runtime-definitions": "2.0.0-dev-rc.1.0.0.225277",
147
- "@fluidframework/core-interfaces": "2.0.0-dev-rc.1.0.0.225277",
148
- "@fluidframework/core-utils": "2.0.0-dev-rc.1.0.0.225277",
149
- "@fluidframework/datastore": "2.0.0-dev-rc.1.0.0.225277",
150
- "@fluidframework/driver-definitions": "2.0.0-dev-rc.1.0.0.225277",
151
- "@fluidframework/driver-utils": "2.0.0-dev-rc.1.0.0.225277",
152
- "@fluidframework/id-compressor": "2.0.0-dev-rc.1.0.0.225277",
153
- "@fluidframework/protocol-definitions": "^3.1.0-223007",
154
- "@fluidframework/runtime-definitions": "2.0.0-dev-rc.1.0.0.225277",
155
- "@fluidframework/runtime-utils": "2.0.0-dev-rc.1.0.0.225277",
156
- "@fluidframework/telemetry-utils": "2.0.0-dev-rc.1.0.0.225277",
144
+ "@fluid-internal/client-utils": "2.0.0-dev-rc.1.0.0.228517",
145
+ "@fluidframework/container-definitions": "2.0.0-dev-rc.1.0.0.228517",
146
+ "@fluidframework/container-runtime-definitions": "2.0.0-dev-rc.1.0.0.228517",
147
+ "@fluidframework/core-interfaces": "2.0.0-dev-rc.1.0.0.228517",
148
+ "@fluidframework/core-utils": "2.0.0-dev-rc.1.0.0.228517",
149
+ "@fluidframework/datastore": "2.0.0-dev-rc.1.0.0.228517",
150
+ "@fluidframework/driver-definitions": "2.0.0-dev-rc.1.0.0.228517",
151
+ "@fluidframework/driver-utils": "2.0.0-dev-rc.1.0.0.228517",
152
+ "@fluidframework/id-compressor": "2.0.0-dev-rc.1.0.0.228517",
153
+ "@fluidframework/protocol-definitions": "^3.1.0",
154
+ "@fluidframework/runtime-definitions": "2.0.0-dev-rc.1.0.0.228517",
155
+ "@fluidframework/runtime-utils": "2.0.0-dev-rc.1.0.0.228517",
156
+ "@fluidframework/telemetry-utils": "2.0.0-dev-rc.1.0.0.228517",
157
+ "@tylerbu/sorted-btree-es6": "^1.8.0",
157
158
  "double-ended-queue": "^2.1.0-0",
158
159
  "events": "^3.1.0",
159
160
  "lz4js": "^0.2.0",
160
- "sorted-btree": "^1.8.0",
161
161
  "uuid": "^9.0.0"
162
162
  },
163
163
  "devDependencies": {
164
164
  "@arethetypeswrong/cli": "^0.13.3",
165
- "@fluid-private/stochastic-test-utils": "2.0.0-dev-rc.1.0.0.225277",
165
+ "@fluid-private/stochastic-test-utils": "2.0.0-dev-rc.1.0.0.228517",
166
166
  "@fluid-tools/benchmark": "^0.48.0",
167
- "@fluid-tools/build-cli": "0.29.0-222379",
167
+ "@fluid-tools/build-cli": "^0.29.0",
168
168
  "@fluidframework/build-common": "^2.0.3",
169
- "@fluidframework/build-tools": "0.29.0-222379",
169
+ "@fluidframework/build-tools": "^0.29.0",
170
170
  "@fluidframework/container-runtime-previous": "npm:@fluidframework/container-runtime@2.0.0-internal.8.0.0",
171
- "@fluidframework/eslint-config-fluid": "^3.1.0",
172
- "@fluidframework/mocha-test-setup": "2.0.0-dev-rc.1.0.0.225277",
173
- "@fluidframework/test-runtime-utils": "2.0.0-dev-rc.1.0.0.225277",
171
+ "@fluidframework/eslint-config-fluid": "^3.2.0",
172
+ "@fluidframework/mocha-test-setup": "2.0.0-dev-rc.1.0.0.228517",
173
+ "@fluidframework/test-runtime-utils": "2.0.0-dev-rc.1.0.0.228517",
174
174
  "@microsoft/api-extractor": "^7.38.3",
175
175
  "@types/double-ended-queue": "^2.1.0",
176
176
  "@types/events": "^3.0.0",
@@ -204,7 +204,11 @@
204
204
  }
205
205
  },
206
206
  "typeValidation": {
207
- "broken": {}
207
+ "broken": {
208
+ "ClassDeclaration_ContainerRuntime": {
209
+ "forwardCompat": false
210
+ }
211
+ }
208
212
  },
209
213
  "scripts": {
210
214
  "api": "fluid-build . --task api",
@@ -216,7 +220,7 @@
216
220
  "build:docs": "fluid-build . --task api",
217
221
  "build:esnext": "tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json",
218
222
  "build:genver": "gen-version",
219
- "build:test": "tsc-multi --config ./tsc-multi.test.json",
223
+ "build:test": "tsc --project ./src/test/tsconfig.json",
220
224
  "check:are-the-types-wrong": "attw --pack . --entrypoints .",
221
225
  "check:release-tags": "api-extractor run --local --config ./api-extractor-lint.json",
222
226
  "ci:build:docs": "api-extractor run",
@@ -233,7 +237,7 @@
233
237
  "test:coverage": "c8 npm test",
234
238
  "test:mocha": "mocha --ignore \"dist/test/types/*\" --recursive dist/test -r node_modules/@fluidframework/mocha-test-setup",
235
239
  "test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
236
- "tsc": "tsc-multi --config ../../../common/build/build-common/tsc-multi.cjs.json",
240
+ "tsc": "tsc",
237
241
  "tsc:watch": "tsc --watch",
238
242
  "typetests:gen": "fluid-type-test-generator",
239
243
  "typetests:prepare": "flub typetests --dir . --reset --previous --normalize"
@@ -772,10 +772,16 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
772
772
  const maybeUnusedStorageIds: Set<string> = new Set();
773
773
  for (const route of blobRoutes) {
774
774
  const blobId = getBlobIdFromGCNodePath(route);
775
+ // If the blob hasn't already been deleted, log an error because this should never happen.
776
+ // If the blob has already been deleted, log a telemetry event. This can happen because multiple GC
777
+ // sweep ops can contain the same data store. It would be interesting to track how often this happens.
778
+ const alreadyDeleted = this.isBlobDeleted(route);
775
779
  if (!this.redirectTable.has(blobId)) {
776
- this.mc.logger.sendErrorEvent({
780
+ this.mc.logger.sendTelemetryEvent({
777
781
  eventName: "DeletedAttachmentBlobNotFound",
782
+ category: alreadyDeleted ? "generic" : "error",
778
783
  blobId,
784
+ details: { alreadyDeleted },
779
785
  });
780
786
  continue;
781
787
  }
@@ -2268,6 +2268,7 @@ export class ContainerRuntime
2268
2268
  messageWithContext.message,
2269
2269
  local,
2270
2270
  localOpMetadata,
2271
+ (from, to) => this.garbageCollector.addedOutboundReference(from, to),
2271
2272
  );
2272
2273
  break;
2273
2274
  case ContainerMessageType.BlobAttach:
@@ -2679,6 +2680,12 @@ export class ContainerRuntime
2679
2680
  this.blobManager.setRedirectTable(blobRedirectTable);
2680
2681
  }
2681
2682
 
2683
+ // We can finalize any allocated IDs since we're the only client
2684
+ const idRange = this.idCompressor?.takeNextCreationRange();
2685
+ if (idRange !== undefined) {
2686
+ this.idCompressor?.finalizeCreationRange(idRange);
2687
+ }
2688
+
2682
2689
  const summarizeResult = this.dataStores.createSummary(telemetryContext);
2683
2690
  // Wrap data store summaries in .channels subtree.
2684
2691
  wrapSummaryInChannelsTree(summarizeResult);
@@ -78,7 +78,7 @@ import {
78
78
  summarizerClientType,
79
79
  } from "./summary";
80
80
  import { ContainerRuntime } from "./containerRuntime";
81
- import { sendGCUnexpectedUsageEvent } from "./gc";
81
+ import { detectOutboundRoutesViaDDSKey, sendGCUnexpectedUsageEvent } from "./gc";
82
82
 
83
83
  function createAttributes(
84
84
  pkg: readonly string[],
@@ -650,13 +650,20 @@ export abstract class FluidDataStoreContext
650
650
  }
651
651
 
652
652
  /**
653
+ * @deprecated There is no replacement for this, its functionality is no longer needed.
654
+ * It will be removed in a future release, sometime after 2.0.0-internal.8.0.0
655
+ *
653
656
  * Called when a new outbound reference is added to another node. This is used by garbage collection to identify
654
657
  * all references added in the system.
655
658
  * @param srcHandle - The handle of the node that added the reference.
656
659
  * @param outboundHandle - The handle of the outbound node that is referenced.
657
660
  */
658
661
  public addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {
659
- this._containerRuntime.addedGCOutboundReference(srcHandle, outboundHandle);
662
+ // By default, skip this call since the ContainerRuntime will detect the outbound route directly.
663
+ if (this.mc.config.getBoolean(detectOutboundRoutesViaDDSKey) === true) {
664
+ // Note: The ContainerRuntime code will check this same setting to avoid double counting.
665
+ this._containerRuntime.addedGCOutboundReference(srcHandle, outboundHandle);
666
+ }
660
667
  }
661
668
 
662
669
  /**
package/src/dataStores.ts CHANGED
@@ -33,6 +33,7 @@ import {
33
33
  create404Response,
34
34
  createResponseError,
35
35
  GCDataBuilder,
36
+ isSerializedHandle,
36
37
  responseToException,
37
38
  SummaryTreeBuilder,
38
39
  unpackChildNodesUsedRoutes,
@@ -61,7 +62,7 @@ import {
61
62
  } from "./dataStoreContext";
62
63
  import { StorageServiceWithAttachBlobs } from "./storageServiceWithAttachBlobs";
63
64
  import { IDataStoreAliasMessage, isDataStoreAliasMessage } from "./dataStore";
64
- import { GCNodeType, disableDatastoreSweepKey } from "./gc";
65
+ import { GCNodeType, detectOutboundRoutesViaDDSKey, disableDatastoreSweepKey } from "./gc";
65
66
  import { IContainerRuntimeMetadata, nonDataStorePaths, rootHasIsolatedChannels } from "./summary";
66
67
 
67
68
  type PendingAliasResolve = (success: boolean) => void;
@@ -441,6 +442,7 @@ export class DataStores implements IDisposable {
441
442
  message: ISequencedDocumentMessage,
442
443
  local: boolean,
443
444
  localMessageMetadata: unknown,
445
+ addedOutboundReference: (fromNodePath: string, toNodePath: string) => void,
444
446
  ) {
445
447
  const envelope = message.contents as IEnvelope;
446
448
  const transformed = { ...message, contents: envelope.contents };
@@ -462,6 +464,13 @@ export class DataStores implements IDisposable {
462
464
  assert(!!context, 0x162 /* "There should be a store context for the op" */);
463
465
  context.process(transformed, local, localMessageMetadata);
464
466
 
467
+ // By default, we use the new behavior of detecting outbound routes here.
468
+ // If this setting is true, then DataStoreContext would be notifying GC instead.
469
+ if (this.mc.config.getBoolean(detectOutboundRoutesViaDDSKey) !== true) {
470
+ // Notify GC of any outbound references that were added by this op.
471
+ detectOutboundReferences(envelope, addedOutboundReference);
472
+ }
473
+
465
474
  // Notify that a GC node for the data store changed. This is used to detect if a deleted data store is
466
475
  // being used.
467
476
  this.gcNodeUpdated(
@@ -830,12 +839,15 @@ export class DataStores implements IDisposable {
830
839
 
831
840
  const dataStoreContext = this.contexts.get(dataStoreId);
832
841
  if (dataStoreContext === undefined) {
833
- this.mc.logger.sendErrorEvent({
842
+ // If the data store hasn't already been deleted, log an error because this should never happen.
843
+ // If the data store has already been deleted, log a telemetry event. This can happen because multiple GC
844
+ // sweep ops can contain the same data store. It would be interesting to track how often this happens.
845
+ const alreadyDeleted = this.isDataStoreDeleted(`/${dataStoreId}`);
846
+ this.mc.logger.sendTelemetryEvent({
834
847
  eventName: "DeletedDataStoreNotFound",
848
+ category: alreadyDeleted ? "generic" : "error",
835
849
  ...tagCodeArtifacts({ id: dataStoreId }),
836
- details: {
837
- alreadyDeleted: this.isDataStoreDeleted(dataStoreId),
838
- },
850
+ details: { alreadyDeleted },
839
851
  });
840
852
  continue;
841
853
  }
@@ -947,3 +959,42 @@ export function getSummaryForDatastores(
947
959
  };
948
960
  }
949
961
  }
962
+
963
+ /**
964
+ * Traverse this op's contents and detect any outbound routes that were added by this op.
965
+ */
966
+ export function detectOutboundReferences(
967
+ envelope: IEnvelope,
968
+ addedOutboundReference: (fromNodePath: string, toNodePath: string) => void,
969
+ ): void {
970
+ // These will be built up as we traverse the envelope contents
971
+ const outboundPaths: string[] = [];
972
+ let ddsAddress: string | undefined;
973
+
974
+ function recursivelyFindHandles(obj: unknown) {
975
+ if (typeof obj === "object" && obj !== null) {
976
+ for (const [key, value] of Object.entries(obj)) {
977
+ // If 'value' is a serialized IFluidHandle, it represents a new outbound route.
978
+ if (isSerializedHandle(value)) {
979
+ outboundPaths.push(value.url);
980
+ }
981
+
982
+ // NOTE: This is taking a hard dependency on the fact that in our DataStore implementation,
983
+ // the address of the DDS is stored in a property called "address". This is not ideal.
984
+ // An alternative would be for the op envelope to include the absolute path (built up as it is submitted)
985
+ if (key === "address" && ddsAddress === undefined) {
986
+ ddsAddress = value;
987
+ }
988
+
989
+ recursivelyFindHandles(value);
990
+ }
991
+ }
992
+ }
993
+
994
+ recursivelyFindHandles(envelope.contents);
995
+
996
+ // GC node paths are all absolute paths, hence the "" prefix.
997
+ // e.g. this will yield "/dataStoreId/ddsId"
998
+ const fromPath = ["", envelope.address, ddsAddress].join("/");
999
+ outboundPaths.forEach((toPath) => addedOutboundReference(fromPath, toPath));
1000
+ }
@@ -20,7 +20,9 @@ import {
20
20
  ITelemetryLoggerExt,
21
21
  MonitoringContext,
22
22
  PerformanceEvent,
23
+ tagCodeArtifacts,
23
24
  } from "@fluidframework/telemetry-utils";
25
+ import { BlobManager } from "../blobManager";
24
26
  import {
25
27
  InactiveResponseHeaderKey,
26
28
  RuntimeHeaderData,
@@ -261,7 +263,7 @@ export class GarbageCollector implements IGarbageCollector {
261
263
  const currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();
262
264
  assert(
263
265
  currentReferenceTimestampMs !== undefined,
264
- "Trying to initialize GC state without current timestamp",
266
+ 0x8a4 /* Trying to initialize GC state without current timestamp */,
265
267
  );
266
268
 
267
269
  /**
@@ -1005,6 +1007,18 @@ export class GarbageCollector implements IGarbageCollector {
1005
1007
  return;
1006
1008
  }
1007
1009
 
1010
+ if (!toNodePath.startsWith("/")) {
1011
+ // A long time ago we stored handles with relatives paths. We don't expect to see these cases though
1012
+ // because GC was enabled only after we made the switch to always using absolute paths.
1013
+ this.mc.logger.sendErrorEvent({
1014
+ eventName: "InvalidRelativeOutboundRoute",
1015
+ ...tagCodeArtifacts({ fromId: fromNodePath, id: toNodePath }),
1016
+ });
1017
+ return;
1018
+ }
1019
+
1020
+ assert(fromNodePath.startsWith("/"), 0x8a5 /* fromNodePath must be an absolute path */);
1021
+
1008
1022
  const outboundRoutes = this.newReferencesSinceLastRun.get(fromNodePath) ?? [];
1009
1023
  outboundRoutes.push(toNodePath);
1010
1024
  this.newReferencesSinceLastRun.set(fromNodePath, outboundRoutes);
@@ -1120,9 +1134,25 @@ export class GarbageCollector implements IGarbageCollector {
1120
1134
  deletedAttachmentBlobCount: 0,
1121
1135
  };
1122
1136
 
1137
+ // The runtime can't reliably identify the type of deleted nodes. So, get the type here. This should
1138
+ // be good enough because the only types that participate in GC today are data stores, DDSes and blobs.
1139
+ const getDeletedNodeType = (nodeId: string): GCNodeType => {
1140
+ const pathParts = nodeId.split("/");
1141
+ if (pathParts[1] === BlobManager.basePath) {
1142
+ return GCNodeType.Blob;
1143
+ }
1144
+ if (pathParts.length === 2) {
1145
+ return GCNodeType.DataStore;
1146
+ }
1147
+ if (pathParts.length === 3) {
1148
+ return GCNodeType.SubDataStore;
1149
+ }
1150
+ return GCNodeType.Other;
1151
+ };
1152
+
1123
1153
  for (const nodeId of deletedNodes) {
1124
1154
  sweepPhaseStats.deletedNodeCount++;
1125
- const nodeType = this.runtime.getNodeType(nodeId);
1155
+ const nodeType = getDeletedNodeType(nodeId);
1126
1156
  if (nodeType === GCNodeType.DataStore) {
1127
1157
  sweepPhaseStats.deletedDataStoreCount++;
1128
1158
  } else if (nodeType === GCNodeType.Blob) {
@@ -74,6 +74,8 @@ export const gcVersionUpgradeToV4Key = "Fluid.GarbageCollection.GCVersionUpgrade
74
74
  export const disableDatastoreSweepKey = "Fluid.GarbageCollection.DisableDataStoreSweep";
75
75
  /** Config key to disable GC sweep for attachment blobs. */
76
76
  export const disableAttachmentBlobSweepKey = "Fluid.GarbageCollection.DisableAttachmentBlobSweep";
77
+ /** Config key to revert new paradigm of detecting outbound routes in ContainerRuntime layer (use true) */
78
+ export const detectOutboundRoutesViaDDSKey = "Fluid.GarbageCollection.DetectOutboundRoutesViaDDS";
77
79
 
78
80
  // One day in milliseconds.
79
81
  export const oneDayMs = 1 * 24 * 60 * 60 * 1000;
package/src/gc/index.ts CHANGED
@@ -34,9 +34,11 @@ export {
34
34
  stableGCVersion,
35
35
  disableAttachmentBlobSweepKey,
36
36
  disableDatastoreSweepKey,
37
+ detectOutboundRoutesViaDDSKey,
37
38
  UnreferencedState,
38
39
  throwOnTombstoneLoadOverrideKey,
39
40
  GarbageCollectionMessage,
41
+ ISweepMessage,
40
42
  } from "./gcDefinitions";
41
43
  export {
42
44
  cloneGCData,
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/container-runtime";
9
- export const pkgVersion = "2.0.0-dev-rc.1.0.0.225277";
9
+ export const pkgVersion = "2.0.0-dev-rc.1.0.0.228517";
@@ -693,7 +693,9 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
693
693
  * Tries to summarize with retries where retry is based on the failure params.
694
694
  * For example, summarization may be retried for failures with "retryAfterSeconds" param.
695
695
  */
696
- private async trySummarizeWithRetries(reason: SummarizeReason) {
696
+ private async trySummarizeWithRetries(
697
+ reason: SummarizeReason,
698
+ ): Promise<ISummarizeResults | undefined> {
697
699
  // Helper to set summarize options, telemetry properties and call summarize.
698
700
  const attemptSummarize = (attemptNumber: number, finalAttempt: boolean) => {
699
701
  const summarizeOptions: ISummarizeOptions = {
@@ -732,24 +734,23 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
732
734
  let currentAttempt = 0;
733
735
  let retryAfterSeconds: number | undefined;
734
736
  let done = false;
735
- let result: "success" | "failure" | "canceled" = "success";
737
+ let status: "success" | "failure" | "canceled" = "success";
738
+ let results: ISummarizeResults | undefined;
736
739
  do {
737
740
  currentAttempt++;
738
741
  if (this.cancellationToken.cancelled) {
739
- result = "canceled";
742
+ status = "canceled";
740
743
  done = true;
741
744
  break;
742
745
  }
743
746
 
744
- const { summarizeProps, summarizeResult } = attemptSummarize(
745
- currentAttempt,
746
- false /* finalAttempt */,
747
- );
747
+ const attemptResult = attemptSummarize(currentAttempt, false /* finalAttempt */);
748
+ results = attemptResult.summarizeResult;
748
749
 
749
750
  // Ack / nack is the final step, so if it succeeds we're done.
750
- const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
751
+ const ackNackResult = await results.receivedSummaryAckOrNack;
751
752
  if (ackNackResult.success) {
752
- result = "success";
753
+ status = "success";
753
754
  done = true;
754
755
  break;
755
756
  }
@@ -758,7 +759,7 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
758
759
  // If submit summary failed, use the params from "summarySubmitted" result. Else, use the params
759
760
  // from "receivedSummaryAckOrNack" result.
760
761
  // Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
761
- const submitSummaryResult = await summarizeResult.summarySubmitted;
762
+ const submitSummaryResult = await results.summarySubmitted;
762
763
  if (!submitSummaryResult.success) {
763
764
  maxAttempts = this.maxAttemptsForSubmitFailures;
764
765
  retryAfterSeconds = submitSummaryResult.data?.retryAfterSeconds;
@@ -768,9 +769,9 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
768
769
  }
769
770
 
770
771
  // Emit "summarize" event for this failed attempt.
771
- result = "failure";
772
+ status = "failure";
772
773
  const eventProps: ISummarizeEventProps = {
773
- result,
774
+ result: status,
774
775
  currentAttempt,
775
776
  maxAttempts,
776
777
  error: ackNackResult.error,
@@ -791,16 +792,16 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
791
792
  summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
792
793
  stage: submitSummaryResult.data?.stage,
793
794
  dynamicRetries: true, // To differentiate this telemetry from regular retry logic
794
- ...summarizeProps,
795
+ ...attemptResult.summarizeProps,
795
796
  });
796
797
  await delay(retryAfterSeconds * 1000);
797
798
  }
798
799
  } while (!done);
799
800
 
800
801
  // If summarize attempt did not fail, emit "summarize" event and return. A failed attempt may be retried below.
801
- if (result !== "failure") {
802
- this.emit("summarize", { result, currentAttempt, maxAttempts });
803
- return;
802
+ if (status !== "failure") {
803
+ this.emit("summarize", { result: status, currentAttempt, maxAttempts });
804
+ return results;
804
805
  }
805
806
 
806
807
  // If summarization wasn't successful above and the failure contains "retryAfterSeconds", perform one last
@@ -809,20 +810,44 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
809
810
  const { summarizeResult } = attemptSummarize(++currentAttempt, true /* finalAttempt */);
810
811
  // Ack / nack is the final step, so if it succeeds we're done.
811
812
  const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
812
- result = ackNackResult.success ? "success" : "failure";
813
+ status = ackNackResult.success ? "success" : "failure";
813
814
  const eventProps: ISummarizeEventProps = {
814
- result,
815
+ result: status,
815
816
  currentAttempt,
816
817
  maxAttempts,
817
818
  error: ackNackResult.success ? undefined : ackNackResult.error,
818
819
  };
819
820
  this.emit("summarize", eventProps);
821
+ results = summarizeResult;
820
822
  }
821
823
 
822
824
  // If summarization is still unsuccessful, stop the summarizer.
823
- if (result === "failure") {
825
+ if (status === "failure") {
824
826
  this.stopSummarizerCallback("failToSummarize");
825
827
  }
828
+ return results;
829
+ }
830
+
831
+ /**
832
+ * Attempts to generate a summary on demand with retries in case of failures. The retry logic is the same
833
+ * as heuristics based summaries.
834
+ */
835
+ private async summarizeOnDemandWithRetries(
836
+ reason: SummarizeReason,
837
+ resultsBuilder: SummarizeResultBuilder,
838
+ ) {
839
+ const results = await this.trySummarizeWithRetries(reason);
840
+ if (results === undefined) {
841
+ resultsBuilder.fail("Summarization was canceled", undefined);
842
+ return resultsBuilder.build();
843
+ }
844
+ const submitResult = await results.summarySubmitted;
845
+ const summaryOpBroadcastedResult = await results.summaryOpBroadcasted;
846
+ const ackNackResult = await results.receivedSummaryAckOrNack;
847
+ resultsBuilder.summarySubmitted.resolve(submitResult);
848
+ resultsBuilder.summaryOpBroadcasted.resolve(summaryOpBroadcastedResult);
849
+ resultsBuilder.receivedSummaryAckOrNack.resolve(ackNackResult);
850
+ return resultsBuilder.build();
826
851
  }
827
852
 
828
853
  /** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
@@ -842,12 +867,20 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
842
867
  }
843
868
 
844
869
  const { reason, ...summarizeOptions } = options;
845
- const result = this.trySummarizeOnce(
846
- { summarizeReason: `onDemand/${reason}` },
847
- summarizeOptions,
848
- resultsBuilder,
849
- );
850
- return result;
870
+ if (options.retryOnFailure === true) {
871
+ this.summarizeOnDemandWithRetries(`onDemand;${reason}`, resultsBuilder).catch(
872
+ (error) => {
873
+ resultsBuilder.fail("summarize failed", error);
874
+ },
875
+ );
876
+ } else {
877
+ this.trySummarizeOnce(
878
+ { summarizeReason: `onDemand/${reason}` },
879
+ summarizeOptions,
880
+ resultsBuilder,
881
+ );
882
+ }
883
+ return resultsBuilder.build();
851
884
  }
852
885
 
853
886
  /** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
@@ -149,6 +149,8 @@ export interface ISubmitSummaryOptions extends ISummarizeOptions {
149
149
  export interface IOnDemandSummarizeOptions extends ISummarizeOptions {
150
150
  /** Reason for generating summary. */
151
151
  readonly reason: string;
152
+ /** In case of a failure, will attempt to retry based on if the failure is retriable. */
153
+ readonly retryOnFailure?: boolean;
152
154
  }
153
155
 
154
156
  /**
@@ -1 +0,0 @@
1
- {"version":3,"file":"batchTracker.cjs","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qEAAyF;AACzF,2DAAoD;AACpD,+DAA2D;AAI3D,MAAa,YAAY;IAMxB,YACkB,iBAA+B,EAChD,MAA4B,EAC5B,oBAA4B,EAC5B,sBAA8B,EAC9B,mBAAiC,GAAG,EAAE,CAAC,0BAAW,CAAC,GAAG,EAAE;QAJvC,sBAAiB,GAAjB,iBAAiB,CAAc;QAJzC,sBAAiB,GAAW,CAAC,CAAC;QAUrC,IAAI,CAAC,MAAM,GAAG,IAAA,mCAAiB,EAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAkC,EAAE,EAAE;YAC9E,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;YACvD,IAAI,CAAC,6BAA6B,GAAG,gBAAgB,EAAE,CAAC;YACxD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CACxB,UAAU,EACV,CAAC,KAAsB,EAAE,OAAkC,EAAE,EAAE;YAC9D,IAAA,mBAAM,EACL,IAAI,CAAC,wBAAwB,KAAK,SAAS;gBAC1C,IAAI,CAAC,6BAA6B,KAAK,SAAS,EACjD,KAAK,CAAC,4CAA4C,CAClD,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;YAC1E,IAAI,MAAM,IAAI,oBAAoB,EAAE;gBACnC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAChC,SAAS,EAAE,cAAc;oBACzB,MAAM;oBACN,SAAS,EAAE,oBAAoB;oBAC/B,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;oBACjE,UAAU,EAAE,KAAK,KAAK,SAAS;iBAC/B,CAAC,CAAC;aACH;YAED,IAAI,IAAI,CAAC,iBAAiB,GAAG,sBAAsB,KAAK,CAAC,EAAE;gBAC1D,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAChC,SAAS,EAAE,QAAQ;oBACnB,MAAM;oBACN,YAAY,EAAE,sBAAsB;oBACpC,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;iBACjE,CAAC,CAAC;aACH;YAED,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,6BAA6B,GAAG,SAAS,CAAC;QAChD,CAAC,CACD,CAAC;IACH,CAAC;CACD;AAzDD,oCAyDC;AAED;;;;;;;GAOG;AACI,MAAM,gBAAgB,GAAG,CAC/B,iBAA+B,EAC/B,MAA2B,EAC3B,uBAA+B,IAAI,EACnC,yBAAiC,IAAI,EACpC,EAAE,CAAC,IAAI,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;AALlF,QAAA,gBAAgB,oBAKkE","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventEmitter } from \"events\";\nimport { ITelemetryLoggerExt, createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\n\nexport class BatchTracker {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate startBatchSequenceNumber: number | undefined;\n\tprivate trackedBatchCount: number = 0;\n\tprivate batchProcessingStartTimeStamp: number | undefined;\n\n\tconstructor(\n\t\tprivate readonly batchEventEmitter: EventEmitter,\n\t\tlogger: ITelemetryBaseLogger,\n\t\tbatchLengthThreshold: number,\n\t\tbatchCountSamplingRate: number,\n\t\tdateTimeProvider: () => number = () => performance.now(),\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Batching\" });\n\n\t\tthis.batchEventEmitter.on(\"batchBegin\", (message: ISequencedDocumentMessage) => {\n\t\t\tthis.startBatchSequenceNumber = message.sequenceNumber;\n\t\t\tthis.batchProcessingStartTimeStamp = dateTimeProvider();\n\t\t\tthis.trackedBatchCount++;\n\t\t});\n\n\t\tthis.batchEventEmitter.on(\n\t\t\t\"batchEnd\",\n\t\t\t(error: any | undefined, message: ISequencedDocumentMessage) => {\n\t\t\t\tassert(\n\t\t\t\t\tthis.startBatchSequenceNumber !== undefined &&\n\t\t\t\t\t\tthis.batchProcessingStartTimeStamp !== undefined,\n\t\t\t\t\t0x2ba /* \"batchBegin must fire before batchEnd\" */,\n\t\t\t\t);\n\n\t\t\t\tconst length = message.sequenceNumber - this.startBatchSequenceNumber + 1;\n\t\t\t\tif (length >= batchLengthThreshold) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"LengthTooBig\",\n\t\t\t\t\t\tlength,\n\t\t\t\t\t\tthreshold: batchLengthThreshold,\n\t\t\t\t\t\tbatchEndSequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\tduration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n\t\t\t\t\t\tbatchError: error !== undefined,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this.trackedBatchCount % batchCountSamplingRate === 0) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"Length\",\n\t\t\t\t\t\tlength,\n\t\t\t\t\t\tsamplingRate: batchCountSamplingRate,\n\t\t\t\t\t\tbatchEndSequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\tduration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.startBatchSequenceNumber = undefined;\n\t\t\t\tthis.batchProcessingStartTimeStamp = undefined;\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Track batch sizes in terms of op counts and processing times\n *\n * @param batchEventEmitter - event emitter which tracks the lifecycle of batch operations\n * @param logger - See {@link @fluidframework/core-interfaces#ITelemetryLoggerExt}\n * @param batchLengthThreshold - threshold for the length of a batch when to send an error event\n * @param batchCountSamplingRate - rate for batches for which to send an event with its characteristics\n */\nexport const BindBatchTracker = (\n\tbatchEventEmitter: EventEmitter,\n\tlogger: ITelemetryLoggerExt,\n\tbatchLengthThreshold: number = 1000,\n\tbatchCountSamplingRate: number = 1000,\n) => new BatchTracker(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate);\n"]}