@fluidframework/container-runtime 2.0.0-internal.5.3.4 → 2.0.0-internal.5.4.2
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.
- package/CHANGELOG.md +9 -0
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +1 -1
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +9 -1
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +55 -12
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +2 -2
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +43 -11
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +189 -137
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +3 -0
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +1 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +24 -27
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.js +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStores.d.ts +1 -1
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +14 -24
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +2 -0
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +5 -5
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +12 -5
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts +1 -0
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +1 -0
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +15 -22
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/id-compressor/idCompressor.d.ts +3 -3
- package/dist/id-compressor/idCompressor.d.ts.map +1 -1
- package/dist/id-compressor/idCompressor.js +3 -1
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts +2 -2
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +1 -1
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +2 -2
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +1 -1
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +2 -2
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +1 -1
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +6 -5
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +5 -12
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +7 -1
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/pendingStateManager.d.ts +4 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +21 -12
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +1 -1
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +1 -1
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +3 -5
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +10 -28
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.js +1 -1
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +5 -5
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +7 -10
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +4 -8
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +5 -1
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +2 -3
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +6 -2
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +9 -1
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +55 -12
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +43 -11
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +188 -137
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +3 -0
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +1 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +26 -29
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.js +2 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStores.d.ts +1 -1
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +15 -25
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.d.ts.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js +2 -0
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +6 -6
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +13 -6
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts +1 -0
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +1 -0
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +16 -23
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/id-compressor/idCompressor.d.ts +3 -3
- package/lib/id-compressor/idCompressor.d.ts.map +1 -1
- package/lib/id-compressor/idCompressor.js +3 -1
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts +2 -2
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -2
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +2 -2
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +2 -2
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +2 -2
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +2 -2
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +6 -5
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +6 -13
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +6 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +7 -1
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +4 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +21 -12
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +2 -2
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +2 -2
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +3 -5
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +11 -29
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.js +2 -2
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +5 -5
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +8 -11
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +4 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +5 -9
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +6 -2
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +2 -3
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +7 -3
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +16 -16
- package/src/batchTracker.ts +2 -2
- package/src/blobManager.ts +70 -13
- package/src/connectionTelemetry.ts +7 -3
- package/src/containerRuntime.ts +287 -150
- package/src/dataStore.ts +3 -0
- package/src/dataStoreContext.ts +31 -33
- package/src/dataStoreContexts.ts +2 -2
- package/src/dataStores.ts +15 -18
- package/src/deltaManagerSummarizerProxy.ts +2 -0
- package/src/deltaScheduler.ts +6 -10
- package/src/gc/garbageCollection.ts +13 -8
- package/src/gc/gcHelpers.ts +1 -0
- package/src/gc/gcTelemetry.ts +12 -8
- package/src/id-compressor/idCompressor.ts +6 -5
- package/src/opLifecycle/opCompressor.ts +4 -3
- package/src/opLifecycle/opDecompressor.ts +4 -3
- package/src/opLifecycle/opSplitter.ts +4 -3
- package/src/opLifecycle/outbox.ts +13 -25
- package/src/opLifecycle/remoteMessageProcessor.ts +8 -2
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +22 -10
- package/src/scheduleManager.ts +2 -2
- package/src/summary/orderedClientElection.ts +2 -2
- package/src/summary/runningSummarizer.ts +18 -44
- package/src/summary/summarizer.ts +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +13 -15
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +8 -7
- package/src/summary/summaryGenerator.ts +6 -2
- 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
|
+
"version": "2.0.0-internal.5.4.2",
|
|
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.
|
|
41
|
-
"@fluidframework/container-runtime-definitions": ">=2.0.0-internal.5.
|
|
42
|
-
"@fluidframework/container-utils": ">=2.0.0-internal.5.
|
|
43
|
-
"@fluidframework/core-interfaces": ">=2.0.0-internal.5.
|
|
44
|
-
"@fluidframework/core-utils": ">=2.0.0-internal.5.
|
|
45
|
-
"@fluidframework/datastore": ">=2.0.0-internal.5.
|
|
46
|
-
"@fluidframework/driver-definitions": ">=2.0.0-internal.5.
|
|
47
|
-
"@fluidframework/driver-utils": ">=2.0.0-internal.5.
|
|
40
|
+
"@fluidframework/container-definitions": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
41
|
+
"@fluidframework/container-runtime-definitions": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
42
|
+
"@fluidframework/container-utils": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
43
|
+
"@fluidframework/core-interfaces": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
44
|
+
"@fluidframework/core-utils": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
45
|
+
"@fluidframework/datastore": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
46
|
+
"@fluidframework/driver-definitions": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
47
|
+
"@fluidframework/driver-utils": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
48
48
|
"@fluidframework/protocol-definitions": "^1.1.0",
|
|
49
|
-
"@fluidframework/runtime-definitions": ">=2.0.0-internal.5.
|
|
50
|
-
"@fluidframework/runtime-utils": ">=2.0.0-internal.5.
|
|
51
|
-
"@fluidframework/telemetry-utils": ">=2.0.0-internal.5.
|
|
49
|
+
"@fluidframework/runtime-definitions": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
50
|
+
"@fluidframework/runtime-utils": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
51
|
+
"@fluidframework/telemetry-utils": ">=2.0.0-internal.5.4.2 <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.
|
|
59
|
+
"@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.5.4.2 <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.
|
|
67
|
-
"@fluidframework/test-runtime-utils": ">=2.0.0-internal.5.
|
|
66
|
+
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.5.4.2 <2.0.0-internal.5.5.0",
|
|
67
|
+
"@fluidframework/test-runtime-utils": ">=2.0.0-internal.5.4.2 <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",
|
package/src/batchTracker.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { EventEmitter } from "events";
|
|
7
|
-
import { ITelemetryLoggerExt,
|
|
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 =
|
|
24
|
+
this.logger = createChildLogger({ logger, namespace: "Batching" });
|
|
25
25
|
|
|
26
26
|
this.batchEventEmitter.on("batchBegin", (message: ISequencedDocumentMessage) => {
|
|
27
27
|
this.startBatchSequenceNumber = message.sequenceNumber;
|
package/src/blobManager.ts
CHANGED
|
@@ -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
|
-
|
|
34
|
-
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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.
|
|
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 {
|
|
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 =
|
|
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
|
-
?
|
|
186
|
+
? formatTick(this.connectionStartTime - this.bootTime)
|
|
183
187
|
: undefined,
|
|
184
188
|
firstConnection: this.firstConnection,
|
|
185
189
|
});
|