@fluidframework/container-runtime 2.0.0-dev.4.1.0.148229 → 2.0.0-dev.4.3.0.157531
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 +58 -0
- package/README.md +69 -0
- package/dist/blobManager.d.ts +6 -14
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +50 -37
- package/dist/blobManager.js.map +1 -1
- package/dist/containerRuntime.d.ts +47 -4
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +203 -49
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +2 -1
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +3 -0
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +5 -5
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +3 -6
- package/dist/dataStores.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +5 -5
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +1 -3
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.js +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js +6 -6
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.d.ts +146 -0
- package/dist/id-compressor/appendOnlySortedMap.d.ts.map +1 -0
- package/dist/id-compressor/appendOnlySortedMap.js +360 -0
- package/dist/id-compressor/appendOnlySortedMap.js.map +1 -0
- package/dist/id-compressor/idCompressor.d.ts +279 -0
- package/dist/id-compressor/idCompressor.d.ts.map +1 -0
- package/dist/id-compressor/idCompressor.js +1258 -0
- package/dist/id-compressor/idCompressor.js.map +1 -0
- package/dist/id-compressor/idRange.d.ts +11 -0
- package/dist/id-compressor/idRange.d.ts.map +1 -0
- package/dist/id-compressor/idRange.js +29 -0
- package/dist/id-compressor/idRange.js.map +1 -0
- package/dist/id-compressor/index.d.ts +14 -0
- package/dist/id-compressor/index.d.ts.map +1 -0
- package/dist/id-compressor/index.js +38 -0
- package/dist/id-compressor/index.js.map +1 -0
- package/dist/id-compressor/numericUuid.d.ts +59 -0
- package/dist/id-compressor/numericUuid.d.ts.map +1 -0
- package/dist/id-compressor/numericUuid.js +325 -0
- package/dist/id-compressor/numericUuid.js.map +1 -0
- package/dist/id-compressor/sessionIdNormalizer.d.ts +138 -0
- package/dist/id-compressor/sessionIdNormalizer.d.ts.map +1 -0
- package/dist/id-compressor/sessionIdNormalizer.js +488 -0
- package/dist/id-compressor/sessionIdNormalizer.js.map +1 -0
- package/dist/id-compressor/utils.d.ts +57 -0
- package/dist/id-compressor/utils.d.ts.map +1 -0
- package/dist/id-compressor/utils.js +90 -0
- package/dist/id-compressor/utils.js.map +1 -0
- package/dist/id-compressor/uuidUtilities.d.ts +30 -0
- package/dist/id-compressor/uuidUtilities.d.ts.map +1 -0
- package/dist/id-compressor/uuidUtilities.js +106 -0
- package/dist/id-compressor/uuidUtilities.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.d.ts +9 -2
- package/dist/opLifecycle/batchManager.d.ts.map +1 -1
- package/dist/opLifecycle/batchManager.js +21 -2
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +2 -1
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +2 -1
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +14 -0
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/dist/opLifecycle/opGroupingManager.js +61 -0
- package/dist/opLifecycle/opGroupingManager.js.map +1 -0
- package/dist/opLifecycle/opSplitter.d.ts +1 -1
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +5 -6
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts +4 -2
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +37 -25
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +4 -2
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +30 -20
- 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 +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +11 -3
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/summary/index.d.ts +2 -2
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +4 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +1 -0
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +19 -0
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +4 -3
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +65 -66
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +1 -5
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -0
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js +3 -0
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +128 -2
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +4 -3
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +14 -2
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +3 -0
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js +3 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +28 -2
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +19 -16
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +2 -0
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/blobManager.d.ts +6 -14
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +50 -37
- package/lib/blobManager.js.map +1 -1
- package/lib/containerRuntime.d.ts +47 -4
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +187 -52
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +2 -1
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +3 -0
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +5 -5
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +3 -6
- package/lib/dataStores.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +5 -5
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +1 -3
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.js +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js +6 -6
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.d.ts +146 -0
- package/lib/id-compressor/appendOnlySortedMap.d.ts.map +1 -0
- package/lib/id-compressor/appendOnlySortedMap.js +355 -0
- package/lib/id-compressor/appendOnlySortedMap.js.map +1 -0
- package/lib/id-compressor/idCompressor.d.ts +279 -0
- package/lib/id-compressor/idCompressor.d.ts.map +1 -0
- package/lib/id-compressor/idCompressor.js +1248 -0
- package/lib/id-compressor/idCompressor.js.map +1 -0
- package/lib/id-compressor/idRange.d.ts +11 -0
- package/lib/id-compressor/idRange.d.ts.map +1 -0
- package/lib/id-compressor/idRange.js +25 -0
- package/lib/id-compressor/idRange.js.map +1 -0
- package/lib/id-compressor/index.d.ts +14 -0
- package/lib/id-compressor/index.d.ts.map +1 -0
- package/lib/id-compressor/index.js +14 -0
- package/lib/id-compressor/index.js.map +1 -0
- package/lib/id-compressor/numericUuid.d.ts +59 -0
- package/lib/id-compressor/numericUuid.d.ts.map +1 -0
- package/lib/id-compressor/numericUuid.js +315 -0
- package/lib/id-compressor/numericUuid.js.map +1 -0
- package/lib/id-compressor/sessionIdNormalizer.d.ts +138 -0
- package/lib/id-compressor/sessionIdNormalizer.d.ts.map +1 -0
- package/lib/id-compressor/sessionIdNormalizer.js +484 -0
- package/lib/id-compressor/sessionIdNormalizer.js.map +1 -0
- package/lib/id-compressor/utils.d.ts +57 -0
- package/lib/id-compressor/utils.d.ts.map +1 -0
- package/lib/id-compressor/utils.js +79 -0
- package/lib/id-compressor/utils.js.map +1 -0
- package/lib/id-compressor/uuidUtilities.d.ts +30 -0
- package/lib/id-compressor/uuidUtilities.d.ts.map +1 -0
- package/lib/id-compressor/uuidUtilities.js +98 -0
- package/lib/id-compressor/uuidUtilities.js.map +1 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.d.ts +9 -2
- package/lib/opLifecycle/batchManager.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +19 -1
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +2 -1
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +1 -0
- package/lib/opLifecycle/index.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.d.ts +14 -0
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -0
- package/lib/opLifecycle/opGroupingManager.js +57 -0
- package/lib/opLifecycle/opGroupingManager.js.map +1 -0
- package/lib/opLifecycle/opSplitter.d.ts +1 -1
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +5 -6
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts +4 -2
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +38 -26
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +4 -2
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +30 -20
- 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 +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +11 -3
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/summary/index.d.ts +2 -2
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +2 -1
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +1 -0
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +19 -0
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +4 -3
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +65 -66
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +1 -5
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -0
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js +3 -0
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +128 -2
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +3 -3
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +14 -2
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +3 -0
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +2 -0
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +28 -2
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +17 -15
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +2 -0
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +29 -17
- package/src/blobManager.ts +64 -41
- package/src/containerRuntime.ts +294 -65
- package/src/dataStoreContext.ts +6 -0
- package/src/dataStores.ts +4 -7
- package/src/gc/garbageCollection.ts +7 -6
- package/src/gc/gcConfigs.ts +1 -3
- package/src/gc/gcDefinitions.ts +1 -1
- package/src/gc/gcHelpers.ts +9 -6
- package/src/id-compressor/README.md +3 -0
- package/src/id-compressor/appendOnlySortedMap.ts +427 -0
- package/src/id-compressor/idCompressor.ts +1854 -0
- package/src/id-compressor/idRange.ts +35 -0
- package/src/id-compressor/index.ts +35 -0
- package/src/id-compressor/numericUuid.ts +383 -0
- package/src/id-compressor/sessionIdNormalizer.ts +609 -0
- package/src/id-compressor/utils.ts +114 -0
- package/src/id-compressor/uuidUtilities.ts +123 -0
- package/src/index.ts +1 -0
- package/src/opLifecycle/README.md +119 -0
- package/src/opLifecycle/batchManager.ts +35 -2
- package/src/opLifecycle/index.ts +2 -1
- package/src/opLifecycle/opDecompressor.ts +1 -0
- package/src/opLifecycle/opGroupingManager.ts +82 -0
- package/src/opLifecycle/opSplitter.ts +1 -5
- package/src/opLifecycle/outbox.ts +64 -26
- package/src/opLifecycle/remoteMessageProcessor.ts +38 -22
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +21 -7
- package/src/summary/index.ts +2 -1
- package/src/summary/orderedClientElection.ts +17 -1
- package/src/summary/runningSummarizer.ts +78 -77
- package/src/summary/summarizer.ts +0 -8
- package/src/summary/summarizerHeuristics.ts +4 -0
- package/src/summary/summarizerNode/summarizerNode.ts +1 -1
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +3 -3
- package/src/summary/summarizerTypes.ts +20 -3
- package/src/summary/summaryFormat.ts +4 -0
- package/src/summary/summaryGenerator.ts +22 -16
- package/src/summary/summaryManager.ts +2 -0
package/src/blobManager.ts
CHANGED
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
IContainerRuntime,
|
|
29
29
|
IContainerRuntimeEvents,
|
|
30
30
|
} from "@fluidframework/container-runtime-definitions";
|
|
31
|
-
import { AttachState } from "@fluidframework/container-definitions";
|
|
31
|
+
import { AttachState, ICriticalContainerError } from "@fluidframework/container-definitions";
|
|
32
32
|
import {
|
|
33
33
|
ChildLogger,
|
|
34
34
|
loggerToMonitoringContext,
|
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
ISummaryTreeWithStats,
|
|
41
41
|
ITelemetryContext,
|
|
42
42
|
} from "@fluidframework/runtime-definitions";
|
|
43
|
+
import { GenericError } from "@fluidframework/container-utils";
|
|
43
44
|
import { ContainerRuntime, TombstoneResponseHeaderKey } from "./containerRuntime";
|
|
44
45
|
import { sendGCUnexpectedUsageEvent, sweepAttachmentBlobsKey, throwOnTombstoneLoadKey } from "./gc";
|
|
45
46
|
import { Throttler, formExponentialFn, IThrottler } from "./throttler";
|
|
@@ -132,14 +133,13 @@ interface PendingBlob {
|
|
|
132
133
|
status: PendingBlobStatus;
|
|
133
134
|
storageId?: string;
|
|
134
135
|
handleP: Deferred<IFluidHandle<ArrayBufferLike>>;
|
|
135
|
-
uploadP
|
|
136
|
-
|
|
137
|
-
serverUploadTime?: number;
|
|
136
|
+
uploadP?: Promise<ICreateBlobResponse>;
|
|
137
|
+
uploadTime?: number;
|
|
138
138
|
minTTLInSeconds?: number;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
export interface IPendingBlobs {
|
|
142
|
-
[id: string]: { blob: string };
|
|
142
|
+
[id: string]: { blob: string; uploadTime?: number; minTTLInSeconds?: number };
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
export interface IBlobManagerEvents {
|
|
@@ -191,6 +191,8 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
191
191
|
*/
|
|
192
192
|
private readonly tombstonedBlobs: Set<string> = new Set();
|
|
193
193
|
|
|
194
|
+
private readonly sendBlobAttachOp: (localId: string, storageId?: string) => void;
|
|
195
|
+
|
|
194
196
|
constructor(
|
|
195
197
|
private readonly routeContext: IFluidHandleContext,
|
|
196
198
|
snapshot: IBlobManagerLoadInfo,
|
|
@@ -205,7 +207,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
205
207
|
* knowledge of which they cannot request the blob from storage. It's important that this op is sequenced
|
|
206
208
|
* before any ops that reference the local ID, otherwise, an invalid handle could be added to the document.
|
|
207
209
|
*/
|
|
208
|
-
|
|
210
|
+
sendBlobAttachOp: (localId: string, storageId?: string) => void,
|
|
209
211
|
// Called when a blob node is requested. blobPath is the path of the blob's node in GC's graph.
|
|
210
212
|
// blobPath's format - `/<BlobManager.basePath>/<blobId>`.
|
|
211
213
|
private readonly blobRequested: (blobPath: string) => void,
|
|
@@ -214,7 +216,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
214
216
|
private readonly isBlobDeleted: (blobPath: string) => boolean,
|
|
215
217
|
private readonly runtime: IBlobManagerRuntime,
|
|
216
218
|
stashedBlobs: IPendingBlobs = {},
|
|
217
|
-
private readonly
|
|
219
|
+
private readonly closeContainer: (error?: ICriticalContainerError) => void,
|
|
218
220
|
) {
|
|
219
221
|
super();
|
|
220
222
|
this.mc = loggerToMonitoringContext(ChildLogger.create(this.runtime.logger, "BlobManager"));
|
|
@@ -230,6 +232,21 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
230
232
|
// Begin uploading stashed blobs from previous container instance
|
|
231
233
|
Object.entries(stashedBlobs).forEach(([localId, entry]) => {
|
|
232
234
|
const blob = stringToBuffer(entry.blob, "base64");
|
|
235
|
+
if (entry.minTTLInSeconds && entry.uploadTime) {
|
|
236
|
+
const timeLapseSinceLocalUpload = (Date.now() - entry.uploadTime) / 1000;
|
|
237
|
+
// stashed entries with more than half-life in storage will not be reuploaded
|
|
238
|
+
if (entry.minTTLInSeconds - timeLapseSinceLocalUpload > entry.minTTLInSeconds / 2) {
|
|
239
|
+
this.pendingBlobs.set(localId, {
|
|
240
|
+
blob,
|
|
241
|
+
status: PendingBlobStatus.OfflinePendingOp,
|
|
242
|
+
handleP: new Deferred(),
|
|
243
|
+
uploadP: undefined,
|
|
244
|
+
uploadTime: entry.uploadTime,
|
|
245
|
+
minTTLInSeconds: entry.minTTLInSeconds,
|
|
246
|
+
});
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
233
250
|
this.pendingBlobs.set(localId, {
|
|
234
251
|
blob,
|
|
235
252
|
status: PendingBlobStatus.OfflinePendingUpload,
|
|
@@ -237,6 +254,37 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
237
254
|
uploadP: this.uploadBlob(localId, blob),
|
|
238
255
|
});
|
|
239
256
|
});
|
|
257
|
+
|
|
258
|
+
this.sendBlobAttachOp = (localId: string, blobId?: string) => {
|
|
259
|
+
const pendingEntry = this.pendingBlobs.get(localId);
|
|
260
|
+
if (pendingEntry?.uploadTime && pendingEntry?.minTTLInSeconds) {
|
|
261
|
+
const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
|
|
262
|
+
const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
|
|
263
|
+
this.mc.logger.sendTelemetryEvent({
|
|
264
|
+
eventName: "sendBlobAttach",
|
|
265
|
+
entryStatus: pendingEntry.status,
|
|
266
|
+
secondsSinceUpload,
|
|
267
|
+
minTTLInSeconds: pendingEntry.minTTLInSeconds,
|
|
268
|
+
expired,
|
|
269
|
+
});
|
|
270
|
+
if (expired) {
|
|
271
|
+
// we want to avoid submitting ops with broken handles
|
|
272
|
+
this.closeContainer(
|
|
273
|
+
new GenericError(
|
|
274
|
+
"Trying to submit a BlobAttach for expired blob",
|
|
275
|
+
undefined,
|
|
276
|
+
{
|
|
277
|
+
localId,
|
|
278
|
+
blobId,
|
|
279
|
+
entryStatus: pendingEntry.status,
|
|
280
|
+
secondsSinceUpload,
|
|
281
|
+
},
|
|
282
|
+
),
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return sendBlobAttachOp(localId, blobId);
|
|
287
|
+
};
|
|
240
288
|
}
|
|
241
289
|
|
|
242
290
|
private get pendingOfflineUploads() {
|
|
@@ -428,9 +476,8 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
428
476
|
0x386 /* Must have pending blob entry for uploaded blob */,
|
|
429
477
|
);
|
|
430
478
|
entry.storageId = response.id;
|
|
431
|
-
entry.
|
|
479
|
+
entry.uploadTime = Date.now();
|
|
432
480
|
entry.minTTLInSeconds = response.minTTLInSeconds;
|
|
433
|
-
entry.serverUploadTime = this.getCurrentReferenceTimestampMs();
|
|
434
481
|
if (this.runtime.connected) {
|
|
435
482
|
if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
|
|
436
483
|
// Send a blob attach op. This serves two purposes:
|
|
@@ -438,7 +485,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
438
485
|
// until its storage ID is added to the next summary.
|
|
439
486
|
// 2. It will create a local ID to storage ID mapping in all clients which is needed to retrieve the
|
|
440
487
|
// blob from the server via the storage ID.
|
|
441
|
-
this.logTimeInfo(entry, "sendBlobAttachResolveTTL");
|
|
442
488
|
this.sendBlobAttachOp(localId, response.id);
|
|
443
489
|
if (this.storageIds.has(response.id)) {
|
|
444
490
|
// The blob is de-duped. Set up a local ID to storage ID mapping and return the blob. Since this is
|
|
@@ -512,7 +558,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
512
558
|
* is called on reconnection.
|
|
513
559
|
*/
|
|
514
560
|
if (entry.status !== PendingBlobStatus.OnlinePendingOp) {
|
|
515
|
-
this.logTimeInfo(entry, "sendBlobAttachTransitionOfflineTTL");
|
|
516
561
|
this.sendBlobAttachOp(localId, entry.storageId);
|
|
517
562
|
}
|
|
518
563
|
|
|
@@ -534,9 +579,7 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
534
579
|
const { localId, blobId }: { localId?: string; blobId?: string } = metadata;
|
|
535
580
|
assert(localId !== undefined, 0x50d /* local ID not available on reSubmit */);
|
|
536
581
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
537
|
-
|
|
538
|
-
this.logTimeInfo(pendingEntry, "sendBlobAttachResubmitTTL");
|
|
539
|
-
}
|
|
582
|
+
|
|
540
583
|
if (!blobId) {
|
|
541
584
|
// We submitted this op while offline. The blob should have been uploaded by now.
|
|
542
585
|
assert(
|
|
@@ -549,32 +592,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
549
592
|
return this.sendBlobAttachOp(localId, blobId);
|
|
550
593
|
}
|
|
551
594
|
|
|
552
|
-
private logTimeInfo(pendingEntry: PendingBlob, eventName: string) {
|
|
553
|
-
let timeLapseSinceLocalUpload: number = 0;
|
|
554
|
-
let timeLapseSinceServerUpload: number = 0;
|
|
555
|
-
let expiredUsingLocalTime;
|
|
556
|
-
let expiredUsingServerTime;
|
|
557
|
-
if (pendingEntry.localUploadTime) {
|
|
558
|
-
timeLapseSinceLocalUpload = (Date.now() - pendingEntry.localUploadTime) / 1000;
|
|
559
|
-
expiredUsingLocalTime =
|
|
560
|
-
(pendingEntry.minTTLInSeconds ?? 0) - timeLapseSinceLocalUpload < 0 ? true : false;
|
|
561
|
-
}
|
|
562
|
-
if (pendingEntry.serverUploadTime) {
|
|
563
|
-
timeLapseSinceServerUpload = (Date.now() - pendingEntry.serverUploadTime) / 1000;
|
|
564
|
-
expiredUsingServerTime =
|
|
565
|
-
(pendingEntry.minTTLInSeconds ?? 0) - timeLapseSinceServerUpload < 0 ? true : false;
|
|
566
|
-
}
|
|
567
|
-
this.mc.logger.sendTelemetryEvent({
|
|
568
|
-
eventName,
|
|
569
|
-
entryStatus: pendingEntry.status,
|
|
570
|
-
timeLapseSinceLocalUpload,
|
|
571
|
-
timeLapseSinceServerUpload,
|
|
572
|
-
minTTLInSeconds: pendingEntry.minTTLInSeconds,
|
|
573
|
-
expiredUsingLocalTime,
|
|
574
|
-
expiredUsingServerTime,
|
|
575
|
-
});
|
|
576
|
-
}
|
|
577
|
-
|
|
578
595
|
public processBlobAttachOp(message: ISequencedDocumentMessage, local: boolean) {
|
|
579
596
|
const localId = message.metadata?.localId;
|
|
580
597
|
const blobId = message.metadata?.blobId;
|
|
@@ -887,7 +904,13 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
887
904
|
public getPendingBlobs(): IPendingBlobs {
|
|
888
905
|
const blobs = {};
|
|
889
906
|
for (const [key, entry] of this.pendingBlobs) {
|
|
890
|
-
blobs[key] =
|
|
907
|
+
blobs[key] = entry.minTTLInSeconds
|
|
908
|
+
? {
|
|
909
|
+
blob: bufferToString(entry.blob, "base64"),
|
|
910
|
+
uploadTime: entry.uploadTime,
|
|
911
|
+
minTTLInSeconds: entry.minTTLInSeconds,
|
|
912
|
+
}
|
|
913
|
+
: { blob: bufferToString(entry.blob, "base64") };
|
|
891
914
|
}
|
|
892
915
|
return blobs;
|
|
893
916
|
}
|