@fluidframework/container-runtime 2.0.0-internal.5.3.1 → 2.0.0-internal.5.4.0

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 (231) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/batchTracker.d.ts.map +1 -1
  3. package/dist/batchTracker.js +1 -1
  4. package/dist/batchTracker.js.map +1 -1
  5. package/dist/blobManager.d.ts +9 -1
  6. package/dist/blobManager.d.ts.map +1 -1
  7. package/dist/blobManager.js +55 -12
  8. package/dist/blobManager.js.map +1 -1
  9. package/dist/connectionTelemetry.d.ts.map +1 -1
  10. package/dist/connectionTelemetry.js +2 -2
  11. package/dist/connectionTelemetry.js.map +1 -1
  12. package/dist/containerRuntime.d.ts +43 -11
  13. package/dist/containerRuntime.d.ts.map +1 -1
  14. package/dist/containerRuntime.js +189 -137
  15. package/dist/containerRuntime.js.map +1 -1
  16. package/dist/dataStore.js +3 -0
  17. package/dist/dataStore.js.map +1 -1
  18. package/dist/dataStoreContext.d.ts +1 -1
  19. package/dist/dataStoreContext.d.ts.map +1 -1
  20. package/dist/dataStoreContext.js +24 -27
  21. package/dist/dataStoreContext.js.map +1 -1
  22. package/dist/dataStoreContexts.js +1 -1
  23. package/dist/dataStoreContexts.js.map +1 -1
  24. package/dist/dataStores.d.ts +1 -1
  25. package/dist/dataStores.d.ts.map +1 -1
  26. package/dist/dataStores.js +14 -24
  27. package/dist/dataStores.js.map +1 -1
  28. package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
  29. package/dist/deltaManagerSummarizerProxy.js +2 -0
  30. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  31. package/dist/deltaScheduler.d.ts.map +1 -1
  32. package/dist/deltaScheduler.js +5 -5
  33. package/dist/deltaScheduler.js.map +1 -1
  34. package/dist/gc/garbageCollection.d.ts.map +1 -1
  35. package/dist/gc/garbageCollection.js +12 -5
  36. package/dist/gc/garbageCollection.js.map +1 -1
  37. package/dist/gc/gcHelpers.d.ts +1 -0
  38. package/dist/gc/gcHelpers.d.ts.map +1 -1
  39. package/dist/gc/gcHelpers.js +1 -0
  40. package/dist/gc/gcHelpers.js.map +1 -1
  41. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  42. package/dist/gc/gcTelemetry.js +15 -22
  43. package/dist/gc/gcTelemetry.js.map +1 -1
  44. package/dist/id-compressor/idCompressor.d.ts +3 -3
  45. package/dist/id-compressor/idCompressor.d.ts.map +1 -1
  46. package/dist/id-compressor/idCompressor.js +3 -1
  47. package/dist/id-compressor/idCompressor.js.map +1 -1
  48. package/dist/opLifecycle/opCompressor.d.ts +2 -2
  49. package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
  50. package/dist/opLifecycle/opCompressor.js +1 -1
  51. package/dist/opLifecycle/opCompressor.js.map +1 -1
  52. package/dist/opLifecycle/opDecompressor.d.ts +2 -2
  53. package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
  54. package/dist/opLifecycle/opDecompressor.js +1 -1
  55. package/dist/opLifecycle/opDecompressor.js.map +1 -1
  56. package/dist/opLifecycle/opSplitter.d.ts +2 -2
  57. package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
  58. package/dist/opLifecycle/opSplitter.js +1 -1
  59. package/dist/opLifecycle/opSplitter.js.map +1 -1
  60. package/dist/opLifecycle/outbox.d.ts +6 -5
  61. package/dist/opLifecycle/outbox.d.ts.map +1 -1
  62. package/dist/opLifecycle/outbox.js +5 -12
  63. package/dist/opLifecycle/outbox.js.map +1 -1
  64. package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  65. package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  66. package/dist/opLifecycle/remoteMessageProcessor.js +7 -1
  67. package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
  68. package/dist/packageVersion.d.ts +1 -1
  69. package/dist/packageVersion.js +1 -1
  70. package/dist/packageVersion.js.map +1 -1
  71. package/dist/pendingStateManager.d.ts +4 -1
  72. package/dist/pendingStateManager.d.ts.map +1 -1
  73. package/dist/pendingStateManager.js +21 -12
  74. package/dist/pendingStateManager.js.map +1 -1
  75. package/dist/scheduleManager.d.ts.map +1 -1
  76. package/dist/scheduleManager.js +1 -1
  77. package/dist/scheduleManager.js.map +1 -1
  78. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  79. package/dist/summary/orderedClientElection.js +1 -1
  80. package/dist/summary/orderedClientElection.js.map +1 -1
  81. package/dist/summary/runningSummarizer.d.ts +3 -5
  82. package/dist/summary/runningSummarizer.d.ts.map +1 -1
  83. package/dist/summary/runningSummarizer.js +10 -28
  84. package/dist/summary/runningSummarizer.js.map +1 -1
  85. package/dist/summary/summarizer.js +1 -1
  86. package/dist/summary/summarizer.js.map +1 -1
  87. package/dist/summary/summarizerNode/summarizerNode.d.ts +5 -5
  88. package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  89. package/dist/summary/summarizerNode/summarizerNode.js +7 -10
  90. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  91. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
  92. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  93. package/dist/summary/summarizerNode/summarizerNodeWithGc.js +4 -8
  94. package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  95. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  96. package/dist/summary/summaryGenerator.js +5 -1
  97. package/dist/summary/summaryGenerator.js.map +1 -1
  98. package/dist/summary/summaryManager.d.ts +2 -3
  99. package/dist/summary/summaryManager.d.ts.map +1 -1
  100. package/dist/summary/summaryManager.js +6 -2
  101. package/dist/summary/summaryManager.js.map +1 -1
  102. package/lib/batchTracker.d.ts.map +1 -1
  103. package/lib/batchTracker.js +2 -2
  104. package/lib/batchTracker.js.map +1 -1
  105. package/lib/blobManager.d.ts +9 -1
  106. package/lib/blobManager.d.ts.map +1 -1
  107. package/lib/blobManager.js +55 -12
  108. package/lib/blobManager.js.map +1 -1
  109. package/lib/connectionTelemetry.d.ts.map +1 -1
  110. package/lib/connectionTelemetry.js +3 -3
  111. package/lib/connectionTelemetry.js.map +1 -1
  112. package/lib/containerRuntime.d.ts +43 -11
  113. package/lib/containerRuntime.d.ts.map +1 -1
  114. package/lib/containerRuntime.js +188 -137
  115. package/lib/containerRuntime.js.map +1 -1
  116. package/lib/dataStore.js +3 -0
  117. package/lib/dataStore.js.map +1 -1
  118. package/lib/dataStoreContext.d.ts +1 -1
  119. package/lib/dataStoreContext.d.ts.map +1 -1
  120. package/lib/dataStoreContext.js +26 -29
  121. package/lib/dataStoreContext.js.map +1 -1
  122. package/lib/dataStoreContexts.js +2 -2
  123. package/lib/dataStoreContexts.js.map +1 -1
  124. package/lib/dataStores.d.ts +1 -1
  125. package/lib/dataStores.d.ts.map +1 -1
  126. package/lib/dataStores.js +15 -25
  127. package/lib/dataStores.js.map +1 -1
  128. package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
  129. package/lib/deltaManagerSummarizerProxy.js +2 -0
  130. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  131. package/lib/deltaScheduler.d.ts.map +1 -1
  132. package/lib/deltaScheduler.js +6 -6
  133. package/lib/deltaScheduler.js.map +1 -1
  134. package/lib/gc/garbageCollection.d.ts.map +1 -1
  135. package/lib/gc/garbageCollection.js +13 -6
  136. package/lib/gc/garbageCollection.js.map +1 -1
  137. package/lib/gc/gcHelpers.d.ts +1 -0
  138. package/lib/gc/gcHelpers.d.ts.map +1 -1
  139. package/lib/gc/gcHelpers.js +1 -0
  140. package/lib/gc/gcHelpers.js.map +1 -1
  141. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  142. package/lib/gc/gcTelemetry.js +16 -23
  143. package/lib/gc/gcTelemetry.js.map +1 -1
  144. package/lib/id-compressor/idCompressor.d.ts +3 -3
  145. package/lib/id-compressor/idCompressor.d.ts.map +1 -1
  146. package/lib/id-compressor/idCompressor.js +3 -1
  147. package/lib/id-compressor/idCompressor.js.map +1 -1
  148. package/lib/opLifecycle/opCompressor.d.ts +2 -2
  149. package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
  150. package/lib/opLifecycle/opCompressor.js +2 -2
  151. package/lib/opLifecycle/opCompressor.js.map +1 -1
  152. package/lib/opLifecycle/opDecompressor.d.ts +2 -2
  153. package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
  154. package/lib/opLifecycle/opDecompressor.js +2 -2
  155. package/lib/opLifecycle/opDecompressor.js.map +1 -1
  156. package/lib/opLifecycle/opSplitter.d.ts +2 -2
  157. package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
  158. package/lib/opLifecycle/opSplitter.js +2 -2
  159. package/lib/opLifecycle/opSplitter.js.map +1 -1
  160. package/lib/opLifecycle/outbox.d.ts +6 -5
  161. package/lib/opLifecycle/outbox.d.ts.map +1 -1
  162. package/lib/opLifecycle/outbox.js +6 -13
  163. package/lib/opLifecycle/outbox.js.map +1 -1
  164. package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
  165. package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
  166. package/lib/opLifecycle/remoteMessageProcessor.js +7 -1
  167. package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
  168. package/lib/packageVersion.d.ts +1 -1
  169. package/lib/packageVersion.js +1 -1
  170. package/lib/packageVersion.js.map +1 -1
  171. package/lib/pendingStateManager.d.ts +4 -1
  172. package/lib/pendingStateManager.d.ts.map +1 -1
  173. package/lib/pendingStateManager.js +21 -12
  174. package/lib/pendingStateManager.js.map +1 -1
  175. package/lib/scheduleManager.d.ts.map +1 -1
  176. package/lib/scheduleManager.js +2 -2
  177. package/lib/scheduleManager.js.map +1 -1
  178. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  179. package/lib/summary/orderedClientElection.js +2 -2
  180. package/lib/summary/orderedClientElection.js.map +1 -1
  181. package/lib/summary/runningSummarizer.d.ts +3 -5
  182. package/lib/summary/runningSummarizer.d.ts.map +1 -1
  183. package/lib/summary/runningSummarizer.js +11 -29
  184. package/lib/summary/runningSummarizer.js.map +1 -1
  185. package/lib/summary/summarizer.js +2 -2
  186. package/lib/summary/summarizer.js.map +1 -1
  187. package/lib/summary/summarizerNode/summarizerNode.d.ts +5 -5
  188. package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
  189. package/lib/summary/summarizerNode/summarizerNode.js +8 -11
  190. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  191. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
  192. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  193. package/lib/summary/summarizerNode/summarizerNodeWithGc.js +5 -9
  194. package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
  195. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  196. package/lib/summary/summaryGenerator.js +6 -2
  197. package/lib/summary/summaryGenerator.js.map +1 -1
  198. package/lib/summary/summaryManager.d.ts +2 -3
  199. package/lib/summary/summaryManager.d.ts.map +1 -1
  200. package/lib/summary/summaryManager.js +7 -3
  201. package/lib/summary/summaryManager.js.map +1 -1
  202. package/package.json +16 -16
  203. package/src/batchTracker.ts +2 -2
  204. package/src/blobManager.ts +70 -13
  205. package/src/connectionTelemetry.ts +7 -3
  206. package/src/containerRuntime.ts +287 -150
  207. package/src/dataStore.ts +3 -0
  208. package/src/dataStoreContext.ts +31 -33
  209. package/src/dataStoreContexts.ts +2 -2
  210. package/src/dataStores.ts +15 -18
  211. package/src/deltaManagerSummarizerProxy.ts +2 -0
  212. package/src/deltaScheduler.ts +6 -10
  213. package/src/gc/garbageCollection.ts +13 -8
  214. package/src/gc/gcHelpers.ts +1 -0
  215. package/src/gc/gcTelemetry.ts +12 -8
  216. package/src/id-compressor/idCompressor.ts +6 -5
  217. package/src/opLifecycle/opCompressor.ts +4 -3
  218. package/src/opLifecycle/opDecompressor.ts +4 -3
  219. package/src/opLifecycle/opSplitter.ts +4 -3
  220. package/src/opLifecycle/outbox.ts +13 -25
  221. package/src/opLifecycle/remoteMessageProcessor.ts +8 -2
  222. package/src/packageVersion.ts +1 -1
  223. package/src/pendingStateManager.ts +22 -10
  224. package/src/scheduleManager.ts +2 -2
  225. package/src/summary/orderedClientElection.ts +2 -2
  226. package/src/summary/runningSummarizer.ts +18 -44
  227. package/src/summary/summarizer.ts +2 -2
  228. package/src/summary/summarizerNode/summarizerNode.ts +13 -15
  229. package/src/summary/summarizerNode/summarizerNodeWithGc.ts +8 -7
  230. package/src/summary/summaryGenerator.ts +6 -2
  231. package/src/summary/summaryManager.ts +9 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/container-runtime",
3
- "version": "2.0.0-internal.5.3.1",
3
+ "version": "2.0.0-internal.5.4.0",
4
4
  "description": "Fluid container runtime",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -37,18 +37,18 @@
37
37
  "dependencies": {
38
38
  "@fluidframework/common-definitions": "^0.20.1",
39
39
  "@fluidframework/common-utils": "^1.1.1",
40
- "@fluidframework/container-definitions": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
41
- "@fluidframework/container-runtime-definitions": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
42
- "@fluidframework/container-utils": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
43
- "@fluidframework/core-interfaces": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
44
- "@fluidframework/core-utils": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
45
- "@fluidframework/datastore": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
46
- "@fluidframework/driver-definitions": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
47
- "@fluidframework/driver-utils": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
40
+ "@fluidframework/container-definitions": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
41
+ "@fluidframework/container-runtime-definitions": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
42
+ "@fluidframework/container-utils": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
43
+ "@fluidframework/core-interfaces": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
44
+ "@fluidframework/core-utils": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
45
+ "@fluidframework/datastore": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
46
+ "@fluidframework/driver-definitions": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
47
+ "@fluidframework/driver-utils": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
48
48
  "@fluidframework/protocol-definitions": "^1.1.0",
49
- "@fluidframework/runtime-definitions": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
50
- "@fluidframework/runtime-utils": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
51
- "@fluidframework/telemetry-utils": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
49
+ "@fluidframework/runtime-definitions": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
50
+ "@fluidframework/runtime-utils": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
51
+ "@fluidframework/telemetry-utils": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
52
52
  "double-ended-queue": "^2.1.0-0",
53
53
  "events": "^3.1.0",
54
54
  "lz4js": "^0.2.0",
@@ -56,15 +56,15 @@
56
56
  "uuid": "^8.3.1"
57
57
  },
58
58
  "devDependencies": {
59
- "@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
59
+ "@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
60
60
  "@fluid-tools/benchmark": "^0.48.0",
61
61
  "@fluid-tools/build-cli": "^0.21.0",
62
62
  "@fluidframework/build-common": "^1.2.0",
63
63
  "@fluidframework/build-tools": "^0.21.0",
64
64
  "@fluidframework/container-runtime-previous": "npm:@fluidframework/container-runtime@2.0.0-internal.5.2.0",
65
65
  "@fluidframework/eslint-config-fluid": "^2.0.0",
66
- "@fluidframework/mocha-test-setup": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
67
- "@fluidframework/test-runtime-utils": ">=2.0.0-internal.5.3.1 <2.0.0-internal.5.4.0",
66
+ "@fluidframework/mocha-test-setup": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
67
+ "@fluidframework/test-runtime-utils": ">=2.0.0-internal.5.4.0 <2.0.0-internal.5.5.0",
68
68
  "@microsoft/api-extractor": "^7.34.4",
69
69
  "@types/double-ended-queue": "^2.1.0",
70
70
  "@types/events": "^3.0.0",
@@ -97,7 +97,7 @@
97
97
  "build:genver": "gen-version",
98
98
  "build:test": "tsc --project ./src/test/tsconfig.json",
99
99
  "ci:build:docs": "api-extractor run --typescript-compiler-folder ../../../node_modules/typescript && copyfiles -u 1 ./_api-extractor-temp/doc-models/* ../../../_api-extractor-temp/",
100
- "clean": "rimraf dist lib *.tsbuildinfo *.build.log",
100
+ "clean": "rimraf --glob \"dist\" \"lib\" \"*.tsbuildinfo\" \"*.build.log\"",
101
101
  "eslint": "eslint --format stylish src",
102
102
  "eslint:fix": "eslint --format stylish src --fix --fix-type problem,suggestion,layout",
103
103
  "format": "npm run prettier:fix",
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { EventEmitter } from "events";
7
- import { ITelemetryLoggerExt, ChildLogger } from "@fluidframework/telemetry-utils";
7
+ import { ITelemetryLoggerExt, createChildLogger } from "@fluidframework/telemetry-utils";
8
8
  import { assert, performance } from "@fluidframework/common-utils";
9
9
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
10
10
 
@@ -21,7 +21,7 @@ export class BatchTracker {
21
21
  batchCountSamplingRate: number,
22
22
  dateTimeProvider: () => number = () => performance.now(),
23
23
  ) {
24
- this.logger = ChildLogger.create(logger, "Batching");
24
+ this.logger = createChildLogger({ logger, namespace: "Batching" });
25
25
 
26
26
  this.batchEventEmitter.on("batchBegin", (message: ISequencedDocumentMessage) => {
27
27
  this.startBatchSequenceNumber = message.sequenceNumber;
@@ -30,8 +30,8 @@ import {
30
30
  } from "@fluidframework/container-runtime-definitions";
31
31
  import { AttachState, ICriticalContainerError } from "@fluidframework/container-definitions";
32
32
  import {
33
- ChildLogger,
34
- loggerToMonitoringContext,
33
+ LoggingError,
34
+ createChildMonitoringContext,
35
35
  MonitoringContext,
36
36
  PerformanceEvent,
37
37
  } from "@fluidframework/telemetry-utils";
@@ -124,7 +124,7 @@ export type IBlobManagerRuntime = Pick<
124
124
 
125
125
  // Note that while offline we "submit" an op before uploading the blob, but we always
126
126
  // expect blobs to be uploaded before we actually see the op round-trip
127
- enum PendingBlobStatus {
127
+ export enum PendingBlobStatus {
128
128
  OnlinePendingUpload,
129
129
  OnlinePendingOp,
130
130
  OfflinePendingUpload,
@@ -138,11 +138,13 @@ interface PendingBlob {
138
138
  status: PendingBlobStatus;
139
139
  storageId?: string;
140
140
  handleP: Deferred<BlobHandle>;
141
- uploadP?: Promise<ICreateBlobResponse>;
141
+ uploadP?: Promise<ICreateBlobResponse | void>;
142
142
  uploadTime?: number;
143
143
  minTTLInSeconds?: number;
144
144
  attached?: boolean;
145
145
  acked?: boolean;
146
+ abortSignal?: AbortSignal;
147
+ opsent?: boolean;
146
148
  }
147
149
 
148
150
  export interface IPendingBlobs {
@@ -232,7 +234,10 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
232
234
  private readonly closeContainer: (error?: ICriticalContainerError) => void,
233
235
  ) {
234
236
  super();
235
- this.mc = loggerToMonitoringContext(ChildLogger.create(this.runtime.logger, "BlobManager"));
237
+ this.mc = createChildMonitoringContext({
238
+ logger: this.runtime.logger,
239
+ namespace: "BlobManager",
240
+ });
236
241
  // Read the feature flag that tells whether to throw when a tombstone blob is requested.
237
242
  this.throwOnTombstoneLoad =
238
243
  this.mc.config.getBoolean(throwOnTombstoneLoadKey) === true &&
@@ -277,6 +282,11 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
277
282
 
278
283
  this.sendBlobAttachOp = (localId: string, blobId?: string) => {
279
284
  const pendingEntry = this.pendingBlobs.get(localId);
285
+ assert(
286
+ pendingEntry !== undefined,
287
+ 0x725 /* Must have pending blob entry for upcoming op */,
288
+ );
289
+ pendingEntry.opsent = true;
280
290
  if (pendingEntry?.uploadTime && pendingEntry?.minTTLInSeconds) {
281
291
  const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
282
292
  const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
@@ -324,6 +334,13 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
324
334
  );
325
335
  }
326
336
 
337
+ private createAbortError(pending?: PendingBlob) {
338
+ return new LoggingError("uploadBlob aborted", {
339
+ acked: pending?.acked,
340
+ status: pending?.status,
341
+ uploadTime: pending?.uploadTime,
342
+ });
343
+ }
327
344
  /**
328
345
  * Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
329
346
  */
@@ -441,7 +458,10 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
441
458
  return this.getBlobHandle(response.id);
442
459
  }
443
460
 
444
- public async createBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>> {
461
+ public async createBlob(
462
+ blob: ArrayBufferLike,
463
+ signal?: AbortSignal,
464
+ ): Promise<IFluidHandle<ArrayBufferLike>> {
445
465
  if (this.runtime.attachState === AttachState.Detached) {
446
466
  return this.createBlobDetached(blob);
447
467
  }
@@ -455,6 +475,10 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
455
475
  0x385 /* For clarity and paranoid defense against adding future attachment states */,
456
476
  );
457
477
 
478
+ if (signal?.aborted) {
479
+ throw this.createAbortError();
480
+ }
481
+
458
482
  // Create a local ID for the blob. After uploading it to storage and before returning it, a local ID to
459
483
  // storage ID mapping is created.
460
484
  const localId = uuid();
@@ -465,13 +489,27 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
465
489
  uploadP: this.uploadBlob(localId, blob),
466
490
  attached: false,
467
491
  acked: false,
492
+ abortSignal: signal,
493
+ opsent: false,
468
494
  };
469
495
  this.pendingBlobs.set(localId, pendingEntry);
470
496
 
471
- return pendingEntry.handleP.promise;
497
+ const abortListener = () => {
498
+ if (!pendingEntry.acked) {
499
+ pendingEntry.handleP.reject(this.createAbortError(pendingEntry));
500
+ }
501
+ };
502
+ signal?.addEventListener("abort", abortListener, { once: true });
503
+
504
+ return pendingEntry.handleP.promise.finally(() => {
505
+ signal?.removeEventListener("abort", abortListener);
506
+ });
472
507
  }
473
508
 
474
- private async uploadBlob(localId: string, blob: ArrayBufferLike): Promise<ICreateBlobResponse> {
509
+ private async uploadBlob(
510
+ localId: string,
511
+ blob: ArrayBufferLike,
512
+ ): Promise<ICreateBlobResponse | void> {
475
513
  return PerformanceEvent.timedExecAsync(
476
514
  this.mc.logger,
477
515
  { eventName: "createBlob" },
@@ -495,17 +533,24 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
495
533
  if (this.pendingBlobs.has(id)) {
496
534
  const entry = this.pendingBlobs.get(id);
497
535
  if (entry?.attached && entry?.acked) {
498
- this.pendingBlobs.delete(id);
499
- if (!this.hasPendingBlobs) {
500
- this.emit("noPendingBlobs");
501
- }
536
+ this.deletePendingBlob(id);
502
537
  }
503
538
  }
504
539
  }
505
540
 
541
+ private deletePendingBlob(id: string) {
542
+ if (this.pendingBlobs.delete(id) && !this.hasPendingBlobs) {
543
+ this.emit("noPendingBlobs");
544
+ }
545
+ }
546
+
506
547
  private onUploadResolve(localId: string, response: ICreateBlobResponseWithTTL) {
507
548
  const entry = this.pendingBlobs.get(localId);
508
549
  assert(entry !== undefined, 0x6c8 /* pending blob entry not found for uploaded blob */);
550
+ if (entry.abortSignal?.aborted === true && !entry.opsent) {
551
+ this.deletePendingBlob(localId);
552
+ return;
553
+ }
509
554
  assert(
510
555
  entry.status === PendingBlobStatus.OnlinePendingUpload ||
511
556
  entry.status === PendingBlobStatus.OfflinePendingUpload,
@@ -554,9 +599,13 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
554
599
  return response;
555
600
  }
556
601
 
557
- private async onUploadReject(localId: string, error) {
602
+ private async onUploadReject(localId: string, error: any) {
558
603
  const entry = this.pendingBlobs.get(localId);
559
604
  assert(!!entry, 0x387 /* Must have pending blob entry for blob which failed to upload */);
605
+ if (entry.abortSignal?.aborted === true && !entry.opsent) {
606
+ this.deletePendingBlob(localId);
607
+ return;
608
+ }
560
609
  if (!this.runtime.connected) {
561
610
  if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
562
611
  this.transitionToOffline(localId);
@@ -631,6 +680,14 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
631
680
  public processBlobAttachOp(message: ISequencedDocumentMessage, local: boolean) {
632
681
  const localId = (message.metadata as IBlobMetadata | undefined)?.localId;
633
682
  const blobId = (message.metadata as IBlobMetadata | undefined)?.blobId;
683
+
684
+ if (localId) {
685
+ const pendingEntry = this.pendingBlobs.get(localId);
686
+ if (pendingEntry?.abortSignal?.aborted) {
687
+ this.deletePendingBlob(localId);
688
+ return;
689
+ }
690
+ }
634
691
  assert(blobId !== undefined, 0x12a /* "Missing blob id on metadata" */);
635
692
 
636
693
  // Set up a mapping from local ID to storage ID. This is crucial since without this the blob cannot be
@@ -3,7 +3,11 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { ITelemetryLoggerExt, ChildLogger, TelemetryLogger } from "@fluidframework/telemetry-utils";
6
+ import {
7
+ ITelemetryLoggerExt,
8
+ createChildLogger,
9
+ formatTick,
10
+ } from "@fluidframework/telemetry-utils";
7
11
  import { IDeltaManager } from "@fluidframework/container-definitions";
8
12
  import {
9
13
  IDocumentMessage,
@@ -75,7 +79,7 @@ class OpPerfTelemetry {
75
79
  private readonly deltaManager: IDeltaManager<ISequencedDocumentMessage, IDocumentMessage>,
76
80
  logger: ITelemetryLoggerExt,
77
81
  ) {
78
- this.logger = ChildLogger.create(logger, "OpPerf");
82
+ this.logger = createChildLogger({ logger, namespace: "OpPerf" });
79
83
 
80
84
  this.deltaManager.on("pong", (latency) => this.recordPingTime(latency));
81
85
  this.deltaManager.on("submitOp", (message) => this.beforeOpSubmit(message));
@@ -179,7 +183,7 @@ class OpPerfTelemetry {
179
183
  ops: this.gap,
180
184
  // track time to connect only for first connection.
181
185
  timeToConnect: this.firstConnection
182
- ? TelemetryLogger.formatTick(this.connectionStartTime - this.bootTime)
186
+ ? formatTick(this.connectionStartTime - this.bootTime)
183
187
  : undefined,
184
188
  firstConnection: this.firstConnection,
185
189
  });