@fluidframework/container-runtime 2.0.0-dev-rc.4.0.0.261659 → 2.0.0-dev-rc.5.0.0.265721

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 (322) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/api-report/container-runtime.api.md +60 -29
  3. package/dist/batchTracker.js.map +1 -1
  4. package/dist/blobManager.d.ts +9 -9
  5. package/dist/blobManager.d.ts.map +1 -1
  6. package/dist/blobManager.js +3 -5
  7. package/dist/blobManager.js.map +1 -1
  8. package/dist/channelCollection.d.ts +8 -6
  9. package/dist/channelCollection.d.ts.map +1 -1
  10. package/dist/channelCollection.js +22 -11
  11. package/dist/channelCollection.js.map +1 -1
  12. package/dist/connectionTelemetry.d.ts +1 -1
  13. package/dist/connectionTelemetry.d.ts.map +1 -1
  14. package/dist/connectionTelemetry.js.map +1 -1
  15. package/dist/containerHandleContext.d.ts +2 -1
  16. package/dist/containerHandleContext.d.ts.map +1 -1
  17. package/dist/containerHandleContext.js.map +1 -1
  18. package/dist/containerRuntime.d.ts +14 -24
  19. package/dist/containerRuntime.d.ts.map +1 -1
  20. package/dist/containerRuntime.js +125 -140
  21. package/dist/containerRuntime.js.map +1 -1
  22. package/dist/dataStore.d.ts.map +1 -1
  23. package/dist/dataStore.js.map +1 -1
  24. package/dist/dataStoreContext.d.ts +13 -10
  25. package/dist/dataStoreContext.d.ts.map +1 -1
  26. package/dist/dataStoreContext.js +21 -8
  27. package/dist/dataStoreContext.js.map +1 -1
  28. package/dist/dataStoreContexts.js.map +1 -1
  29. package/dist/dataStoreRegistry.js.map +1 -1
  30. package/dist/{deltaManagerSummarizerProxy.d.ts → deltaManagerProxies.d.ts} +28 -3
  31. package/dist/deltaManagerProxies.d.ts.map +1 -0
  32. package/dist/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +38 -2
  33. package/dist/deltaManagerProxies.js.map +1 -0
  34. package/dist/deltaScheduler.d.ts +1 -1
  35. package/dist/deltaScheduler.d.ts.map +1 -1
  36. package/dist/deltaScheduler.js.map +1 -1
  37. package/dist/gc/garbageCollection.d.ts +1 -2
  38. package/dist/gc/garbageCollection.d.ts.map +1 -1
  39. package/dist/gc/garbageCollection.js +1 -1
  40. package/dist/gc/garbageCollection.js.map +1 -1
  41. package/dist/gc/gcConfigs.d.ts.map +1 -1
  42. package/dist/gc/gcConfigs.js +14 -19
  43. package/dist/gc/gcConfigs.js.map +1 -1
  44. package/dist/gc/gcDefinitions.d.ts +4 -22
  45. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  46. package/dist/gc/gcDefinitions.js +3 -3
  47. package/dist/gc/gcDefinitions.js.map +1 -1
  48. package/dist/gc/gcHelpers.d.ts +1 -2
  49. package/dist/gc/gcHelpers.d.ts.map +1 -1
  50. package/dist/gc/gcHelpers.js.map +1 -1
  51. package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -1
  52. package/dist/gc/gcSummaryDefinitions.d.ts +1 -1
  53. package/dist/gc/gcSummaryDefinitions.d.ts.map +1 -1
  54. package/dist/gc/gcSummaryDefinitions.js.map +1 -1
  55. package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
  56. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  57. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  58. package/dist/gc/gcTelemetry.d.ts +1 -1
  59. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  60. package/dist/gc/gcTelemetry.js +2 -2
  61. package/dist/gc/gcTelemetry.js.map +1 -1
  62. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  63. package/dist/gc/index.d.ts +1 -1
  64. package/dist/gc/index.d.ts.map +1 -1
  65. package/dist/gc/index.js +2 -2
  66. package/dist/gc/index.js.map +1 -1
  67. package/dist/index.d.ts +1 -1
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js.map +1 -1
  70. package/dist/legacy.d.ts +6 -1
  71. package/dist/messageTypes.d.ts +5 -2
  72. package/dist/messageTypes.d.ts.map +1 -1
  73. package/dist/messageTypes.js.map +1 -1
  74. package/dist/opLifecycle/batchManager.d.ts +4 -0
  75. package/dist/opLifecycle/batchManager.d.ts.map +1 -1
  76. package/dist/opLifecycle/batchManager.js.map +1 -1
  77. package/dist/opLifecycle/opCompressor.js.map +1 -1
  78. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  79. package/dist/opLifecycle/opGroupingManager.js.map +1 -1
  80. package/dist/opLifecycle/opSplitter.js.map +1 -1
  81. package/dist/opLifecycle/outbox.d.ts +1 -0
  82. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  83. package/dist/opLifecycle/outbox.js +7 -20
  84. package/dist/opLifecycle/outbox.js.map +1 -1
  85. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  86. package/dist/packageVersion.d.ts +1 -1
  87. package/dist/packageVersion.js +1 -1
  88. package/dist/packageVersion.js.map +1 -1
  89. package/dist/pendingStateManager.d.ts +6 -0
  90. package/dist/pendingStateManager.d.ts.map +1 -1
  91. package/dist/pendingStateManager.js +10 -1
  92. package/dist/pendingStateManager.js.map +1 -1
  93. package/dist/scheduleManager.d.ts +1 -1
  94. package/dist/scheduleManager.d.ts.map +1 -1
  95. package/dist/scheduleManager.js.map +1 -1
  96. package/dist/storageServiceWithAttachBlobs.js.map +1 -1
  97. package/dist/summary/documentSchema.js +2 -2
  98. package/dist/summary/documentSchema.js.map +1 -1
  99. package/dist/summary/index.d.ts +2 -2
  100. package/dist/summary/index.d.ts.map +1 -1
  101. package/dist/summary/index.js.map +1 -1
  102. package/dist/summary/orderedClientElection.d.ts +4 -2
  103. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  104. package/dist/summary/orderedClientElection.js +35 -13
  105. package/dist/summary/orderedClientElection.js.map +1 -1
  106. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  107. package/dist/summary/runningSummarizer.d.ts +0 -5
  108. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  109. package/dist/summary/runningSummarizer.js +28 -113
  110. package/dist/summary/runningSummarizer.js.map +1 -1
  111. package/dist/summary/summarizer.d.ts +1 -1
  112. package/dist/summary/summarizer.d.ts.map +1 -1
  113. package/dist/summary/summarizer.js +4 -1
  114. package/dist/summary/summarizer.js.map +1 -1
  115. package/dist/summary/summarizerClientElection.js.map +1 -1
  116. package/dist/summary/summarizerHeuristics.js.map +1 -1
  117. package/dist/summary/summarizerNode/summarizerNode.d.ts +1 -2
  118. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  119. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  120. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  121. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -2
  122. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  123. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  124. package/dist/summary/summarizerTypes.d.ts +16 -28
  125. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  126. package/dist/summary/summarizerTypes.js.map +1 -1
  127. package/dist/summary/summaryCollection.d.ts +1 -1
  128. package/dist/summary/summaryCollection.d.ts.map +1 -1
  129. package/dist/summary/summaryCollection.js +2 -2
  130. package/dist/summary/summaryCollection.js.map +1 -1
  131. package/dist/summary/summaryFormat.d.ts +26 -6
  132. package/dist/summary/summaryFormat.d.ts.map +1 -1
  133. package/dist/summary/summaryFormat.js.map +1 -1
  134. package/dist/summary/summaryGenerator.d.ts +7 -8
  135. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  136. package/dist/summary/summaryGenerator.js +30 -25
  137. package/dist/summary/summaryGenerator.js.map +1 -1
  138. package/dist/summary/summaryManager.js +5 -5
  139. package/dist/summary/summaryManager.js.map +1 -1
  140. package/dist/throttler.js.map +1 -1
  141. package/lib/batchTracker.js.map +1 -1
  142. package/lib/blobManager.d.ts +9 -9
  143. package/lib/blobManager.d.ts.map +1 -1
  144. package/lib/blobManager.js +4 -6
  145. package/lib/blobManager.js.map +1 -1
  146. package/lib/channelCollection.d.ts +8 -6
  147. package/lib/channelCollection.d.ts.map +1 -1
  148. package/lib/channelCollection.js +23 -12
  149. package/lib/channelCollection.js.map +1 -1
  150. package/lib/connectionTelemetry.d.ts +1 -1
  151. package/lib/connectionTelemetry.d.ts.map +1 -1
  152. package/lib/connectionTelemetry.js.map +1 -1
  153. package/lib/containerHandleContext.d.ts +2 -1
  154. package/lib/containerHandleContext.d.ts.map +1 -1
  155. package/lib/containerHandleContext.js.map +1 -1
  156. package/lib/containerRuntime.d.ts +14 -24
  157. package/lib/containerRuntime.d.ts.map +1 -1
  158. package/lib/containerRuntime.js +125 -140
  159. package/lib/containerRuntime.js.map +1 -1
  160. package/lib/dataStore.d.ts.map +1 -1
  161. package/lib/dataStore.js.map +1 -1
  162. package/lib/dataStoreContext.d.ts +13 -10
  163. package/lib/dataStoreContext.d.ts.map +1 -1
  164. package/lib/dataStoreContext.js +23 -10
  165. package/lib/dataStoreContext.js.map +1 -1
  166. package/lib/dataStoreContexts.js.map +1 -1
  167. package/lib/dataStoreRegistry.js.map +1 -1
  168. package/lib/{deltaManagerSummarizerProxy.d.ts → deltaManagerProxies.d.ts} +28 -3
  169. package/lib/deltaManagerProxies.d.ts.map +1 -0
  170. package/lib/{deltaManagerSummarizerProxy.js → deltaManagerProxies.js} +36 -1
  171. package/lib/deltaManagerProxies.js.map +1 -0
  172. package/lib/deltaScheduler.d.ts +1 -1
  173. package/lib/deltaScheduler.d.ts.map +1 -1
  174. package/lib/deltaScheduler.js.map +1 -1
  175. package/lib/gc/garbageCollection.d.ts +1 -2
  176. package/lib/gc/garbageCollection.d.ts.map +1 -1
  177. package/lib/gc/garbageCollection.js +1 -1
  178. package/lib/gc/garbageCollection.js.map +1 -1
  179. package/lib/gc/gcConfigs.d.ts.map +1 -1
  180. package/lib/gc/gcConfigs.js +15 -20
  181. package/lib/gc/gcConfigs.js.map +1 -1
  182. package/lib/gc/gcDefinitions.d.ts +4 -22
  183. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  184. package/lib/gc/gcDefinitions.js +2 -2
  185. package/lib/gc/gcDefinitions.js.map +1 -1
  186. package/lib/gc/gcHelpers.d.ts +1 -2
  187. package/lib/gc/gcHelpers.d.ts.map +1 -1
  188. package/lib/gc/gcHelpers.js.map +1 -1
  189. package/lib/gc/gcReferenceGraphAlgorithm.js.map +1 -1
  190. package/lib/gc/gcSummaryDefinitions.d.ts +1 -1
  191. package/lib/gc/gcSummaryDefinitions.d.ts.map +1 -1
  192. package/lib/gc/gcSummaryDefinitions.js.map +1 -1
  193. package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
  194. package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
  195. package/lib/gc/gcSummaryStateTracker.js.map +1 -1
  196. package/lib/gc/gcTelemetry.d.ts +1 -1
  197. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  198. package/lib/gc/gcTelemetry.js +2 -2
  199. package/lib/gc/gcTelemetry.js.map +1 -1
  200. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  201. package/lib/gc/index.d.ts +1 -1
  202. package/lib/gc/index.d.ts.map +1 -1
  203. package/lib/gc/index.js +1 -1
  204. package/lib/gc/index.js.map +1 -1
  205. package/lib/index.d.ts +1 -1
  206. package/lib/index.d.ts.map +1 -1
  207. package/lib/index.js.map +1 -1
  208. package/lib/legacy.d.ts +6 -1
  209. package/lib/messageTypes.d.ts +5 -2
  210. package/lib/messageTypes.d.ts.map +1 -1
  211. package/lib/messageTypes.js.map +1 -1
  212. package/lib/opLifecycle/batchManager.d.ts +4 -0
  213. package/lib/opLifecycle/batchManager.d.ts.map +1 -1
  214. package/lib/opLifecycle/batchManager.js.map +1 -1
  215. package/lib/opLifecycle/opCompressor.js.map +1 -1
  216. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  217. package/lib/opLifecycle/opGroupingManager.js.map +1 -1
  218. package/lib/opLifecycle/opSplitter.js.map +1 -1
  219. package/lib/opLifecycle/outbox.d.ts +1 -0
  220. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  221. package/lib/opLifecycle/outbox.js +7 -20
  222. package/lib/opLifecycle/outbox.js.map +1 -1
  223. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  224. package/lib/packageVersion.d.ts +1 -1
  225. package/lib/packageVersion.js +1 -1
  226. package/lib/packageVersion.js.map +1 -1
  227. package/lib/pendingStateManager.d.ts +6 -0
  228. package/lib/pendingStateManager.d.ts.map +1 -1
  229. package/lib/pendingStateManager.js +10 -1
  230. package/lib/pendingStateManager.js.map +1 -1
  231. package/lib/scheduleManager.d.ts +1 -1
  232. package/lib/scheduleManager.d.ts.map +1 -1
  233. package/lib/scheduleManager.js.map +1 -1
  234. package/lib/storageServiceWithAttachBlobs.js.map +1 -1
  235. package/lib/summary/documentSchema.js +2 -2
  236. package/lib/summary/documentSchema.js.map +1 -1
  237. package/lib/summary/index.d.ts +2 -2
  238. package/lib/summary/index.d.ts.map +1 -1
  239. package/lib/summary/index.js.map +1 -1
  240. package/lib/summary/orderedClientElection.d.ts +4 -2
  241. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  242. package/lib/summary/orderedClientElection.js +35 -13
  243. package/lib/summary/orderedClientElection.js.map +1 -1
  244. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  245. package/lib/summary/runningSummarizer.d.ts +0 -5
  246. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  247. package/lib/summary/runningSummarizer.js +21 -106
  248. package/lib/summary/runningSummarizer.js.map +1 -1
  249. package/lib/summary/summarizer.d.ts +1 -1
  250. package/lib/summary/summarizer.d.ts.map +1 -1
  251. package/lib/summary/summarizer.js +4 -1
  252. package/lib/summary/summarizer.js.map +1 -1
  253. package/lib/summary/summarizerClientElection.js.map +1 -1
  254. package/lib/summary/summarizerHeuristics.js.map +1 -1
  255. package/lib/summary/summarizerNode/summarizerNode.d.ts +1 -2
  256. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  257. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  258. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  259. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -2
  260. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  261. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  262. package/lib/summary/summarizerTypes.d.ts +16 -28
  263. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  264. package/lib/summary/summarizerTypes.js.map +1 -1
  265. package/lib/summary/summaryCollection.d.ts +1 -1
  266. package/lib/summary/summaryCollection.d.ts.map +1 -1
  267. package/lib/summary/summaryCollection.js +2 -2
  268. package/lib/summary/summaryCollection.js.map +1 -1
  269. package/lib/summary/summaryFormat.d.ts +26 -6
  270. package/lib/summary/summaryFormat.d.ts.map +1 -1
  271. package/lib/summary/summaryFormat.js +1 -1
  272. package/lib/summary/summaryFormat.js.map +1 -1
  273. package/lib/summary/summaryGenerator.d.ts +7 -8
  274. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  275. package/lib/summary/summaryGenerator.js +24 -19
  276. package/lib/summary/summaryGenerator.js.map +1 -1
  277. package/lib/summary/summaryManager.js +1 -1
  278. package/lib/summary/summaryManager.js.map +1 -1
  279. package/lib/throttler.js.map +1 -1
  280. package/lib/tsdoc-metadata.json +1 -1
  281. package/package.json +65 -26
  282. package/src/blobManager.ts +14 -13
  283. package/src/channelCollection.ts +34 -20
  284. package/src/connectionTelemetry.ts +1 -1
  285. package/src/containerHandleContext.ts +2 -1
  286. package/src/containerRuntime.ts +161 -170
  287. package/src/dataStore.ts +3 -2
  288. package/src/dataStoreContext.ts +62 -23
  289. package/src/{deltaManagerSummarizerProxy.ts → deltaManagerProxies.ts} +55 -3
  290. package/src/deltaScheduler.ts +1 -1
  291. package/src/gc/garbageCollection.md +0 -8
  292. package/src/gc/garbageCollection.ts +2 -1
  293. package/src/gc/gcConfigs.ts +12 -19
  294. package/src/gc/gcDefinitions.ts +5 -23
  295. package/src/gc/gcHelpers.ts +1 -1
  296. package/src/gc/gcSummaryDefinitions.ts +1 -1
  297. package/src/gc/gcSummaryStateTracker.ts +1 -1
  298. package/src/gc/gcTelemetry.ts +1 -1
  299. package/src/gc/index.ts +1 -1
  300. package/src/index.ts +6 -1
  301. package/src/messageTypes.ts +4 -2
  302. package/src/opLifecycle/batchManager.ts +5 -0
  303. package/src/opLifecycle/outbox.ts +7 -30
  304. package/src/packageVersion.ts +1 -1
  305. package/src/pendingStateManager.ts +11 -1
  306. package/src/scheduleManager.ts +1 -1
  307. package/src/summary/documentSchema.ts +1 -1
  308. package/src/summary/index.ts +5 -1
  309. package/src/summary/orderedClientElection.ts +83 -12
  310. package/src/summary/runningSummarizer.ts +30 -114
  311. package/src/summary/summarizer.ts +5 -2
  312. package/src/summary/summarizerNode/summarizerNode.ts +0 -2
  313. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +1 -3
  314. package/src/summary/summarizerTypes.ts +22 -29
  315. package/src/summary/summaryCollection.ts +1 -1
  316. package/src/summary/summaryFormat.ts +35 -6
  317. package/src/summary/summaryGenerator.ts +50 -27
  318. package/src/summary/summaryManager.ts +1 -1
  319. package/dist/deltaManagerSummarizerProxy.d.ts.map +0 -1
  320. package/dist/deltaManagerSummarizerProxy.js.map +0 -1
  321. package/lib/deltaManagerSummarizerProxy.d.ts.map +0 -1
  322. package/lib/deltaManagerSummarizerProxy.js.map +0 -1
@@ -9,7 +9,7 @@ import {
9
9
  IAudience,
10
10
  ISelf,
11
11
  ICriticalContainerError,
12
- IDeltaManager,
12
+ type IAudienceEvents,
13
13
  } from "@fluidframework/container-definitions";
14
14
  import {
15
15
  IBatchMessage,
@@ -18,7 +18,7 @@ import {
18
18
  ILoader,
19
19
  IRuntime,
20
20
  LoaderHeader,
21
- type IAudienceEvents,
21
+ IDeltaManager,
22
22
  } from "@fluidframework/container-definitions/internal";
23
23
  import {
24
24
  IContainerRuntime,
@@ -27,12 +27,15 @@ import {
27
27
  import {
28
28
  FluidObject,
29
29
  IFluidHandle,
30
- IFluidHandleContext,
31
- IProvideFluidHandleContext,
32
30
  IRequest,
33
31
  IResponse,
34
32
  ITelemetryBaseLogger,
35
33
  } from "@fluidframework/core-interfaces";
34
+ import {
35
+ IFluidHandleContext,
36
+ type IFluidHandleInternal,
37
+ IProvideFluidHandleContext,
38
+ } from "@fluidframework/core-interfaces/internal";
36
39
  import { ISignalEnvelope } from "@fluidframework/core-interfaces/internal";
37
40
  import {
38
41
  assert,
@@ -67,13 +70,11 @@ import {
67
70
  MessageType,
68
71
  SummaryType,
69
72
  } from "@fluidframework/protocol-definitions";
73
+ import { IInboundSignalMessage } from "@fluidframework/runtime-definitions";
70
74
  import {
71
- IGarbageCollectionData,
72
- IInboundSignalMessage,
73
75
  ISummaryTreeWithStats,
74
76
  ITelemetryContext,
75
- } from "@fluidframework/runtime-definitions";
76
- import {
77
+ IGarbageCollectionData,
77
78
  CreateChildSummarizerNodeParam,
78
79
  FlushMode,
79
80
  FlushModeExperimental,
@@ -130,7 +131,7 @@ import { IPerfSignalReport, ReportOpPerfTelemetry } from "./connectionTelemetry.
130
131
  import { ContainerFluidHandleContext } from "./containerHandleContext.js";
131
132
  import { channelToDataStore } from "./dataStore.js";
132
133
  import { FluidDataStoreRegistry } from "./dataStoreRegistry.js";
133
- import { DeltaManagerSummarizerProxy } from "./deltaManagerSummarizerProxy.js";
134
+ import { DeltaManagerPendingOpsProxy, DeltaManagerSummarizerProxy } from "./deltaManagerProxies.js";
134
135
  import {
135
136
  GCNodeType,
136
137
  GarbageCollector,
@@ -465,10 +466,7 @@ export interface IContainerRuntimeOptions {
465
466
  * message to be sent to the service.
466
467
  * The grouping an ungrouping of such messages is handled by the "OpGroupingManager".
467
468
  *
468
- * By default, the feature is disabled. If enabled from options, the `Fluid.ContainerRuntime.DisableGroupedBatching`
469
- * flag can be used to disable it at runtime.
470
- *
471
- * @experimental Not ready for use.
469
+ * By default, the feature is enabled.
472
470
  */
473
471
  readonly enableGroupedBatching?: boolean;
474
472
 
@@ -801,7 +799,7 @@ export class ContainerRuntime
801
799
  maxBatchSizeInBytes = defaultMaxBatchSizeInBytes,
802
800
  enableRuntimeIdCompressor,
803
801
  chunkSizeInBytes = defaultChunkSizeInBytes,
804
- enableGroupedBatching = false,
802
+ enableGroupedBatching = true,
805
803
  explicitSchemaControl = false,
806
804
  } = runtimeOptions;
807
805
 
@@ -962,9 +960,6 @@ export class ContainerRuntime
962
960
  }
963
961
  };
964
962
 
965
- const disableGroupedBatching = mc.config.getBoolean(
966
- "Fluid.ContainerRuntime.DisableGroupedBatching",
967
- );
968
963
  const disableCompression = mc.config.getBoolean(
969
964
  "Fluid.ContainerRuntime.CompressionDisabled",
970
965
  );
@@ -973,8 +968,6 @@ export class ContainerRuntime
973
968
  compressionOptions.minimumBatchSizeInBytes !== Infinity &&
974
969
  compressionOptions.compressionAlgorithm === "lz4";
975
970
 
976
- const opGroupingEnabled = disableGroupedBatching !== true && enableGroupedBatching;
977
-
978
971
  const documentSchemaController = new DocumentsSchemaController(
979
972
  existing,
980
973
  protocolSequenceNumber,
@@ -983,7 +976,7 @@ export class ContainerRuntime
983
976
  explicitSchemaControl,
984
977
  compressionLz4,
985
978
  idCompressorMode,
986
- opGroupingEnabled,
979
+ opGroupingEnabled: enableGroupedBatching,
987
980
  disallowedVersions: [],
988
981
  },
989
982
  (schema) => {
@@ -992,7 +985,6 @@ export class ContainerRuntime
992
985
  );
993
986
 
994
987
  const featureGatesForTelemetry: Record<string, boolean | number | undefined> = {
995
- disableGroupedBatching,
996
988
  disableCompression,
997
989
  };
998
990
 
@@ -1196,6 +1188,8 @@ export class ContainerRuntime
1196
1188
 
1197
1189
  private readonly summarizerNode: IRootSummarizerNodeWithGC;
1198
1190
 
1191
+ private readonly logger: ITelemetryLoggerExt;
1192
+
1199
1193
  private readonly maxConsecutiveReconnects: number;
1200
1194
  private readonly defaultMaxConsecutiveReconnects = 7;
1201
1195
 
@@ -1356,7 +1350,8 @@ export class ContainerRuntime
1356
1350
  dataStoreAliasMap: [string, string][],
1357
1351
  private readonly runtimeOptions: Readonly<Required<IContainerRuntimeOptions>>,
1358
1352
  private readonly containerScope: FluidObject,
1359
- public readonly logger: ITelemetryLoggerExt,
1353
+ // Create a custom ITelemetryBaseLogger to output telemetry events.
1354
+ public readonly baseLogger: ITelemetryBaseLogger,
1360
1355
  existing: boolean,
1361
1356
  blobManagerSnapshot: IBlobManagerLoadInfo,
1362
1357
  private readonly _storage: IDocumentStorageService,
@@ -1394,8 +1389,10 @@ export class ContainerRuntime
1394
1389
  loader,
1395
1390
  pendingLocalState,
1396
1391
  supportedFeatures,
1392
+ snapshotWithContents,
1397
1393
  } = context;
1398
1394
 
1395
+ this.logger = createChildLogger({ logger: this.baseLogger });
1399
1396
  this.mc = createChildMonitoringContext({
1400
1397
  logger: this.logger,
1401
1398
  namespace: "ContainerRuntime",
@@ -1413,7 +1410,6 @@ export class ContainerRuntime
1413
1410
  };
1414
1411
 
1415
1412
  this.innerDeltaManager = deltaManager;
1416
- this.deltaManager = new DeltaManagerSummarizerProxy(this.innerDeltaManager);
1417
1413
 
1418
1414
  // Here we could wrap/intercept on these functions to block/modify outgoing messages if needed.
1419
1415
  // This makes ContainerRuntime the final gatekeeper for outgoing messages.
@@ -1518,6 +1514,44 @@ export class ContainerRuntime
1518
1514
  opGroupingManager,
1519
1515
  );
1520
1516
 
1517
+ const pendingRuntimeState = pendingLocalState as IPendingRuntimeState | undefined;
1518
+ this.pendingStateManager = new PendingStateManager(
1519
+ {
1520
+ applyStashedOp: this.applyStashedOp.bind(this),
1521
+ clientId: () => this.clientId,
1522
+ close: this.closeFn,
1523
+ connected: () => this.connected,
1524
+ reSubmit: (message: IPendingBatchMessage) => {
1525
+ this.reSubmit(message);
1526
+ this.flush();
1527
+ },
1528
+ reSubmitBatch: this.reSubmitBatch.bind(this),
1529
+ isActiveConnection: () => this.innerDeltaManager.active,
1530
+ isAttached: () => this.attachState !== AttachState.Detached,
1531
+ },
1532
+ pendingRuntimeState?.pending,
1533
+ this.logger,
1534
+ );
1535
+
1536
+ let outerDeltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>;
1537
+ const useDeltaManagerOpsProxy =
1538
+ this.mc.config.getBoolean("Fluid.ContainerRuntime.DeltaManagerOpsProxy") !== false;
1539
+ // The summarizerDeltaManager Proxy is used to lie to the summarizer to convince it is in the right state as a summarizer client.
1540
+ const summarizerDeltaManagerProxy = new DeltaManagerSummarizerProxy(this.innerDeltaManager);
1541
+ outerDeltaManager = summarizerDeltaManagerProxy;
1542
+
1543
+ // The DeltaManagerPendingOpsProxy is used to control the minimum sequence number
1544
+ // It allows us to lie to the layers below so that they can maintain enough local state for rebasing ops.
1545
+ if (useDeltaManagerOpsProxy) {
1546
+ const pendingOpsDeltaManagerProxy = new DeltaManagerPendingOpsProxy(
1547
+ summarizerDeltaManagerProxy,
1548
+ this.pendingStateManager,
1549
+ );
1550
+ outerDeltaManager = pendingOpsDeltaManagerProxy;
1551
+ }
1552
+
1553
+ this.deltaManager = outerDeltaManager;
1554
+
1521
1555
  this.handleContext = new ContainerFluidHandleContext("", this);
1522
1556
 
1523
1557
  if (this.summaryConfiguration.state === "enabled") {
@@ -1543,8 +1577,6 @@ export class ContainerRuntime
1543
1577
  this._flushMode = runtimeOptions.flushMode;
1544
1578
  }
1545
1579
 
1546
- const pendingRuntimeState = pendingLocalState as IPendingRuntimeState | undefined;
1547
-
1548
1580
  if (context.attachState === AttachState.Attached) {
1549
1581
  const maxSnapshotCacheDurationMs = this._storage?.policies?.maximumCacheDurationMs;
1550
1582
  if (
@@ -1616,8 +1648,19 @@ export class ContainerRuntime
1616
1648
  return this.submitSignalFn(envelope2, targetClientId);
1617
1649
  };
1618
1650
 
1651
+ let snapshot: ISnapshot | ISnapshotTree | undefined = getSummaryForDatastores(
1652
+ baseSnapshot,
1653
+ metadata,
1654
+ );
1655
+ if (snapshot !== undefined && snapshotWithContents !== undefined) {
1656
+ snapshot = {
1657
+ ...snapshotWithContents,
1658
+ snapshotTree: snapshot,
1659
+ };
1660
+ }
1661
+
1619
1662
  this.channelCollection = new ChannelCollection(
1620
- getSummaryForDatastores(baseSnapshot, metadata),
1663
+ snapshot,
1621
1664
  parentContext,
1622
1665
  this.mc.logger,
1623
1666
  (props) => this.garbageCollector.nodeUpdated(props),
@@ -1660,24 +1703,6 @@ export class ContainerRuntime
1660
1703
  createChildLogger({ logger: this.logger, namespace: "ScheduleManager" }),
1661
1704
  );
1662
1705
 
1663
- this.pendingStateManager = new PendingStateManager(
1664
- {
1665
- applyStashedOp: this.applyStashedOp.bind(this),
1666
- clientId: () => this.clientId,
1667
- close: this.closeFn,
1668
- connected: () => this.connected,
1669
- reSubmit: (message: IPendingBatchMessage) => {
1670
- this.reSubmit(message);
1671
- this.flush();
1672
- },
1673
- reSubmitBatch: this.reSubmitBatch.bind(this),
1674
- isActiveConnection: () => this.innerDeltaManager.active,
1675
- isAttached: () => this.attachState !== AttachState.Detached,
1676
- },
1677
- pendingRuntimeState?.pending,
1678
- this.logger,
1679
- );
1680
-
1681
1706
  const disablePartialFlush = this.mc.config.getBoolean(
1682
1707
  "Fluid.ContainerRuntime.DisablePartialFlush",
1683
1708
  );
@@ -1729,7 +1754,7 @@ export class ContainerRuntime
1729
1754
  let oldClientId = this.clientId;
1730
1755
  this.on("connected", () => {
1731
1756
  const clientId = this.clientId;
1732
- assert(clientId !== undefined, "can't be undefined");
1757
+ assert(clientId !== undefined, 0x975 /* can't be undefined */);
1733
1758
  (audience as unknown as TypedEventEmitter<IAudienceEvents>).emit(
1734
1759
  "selfChanged",
1735
1760
  { clientId: oldClientId },
@@ -1766,6 +1791,9 @@ export class ContainerRuntime
1766
1791
  orderedClientCollection,
1767
1792
  electedSummarizerData ?? this.innerDeltaManager.lastSequenceNumber,
1768
1793
  SummarizerClientElection.isClientEligible,
1794
+ this.mc.config.getBoolean(
1795
+ "Fluid.ContainerRuntime.OrderedClientElection.EnablePerformanceEvents",
1796
+ ),
1769
1797
  );
1770
1798
 
1771
1799
  this.summarizerClientElection = new SummarizerClientElection(
@@ -1838,7 +1866,7 @@ export class ContainerRuntime
1838
1866
  }
1839
1867
 
1840
1868
  // logging hardware telemetry
1841
- logger.sendTelemetryEvent({
1869
+ this.logger.sendTelemetryEvent({
1842
1870
  eventName: "DeviceSpec",
1843
1871
  ...getDeviceSpec(),
1844
1872
  });
@@ -2321,6 +2349,7 @@ export class ContainerRuntime
2321
2349
  let newState: boolean;
2322
2350
 
2323
2351
  try {
2352
+ this.submitIdAllocationOpIfNeeded(true);
2324
2353
  // replay the ops
2325
2354
  this.pendingStateManager.replayPendingStates();
2326
2355
  } finally {
@@ -2373,8 +2402,6 @@ export class ContainerRuntime
2373
2402
  return;
2374
2403
  case ContainerMessageType.BlobAttach:
2375
2404
  return;
2376
- case ContainerMessageType.ChunkedOp:
2377
- throw new Error("chunkedOp not expected here");
2378
2405
  case ContainerMessageType.Rejoin:
2379
2406
  throw new Error("rejoin not expected here");
2380
2407
  case ContainerMessageType.GC:
@@ -2387,7 +2414,7 @@ export class ContainerRuntime
2387
2414
  const compatBehavior = opContents.compatDetails?.behavior;
2388
2415
  if (!compatBehaviorAllowsMessageType(opContents.type, compatBehavior)) {
2389
2416
  const error = DataProcessingError.create(
2390
- "Stashed runtime message of unknown type",
2417
+ "Stashed runtime message of unexpected type",
2391
2418
  "applyStashedOp",
2392
2419
  undefined /* sequencedMessage */,
2393
2420
  {
@@ -2420,7 +2447,7 @@ export class ContainerRuntime
2420
2447
  for (const range of ops) {
2421
2448
  compressor.finalizeCreationRange(range);
2422
2449
  }
2423
- assert(this.pendingIdCompressorOps.length === 0, "No new ops added");
2450
+ assert(this.pendingIdCompressorOps.length === 0, 0x976 /* No new ops added */);
2424
2451
  this._idCompressor = compressor;
2425
2452
  })
2426
2453
  .catch((error) => {
@@ -2434,8 +2461,11 @@ export class ContainerRuntime
2434
2461
  public setConnectionState(connected: boolean, clientId?: string) {
2435
2462
  // Validate we have consistent state
2436
2463
  const currentClientId = this._audience.getSelf()?.clientId;
2437
- assert(clientId === currentClientId, "input clientId does not match Audience");
2438
- assert(this.clientId === currentClientId, "this.clientId does not match Audience");
2464
+ assert(clientId === currentClientId, 0x977 /* input clientId does not match Audience */);
2465
+ assert(
2466
+ this.clientId === currentClientId,
2467
+ 0x978 /* this.clientId does not match Audience */,
2468
+ );
2439
2469
 
2440
2470
  if (connected && this.idCompressorMode === "delayed") {
2441
2471
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
@@ -2582,6 +2612,17 @@ export class ContainerRuntime
2582
2612
  */
2583
2613
  private processCore(messageWithContext: MessageWithContext) {
2584
2614
  const { message, local } = messageWithContext;
2615
+
2616
+ // Intercept to reduce minimum sequence number to the delta manager's minimum sequence number.
2617
+ // Sequence numbers are not guaranteed to follow any sort of order. Re-entrancy is one of those situations
2618
+ if (
2619
+ this.deltaManager.minimumSequenceNumber <
2620
+ messageWithContext.message.minimumSequenceNumber
2621
+ ) {
2622
+ messageWithContext.message.minimumSequenceNumber =
2623
+ this.deltaManager.minimumSequenceNumber;
2624
+ }
2625
+
2585
2626
  // Surround the actual processing of the operation with messages to the schedule manager indicating
2586
2627
  // the beginning and end. This allows it to emit appropriate events and/or pause the processing of new
2587
2628
  // messages once a batch has been fully processed.
@@ -2672,7 +2713,7 @@ export class ContainerRuntime
2672
2713
  } else {
2673
2714
  assert(
2674
2715
  this.pendingIdCompressorOps.length === 0,
2675
- "there should be no pending ops!",
2716
+ 0x979 /* there should be no pending ops! */,
2676
2717
  );
2677
2718
  this._idCompressor.finalizeCreationRange(range);
2678
2719
  }
@@ -3204,7 +3245,7 @@ export class ContainerRuntime
3204
3245
 
3205
3246
  return { stats, summary };
3206
3247
  } finally {
3207
- this.mc.logger.sendTelemetryEvent({
3248
+ summaryLogger.sendTelemetryEvent({
3208
3249
  eventName: "SummarizeTelemetry",
3209
3250
  details: telemetryContext.serialize(),
3210
3251
  });
@@ -3401,7 +3442,6 @@ export class ContainerRuntime
3401
3442
  const {
3402
3443
  fullTree = false,
3403
3444
  finalAttempt = false,
3404
- refreshLatestAck,
3405
3445
  summaryLogger,
3406
3446
  latestSummaryRefSeqNum,
3407
3447
  } = options;
@@ -3421,16 +3461,6 @@ export class ContainerRuntime
3421
3461
 
3422
3462
  assert(this.outbox.isEmpty, 0x3d1 /* Can't trigger summary in the middle of a batch */);
3423
3463
 
3424
- // We close the summarizer and download a new snapshot and reload the container
3425
- if (refreshLatestAck === true) {
3426
- return this.prefetchLatestSummaryThenClose(
3427
- createChildLogger({
3428
- logger: summaryNumberLogger,
3429
- properties: { all: { safeSummary: true } },
3430
- }),
3431
- );
3432
- }
3433
-
3434
3464
  // If the container is dirty, i.e., there are pending unacked ops, the summary will not be eventual consistent
3435
3465
  // and it may even be incorrect. So, wait for the container to be saved with a timeout. If the container is not
3436
3466
  // saved within the timeout, check if it should be failed or can continue.
@@ -3526,7 +3556,7 @@ export class ContainerRuntime
3526
3556
  stage: "base",
3527
3557
  referenceSequenceNumber: summaryRefSeqNum,
3528
3558
  minimumSequenceNumber,
3529
- error: new LoggingError(
3559
+ error: new RetriableSummaryError(
3530
3560
  `Summarizer node state inconsistent with summarizer state.`,
3531
3561
  ),
3532
3562
  };
@@ -3578,7 +3608,7 @@ export class ContainerRuntime
3578
3608
  stage: "base",
3579
3609
  referenceSequenceNumber: summaryRefSeqNum,
3580
3610
  minimumSequenceNumber,
3581
- error: new LoggingError(continueResult.error),
3611
+ error: new RetriableSummaryError(continueResult.error),
3582
3612
  };
3583
3613
  }
3584
3614
 
@@ -3599,7 +3629,7 @@ export class ContainerRuntime
3599
3629
  stage: "base",
3600
3630
  referenceSequenceNumber: summaryRefSeqNum,
3601
3631
  minimumSequenceNumber,
3602
- error: wrapError(error, (msg) => new LoggingError(msg)),
3632
+ error: wrapError(error, (msg) => new RetriableSummaryError(msg)),
3603
3633
  };
3604
3634
  }
3605
3635
 
@@ -3674,7 +3704,7 @@ export class ContainerRuntime
3674
3704
  return {
3675
3705
  stage: "generate",
3676
3706
  ...generateSummaryData,
3677
- error: new LoggingError(continueResult.error),
3707
+ error: new RetriableSummaryError(continueResult.error),
3678
3708
  };
3679
3709
  }
3680
3710
 
@@ -3701,7 +3731,7 @@ export class ContainerRuntime
3701
3731
  return {
3702
3732
  stage: "generate",
3703
3733
  ...generateSummaryData,
3704
- error: wrapError(error, (msg) => new LoggingError(msg)),
3734
+ error: wrapError(error, (msg) => new RetriableSummaryError(msg)),
3705
3735
  };
3706
3736
  }
3707
3737
 
@@ -3724,7 +3754,7 @@ export class ContainerRuntime
3724
3754
  return {
3725
3755
  stage: "upload",
3726
3756
  ...uploadData,
3727
- error: new LoggingError(continueResult.error),
3757
+ error: new RetriableSummaryError(continueResult.error),
3728
3758
  };
3729
3759
  }
3730
3760
 
@@ -3735,7 +3765,7 @@ export class ContainerRuntime
3735
3765
  return {
3736
3766
  stage: "upload",
3737
3767
  ...uploadData,
3738
- error: wrapError(error, (msg) => new LoggingError(msg)),
3768
+ error: wrapError(error, (msg) => new RetriableSummaryError(msg)),
3739
3769
  };
3740
3770
  }
3741
3771
 
@@ -3752,7 +3782,7 @@ export class ContainerRuntime
3752
3782
  return {
3753
3783
  stage: "upload",
3754
3784
  ...uploadData,
3755
- error: wrapError(error, (msg) => new LoggingError(msg)),
3785
+ error: wrapError(error, (msg) => new RetriableSummaryError(msg)),
3756
3786
  };
3757
3787
  }
3758
3788
  return submitData;
@@ -3880,16 +3910,18 @@ export class ContainerRuntime
3880
3910
  public async uploadBlob(
3881
3911
  blob: ArrayBufferLike,
3882
3912
  signal?: AbortSignal,
3883
- ): Promise<IFluidHandle<ArrayBufferLike>> {
3913
+ ): Promise<IFluidHandleInternal<ArrayBufferLike>> {
3884
3914
  this.verifyNotClosed();
3885
3915
  return this.blobManager.createBlob(blob, signal);
3886
3916
  }
3887
3917
 
3888
- private submitIdAllocationOpIfNeeded(): void {
3918
+ private submitIdAllocationOpIfNeeded(resubmitOutstandingRanges: boolean): void {
3889
3919
  if (this._idCompressor) {
3890
- const idRange = this._idCompressor.takeNextCreationRange();
3920
+ const idRange = resubmitOutstandingRanges
3921
+ ? this._idCompressor.takeUnfinalizedCreationRange()
3922
+ : this._idCompressor.takeNextCreationRange();
3891
3923
  // Don't include the idRange if there weren't any Ids allocated
3892
- if (idRange?.ids !== undefined) {
3924
+ if (idRange.ids !== undefined) {
3893
3925
  const idAllocationMessage: ContainerRuntimeIdAllocationMessage = {
3894
3926
  type: ContainerMessageType.IdAllocation,
3895
3927
  contents: idRange,
@@ -3934,6 +3966,10 @@ export class ContainerRuntime
3934
3966
  }
3935
3967
 
3936
3968
  const type = containerRuntimeMessage.type;
3969
+ assert(
3970
+ type !== ContainerMessageType.IdAllocation,
3971
+ "IdAllocation should be submitted directly to outbox.",
3972
+ );
3937
3973
  const message: BatchMessage = {
3938
3974
  contents: serializedContent,
3939
3975
  metadata,
@@ -3942,44 +3978,36 @@ export class ContainerRuntime
3942
3978
  };
3943
3979
 
3944
3980
  try {
3945
- // If `message` is an allocation op, then we are in the resubmit path and we must redirect the allocation
3946
- // op into the correct batch to avoid ranges being finalized out of order.
3947
- // Otherwise, submit an IdAllocation op if any IDs have been generated since the last op was submitted, as
3948
- // any of the other op types may contain those IDs and thus depend on the allocation op being sent first.
3949
- if (type === ContainerMessageType.IdAllocation) {
3950
- this.outbox.submitIdAllocation(message);
3951
- } else {
3952
- this.submitIdAllocationOpIfNeeded();
3953
-
3954
- // Allow document schema controller to send a message if it needs to propose change in document schema.
3955
- // If it needs to send a message, it will call provided callback with payload of such message and rely
3956
- // on this callback to do actual sending.
3957
- const contents = this.documentsSchemaController.maybeSendSchemaMessage();
3958
- if (contents) {
3959
- this.logger.sendTelemetryEvent({
3960
- eventName: "SchemaChangeProposal",
3961
- refSeq: contents.refSeq,
3962
- version: contents.version,
3963
- newRuntimeSchema: JSON.stringify(contents.runtime),
3964
- sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
3965
- oldRuntimeSchema: JSON.stringify(this.metadata?.documentSchema?.runtime),
3966
- });
3967
- const msg: ContainerRuntimeDocumentSchemaMessage = {
3968
- type: ContainerMessageType.DocumentSchemaChange,
3969
- contents,
3970
- };
3971
- this.outbox.submit({
3972
- contents: JSON.stringify(msg),
3973
- referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
3974
- });
3975
- }
3981
+ this.submitIdAllocationOpIfNeeded(false);
3982
+
3983
+ // Allow document schema controller to send a message if it needs to propose change in document schema.
3984
+ // If it needs to send a message, it will call provided callback with payload of such message and rely
3985
+ // on this callback to do actual sending.
3986
+ const contents = this.documentsSchemaController.maybeSendSchemaMessage();
3987
+ if (contents) {
3988
+ this.logger.sendTelemetryEvent({
3989
+ eventName: "SchemaChangeProposal",
3990
+ refSeq: contents.refSeq,
3991
+ version: contents.version,
3992
+ newRuntimeSchema: JSON.stringify(contents.runtime),
3993
+ sessionRuntimeSchema: JSON.stringify(this.sessionSchema),
3994
+ oldRuntimeSchema: JSON.stringify(this.metadata?.documentSchema?.runtime),
3995
+ });
3996
+ const msg: ContainerRuntimeDocumentSchemaMessage = {
3997
+ type: ContainerMessageType.DocumentSchemaChange,
3998
+ contents,
3999
+ };
4000
+ this.outbox.submit({
4001
+ contents: JSON.stringify(msg),
4002
+ referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
4003
+ });
4004
+ }
3976
4005
 
3977
- if (type === ContainerMessageType.BlobAttach) {
3978
- // BlobAttach ops must have their metadata visible and cannot be grouped (see opGroupingManager.ts)
3979
- this.outbox.submitBlobAttach(message);
3980
- } else {
3981
- this.outbox.submit(message);
3982
- }
4006
+ if (type === ContainerMessageType.BlobAttach) {
4007
+ // BlobAttach ops must have their metadata visible and cannot be grouped (see opGroupingManager.ts)
4008
+ this.outbox.submitBlobAttach(message);
4009
+ } else {
4010
+ this.outbox.submit(message);
3983
4011
  }
3984
4012
 
3985
4013
  if (!this.currentlyBatching()) {
@@ -4103,11 +4131,15 @@ export class ContainerRuntime
4103
4131
  this.channelCollection.reSubmit(message.type, message.contents, localOpMetadata);
4104
4132
  break;
4105
4133
  case ContainerMessageType.IdAllocation: {
4106
- this.submit(message, localOpMetadata);
4134
+ // Allocation ops are never resubmitted/rebased. This is because they require special handling to
4135
+ // avoid being submitted out of order. For example, if the pending state manager contained
4136
+ // [idOp1, dataOp1, idOp2, dataOp2] and the resubmission of dataOp1 generated idOp3, that would be
4137
+ // placed into the outbox in the same batch as idOp1, but before idOp2 is resubmitted.
4138
+ // To avoid this, allocation ops are simply never resubmitted. Prior to invoking the pending state
4139
+ // manager to replay pending ops, the runtime will always submit a new allocation range that includes
4140
+ // all pending IDs. The resubmitted allocation ops are then ignored here.
4107
4141
  break;
4108
4142
  }
4109
- case ContainerMessageType.ChunkedOp:
4110
- throw new Error(`chunkedOp not expected here`);
4111
4143
  case ContainerMessageType.BlobAttach:
4112
4144
  this.blobManager.reSubmit(opMetadata);
4113
4145
  break;
@@ -4134,7 +4166,7 @@ export class ContainerRuntime
4134
4166
  });
4135
4167
  } else {
4136
4168
  const error = DataProcessingError.create(
4137
- "Resubmitting runtime message of unknown type",
4169
+ "Resubmitting runtime message of unexpected type",
4138
4170
  "reSubmitCore",
4139
4171
  undefined /* sequencedMessage */,
4140
4172
  {
@@ -4184,7 +4216,7 @@ export class ContainerRuntime
4184
4216
  * and then close as the current main client is likely to be re-elected as the parent summarizer again.
4185
4217
  */
4186
4218
  if (!result.isSummaryTracked && result.isSummaryNewer) {
4187
- await this.fetchLatestSnapshotFromStorage(
4219
+ await this.fetchLatestSnapshotAndClose(
4188
4220
  summaryLogger,
4189
4221
  {
4190
4222
  eventName: "RefreshLatestSummaryAckFetch",
@@ -4193,8 +4225,6 @@ export class ContainerRuntime
4193
4225
  },
4194
4226
  readAndParseBlob,
4195
4227
  );
4196
-
4197
- await this.closeStaleSummarizer();
4198
4228
  return;
4199
4229
  }
4200
4230
 
@@ -4203,54 +4233,16 @@ export class ContainerRuntime
4203
4233
  }
4204
4234
 
4205
4235
  /**
4206
- * Fetches the latest snapshot from storage to refresh the cache as a performance optimization and closes the
4207
- * summarizer to reload from new state.
4208
- * @param summaryLogger - logger to use when fetching snapshot from storage
4209
- * @returns a generic summarization error
4236
+ * Fetches the latest snapshot from storage and closes the container. This is done in cases where
4237
+ * the last known snapshot is older than the latest one. This will ensure that the latest snapshot
4238
+ * is downloaded and we don't end up loading snapshot from cache.
4210
4239
  */
4211
- private async prefetchLatestSummaryThenClose(
4212
- summaryLogger: ITelemetryLoggerExt,
4213
- ): Promise<IBaseSummarizeResult> {
4214
- const readAndParseBlob = async <T>(id: string) => readAndParse<T>(this.storage, id);
4215
-
4216
- // This is a performance optimization as the same parent is likely to be elected again, and would use its
4217
- // cache to fetch the snapshot instead of the network.
4218
- await this.fetchLatestSnapshotFromStorage(
4219
- summaryLogger,
4220
- {
4221
- eventName: "RefreshLatestSummaryFromServerFetch",
4222
- },
4223
- readAndParseBlob,
4224
- );
4225
-
4226
- await this.closeStaleSummarizer();
4227
-
4228
- return {
4229
- stage: "base",
4230
- error: new LoggingError("summary state stale - Unsupported option 'refreshLatestAck'"),
4231
- referenceSequenceNumber: this.deltaManager.lastSequenceNumber,
4232
- minimumSequenceNumber: this.deltaManager.minimumSequenceNumber,
4233
- };
4234
- }
4235
-
4236
- private async closeStaleSummarizer(): Promise<void> {
4237
- // Delay before restarting summarizer to prevent the summarizer from restarting too frequently.
4238
- await delay(this.closeSummarizerDelayMs);
4239
- this._summarizer?.stop("latestSummaryStateStale");
4240
- this.disposeFn();
4241
- }
4242
-
4243
- /**
4244
- * Downloads the latest snapshot from storage.
4245
- * By default, it also closes the container after downloading the snapshot. However, this may be
4246
- * overridden via options.
4247
- */
4248
- private async fetchLatestSnapshotFromStorage(
4240
+ private async fetchLatestSnapshotAndClose(
4249
4241
  logger: ITelemetryLoggerExt,
4250
4242
  event: ITelemetryGenericEventExt,
4251
4243
  readAndParseBlob: ReadAndParseBlob,
4252
- ): Promise<{ snapshotTree: ISnapshotTree; versionId: string; latestSnapshotRefSeq: number }> {
4253
- return PerformanceEvent.timedExecAsync(
4244
+ ) {
4245
+ await PerformanceEvent.timedExecAsync(
4254
4246
  logger,
4255
4247
  event,
4256
4248
  async (perfEvent: {
@@ -4289,13 +4281,12 @@ export class ContainerRuntime
4289
4281
  stats.snapshotVersion = versions[0].id;
4290
4282
 
4291
4283
  perfEvent.end(stats);
4292
- return {
4293
- snapshotTree: maybeSnapshot,
4294
- versionId: versions[0].id,
4295
- latestSnapshotRefSeq,
4296
- };
4297
4284
  },
4298
4285
  );
4286
+
4287
+ await delay(this.closeSummarizerDelayMs);
4288
+ this._summarizer?.stop("latestSummaryStateStale");
4289
+ this.disposeFn();
4299
4290
  }
4300
4291
 
4301
4292
  public getPendingLocalState(props?: IGetPendingLocalStateProps): unknown {