@fluidframework/container-runtime 2.0.0-internal.5.3.2 → 2.0.0-internal.6.0.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 +80 -0
- package/dist/batchTracker.d.ts +2 -1
- 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 +13 -2
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +103 -25
- package/dist/blobManager.js.map +1 -1
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +12 -4
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/containerRuntime.d.ts +69 -22
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +344 -238
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +11 -2
- 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 +40 -44
- 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 +21 -5
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +102 -58
- 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 +29 -25
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.js +13 -11
- package/dist/gc/gcConfigs.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 +5 -6
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js +4 -6
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +44 -33
- 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 +52 -52
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/idRange.js +2 -2
- package/dist/id-compressor/idRange.js.map +1 -1
- package/dist/id-compressor/sessionIdNormalizer.js +11 -16
- package/dist/id-compressor/sessionIdNormalizer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/opLifecycle/batchManager.js +10 -6
- package/dist/opLifecycle/batchManager.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 +7 -2
- 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 +12 -10
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +13 -5
- package/dist/opLifecycle/opGroupingManager.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 +11 -7
- 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 +6 -14
- 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 +8 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/dist/opProperties.js +1 -2
- package/dist/opProperties.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 +6 -3
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +41 -32
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +15 -11
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -1
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +18 -19
- 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 +42 -66
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.js +5 -8
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.js +5 -9
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +8 -12
- package/dist/summary/summarizerHeuristics.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 +26 -22
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/dist/summary/summarizerNode/summarizerNodeUtils.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 +13 -16
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summaryCollection.js +3 -5
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.js +1 -2
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +67 -21
- 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 +9 -7
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +2 -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 +13 -2
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +103 -25
- package/lib/blobManager.js.map +1 -1
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +13 -5
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/containerRuntime.d.ts +69 -22
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +343 -238
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +11 -2
- 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 +42 -46
- 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 +21 -5
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +103 -59
- 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 +30 -26
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.js +13 -11
- package/lib/gc/gcConfigs.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 +5 -6
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +4 -6
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +45 -34
- 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 +52 -52
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/idRange.js +2 -2
- package/lib/id-compressor/idRange.js.map +1 -1
- package/lib/id-compressor/sessionIdNormalizer.js +11 -16
- package/lib/id-compressor/sessionIdNormalizer.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/opLifecycle/batchManager.js +10 -6
- package/lib/opLifecycle/batchManager.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 +8 -3
- 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 +13 -11
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +13 -5
- package/lib/opLifecycle/opGroupingManager.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 +12 -8
- 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 +7 -15
- 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 +8 -2
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/opProperties.js +1 -2
- package/lib/opProperties.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 +6 -3
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +41 -32
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +16 -12
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -1
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +19 -20
- 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 +43 -67
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.js +6 -9
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.js +5 -9
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +8 -12
- package/lib/summary/summarizerHeuristics.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 +27 -23
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +2 -4
- package/lib/summary/summarizerNode/summarizerNodeUtils.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 +14 -17
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summaryCollection.js +3 -5
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.js +1 -2
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +68 -22
- 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 +10 -8
- package/lib/summary/summaryManager.js.map +1 -1
- package/package.json +30 -18
- package/src/batchTracker.ts +4 -3
- package/src/blobManager.ts +113 -15
- package/src/connectionTelemetry.ts +7 -3
- package/src/containerRuntime.ts +354 -194
- package/src/dataStore.ts +10 -1
- package/src/dataStoreContext.ts +31 -33
- package/src/dataStoreContexts.ts +2 -2
- package/src/dataStores.ts +108 -71
- 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 +13 -10
- package/src/id-compressor/idCompressor.ts +6 -5
- package/src/index.ts +0 -1
- 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 +34 -25
- package/src/scheduleManager.ts +2 -2
- package/src/summary/orderedClientElection.ts +4 -3
- 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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,85 @@
|
|
|
1
1
|
# @fluidframework/container-runtime
|
|
2
2
|
|
|
3
|
+
## 2.0.0-internal.6.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- Removed IContainerContext.existing [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
8
|
+
|
|
9
|
+
The recommended means of checking for existing changed to the instantiateRuntime param in 2021, and the IContainerContext.existing member was formally deprecated in 2.0.0-internal.2.0.0. This member is now removed.
|
|
10
|
+
|
|
11
|
+
- `getRootDataStore` API is deprecated [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
12
|
+
|
|
13
|
+
The `getRootDataStore` API that is used to get aliased data store has been deprecated. It will be removed in a future release.
|
|
14
|
+
Use `getAliasedDataStoreEntryPoint` API to get aliased data stores instead. It returns the data store's entry point which is its `IFluidHandle`. To use this API `initializeEntryPoint` must be provided when creating `FluidDataStoreRuntime` [here](https://github.com/microsoft/FluidFramework/blob/main/packages/runtime/datastore/src/dataStoreRuntime.ts#L243). `getAliasedDataStoreEntryPoint` and `initializeEntryPoint` will become required in a future release.
|
|
15
|
+
|
|
16
|
+
- Request APIs deprecated from many places [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
17
|
+
|
|
18
|
+
The `request` API (associated with the `IFluidRouter` interface) has been deprecated on a number of classes and interfaces. The following are impacted:
|
|
19
|
+
|
|
20
|
+
- `IRuntime` and `ContainerRuntime`
|
|
21
|
+
- `IFluidDataStoreRuntime` and `FluidDataStoreRuntime`
|
|
22
|
+
- `IFluidDataStoreChannel`
|
|
23
|
+
- `MockFluidDataStoreRuntime`
|
|
24
|
+
- `TestFluidObject`
|
|
25
|
+
|
|
26
|
+
Please migrate usage to the corresponding `entryPoint` or `getEntryPoint()` of the object. The value for these "entryPoint" related APIs is determined from factories (for `IRuntime` and `IFluidDataStoreRuntime`) via the `initializeEntryPoint` method. If no method is passed to the factory, the corresponding `entryPoint` and `getEntryPoint()` will be undefined.
|
|
27
|
+
|
|
28
|
+
For an example implementation of `initializeEntryPoint`, see [pureDataObjectFactory.ts](https://github.com/microsoft/FluidFramework/blob/next/packages/framework/aqueduct/src/data-object-factories/pureDataObjectFactory.ts#L84).
|
|
29
|
+
|
|
30
|
+
More information of the migration off the request pattern, and current status of its removal, is documented in [Removing-IFluidRouter.md](https://github.com/microsoft/FluidFramework/blob/main/packages/common/core-interfaces/Removing-IFluidRouter.md).
|
|
31
|
+
|
|
32
|
+
- `initializeEntryPoint` will become required [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
33
|
+
|
|
34
|
+
The optional `initializeEntryPoint` method has been added to a number of constructors. **This method argument will become required in an upcoming release** and a value will need to be provided to the following classes:
|
|
35
|
+
|
|
36
|
+
- `BaseContainerRuntimeFactory`
|
|
37
|
+
- `ContainerRuntimeFactoryWithDefaultDataStore`
|
|
38
|
+
- `RuntimeFactory`
|
|
39
|
+
- `ContainerRuntime` (constructor and `loadRuntime`)
|
|
40
|
+
- `FluidDataStoreRuntime`
|
|
41
|
+
|
|
42
|
+
For an example implementation of `initializeEntryPoint`, see [pureDataObjectFactory.ts](https://github.com/microsoft/FluidFramework/blob/main/packages/framework/aqueduct/src/data-object-factories/pureDataObjectFactory.ts#L84).
|
|
43
|
+
|
|
44
|
+
This work will replace the request pattern. See [Removing-IFluidRouter.md](https://github.com/microsoft/FluidFramework/blob/main/packages/common/core-interfaces/Removing-IFluidRouter.md) for more info on this effort.
|
|
45
|
+
|
|
46
|
+
- New required method `getAliasedDataStoreEntryPoint` in ContainerRuntime [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
47
|
+
|
|
48
|
+
`getAliasedDataStoreEntryPoint` API has been added to ContainerRuntime. This can be used to get the entry point to an aliased data stores. To use this API `initializeEntryPoint` must be provided when creating `FluidDataStoreRuntime` [here](https://github.com/microsoft/FluidFramework/blob/main/packages/runtime/datastore/src/dataStoreRuntime.ts#L243). `getAliasedDataStoreEntryPoint` and `initializeEntryPoint` will become required in a future release.
|
|
49
|
+
|
|
50
|
+
- `IRootSummaryTreeWithStats` removed [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
51
|
+
|
|
52
|
+
`IRootSummaryTreeWithStats` was the return type of `summarize` method on `ContainerRuntime`. It was an internal interface used only in `ContainerRuntime` class to to access `gcStats` from a call site. `gcStats` is not needed in the call site anymore so this interface is removed.
|
|
53
|
+
|
|
54
|
+
- getPendingLocalState and closeAndGetPendingLocalState are now async [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
55
|
+
|
|
56
|
+
getPendingLocalState and closeAndGetPendingLocalState are now async to allow uploading blobs to attach to a DDS (in closing scenario). There is a new parameter in those methods at the container/runtime layer "notifyImminentClosure" which is true only when closing and ensures uploading blobs fast resolve and get attached. Once we apply stashed ops to new container, blob will try to reupload and we will know where to place its references.
|
|
57
|
+
|
|
58
|
+
- Calling `ContainerRuntime.closeFn(...)` will no longer call `ContainerContext.disposeFn(...)` as well [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
59
|
+
|
|
60
|
+
This means the `ContainerRuntime` will no longer be disposed by calling this method.
|
|
61
|
+
|
|
62
|
+
If you want to dispose the `ContainerRuntime`, use the `ContainerRuntime.disposeFn` method.
|
|
63
|
+
|
|
64
|
+
For more information about close vs. dispose expectations, see the [Closure](https://github.com/microsoft/FluidFramework/blob/main/packages/loader/container-loader/README.md#closure) section of Loader README.md.
|
|
65
|
+
|
|
66
|
+
- Upgraded typescript transpilation target to ES2020 [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
67
|
+
|
|
68
|
+
Upgraded typescript transpilation target to ES2020. This is done in order to decrease the bundle sizes of Fluid Framework packages. This has provided size improvements across the board for ex. Loader, Driver, Runtime etc. Reduced bundle sizes helps to load lesser code in apps and hence also helps to improve the perf.If any app wants to target any older versions of browsers with which this target version is not compatible, then they can use packages like babel to transpile to a older target.
|
|
69
|
+
|
|
70
|
+
- IDeltaManager members disposed and dispose() removed [8abce8cdb4](https://github.com/microsoft/FluidFramework/commits/8abce8cdb4e2832fb6405fb44e393bef03d5648a)
|
|
71
|
+
|
|
72
|
+
IDeltaManager members disposed and dispose() were deprecated in 2.0.0-internal.5.3.0 and have now been removed.
|
|
73
|
+
|
|
74
|
+
## 2.0.0-internal.5.4.0
|
|
75
|
+
|
|
76
|
+
### Minor Changes
|
|
77
|
+
|
|
78
|
+
- ContainerRuntime.reSubmitFn is deprecated: ([#16276](https://github.com/microsoft/FluidFramework/issues/16276)) [46707372e8](https://github.com/microsoft/FluidFramework/commits/46707372e82a492f6e42b683d37d49c25e6be15b)
|
|
79
|
+
|
|
80
|
+
ContainerRuntime.reSubmitFn is deprecatedsince this functionality needs not be exposed, and we are refactoring the
|
|
81
|
+
signatures of related code internally.
|
|
82
|
+
|
|
3
83
|
## 2.0.0-internal.5.3.0
|
|
4
84
|
|
|
5
85
|
Dependency updates only.
|
package/dist/batchTracker.d.ts
CHANGED
|
@@ -4,13 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { EventEmitter } from "events";
|
|
6
6
|
import { ITelemetryLoggerExt } from "@fluidframework/telemetry-utils";
|
|
7
|
+
import { ITelemetryBaseLogger } from "@fluidframework/core-interfaces";
|
|
7
8
|
export declare class BatchTracker {
|
|
8
9
|
private readonly batchEventEmitter;
|
|
9
10
|
private readonly logger;
|
|
10
11
|
private startBatchSequenceNumber;
|
|
11
12
|
private trackedBatchCount;
|
|
12
13
|
private batchProcessingStartTimeStamp;
|
|
13
|
-
constructor(batchEventEmitter: EventEmitter, logger:
|
|
14
|
+
constructor(batchEventEmitter: EventEmitter, logger: ITelemetryBaseLogger, batchLengthThreshold: number, batchCountSamplingRate: number, dateTimeProvider?: () => number);
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Track batch sizes in terms of op counts and processing times
|
|
@@ -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,
|
|
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;AAGzF,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
|
@@ -11,7 +11,7 @@ class BatchTracker {
|
|
|
11
11
|
constructor(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate, dateTimeProvider = () => common_utils_1.performance.now()) {
|
|
12
12
|
this.batchEventEmitter = batchEventEmitter;
|
|
13
13
|
this.trackedBatchCount = 0;
|
|
14
|
-
this.logger = telemetry_utils_1.
|
|
14
|
+
this.logger = (0, telemetry_utils_1.createChildLogger)({ logger, namespace: "Batching" });
|
|
15
15
|
this.batchEventEmitter.on("batchBegin", (message) => {
|
|
16
16
|
this.startBatchSequenceNumber = message.sequenceNumber;
|
|
17
17
|
this.batchProcessingStartTimeStamp = dateTimeProvider();
|
package/dist/batchTracker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batchTracker.js","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,
|
|
1
|
+
{"version":3,"file":"batchTracker.js","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qEAAyF;AACzF,+DAAmE;AAInE,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,qBAAM,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, performance } from \"@fluidframework/common-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/common-definitions#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
|
@@ -38,9 +38,16 @@ export interface IBlobManagerLoadInfo {
|
|
|
38
38
|
redirectTable?: [string, string][];
|
|
39
39
|
}
|
|
40
40
|
export declare type IBlobManagerRuntime = Pick<IContainerRuntime, "attachState" | "connected" | "logger" | "clientDetails"> & Pick<ContainerRuntime, "gcTombstoneEnforcementAllowed"> & TypedEventEmitter<IContainerRuntimeEvents>;
|
|
41
|
+
export declare enum PendingBlobStatus {
|
|
42
|
+
OnlinePendingUpload = 0,
|
|
43
|
+
OnlinePendingOp = 1,
|
|
44
|
+
OfflinePendingUpload = 2,
|
|
45
|
+
OfflinePendingOp = 3
|
|
46
|
+
}
|
|
41
47
|
export interface IPendingBlobs {
|
|
42
48
|
[id: string]: {
|
|
43
49
|
blob: string;
|
|
50
|
+
storageId?: string;
|
|
44
51
|
uploadTime?: number;
|
|
45
52
|
minTTLInSeconds?: number;
|
|
46
53
|
attached?: boolean;
|
|
@@ -103,7 +110,9 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
103
110
|
sendBlobAttachOp: (localId: string, storageId?: string) => void, blobRequested: (blobPath: string) => void, isBlobDeleted: (blobPath: string) => boolean, runtime: IBlobManagerRuntime, stashedBlobs: IPendingBlobs | undefined, closeContainer: (error?: ICriticalContainerError) => void);
|
|
104
111
|
private get pendingOfflineUploads();
|
|
105
112
|
get hasPendingOfflineUploads(): boolean;
|
|
113
|
+
get allBlobsAttached(): boolean;
|
|
106
114
|
get hasPendingBlobs(): boolean;
|
|
115
|
+
private createAbortError;
|
|
107
116
|
/**
|
|
108
117
|
* Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
|
|
109
118
|
*/
|
|
@@ -113,6 +122,7 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
113
122
|
* again
|
|
114
123
|
*/
|
|
115
124
|
private onDisconnected;
|
|
125
|
+
private shutdownPendingBlobs;
|
|
116
126
|
/**
|
|
117
127
|
* Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
|
|
118
128
|
* detached or there are no (non-pending) attachment blobs in the document
|
|
@@ -121,7 +131,7 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
121
131
|
getBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
122
132
|
private getBlobHandle;
|
|
123
133
|
private createBlobDetached;
|
|
124
|
-
createBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>>;
|
|
134
|
+
createBlob(blob: ArrayBufferLike, signal?: AbortSignal): Promise<IFluidHandle<ArrayBufferLike>>;
|
|
125
135
|
private uploadBlob;
|
|
126
136
|
/**
|
|
127
137
|
* Set up a mapping in the redirect table from fromId to toId. Also, notify the runtime that a reference is added
|
|
@@ -129,6 +139,7 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
129
139
|
*/
|
|
130
140
|
private setRedirection;
|
|
131
141
|
private deletePendingBlobMaybe;
|
|
142
|
+
private deletePendingBlob;
|
|
132
143
|
private onUploadResolve;
|
|
133
144
|
private onUploadReject;
|
|
134
145
|
private transitionToOffline;
|
|
@@ -194,6 +205,6 @@ export declare class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
194
205
|
*/
|
|
195
206
|
private verifyBlobValidity;
|
|
196
207
|
setRedirectTable(table: Map<string, string>): void;
|
|
197
|
-
getPendingBlobs(): IPendingBlobs
|
|
208
|
+
getPendingBlobs(waitBlobsToAttach?: boolean): Promise<IPendingBlobs>;
|
|
198
209
|
}
|
|
199
210
|
//# sourceMappingURL=blobManager.d.ts.map
|
|
@@ -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;AAO9C,OAAO,EAKN,iBAAiB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,iBAAiB,EACjB,uBAAuB,EACvB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAe,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAO7F,OAAO,EACN,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAA8B,MAAM,oBAAoB,CAAC;AAMlF;;;;;;GAMG;AACH,qBAAa,UAAW,YAAW,YAAY,CAAC,eAAe,CAAC;aAc9C,IAAI,EAAE,MAAM;aACZ,YAAY,EAAE,mBAAmB;IAC1C,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAhBhC,OAAO,CAAC,QAAQ,CAAkB;IAElC,IAAW,YAAY,IAAI,YAAY,CAEtC;IAED,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,SAAgB,YAAY,EAAE,MAAM,CAAC;gBAGpB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,mBAAmB,EAC1C,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,EACb,aAAa,CAAC,SAAQ,IAAI,aAAA;IAKrC,WAAW;IAOX,IAAI,CAAC,MAAM,EAAE,YAAY;CAGhC;AAmBD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CACnC;AAID,oBAAY,mBAAmB,GAAG,IAAI,CACrC,iBAAiB,EACjB,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,eAAe,CACxD,GACA,IAAI,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,GACvD,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"blobManager.d.ts","sourceRoot":"","sources":["../src/blobManager.ts"],"names":[],"mappings":"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"}
|
package/dist/blobManager.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.BlobManager = exports.BlobHandle = void 0;
|
|
7
|
+
exports.BlobManager = exports.PendingBlobStatus = exports.BlobHandle = void 0;
|
|
8
8
|
const uuid_1 = require("uuid");
|
|
9
9
|
const runtime_utils_1 = require("@fluidframework/runtime-utils");
|
|
10
10
|
const common_utils_1 = require("@fluidframework/common-utils");
|
|
@@ -38,10 +38,9 @@ class BlobHandle {
|
|
|
38
38
|
return this.routeContext.isAttached && this.attached;
|
|
39
39
|
}
|
|
40
40
|
attachGraph() {
|
|
41
|
-
var _a;
|
|
42
41
|
if (!this.attached) {
|
|
43
42
|
this.attached = true;
|
|
44
|
-
|
|
43
|
+
this.onAttachGraph?.();
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
bind(handle) {
|
|
@@ -73,7 +72,7 @@ var PendingBlobStatus;
|
|
|
73
72
|
PendingBlobStatus[PendingBlobStatus["OnlinePendingOp"] = 1] = "OnlinePendingOp";
|
|
74
73
|
PendingBlobStatus[PendingBlobStatus["OfflinePendingUpload"] = 2] = "OfflinePendingUpload";
|
|
75
74
|
PendingBlobStatus[PendingBlobStatus["OfflinePendingOp"] = 3] = "OfflinePendingOp";
|
|
76
|
-
})(PendingBlobStatus || (PendingBlobStatus = {}));
|
|
75
|
+
})(PendingBlobStatus = exports.PendingBlobStatus || (exports.PendingBlobStatus = {}));
|
|
77
76
|
class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
78
77
|
constructor(routeContext, snapshot, getStorage,
|
|
79
78
|
/**
|
|
@@ -121,7 +120,10 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
121
120
|
* Tombstone is a temporary feature that imitates a blob getting swept by garbage collection.
|
|
122
121
|
*/
|
|
123
122
|
this.tombstonedBlobs = new Set();
|
|
124
|
-
this.mc = (0, telemetry_utils_1.
|
|
123
|
+
this.mc = (0, telemetry_utils_1.createChildMonitoringContext)({
|
|
124
|
+
logger: this.runtime.logger,
|
|
125
|
+
namespace: "BlobManager",
|
|
126
|
+
});
|
|
125
127
|
// Read the feature flag that tells whether to throw when a tombstone blob is requested.
|
|
126
128
|
this.throwOnTombstoneLoad =
|
|
127
129
|
this.mc.config.getBoolean(gc_1.throwOnTombstoneLoadKey) === true &&
|
|
@@ -134,6 +136,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
134
136
|
const blob = (0, common_utils_1.stringToBuffer)(entry.blob, "base64");
|
|
135
137
|
const attached = entry.attached;
|
|
136
138
|
const acked = entry.acked;
|
|
139
|
+
const storageId = entry.storageId; // entry.storageId = response.id
|
|
137
140
|
if (entry.minTTLInSeconds && entry.uploadTime) {
|
|
138
141
|
const timeLapseSinceLocalUpload = (Date.now() - entry.uploadTime) / 1000;
|
|
139
142
|
// stashed entries with more than half-life in storage will not be reuploaded
|
|
@@ -142,6 +145,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
142
145
|
blob,
|
|
143
146
|
status: PendingBlobStatus.OfflinePendingOp,
|
|
144
147
|
handleP: new common_utils_1.Deferred(),
|
|
148
|
+
storageId,
|
|
145
149
|
uploadP: undefined,
|
|
146
150
|
uploadTime: entry.uploadTime,
|
|
147
151
|
minTTLInSeconds: entry.minTTLInSeconds,
|
|
@@ -162,7 +166,9 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
162
166
|
});
|
|
163
167
|
this.sendBlobAttachOp = (localId, blobId) => {
|
|
164
168
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
165
|
-
|
|
169
|
+
(0, common_utils_1.assert)(pendingEntry !== undefined, 0x725 /* Must have pending blob entry for upcoming op */);
|
|
170
|
+
pendingEntry.opsent = true;
|
|
171
|
+
if (pendingEntry?.uploadTime && pendingEntry?.minTTLInSeconds) {
|
|
166
172
|
const secondsSinceUpload = (Date.now() - pendingEntry.uploadTime) / 1000;
|
|
167
173
|
const expired = pendingEntry.minTTLInSeconds - secondsSinceUpload < 0;
|
|
168
174
|
this.mc.logger.sendTelemetryEvent({
|
|
@@ -191,10 +197,25 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
191
197
|
get hasPendingOfflineUploads() {
|
|
192
198
|
return this.pendingOfflineUploads.length > 0;
|
|
193
199
|
}
|
|
200
|
+
get allBlobsAttached() {
|
|
201
|
+
for (const [, entry] of this.pendingBlobs) {
|
|
202
|
+
if (entry.attached === false) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
194
208
|
get hasPendingBlobs() {
|
|
195
209
|
return ((this.runtime.attachState !== container_definitions_1.AttachState.Attached && this.redirectTable.size > 0) ||
|
|
196
210
|
this.pendingBlobs.size > 0);
|
|
197
211
|
}
|
|
212
|
+
createAbortError(pending) {
|
|
213
|
+
return new telemetry_utils_1.LoggingError("uploadBlob aborted", {
|
|
214
|
+
acked: pending?.acked,
|
|
215
|
+
status: pending?.status,
|
|
216
|
+
uploadTime: pending?.uploadTime,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
198
219
|
/**
|
|
199
220
|
* Upload blobs added while offline. This must be completed before connecting and resubmitting ops.
|
|
200
221
|
*/
|
|
@@ -219,6 +240,29 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
219
240
|
}
|
|
220
241
|
}
|
|
221
242
|
}
|
|
243
|
+
async shutdownPendingBlobs() {
|
|
244
|
+
for (const [localId, entry] of this.pendingBlobs) {
|
|
245
|
+
if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
|
|
246
|
+
this.sendBlobAttachOp(localId, entry.storageId);
|
|
247
|
+
entry.status = PendingBlobStatus.OfflinePendingUpload;
|
|
248
|
+
entry.handleP.resolve(this.getBlobHandle(localId));
|
|
249
|
+
}
|
|
250
|
+
else if (entry.status === PendingBlobStatus.OnlinePendingOp) {
|
|
251
|
+
entry.status = PendingBlobStatus.OfflinePendingOp;
|
|
252
|
+
entry.handleP.resolve(this.getBlobHandle(localId));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return new Promise((resolve) => {
|
|
256
|
+
if (this.allBlobsAttached) {
|
|
257
|
+
resolve();
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
this.once("allBlobsAttached", () => {
|
|
261
|
+
resolve();
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
222
266
|
/**
|
|
223
267
|
* Set of actual storage IDs (i.e., IDs that can be requested from storage). This will be empty if the container is
|
|
224
268
|
* detached or there are no (non-pending) attachment blobs in the document
|
|
@@ -266,6 +310,9 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
266
310
|
? () => {
|
|
267
311
|
pending.attached = true;
|
|
268
312
|
this.deletePendingBlobMaybe(id);
|
|
313
|
+
if (this.allBlobsAttached) {
|
|
314
|
+
this.emit("allBlobsAttached");
|
|
315
|
+
}
|
|
269
316
|
}
|
|
270
317
|
: undefined;
|
|
271
318
|
return new BlobHandle(`${BlobManager.basePath}/${id}`, this.routeContext, async () => this.getBlob(id), callback);
|
|
@@ -277,7 +324,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
277
324
|
this.setRedirection(response.id, undefined);
|
|
278
325
|
return this.getBlobHandle(response.id);
|
|
279
326
|
}
|
|
280
|
-
async createBlob(blob) {
|
|
327
|
+
async createBlob(blob, signal) {
|
|
281
328
|
if (this.runtime.attachState === container_definitions_1.AttachState.Detached) {
|
|
282
329
|
return this.createBlobDetached(blob);
|
|
283
330
|
}
|
|
@@ -287,6 +334,9 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
287
334
|
await new Promise((resolve) => this.runtime.once("attached", resolve));
|
|
288
335
|
}
|
|
289
336
|
(0, common_utils_1.assert)(this.runtime.attachState === container_definitions_1.AttachState.Attached, 0x385 /* For clarity and paranoid defense against adding future attachment states */);
|
|
337
|
+
if (signal?.aborted) {
|
|
338
|
+
throw this.createAbortError();
|
|
339
|
+
}
|
|
290
340
|
// Create a local ID for the blob. After uploading it to storage and before returning it, a local ID to
|
|
291
341
|
// storage ID mapping is created.
|
|
292
342
|
const localId = (0, uuid_1.v4)();
|
|
@@ -297,9 +347,19 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
297
347
|
uploadP: this.uploadBlob(localId, blob),
|
|
298
348
|
attached: false,
|
|
299
349
|
acked: false,
|
|
350
|
+
abortSignal: signal,
|
|
351
|
+
opsent: false,
|
|
300
352
|
};
|
|
301
353
|
this.pendingBlobs.set(localId, pendingEntry);
|
|
302
|
-
|
|
354
|
+
const abortListener = () => {
|
|
355
|
+
if (!pendingEntry.acked) {
|
|
356
|
+
pendingEntry.handleP.reject(this.createAbortError(pendingEntry));
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
signal?.addEventListener("abort", abortListener, { once: true });
|
|
360
|
+
return pendingEntry.handleP.promise.finally(() => {
|
|
361
|
+
signal?.removeEventListener("abort", abortListener);
|
|
362
|
+
});
|
|
303
363
|
}
|
|
304
364
|
async uploadBlob(localId, blob) {
|
|
305
365
|
return telemetry_utils_1.PerformanceEvent.timedExecAsync(this.mc.logger, { eventName: "createBlob" }, async () => this.getStorage().createBlob(blob), { end: true, cancel: this.runtime.connected ? "error" : "generic" }).then((response) => this.onUploadResolve(localId, response), async (err) => this.onUploadReject(localId, err));
|
|
@@ -314,18 +374,23 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
314
374
|
deletePendingBlobMaybe(id) {
|
|
315
375
|
if (this.pendingBlobs.has(id)) {
|
|
316
376
|
const entry = this.pendingBlobs.get(id);
|
|
317
|
-
if (
|
|
318
|
-
this.
|
|
319
|
-
if (!this.hasPendingBlobs) {
|
|
320
|
-
this.emit("noPendingBlobs");
|
|
321
|
-
}
|
|
377
|
+
if (entry?.attached && entry?.acked) {
|
|
378
|
+
this.deletePendingBlob(id);
|
|
322
379
|
}
|
|
323
380
|
}
|
|
324
381
|
}
|
|
382
|
+
deletePendingBlob(id) {
|
|
383
|
+
if (this.pendingBlobs.delete(id) && !this.hasPendingBlobs) {
|
|
384
|
+
this.emit("noPendingBlobs");
|
|
385
|
+
}
|
|
386
|
+
}
|
|
325
387
|
onUploadResolve(localId, response) {
|
|
326
|
-
var _a;
|
|
327
388
|
const entry = this.pendingBlobs.get(localId);
|
|
328
389
|
(0, common_utils_1.assert)(entry !== undefined, 0x6c8 /* pending blob entry not found for uploaded blob */);
|
|
390
|
+
if (entry.abortSignal?.aborted === true && !entry.opsent) {
|
|
391
|
+
this.deletePendingBlob(localId);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
329
394
|
(0, common_utils_1.assert)(entry.status === PendingBlobStatus.OnlinePendingUpload ||
|
|
330
395
|
entry.status === PendingBlobStatus.OfflinePendingUpload, 0x386 /* Must have pending blob entry for uploaded blob */);
|
|
331
396
|
entry.storageId = response.id;
|
|
@@ -351,7 +416,7 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
351
416
|
// If there is already an op for this storage ID, append the local ID to the list. Once any op for
|
|
352
417
|
// this storage ID is ack'd, all pending blobs for it can be resolved since the op will keep the
|
|
353
418
|
// blob alive in storage.
|
|
354
|
-
this.opsInFlight.set(response.id, (
|
|
419
|
+
this.opsInFlight.set(response.id, (this.opsInFlight.get(response.id) ?? []).concat(localId));
|
|
355
420
|
entry.status = PendingBlobStatus.OnlinePendingOp;
|
|
356
421
|
}
|
|
357
422
|
}
|
|
@@ -373,6 +438,10 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
373
438
|
async onUploadReject(localId, error) {
|
|
374
439
|
const entry = this.pendingBlobs.get(localId);
|
|
375
440
|
(0, common_utils_1.assert)(!!entry, 0x387 /* Must have pending blob entry for blob which failed to upload */);
|
|
441
|
+
if (entry.abortSignal?.aborted === true && !entry.opsent) {
|
|
442
|
+
this.deletePendingBlob(localId);
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
376
445
|
if (!this.runtime.connected) {
|
|
377
446
|
if (entry.status === PendingBlobStatus.OnlinePendingUpload) {
|
|
378
447
|
this.transitionToOffline(localId);
|
|
@@ -421,16 +490,22 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
421
490
|
const pendingEntry = this.pendingBlobs.get(localId);
|
|
422
491
|
if (!blobId) {
|
|
423
492
|
// We submitted this op while offline. The blob should have been uploaded by now.
|
|
424
|
-
(0, common_utils_1.assert)(
|
|
425
|
-
!!
|
|
426
|
-
return this.sendBlobAttachOp(localId, pendingEntry
|
|
493
|
+
(0, common_utils_1.assert)(pendingEntry?.status === PendingBlobStatus.OfflinePendingOp &&
|
|
494
|
+
!!pendingEntry?.storageId, 0x38d /* blob must be uploaded before resubmitting BlobAttach op */);
|
|
495
|
+
return this.sendBlobAttachOp(localId, pendingEntry?.storageId);
|
|
427
496
|
}
|
|
428
497
|
return this.sendBlobAttachOp(localId, blobId);
|
|
429
498
|
}
|
|
430
499
|
processBlobAttachOp(message, local) {
|
|
431
|
-
|
|
432
|
-
const
|
|
433
|
-
|
|
500
|
+
const localId = message.metadata?.localId;
|
|
501
|
+
const blobId = message.metadata?.blobId;
|
|
502
|
+
if (localId) {
|
|
503
|
+
const pendingEntry = this.pendingBlobs.get(localId);
|
|
504
|
+
if (pendingEntry?.abortSignal?.aborted) {
|
|
505
|
+
this.deletePendingBlob(localId);
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
434
509
|
(0, common_utils_1.assert)(blobId !== undefined, 0x12a /* "Missing blob id on metadata" */);
|
|
435
510
|
// Set up a mapping from local ID to storage ID. This is crucial since without this the blob cannot be
|
|
436
511
|
// requested from the server.
|
|
@@ -494,11 +569,10 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
494
569
|
* Load a set of previously attached blob IDs and redirect table from a previous snapshot.
|
|
495
570
|
*/
|
|
496
571
|
load(snapshot) {
|
|
497
|
-
var _a, _b, _c;
|
|
498
572
|
this.mc.logger.sendTelemetryEvent({
|
|
499
573
|
eventName: "AttachmentBlobsLoaded",
|
|
500
|
-
count:
|
|
501
|
-
redirectTable:
|
|
574
|
+
count: snapshot.ids?.length ?? 0,
|
|
575
|
+
redirectTable: snapshot.redirectTable?.length,
|
|
502
576
|
});
|
|
503
577
|
const table = new Map(snapshot.redirectTable);
|
|
504
578
|
if (snapshot.ids) {
|
|
@@ -685,11 +759,15 @@ class BlobManager extends common_utils_1.TypedEventEmitter {
|
|
|
685
759
|
this.setRedirection(storageId, storageId);
|
|
686
760
|
}
|
|
687
761
|
}
|
|
688
|
-
getPendingBlobs() {
|
|
762
|
+
async getPendingBlobs(waitBlobsToAttach) {
|
|
763
|
+
if (waitBlobsToAttach) {
|
|
764
|
+
await this.shutdownPendingBlobs();
|
|
765
|
+
}
|
|
689
766
|
const blobs = {};
|
|
690
767
|
for (const [key, entry] of this.pendingBlobs) {
|
|
691
768
|
blobs[key] = {
|
|
692
769
|
blob: (0, common_utils_1.bufferToString)(entry.blob, "base64"),
|
|
770
|
+
storageId: entry.storageId,
|
|
693
771
|
attached: entry.attached,
|
|
694
772
|
acked: entry.acked,
|
|
695
773
|
minTTLInSeconds: entry.minTTLInSeconds,
|