@fluidframework/container-runtime 2.0.0-internal.6.2.0 → 2.0.0-internal.6.3.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.
- package/CHANGELOG.md +4 -0
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +4 -3
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +1 -2
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +81 -69
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +13 -12
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +18 -3
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +185 -145
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +3 -3
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +2 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +36 -36
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js +7 -8
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +19 -20
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerProxyBase.d.ts +1 -1
- package/dist/deltaManagerProxyBase.js +2 -2
- package/dist/deltaManagerProxyBase.js.map +1 -1
- package/dist/deltaScheduler.js +6 -6
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +3 -5
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +4 -21
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +2 -2
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.js +7 -7
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +4 -7
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +15 -52
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +4 -4
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +1 -2
- package/dist/gc/index.js.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.js +2 -2
- package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/finalSpace.js +2 -2
- package/dist/id-compressor/finalSpace.js.map +1 -1
- package/dist/id-compressor/idCompressor.d.ts.map +1 -1
- package/dist/id-compressor/idCompressor.js +16 -15
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/sessions.js +5 -5
- package/dist/id-compressor/sessions.js.map +1 -1
- package/dist/id-compressor/utilities.js +2 -2
- package/dist/id-compressor/utilities.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +4 -3
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +11 -10
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +3 -3
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.js +12 -12
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.js +6 -6
- package/dist/opLifecycle/outbox.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.map +1 -1
- package/dist/pendingStateManager.js +12 -13
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +19 -18
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/index.d.ts +1 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +1 -1
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +6 -5
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +3 -3
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +1 -1
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +13 -12
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +1 -1
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +4 -3
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +1 -1
- package/dist/summary/summarizerClientElection.js +2 -2
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +2 -2
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/index.d.ts +1 -1
- package/dist/summary/summarizerNode/index.d.ts.map +1 -1
- package/dist/summary/summarizerNode/index.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +5 -14
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +32 -109
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +0 -11
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +5 -88
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +1 -1
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +9 -8
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.js +2 -2
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +10 -10
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +9 -8
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -1
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +1 -2
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +52 -40
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +2 -1
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +18 -3
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +147 -107
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +1 -1
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +2 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +2 -2
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js +1 -2
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +1 -2
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerProxyBase.d.ts +1 -1
- package/lib/deltaManagerProxyBase.js +1 -1
- package/lib/deltaManagerProxyBase.js.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +3 -5
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +5 -22
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +2 -2
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.js +1 -1
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +4 -7
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +16 -53
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +1 -1
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +1 -1
- package/lib/gc/index.js.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.js +1 -1
- package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/finalSpace.js +1 -1
- package/lib/id-compressor/finalSpace.js.map +1 -1
- package/lib/id-compressor/idCompressor.d.ts.map +1 -1
- package/lib/id-compressor/idCompressor.js +2 -1
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/sessions.js +1 -1
- package/lib/id-compressor/sessions.js.map +1 -1
- package/lib/id-compressor/utilities.js +1 -1
- package/lib/id-compressor/utilities.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -1
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +2 -1
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +1 -1
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.js +1 -1
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.js +1 -1
- package/lib/opLifecycle/outbox.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.map +1 -1
- package/lib/pendingStateManager.js +1 -2
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +2 -1
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/index.d.ts +1 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +1 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +2 -1
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +1 -1
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +5 -4
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +1 -1
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +2 -1
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +1 -1
- package/lib/summary/summarizerClientElection.js +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/index.d.ts +1 -1
- package/lib/summary/summarizerNode/index.d.ts.map +1 -1
- package/lib/summary/summarizerNode/index.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +5 -14
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +16 -93
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +6 -30
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +0 -11
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -86
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +1 -1
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +2 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.js +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +3 -3
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +4 -3
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +22 -24
- package/src/batchTracker.ts +2 -1
- package/src/blobManager.ts +57 -48
- package/src/connectionTelemetry.ts +2 -1
- package/src/containerRuntime.ts +207 -166
- package/src/dataStore.ts +1 -1
- package/src/dataStoreContext.ts +2 -2
- package/src/dataStoreContexts.ts +1 -2
- package/src/dataStores.ts +1 -2
- package/src/deltaManagerProxyBase.ts +1 -1
- package/src/deltaScheduler.ts +1 -1
- package/src/gc/garbageCollection.ts +6 -41
- package/src/gc/gcDefinitions.ts +2 -6
- package/src/gc/gcHelpers.ts +1 -1
- package/src/gc/gcSummaryStateTracker.ts +19 -65
- package/src/gc/gcUnreferencedStateTracker.ts +1 -1
- package/src/gc/index.ts +0 -1
- package/src/id-compressor/appendOnlySortedMap.ts +1 -1
- package/src/id-compressor/finalSpace.ts +1 -1
- package/src/id-compressor/idCompressor.ts +2 -1
- package/src/id-compressor/sessions.ts +1 -1
- package/src/id-compressor/utilities.ts +1 -1
- package/src/opLifecycle/opCompressor.ts +2 -1
- package/src/opLifecycle/opDecompressor.ts +2 -1
- package/src/opLifecycle/opGroupingManager.ts +1 -1
- package/src/opLifecycle/opSplitter.ts +1 -1
- package/src/opLifecycle/outbox.ts +1 -1
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +1 -2
- package/src/scheduleManager.ts +2 -1
- package/src/summary/index.ts +1 -2
- package/src/summary/orderedClientElection.ts +2 -1
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +5 -10
- package/src/summary/summarizer.ts +2 -1
- package/src/summary/summarizerClientElection.ts +1 -1
- package/src/summary/summarizerHeuristics.ts +1 -1
- package/src/summary/summarizerNode/index.ts +1 -2
- package/src/summary/summarizerNode/summarizerNode.ts +23 -145
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +7 -38
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +3 -123
- package/src/summary/summaryCollection.ts +2 -1
- package/src/summary/summaryFormat.ts +1 -1
- package/src/summary/summaryGenerator.ts +3 -3
- package/src/summary/summaryManager.ts +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batchTracker.d.ts","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"batchTracker.d.ts","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,iCAAiC,CAAC;AAIzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE,qBAAa,YAAY;IAOvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,6BAA6B,CAAqB;gBAGxC,iBAAiB,EAAE,YAAY,EAChD,MAAM,EAAE,oBAAoB,EAC5B,oBAAoB,EAAE,MAAM,EAC5B,sBAAsB,EAAE,MAAM,EAC9B,gBAAgB,GAAE,MAAM,MAAgC;CA8CzD;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,sBACT,YAAY,UACvB,mBAAmB,yBACL,MAAM,2BACJ,MAAM,iBAC+D,CAAC"}
|
package/dist/batchTracker.js
CHANGED
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.BindBatchTracker = exports.BatchTracker = void 0;
|
|
8
8
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
9
|
-
const
|
|
9
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
10
|
+
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
10
11
|
class BatchTracker {
|
|
11
|
-
constructor(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate, dateTimeProvider = () =>
|
|
12
|
+
constructor(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate, dateTimeProvider = () => client_utils_1.performance.now()) {
|
|
12
13
|
this.batchEventEmitter = batchEventEmitter;
|
|
13
14
|
this.trackedBatchCount = 0;
|
|
14
15
|
this.logger = (0, telemetry_utils_1.createChildLogger)({ logger, namespace: "Batching" });
|
|
@@ -18,7 +19,7 @@ class BatchTracker {
|
|
|
18
19
|
this.trackedBatchCount++;
|
|
19
20
|
});
|
|
20
21
|
this.batchEventEmitter.on("batchEnd", (error, message) => {
|
|
21
|
-
(0,
|
|
22
|
+
(0, core_utils_1.assert)(this.startBatchSequenceNumber !== undefined &&
|
|
22
23
|
this.batchProcessingStartTimeStamp !== undefined, 0x2ba /* "batchBegin must fire before batchEnd" */);
|
|
23
24
|
const length = message.sequenceNumber - this.startBatchSequenceNumber + 1;
|
|
24
25
|
if (length >= batchLengthThreshold) {
|
package/dist/batchTracker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batchTracker.js","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qEAAyF;AACzF,+
|
|
1
|
+
{"version":3,"file":"batchTracker.js","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qEAAyF;AACzF,2DAAoD;AACpD,+DAA2D;AAI3D,MAAa,YAAY;IAMxB,YACkB,iBAA+B,EAChD,MAA4B,EAC5B,oBAA4B,EAC5B,sBAA8B,EAC9B,mBAAiC,GAAG,EAAE,CAAC,0BAAW,CAAC,GAAG,EAAE;QAJvC,sBAAiB,GAAjB,iBAAiB,CAAc;QAJzC,sBAAiB,GAAW,CAAC,CAAC;QAUrC,IAAI,CAAC,MAAM,GAAG,IAAA,mCAAiB,EAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAkC,EAAE,EAAE;YAC9E,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;YACvD,IAAI,CAAC,6BAA6B,GAAG,gBAAgB,EAAE,CAAC;YACxD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CACxB,UAAU,EACV,CAAC,KAAsB,EAAE,OAAkC,EAAE,EAAE;YAC9D,IAAA,mBAAM,EACL,IAAI,CAAC,wBAAwB,KAAK,SAAS;gBAC1C,IAAI,CAAC,6BAA6B,KAAK,SAAS,EACjD,KAAK,CAAC,4CAA4C,CAClD,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;YAC1E,IAAI,MAAM,IAAI,oBAAoB,EAAE;gBACnC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAChC,SAAS,EAAE,cAAc;oBACzB,MAAM;oBACN,SAAS,EAAE,oBAAoB;oBAC/B,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;oBACjE,UAAU,EAAE,KAAK,KAAK,SAAS;iBAC/B,CAAC,CAAC;aACH;YAED,IAAI,IAAI,CAAC,iBAAiB,GAAG,sBAAsB,KAAK,CAAC,EAAE;gBAC1D,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAChC,SAAS,EAAE,QAAQ;oBACnB,MAAM;oBACN,YAAY,EAAE,sBAAsB;oBACpC,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;iBACjE,CAAC,CAAC;aACH;YAED,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,6BAA6B,GAAG,SAAS,CAAC;QAChD,CAAC,CACD,CAAC;IACH,CAAC;CACD;AAzDD,oCAyDC;AAED;;;;;;;GAOG;AACI,MAAM,gBAAgB,GAAG,CAC/B,iBAA+B,EAC/B,MAA2B,EAC3B,uBAA+B,IAAI,EACnC,yBAAiC,IAAI,EACpC,EAAE,CAAC,IAAI,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;AALlF,QAAA,gBAAgB,oBAKkE","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventEmitter } from \"events\";\nimport { ITelemetryLoggerExt, createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\n\nexport class BatchTracker {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate startBatchSequenceNumber: number | undefined;\n\tprivate trackedBatchCount: number = 0;\n\tprivate batchProcessingStartTimeStamp: number | undefined;\n\n\tconstructor(\n\t\tprivate readonly batchEventEmitter: EventEmitter,\n\t\tlogger: ITelemetryBaseLogger,\n\t\tbatchLengthThreshold: number,\n\t\tbatchCountSamplingRate: number,\n\t\tdateTimeProvider: () => number = () => performance.now(),\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Batching\" });\n\n\t\tthis.batchEventEmitter.on(\"batchBegin\", (message: ISequencedDocumentMessage) => {\n\t\t\tthis.startBatchSequenceNumber = message.sequenceNumber;\n\t\t\tthis.batchProcessingStartTimeStamp = dateTimeProvider();\n\t\t\tthis.trackedBatchCount++;\n\t\t});\n\n\t\tthis.batchEventEmitter.on(\n\t\t\t\"batchEnd\",\n\t\t\t(error: any | undefined, message: ISequencedDocumentMessage) => {\n\t\t\t\tassert(\n\t\t\t\t\tthis.startBatchSequenceNumber !== undefined &&\n\t\t\t\t\t\tthis.batchProcessingStartTimeStamp !== undefined,\n\t\t\t\t\t0x2ba /* \"batchBegin must fire before batchEnd\" */,\n\t\t\t\t);\n\n\t\t\t\tconst length = message.sequenceNumber - this.startBatchSequenceNumber + 1;\n\t\t\t\tif (length >= batchLengthThreshold) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"LengthTooBig\",\n\t\t\t\t\t\tlength,\n\t\t\t\t\t\tthreshold: batchLengthThreshold,\n\t\t\t\t\t\tbatchEndSequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\tduration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n\t\t\t\t\t\tbatchError: error !== undefined,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this.trackedBatchCount % batchCountSamplingRate === 0) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"Length\",\n\t\t\t\t\t\tlength,\n\t\t\t\t\t\tsamplingRate: batchCountSamplingRate,\n\t\t\t\t\t\tbatchEndSequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\tduration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.startBatchSequenceNumber = undefined;\n\t\t\t\tthis.batchProcessingStartTimeStamp = undefined;\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Track batch sizes in terms of op counts and processing times\n *\n * @param batchEventEmitter - event emitter which tracks the lifecycle of batch operations\n * @param logger - See {@link @fluidframework/core-interfaces#ITelemetryLoggerExt}\n * @param batchLengthThreshold - threshold for the length of a batch when to send an error event\n * @param batchCountSamplingRate - rate for batches for which to send an event with its characteristics\n */\nexport const BindBatchTracker = (\n\tbatchEventEmitter: EventEmitter,\n\tlogger: ITelemetryLoggerExt,\n\tbatchLengthThreshold: number = 1000,\n\tbatchCountSamplingRate: number = 1000,\n) => new BatchTracker(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate);\n"]}
|
package/dist/blobManager.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { IFluidHandle, IFluidHandleContext } from "@fluidframework/core-interfaces";
|
|
6
6
|
import { IDocumentStorageService } from "@fluidframework/driver-definitions";
|
|
7
7
|
import { ISequencedDocumentMessage, ISnapshotTree } from "@fluidframework/protocol-definitions";
|
|
8
|
-
import { TypedEventEmitter } from "@
|
|
8
|
+
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
9
9
|
import { IContainerRuntime, IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions";
|
|
10
10
|
import { ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
11
11
|
import { IGarbageCollectionData, ISummaryTreeWithStats, ITelemetryContext } from "@fluidframework/runtime-definitions";
|
|
@@ -107,7 +107,6 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
107
107
|
* Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
|
|
108
108
|
*/
|
|
109
109
|
processStashedChanges(): Promise<void>;
|
|
110
|
-
private stashPendingBlobs;
|
|
111
110
|
/**
|
|
112
111
|
* Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
|
|
113
112
|
* detached or there are no (non-pending) attachment blobs in the document
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobManager.d.ts","sourceRoot":"","sources":["../src/blobManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAEN,yBAAyB,EACzB,aAAa,EACb,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"blobManager.d.ts","sourceRoot":"","sources":["../src/blobManager.ts"],"names":[],"mappings":"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"}
|
package/dist/blobManager.js
CHANGED
|
@@ -7,7 +7,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.BlobManager = exports.BlobHandle = void 0;
|
|
8
8
|
const uuid_1 = require("uuid");
|
|
9
9
|
const runtime_utils_1 = require("@fluidframework/runtime-utils");
|
|
10
|
-
const
|
|
10
|
+
const core_utils_1 = require("@fluidframework/core-utils");
|
|
11
|
+
const client_utils_1 = require("@fluid-internal/client-utils");
|
|
11
12
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
12
13
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
13
14
|
const containerRuntime_1 = require("./containerRuntime");
|
|
@@ -50,7 +51,7 @@ exports.BlobHandle = BlobHandle;
|
|
|
50
51
|
class CancellableThrottler {
|
|
51
52
|
constructor(throttler) {
|
|
52
53
|
this.throttler = throttler;
|
|
53
|
-
this.cancelP = new
|
|
54
|
+
this.cancelP = new core_utils_1.Deferred();
|
|
54
55
|
}
|
|
55
56
|
async getDelay() {
|
|
56
57
|
return Promise.race([
|
|
@@ -60,10 +61,10 @@ class CancellableThrottler {
|
|
|
60
61
|
}
|
|
61
62
|
cancel() {
|
|
62
63
|
this.cancelP.resolve();
|
|
63
|
-
this.cancelP = new
|
|
64
|
+
this.cancelP = new core_utils_1.Deferred();
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
|
-
class BlobManager extends
|
|
67
|
+
class BlobManager extends client_utils_1.TypedEventEmitter {
|
|
67
68
|
constructor(routeContext, snapshot, getStorage,
|
|
68
69
|
/**
|
|
69
70
|
* Submit a BlobAttach op. When a blob is uploaded, there is a short grace period before which the blob is
|
|
@@ -120,7 +121,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
120
121
|
this.redirectTable = this.load(snapshot);
|
|
121
122
|
// Begin uploading stashed blobs from previous container instance
|
|
122
123
|
Object.entries(stashedBlobs).forEach(([localId, entry]) => {
|
|
123
|
-
const blob = (0,
|
|
124
|
+
const blob = (0, client_utils_1.stringToBuffer)(entry.blob, "base64");
|
|
124
125
|
const attached = entry.attached;
|
|
125
126
|
const acked = entry.acked;
|
|
126
127
|
const storageId = entry.storageId; // entry.storageId = response.id
|
|
@@ -132,7 +133,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
132
133
|
blob,
|
|
133
134
|
uploading: false,
|
|
134
135
|
opsent: true,
|
|
135
|
-
handleP: new
|
|
136
|
+
handleP: new core_utils_1.Deferred(),
|
|
136
137
|
storageId,
|
|
137
138
|
uploadP: undefined,
|
|
138
139
|
uploadTime: entry.uploadTime,
|
|
@@ -146,7 +147,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
146
147
|
this.pendingBlobs.set(localId, {
|
|
147
148
|
blob,
|
|
148
149
|
uploading: true,
|
|
149
|
-
handleP: new
|
|
150
|
+
handleP: new core_utils_1.Deferred(),
|
|
150
151
|
uploadP: this.uploadBlob(localId, blob),
|
|
151
152
|
attached,
|
|
152
153
|
acked,
|
|
@@ -155,7 +156,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
155
156
|
});
|
|
156
157
|
this.sendBlobAttachOp = (localId, blobId) => {
|
|
157
158
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
158
|
-
(0,
|
|
159
|
+
(0, core_utils_1.assert)(pendingEntry !== undefined, 0x725 /* Must have pending blob entry for upcoming op */);
|
|
159
160
|
if (pendingEntry?.uploadTime && pendingEntry?.minTTLInSeconds) {
|
|
160
161
|
const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
|
|
161
162
|
const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
|
|
@@ -209,24 +210,6 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
209
210
|
count: pendingUploads.length,
|
|
210
211
|
}, async () => Promise.all(pendingUploads), { start: true, end: true });
|
|
211
212
|
}
|
|
212
|
-
async stashPendingBlobs() {
|
|
213
|
-
for (const [localId, entry] of this.pendingBlobs) {
|
|
214
|
-
if (!entry.opsent) {
|
|
215
|
-
this.sendBlobAttachOp(localId, entry.storageId);
|
|
216
|
-
}
|
|
217
|
-
entry.handleP.resolve(this.getBlobHandle(localId));
|
|
218
|
-
}
|
|
219
|
-
return new Promise((resolve) => {
|
|
220
|
-
if (this.allBlobsAttached) {
|
|
221
|
-
resolve();
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
this.once("allBlobsAttached", () => {
|
|
225
|
-
resolve();
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
213
|
/**
|
|
231
214
|
* Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
|
|
232
215
|
* detached or there are no (non-pending) attachment blobs in the document
|
|
@@ -237,7 +220,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
237
220
|
const undefinedValueInTable = ids.delete(undefined);
|
|
238
221
|
// For a detached container, entries are inserted into the redirect table with an undefined storage ID.
|
|
239
222
|
// For an attached container, entries are inserted w/storage ID after the BlobAttach op round-trips.
|
|
240
|
-
(0,
|
|
223
|
+
(0, core_utils_1.assert)(!undefinedValueInTable ||
|
|
241
224
|
(this.runtime.attachState === container_definitions_1.AttachState.Detached && ids.size === 0), 0x382 /* 'redirectTable' must contain only undefined while detached / defined values while attached */);
|
|
242
225
|
return ids;
|
|
243
226
|
}
|
|
@@ -251,14 +234,14 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
251
234
|
}
|
|
252
235
|
let storageId;
|
|
253
236
|
if (this.runtime.attachState === container_definitions_1.AttachState.Detached) {
|
|
254
|
-
(0,
|
|
237
|
+
(0, core_utils_1.assert)(this.redirectTable.has(blobId), 0x383 /* requesting unknown blobs */);
|
|
255
238
|
// Blobs created while the container is detached are stored in IDetachedBlobStorage.
|
|
256
239
|
// The 'IDocumentStorageService.readBlob()' call below will retrieve these via localId.
|
|
257
240
|
storageId = blobId;
|
|
258
241
|
}
|
|
259
242
|
else {
|
|
260
243
|
const attachedStorageId = this.redirectTable.get(blobId);
|
|
261
|
-
(0,
|
|
244
|
+
(0, core_utils_1.assert)(!!attachedStorageId, 0x11f /* "requesting unknown blobs" */);
|
|
262
245
|
storageId = attachedStorageId;
|
|
263
246
|
}
|
|
264
247
|
// Let runtime know that the corresponding GC node was requested.
|
|
@@ -268,15 +251,13 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
268
251
|
}, { end: true, cancel: "error" });
|
|
269
252
|
}
|
|
270
253
|
getBlobHandle(id) {
|
|
271
|
-
(0,
|
|
254
|
+
(0, core_utils_1.assert)(this.redirectTable.has(id) || this.pendingBlobs.has(id), 0x384 /* requesting handle for unknown blob */);
|
|
272
255
|
const pending = this.pendingBlobs.get(id);
|
|
273
256
|
const callback = pending
|
|
274
257
|
? () => {
|
|
275
258
|
pending.attached = true;
|
|
259
|
+
this.emit("blobAttached", pending);
|
|
276
260
|
this.deletePendingBlobMaybe(id);
|
|
277
|
-
if (this.allBlobsAttached) {
|
|
278
|
-
this.emit("allBlobsAttached");
|
|
279
|
-
}
|
|
280
261
|
}
|
|
281
262
|
: undefined;
|
|
282
263
|
return new BlobHandle(`${BlobManager.basePath}/${id}`, this.routeContext, async () => this.getBlob(id), callback);
|
|
@@ -297,7 +278,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
297
278
|
this.mc.logger.sendTelemetryEvent({ eventName: "CreateBlobWhileAttaching" });
|
|
298
279
|
await new Promise((resolve) => this.runtime.once("attached", resolve));
|
|
299
280
|
}
|
|
300
|
-
(0,
|
|
281
|
+
(0, core_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Attached, 0x385 /* For clarity and paranoid defense against adding future attachment states */);
|
|
301
282
|
if (signal?.aborted) {
|
|
302
283
|
throw this.createAbortError();
|
|
303
284
|
}
|
|
@@ -307,7 +288,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
307
288
|
const pendingEntry = {
|
|
308
289
|
blob,
|
|
309
290
|
uploading: true,
|
|
310
|
-
handleP: new
|
|
291
|
+
handleP: new core_utils_1.Deferred(),
|
|
311
292
|
uploadP: this.uploadBlob(localId, blob),
|
|
312
293
|
attached: false,
|
|
313
294
|
acked: false,
|
|
@@ -350,12 +331,12 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
350
331
|
}
|
|
351
332
|
onUploadResolve(localId, response) {
|
|
352
333
|
const entry = this.pendingBlobs.get(localId);
|
|
353
|
-
(0,
|
|
334
|
+
(0, core_utils_1.assert)(entry !== undefined, 0x6c8 /* pending blob entry not found for uploaded blob */);
|
|
354
335
|
if (entry.abortSignal?.aborted === true && !entry.opsent) {
|
|
355
336
|
this.deletePendingBlob(localId);
|
|
356
337
|
return;
|
|
357
338
|
}
|
|
358
|
-
(0,
|
|
339
|
+
(0, core_utils_1.assert)(entry.uploading === true, 0x386 /* Must have pending blob entry for uploaded blob */);
|
|
359
340
|
entry.storageId = response.id;
|
|
360
341
|
entry.uploadTime = Date.now();
|
|
361
342
|
entry.minTTLInSeconds = response.minTTLInSeconds;
|
|
@@ -385,7 +366,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
385
366
|
}
|
|
386
367
|
async onUploadReject(localId, error) {
|
|
387
368
|
const entry = this.pendingBlobs.get(localId);
|
|
388
|
-
(0,
|
|
369
|
+
(0, core_utils_1.assert)(!!entry, 0x387 /* Must have pending blob entry for blob which failed to upload */);
|
|
389
370
|
if (entry.abortSignal?.aborted === true && !entry.opsent) {
|
|
390
371
|
this.deletePendingBlob(localId);
|
|
391
372
|
return;
|
|
@@ -408,13 +389,13 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
408
389
|
* @param metadata - op metadata containing storage and/or local IDs
|
|
409
390
|
*/
|
|
410
391
|
reSubmit(metadata) {
|
|
411
|
-
(0,
|
|
392
|
+
(0, core_utils_1.assert)(!!metadata, 0x38b /* Resubmitted ops must have metadata */);
|
|
412
393
|
const { localId, blobId } = metadata;
|
|
413
|
-
(0,
|
|
394
|
+
(0, core_utils_1.assert)(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
|
|
414
395
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
415
396
|
if (!blobId) {
|
|
416
397
|
// We submitted this op while offline. The blob should have been uploaded by now.
|
|
417
|
-
(0,
|
|
398
|
+
(0, core_utils_1.assert)(pendingEntry?.opsent === true && !!pendingEntry?.storageId, 0x38d /* blob must be uploaded before resubmitting BlobAttach op */);
|
|
418
399
|
return this.sendBlobAttachOp(localId, pendingEntry?.storageId);
|
|
419
400
|
}
|
|
420
401
|
return this.sendBlobAttachOp(localId, blobId);
|
|
@@ -429,7 +410,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
429
410
|
return;
|
|
430
411
|
}
|
|
431
412
|
}
|
|
432
|
-
(0,
|
|
413
|
+
(0, core_utils_1.assert)(blobId !== undefined, 0x12a /* "Missing blob id on metadata" */);
|
|
433
414
|
// Set up a mapping from local ID to storage ID. This is crucial since without this the blob cannot be
|
|
434
415
|
// requested from the server.
|
|
435
416
|
// Note: The check for undefined is needed for back-compat when localId was not part of the BlobAttach op that
|
|
@@ -440,7 +421,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
440
421
|
// set identity (id -> id) entry
|
|
441
422
|
this.setRedirection(blobId, blobId);
|
|
442
423
|
if (local) {
|
|
443
|
-
(0,
|
|
424
|
+
(0, core_utils_1.assert)(localId !== undefined, 0x50e /* local ID not present in blob attach message */);
|
|
444
425
|
const waitingBlobs = this.opsInFlight.get(blobId);
|
|
445
426
|
if (waitingBlobs !== undefined) {
|
|
446
427
|
// For each op corresponding to this storage ID that we are waiting for, resolve the pending blob.
|
|
@@ -448,7 +429,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
448
429
|
// storage ID is already in flight and any op containing this local ID will be sequenced after that.
|
|
449
430
|
waitingBlobs.forEach((pendingLocalId) => {
|
|
450
431
|
const entry = this.pendingBlobs.get(pendingLocalId);
|
|
451
|
-
(0,
|
|
432
|
+
(0, core_utils_1.assert)(entry !== undefined, 0x38f /* local online BlobAttach op with no pending blob entry */);
|
|
452
433
|
this.setRedirection(pendingLocalId, blobId);
|
|
453
434
|
entry.acked = true;
|
|
454
435
|
entry.handleP.resolve(this.getBlobHandle(pendingLocalId));
|
|
@@ -528,7 +509,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
528
509
|
getGCData(fullGC = false) {
|
|
529
510
|
const gcData = { gcNodes: {} };
|
|
530
511
|
for (const [localId, storageId] of this.redirectTable) {
|
|
531
|
-
(0,
|
|
512
|
+
(0, core_utils_1.assert)(!!storageId, 0x390 /* Must be attached to get GC data */);
|
|
532
513
|
// Only return local ids as GC nodes because a blob can only be referenced via its local id. The storage
|
|
533
514
|
// id entries have the same key and value, ignore them.
|
|
534
515
|
// The outbound routes are empty because a blob node cannot reference other nodes. It can only be referenced
|
|
@@ -588,14 +569,14 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
588
569
|
continue;
|
|
589
570
|
}
|
|
590
571
|
const storageId = this.redirectTable.get(blobId);
|
|
591
|
-
(0,
|
|
572
|
+
(0, core_utils_1.assert)(!!storageId, 0x5bb /* Must be attached to run GC */);
|
|
592
573
|
maybeUnusedStorageIds.add(storageId);
|
|
593
574
|
this.redirectTable.delete(blobId);
|
|
594
575
|
}
|
|
595
576
|
// Find out storage ids that are in-use and remove them from maybeUnusedStorageIds. A storage id is in-use if
|
|
596
577
|
// the redirect table has a local id -> storage id entry for it.
|
|
597
578
|
for (const [localId, storageId] of this.redirectTable.entries()) {
|
|
598
|
-
(0,
|
|
579
|
+
(0, core_utils_1.assert)(!!storageId, 0x5bc /* Must be attached to run GC */);
|
|
599
580
|
// For every storage id, the redirect table has a id -> id entry. These do not make the storage id in-use.
|
|
600
581
|
if (maybeUnusedStorageIds.has(storageId) && localId !== storageId) {
|
|
601
582
|
maybeUnusedStorageIds.delete(storageId);
|
|
@@ -669,34 +650,65 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
669
650
|
}
|
|
670
651
|
}
|
|
671
652
|
setRedirectTable(table) {
|
|
672
|
-
(0,
|
|
673
|
-
(0,
|
|
653
|
+
(0, core_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Detached, 0x252 /* "redirect table can only be set in detached container" */);
|
|
654
|
+
(0, core_utils_1.assert)(this.redirectTable.size === table.size, 0x391 /* Redirect table size must match BlobManager's local ID count */);
|
|
674
655
|
for (const [localId, storageId] of table) {
|
|
675
|
-
(0,
|
|
656
|
+
(0, core_utils_1.assert)(this.redirectTable.has(localId), 0x254 /* "unrecognized id in redirect table" */);
|
|
676
657
|
this.setRedirection(localId, storageId);
|
|
677
658
|
// set identity (id -> id) entry
|
|
678
659
|
this.setRedirection(storageId, storageId);
|
|
679
660
|
}
|
|
680
661
|
}
|
|
681
662
|
async getPendingBlobs(waitBlobsToAttach) {
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
663
|
+
return telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "GetPendingBlobs" }, async () => {
|
|
664
|
+
if (this.pendingBlobs.size === 0) {
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
const blobs = {};
|
|
668
|
+
const localBlobs = new Set();
|
|
669
|
+
while (localBlobs.size < this.pendingBlobs.size) {
|
|
670
|
+
const attachBlobsP = [];
|
|
671
|
+
for (const [id, entry] of this.pendingBlobs) {
|
|
672
|
+
if (!localBlobs.has(entry)) {
|
|
673
|
+
localBlobs.add(entry);
|
|
674
|
+
if (waitBlobsToAttach) {
|
|
675
|
+
if (!entry.opsent) {
|
|
676
|
+
this.sendBlobAttachOp(id, entry.storageId);
|
|
677
|
+
}
|
|
678
|
+
entry.handleP.resolve(this.getBlobHandle(id));
|
|
679
|
+
attachBlobsP.push(new Promise((resolve) => {
|
|
680
|
+
const onBlobAttached = (attachedEntry) => {
|
|
681
|
+
if (attachedEntry === entry) {
|
|
682
|
+
this.off("blobAttached", onBlobAttached);
|
|
683
|
+
resolve();
|
|
684
|
+
}
|
|
685
|
+
};
|
|
686
|
+
if (!entry.attached) {
|
|
687
|
+
this.on("blobAttached", onBlobAttached);
|
|
688
|
+
}
|
|
689
|
+
else {
|
|
690
|
+
resolve();
|
|
691
|
+
}
|
|
692
|
+
}));
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
await Promise.all(attachBlobsP);
|
|
697
|
+
}
|
|
698
|
+
// another for is needed to correctly mark attach state
|
|
699
|
+
// future optimization won't add unattached blobs to the list
|
|
700
|
+
for (const [id, entry] of this.pendingBlobs) {
|
|
701
|
+
blobs[id] = {
|
|
702
|
+
blob: (0, client_utils_1.bufferToString)(entry.blob, "base64"),
|
|
703
|
+
storageId: entry.storageId,
|
|
704
|
+
attached: entry.attached,
|
|
705
|
+
acked: entry.acked,
|
|
706
|
+
minTTLInSeconds: entry.minTTLInSeconds,
|
|
707
|
+
uploadTime: entry.uploadTime,
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
return blobs;
|
|
711
|
+
});
|
|
700
712
|
}
|
|
701
713
|
}
|
|
702
714
|
exports.BlobManager = BlobManager;
|
|
@@ -715,7 +727,7 @@ function getGCNodePathFromBlobId(blobId) {
|
|
|
715
727
|
*/
|
|
716
728
|
function getBlobIdFromGCNodePath(nodePath) {
|
|
717
729
|
const pathParts = nodePath.split("/");
|
|
718
|
-
(0,
|
|
730
|
+
(0, core_utils_1.assert)(pathParts.length === 3 && pathParts[1] === BlobManager.basePath, 0x5bd /* Invalid blob node path */);
|
|
719
731
|
return pathParts[2];
|
|
720
732
|
}
|
|
721
733
|
//# sourceMappingURL=blobManager.js.map
|