@fluidframework/container-runtime 2.0.0-internal.6.4.0 → 2.0.0-internal.7.0.1
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 +103 -0
- package/dist/blobManager.d.ts +3 -6
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +23 -48
- package/dist/blobManager.js.map +1 -1
- package/dist/containerHandleContext.js +3 -3
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +13 -14
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +253 -237
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.js +9 -9
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +2 -3
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +88 -87
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreRegistry.js +3 -3
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/dataStores.d.ts +0 -16
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +0 -48
- package/dist/dataStores.js.map +1 -1
- package/dist/deltaManagerProxyBase.js +4 -4
- package/dist/deltaManagerProxyBase.js.map +1 -1
- package/dist/deltaManagerSummarizerProxy.js +6 -6
- package/dist/deltaManagerSummarizerProxy.js.map +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +12 -3
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +54 -31
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +1 -0
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js +12 -2
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +25 -22
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +13 -7
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js +74 -42
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/gc/gcUnreferencedStateTracker.js +3 -3
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/dist/gc/index.d.ts +2 -2
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/index.js +1 -5
- package/dist/gc/index.js.map +1 -1
- package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/idCompressor.js.map +1 -1
- package/dist/id-compressor/identifiers.d.ts +3 -3
- package/dist/id-compressor/identifiers.d.ts.map +1 -1
- package/dist/messageTypes.d.ts +17 -17
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +1 -1
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/batchManager.js +6 -6
- package/dist/opLifecycle/batchManager.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +2 -2
- package/dist/opLifecycle/definitions.d.ts.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 +3 -19
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js +20 -39
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +3 -3
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +54 -54
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js +6 -6
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.js +37 -37
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +8 -6
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.js +6 -6
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.js +9 -9
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +7 -7
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +12 -12
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +21 -21
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +5 -5
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +3 -3
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +7 -7
- package/dist/summary/summaryManager.js.map +1 -1
- package/dist/throttler.js +16 -16
- package/dist/throttler.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/blobManager.d.ts +3 -6
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +24 -49
- package/lib/blobManager.js.map +1 -1
- package/lib/containerHandleContext.js +3 -3
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +13 -14
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +249 -235
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.js +9 -9
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +2 -3
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +89 -88
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreRegistry.js +3 -3
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/dataStores.d.ts +0 -16
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +2 -50
- package/lib/dataStores.js.map +1 -1
- package/lib/deltaManagerProxyBase.js +4 -4
- package/lib/deltaManagerProxyBase.js.map +1 -1
- package/lib/deltaManagerSummarizerProxy.js +6 -6
- package/lib/deltaManagerSummarizerProxy.js.map +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +12 -3
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +55 -32
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +1 -0
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +14 -4
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +25 -22
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +13 -7
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +74 -42
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/gc/gcUnreferencedStateTracker.js +3 -3
- package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
- package/lib/gc/index.d.ts +2 -2
- package/lib/gc/index.d.ts.map +1 -1
- package/lib/gc/index.js +2 -2
- package/lib/gc/index.js.map +1 -1
- package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/idCompressor.js.map +1 -1
- package/lib/id-compressor/identifiers.d.ts +3 -3
- package/lib/id-compressor/identifiers.d.ts.map +1 -1
- package/lib/messageTypes.d.ts +17 -17
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/opLifecycle/batchManager.js +6 -6
- package/lib/opLifecycle/batchManager.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +2 -2
- package/lib/opLifecycle/definitions.d.ts.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 +3 -19
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js +20 -39
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +3 -3
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +54 -54
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js +6 -6
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.js +37 -37
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +8 -6
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.js +6 -6
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.js +9 -9
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +7 -7
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js +3 -3
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +12 -12
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +21 -21
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +5 -5
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +3 -3
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +6 -6
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/throttler.js +16 -16
- package/lib/throttler.js.map +1 -1
- package/package.json +53 -21
- package/src/blobManager.ts +18 -58
- package/src/containerRuntime.ts +68 -49
- package/src/dataStore.ts +1 -1
- package/src/dataStoreContext.ts +18 -14
- package/src/dataStores.ts +2 -80
- package/src/gc/garbageCollection.ts +53 -24
- package/src/gc/gcConfigs.ts +22 -4
- package/src/gc/gcDefinitions.ts +23 -20
- package/src/gc/gcEarlyAdoption.md +1 -1
- package/src/gc/gcTelemetry.ts +103 -56
- package/src/gc/index.ts +0 -4
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +7 -46
- package/src/summary/summarizer.ts +3 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/container-runtime",
|
|
3
|
-
"version": "2.0.0-internal.
|
|
3
|
+
"version": "2.0.0-internal.7.0.1",
|
|
4
4
|
"description": "Fluid container runtime",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -35,18 +35,18 @@
|
|
|
35
35
|
"temp-directory": "nyc/.nyc_output"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@fluid-internal/client-utils": ">=2.0.0-internal.
|
|
39
|
-
"@fluidframework/container-definitions": ">=2.0.0-internal.
|
|
40
|
-
"@fluidframework/container-runtime-definitions": ">=2.0.0-internal.
|
|
41
|
-
"@fluidframework/core-interfaces": ">=2.0.0-internal.
|
|
42
|
-
"@fluidframework/core-utils": ">=2.0.0-internal.
|
|
43
|
-
"@fluidframework/datastore": ">=2.0.0-internal.
|
|
44
|
-
"@fluidframework/driver-definitions": ">=2.0.0-internal.
|
|
45
|
-
"@fluidframework/driver-utils": ">=2.0.0-internal.
|
|
46
|
-
"@fluidframework/protocol-definitions": "^
|
|
47
|
-
"@fluidframework/runtime-definitions": ">=2.0.0-internal.
|
|
48
|
-
"@fluidframework/runtime-utils": ">=2.0.0-internal.
|
|
49
|
-
"@fluidframework/telemetry-utils": ">=2.0.0-internal.
|
|
38
|
+
"@fluid-internal/client-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
39
|
+
"@fluidframework/container-definitions": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
40
|
+
"@fluidframework/container-runtime-definitions": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
41
|
+
"@fluidframework/core-interfaces": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
42
|
+
"@fluidframework/core-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
43
|
+
"@fluidframework/datastore": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
44
|
+
"@fluidframework/driver-definitions": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
45
|
+
"@fluidframework/driver-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
46
|
+
"@fluidframework/protocol-definitions": "^3.0.0",
|
|
47
|
+
"@fluidframework/runtime-definitions": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
48
|
+
"@fluidframework/runtime-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
49
|
+
"@fluidframework/telemetry-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
50
50
|
"double-ended-queue": "^2.1.0-0",
|
|
51
51
|
"events": "^3.1.0",
|
|
52
52
|
"lz4js": "^0.2.0",
|
|
@@ -54,16 +54,16 @@
|
|
|
54
54
|
"uuid": "^9.0.0"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.
|
|
57
|
+
"@fluid-internal/stochastic-test-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
58
58
|
"@fluid-tools/benchmark": "^0.48.0",
|
|
59
|
-
"@fluid-tools/build-cli": "^0.
|
|
59
|
+
"@fluid-tools/build-cli": "^0.24.0",
|
|
60
60
|
"@fluidframework/build-common": "^2.0.0",
|
|
61
|
-
"@fluidframework/build-tools": "^0.
|
|
61
|
+
"@fluidframework/build-tools": "^0.24.0",
|
|
62
62
|
"@fluidframework/container-runtime-previous": "npm:@fluidframework/container-runtime@2.0.0-internal.6.3.0",
|
|
63
63
|
"@fluidframework/eslint-config-fluid": "^2.1.0",
|
|
64
|
-
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.
|
|
65
|
-
"@fluidframework/test-runtime-utils": ">=2.0.0-internal.
|
|
66
|
-
"@microsoft/api-extractor": "^7.
|
|
64
|
+
"@fluidframework/mocha-test-setup": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
65
|
+
"@fluidframework/test-runtime-utils": ">=2.0.0-internal.7.0.1 <2.0.0-internal.7.1.0",
|
|
66
|
+
"@microsoft/api-extractor": "^7.37.0",
|
|
67
67
|
"@types/double-ended-queue": "^2.1.0",
|
|
68
68
|
"@types/events": "^3.0.0",
|
|
69
69
|
"@types/mocha": "^9.1.1",
|
|
@@ -80,10 +80,42 @@
|
|
|
80
80
|
"prettier": "~2.6.2",
|
|
81
81
|
"rimraf": "^4.4.0",
|
|
82
82
|
"sinon": "^7.4.2",
|
|
83
|
-
"typescript": "~
|
|
83
|
+
"typescript": "~5.1.6"
|
|
84
84
|
},
|
|
85
85
|
"typeValidation": {
|
|
86
|
-
"broken": {
|
|
86
|
+
"broken": {
|
|
87
|
+
"ClassDeclaration_ContainerRuntime": {
|
|
88
|
+
"forwardCompat": false,
|
|
89
|
+
"backCompat": false
|
|
90
|
+
},
|
|
91
|
+
"InterfaceDeclaration_IAckedSummary": {
|
|
92
|
+
"backCompat": false
|
|
93
|
+
},
|
|
94
|
+
"InterfaceDeclaration_IAckSummaryResult": {
|
|
95
|
+
"backCompat": false
|
|
96
|
+
},
|
|
97
|
+
"InterfaceDeclaration_IBroadcastSummaryResult": {
|
|
98
|
+
"backCompat": false
|
|
99
|
+
},
|
|
100
|
+
"InterfaceDeclaration_ISummaryOpMessage": {
|
|
101
|
+
"backCompat": false
|
|
102
|
+
},
|
|
103
|
+
"InterfaceDeclaration_ISummaryNackMessage": {
|
|
104
|
+
"backCompat": false
|
|
105
|
+
},
|
|
106
|
+
"ClassDeclaration_Summarizer": {
|
|
107
|
+
"backCompat": false
|
|
108
|
+
},
|
|
109
|
+
"ClassDeclaration_SummaryCollection": {
|
|
110
|
+
"backCompat": false
|
|
111
|
+
},
|
|
112
|
+
"InterfaceDeclaration_INackSummaryResult": {
|
|
113
|
+
"backCompat": false
|
|
114
|
+
},
|
|
115
|
+
"InterfaceDeclaration_ISummaryAckMessage": {
|
|
116
|
+
"backCompat": false
|
|
117
|
+
}
|
|
118
|
+
}
|
|
87
119
|
},
|
|
88
120
|
"scripts": {
|
|
89
121
|
"build": "fluid-build . --task build",
|
package/src/blobManager.ts
CHANGED
|
@@ -37,14 +37,8 @@ import {
|
|
|
37
37
|
ITelemetryContext,
|
|
38
38
|
} from "@fluidframework/runtime-definitions";
|
|
39
39
|
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
sendGCUnexpectedUsageEvent,
|
|
43
|
-
disableAttachmentBlobSweepKey,
|
|
44
|
-
throwOnTombstoneLoadKey,
|
|
45
|
-
} from "./gc";
|
|
40
|
+
import { disableAttachmentBlobSweepKey } from "./gc";
|
|
46
41
|
import { Throttler, formExponentialFn, IThrottler } from "./throttler";
|
|
47
|
-
import { summarizerClientType } from "./summary";
|
|
48
42
|
import { IBlobMetadata } from "./metadata";
|
|
49
43
|
|
|
50
44
|
/**
|
|
@@ -119,7 +113,6 @@ export type IBlobManagerRuntime = Pick<
|
|
|
119
113
|
IContainerRuntime,
|
|
120
114
|
"attachState" | "connected" | "logger" | "clientDetails"
|
|
121
115
|
> &
|
|
122
|
-
Pick<ContainerRuntime, "gcTombstoneEnforcementAllowed"> &
|
|
123
116
|
TypedEventEmitter<IContainerRuntimeEvents>;
|
|
124
117
|
|
|
125
118
|
type ICreateBlobResponseWithTTL = ICreateBlobResponse & Partial<Record<"minTTLInSeconds", number>>;
|
|
@@ -189,8 +182,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
189
182
|
),
|
|
190
183
|
);
|
|
191
184
|
|
|
192
|
-
/** If true, throw an error when a tombstone attachment blob is retrieved. */
|
|
193
|
-
private readonly throwOnTombstoneLoad: boolean;
|
|
194
185
|
/**
|
|
195
186
|
* This stores IDs of tombstoned blobs.
|
|
196
187
|
* Tombstone is a temporary feature that imitates a blob getting swept by garbage collection.
|
|
@@ -229,11 +220,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
229
220
|
logger: this.runtime.logger,
|
|
230
221
|
namespace: "BlobManager",
|
|
231
222
|
});
|
|
232
|
-
// Read the feature flag that tells whether to throw when a tombstone blob is requested.
|
|
233
|
-
this.throwOnTombstoneLoad =
|
|
234
|
-
this.mc.config.getBoolean(throwOnTombstoneLoadKey) === true &&
|
|
235
|
-
this.runtime.gcTombstoneEnforcementAllowed &&
|
|
236
|
-
this.runtime.clientDetails.type !== summarizerClientType;
|
|
237
223
|
|
|
238
224
|
this.redirectTable = this.load(snapshot);
|
|
239
225
|
|
|
@@ -376,14 +362,19 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
376
362
|
}
|
|
377
363
|
|
|
378
364
|
public async getBlob(blobId: string): Promise<ArrayBufferLike> {
|
|
379
|
-
// Verify that the blob is
|
|
380
|
-
// failing the call.
|
|
381
|
-
this.
|
|
365
|
+
// Verify that the blob is not deleted, i.e., it has not been garbage collected. If it is, this will throw
|
|
366
|
+
// an error, failing the call.
|
|
367
|
+
this.verifyBlobNotDeleted(blobId);
|
|
368
|
+
// Let runtime know that the corresponding GC node was requested.
|
|
369
|
+
// Note that this will throw if the blob is inactive or tombstoned and throwing on incorrect usage
|
|
370
|
+
// is configured.
|
|
371
|
+
this.blobRequested(getGCNodePathFromBlobId(blobId));
|
|
382
372
|
|
|
383
373
|
const pending = this.pendingBlobs.get(blobId);
|
|
384
374
|
if (pending) {
|
|
385
375
|
return pending.blob;
|
|
386
376
|
}
|
|
377
|
+
|
|
387
378
|
let storageId: string;
|
|
388
379
|
if (this.runtime.attachState === AttachState.Detached) {
|
|
389
380
|
assert(this.redirectTable.has(blobId), 0x383 /* requesting unknown blobs */);
|
|
@@ -397,9 +388,6 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
397
388
|
storageId = attachedStorageId;
|
|
398
389
|
}
|
|
399
390
|
|
|
400
|
-
// Let runtime know that the corresponding GC node was requested.
|
|
401
|
-
this.blobRequested(getGCNodePathFromBlobId(blobId));
|
|
402
|
-
|
|
403
391
|
return PerformanceEvent.timedExecAsync(
|
|
404
392
|
this.mc.logger,
|
|
405
393
|
{ eventName: "AttachmentReadBlob", id: storageId },
|
|
@@ -858,56 +846,28 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
858
846
|
}
|
|
859
847
|
|
|
860
848
|
/**
|
|
861
|
-
* Verifies that the blob with given id is
|
|
849
|
+
* Verifies that the blob with given id is not deleted, i.e., it has not been garbage collected. If the blob is GC'd,
|
|
862
850
|
* log an error and throw if necessary.
|
|
863
851
|
*/
|
|
864
|
-
private
|
|
865
|
-
|
|
866
|
-
* A blob can be in one of the following states:
|
|
867
|
-
* 1. "deleted" - It has been deleted by garbage collection sweep phase.
|
|
868
|
-
* 2. "tombstoned" - It is ready for deletion but sweep phase isn't enabled and tombstone feature is enabled.
|
|
869
|
-
* 3. "valid" - It has not been deleted or tombstoned.
|
|
870
|
-
*/
|
|
871
|
-
let state: "valid" | "tombstoned" | "deleted" = "valid";
|
|
872
|
-
if (this.isBlobDeleted(getGCNodePathFromBlobId(blobId))) {
|
|
873
|
-
state = "deleted";
|
|
874
|
-
} else if (this.tombstonedBlobs.has(blobId)) {
|
|
875
|
-
state = "tombstoned";
|
|
876
|
-
}
|
|
877
|
-
|
|
878
|
-
if (state === "valid") {
|
|
852
|
+
private verifyBlobNotDeleted(blobId: string) {
|
|
853
|
+
if (!this.isBlobDeleted(getGCNodePathFromBlobId(blobId))) {
|
|
879
854
|
return;
|
|
880
855
|
}
|
|
881
856
|
|
|
882
|
-
// If the blob is deleted or throw on tombstone load is enabled, throw an error which will fail any attempt
|
|
883
|
-
// to load the blob.
|
|
884
|
-
const shouldFail = state === "deleted" || this.throwOnTombstoneLoad;
|
|
885
857
|
const request = { url: blobId };
|
|
886
858
|
const error = responseToException(
|
|
887
|
-
createResponseError(
|
|
888
|
-
404,
|
|
889
|
-
"Blob was deleted",
|
|
890
|
-
request,
|
|
891
|
-
state === "tombstoned" ? { [TombstoneResponseHeaderKey]: true } : undefined,
|
|
892
|
-
),
|
|
859
|
+
createResponseError(404, `Blob was deleted`, request),
|
|
893
860
|
request,
|
|
894
861
|
);
|
|
895
|
-
|
|
896
|
-
|
|
862
|
+
// Only log deleted events. Tombstone events are logged by garbage collector.
|
|
863
|
+
this.mc.logger.sendErrorEvent(
|
|
897
864
|
{
|
|
898
|
-
eventName:
|
|
899
|
-
|
|
900
|
-
? "GC_Tombstone_Blob_Requested"
|
|
901
|
-
: "GC_Deleted_Blob_Requested",
|
|
902
|
-
category: shouldFail ? "error" : "generic",
|
|
903
|
-
gcTombstoneEnforcementAllowed: this.runtime.gcTombstoneEnforcementAllowed,
|
|
865
|
+
eventName: "GC_Deleted_Blob_Requested",
|
|
866
|
+
pkg: BlobManager.basePath,
|
|
904
867
|
},
|
|
905
|
-
[BlobManager.basePath],
|
|
906
868
|
error,
|
|
907
869
|
);
|
|
908
|
-
|
|
909
|
-
throw error;
|
|
910
|
-
}
|
|
870
|
+
throw error;
|
|
911
871
|
}
|
|
912
872
|
|
|
913
873
|
public setRedirectTable(table: Map<string, string>) {
|
package/src/containerRuntime.ts
CHANGED
|
@@ -8,9 +8,11 @@ import {
|
|
|
8
8
|
FluidObject,
|
|
9
9
|
IFluidHandle,
|
|
10
10
|
IFluidHandleContext,
|
|
11
|
+
// eslint-disable-next-line import/no-deprecated
|
|
11
12
|
IFluidRouter,
|
|
12
13
|
IRequest,
|
|
13
14
|
IResponse,
|
|
15
|
+
IProvideFluidHandleContext,
|
|
14
16
|
} from "@fluidframework/core-interfaces";
|
|
15
17
|
import {
|
|
16
18
|
IAudience,
|
|
@@ -97,6 +99,7 @@ import {
|
|
|
97
99
|
create404Response,
|
|
98
100
|
exceptionToResponse,
|
|
99
101
|
GCDataBuilder,
|
|
102
|
+
// eslint-disable-next-line import/no-deprecated
|
|
100
103
|
requestFluidObject,
|
|
101
104
|
seqFromTree,
|
|
102
105
|
calculateStats,
|
|
@@ -163,7 +166,6 @@ import {
|
|
|
163
166
|
IGarbageCollector,
|
|
164
167
|
IGCRuntimeOptions,
|
|
165
168
|
IGCStats,
|
|
166
|
-
shouldAllowGcTombstoneEnforcement,
|
|
167
169
|
trimLeadingAndTrailingSlashes,
|
|
168
170
|
} from "./gc";
|
|
169
171
|
import { channelToDataStore, IDataStoreAliasMessage, isDataStoreAliasMessage } from "./dataStore";
|
|
@@ -472,6 +474,7 @@ export interface RuntimeHeaderData {
|
|
|
472
474
|
wait?: boolean;
|
|
473
475
|
viaHandle?: boolean;
|
|
474
476
|
allowTombstone?: boolean;
|
|
477
|
+
allowInactive?: boolean;
|
|
475
478
|
}
|
|
476
479
|
|
|
477
480
|
/** Default values for Runtime Headers */
|
|
@@ -479,6 +482,7 @@ export const defaultRuntimeHeaderData: Required<RuntimeHeaderData> = {
|
|
|
479
482
|
wait: true,
|
|
480
483
|
viaHandle: false,
|
|
481
484
|
allowTombstone: false,
|
|
485
|
+
allowInactive: false,
|
|
482
486
|
};
|
|
483
487
|
|
|
484
488
|
/**
|
|
@@ -632,7 +636,12 @@ type MessageWithContext =
|
|
|
632
636
|
*/
|
|
633
637
|
export class ContainerRuntime
|
|
634
638
|
extends TypedEventEmitter<IContainerRuntimeEvents & ISummarizerEvents>
|
|
635
|
-
implements
|
|
639
|
+
implements
|
|
640
|
+
IContainerRuntime,
|
|
641
|
+
IRuntime,
|
|
642
|
+
ISummarizerRuntime,
|
|
643
|
+
ISummarizerInternalsProvider,
|
|
644
|
+
IProvideFluidHandleContext
|
|
636
645
|
{
|
|
637
646
|
/**
|
|
638
647
|
* @deprecated - Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md
|
|
@@ -669,10 +678,15 @@ export class ContainerRuntime
|
|
|
669
678
|
context,
|
|
670
679
|
registryEntries,
|
|
671
680
|
existing: existingFlag,
|
|
672
|
-
requestHandler,
|
|
673
681
|
runtimeOptions,
|
|
674
682
|
containerScope,
|
|
675
683
|
containerRuntimeCtor,
|
|
684
|
+
requestHandler,
|
|
685
|
+
provideEntryPoint: () => {
|
|
686
|
+
throw new UsageError(
|
|
687
|
+
"ContainerRuntime.load is deprecated and should no longer be used",
|
|
688
|
+
);
|
|
689
|
+
},
|
|
676
690
|
});
|
|
677
691
|
}
|
|
678
692
|
|
|
@@ -688,7 +702,7 @@ export class ContainerRuntime
|
|
|
688
702
|
* - containerScope - runtime services provided with context
|
|
689
703
|
* - containerRuntimeCtor - Constructor to use to create the ContainerRuntime instance.
|
|
690
704
|
* This allows mixin classes to leverage this method to define their own async initializer.
|
|
691
|
-
* -
|
|
705
|
+
* - provideEntryPoint - Promise that resolves to an object which will act as entryPoint for the Container.
|
|
692
706
|
* This object should provide all the functionality that the Container is expected to provide to the loader layer.
|
|
693
707
|
*/
|
|
694
708
|
public static async loadRuntime(params: {
|
|
@@ -698,30 +712,21 @@ export class ContainerRuntime
|
|
|
698
712
|
runtimeOptions?: IContainerRuntimeOptions;
|
|
699
713
|
containerScope?: FluidObject;
|
|
700
714
|
containerRuntimeCtor?: typeof ContainerRuntime;
|
|
715
|
+
/** @deprecated Will be removed in future major release. Migrate all usage of IFluidRouter to the "entryPoint" pattern. Refer to Removing-IFluidRouter.md */
|
|
701
716
|
requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>;
|
|
702
|
-
|
|
717
|
+
provideEntryPoint: (containerRuntime: IContainerRuntime) => Promise<FluidObject>;
|
|
703
718
|
}): Promise<ContainerRuntime> {
|
|
704
719
|
const {
|
|
705
720
|
context,
|
|
706
721
|
registryEntries,
|
|
707
722
|
existing,
|
|
708
723
|
requestHandler,
|
|
724
|
+
provideEntryPoint,
|
|
709
725
|
runtimeOptions = {},
|
|
710
726
|
containerScope = {},
|
|
711
727
|
containerRuntimeCtor = ContainerRuntime,
|
|
712
728
|
} = params;
|
|
713
729
|
|
|
714
|
-
const initializeEntryPoint =
|
|
715
|
-
params.initializeEntryPoint ??
|
|
716
|
-
(async (containerRuntime: IContainerRuntime) => ({
|
|
717
|
-
get IFluidRouter() {
|
|
718
|
-
return this;
|
|
719
|
-
},
|
|
720
|
-
async request(req) {
|
|
721
|
-
return containerRuntime.request(req);
|
|
722
|
-
},
|
|
723
|
-
}));
|
|
724
|
-
|
|
725
730
|
// If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:
|
|
726
731
|
// back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45
|
|
727
732
|
const backCompatContext: IContainerContext | OldContainerContextWithLogger = context;
|
|
@@ -850,9 +855,9 @@ export class ContainerRuntime
|
|
|
850
855
|
blobManagerSnapshot,
|
|
851
856
|
context.storage,
|
|
852
857
|
idCompressor,
|
|
858
|
+
provideEntryPoint,
|
|
853
859
|
requestHandler,
|
|
854
860
|
undefined, // summaryConfiguration
|
|
855
|
-
initializeEntryPoint,
|
|
856
861
|
);
|
|
857
862
|
|
|
858
863
|
// Apply stashed ops with a reference sequence number equal to the sequence number of the snapshot,
|
|
@@ -878,17 +883,6 @@ export class ContainerRuntime
|
|
|
878
883
|
return this._storage;
|
|
879
884
|
}
|
|
880
885
|
|
|
881
|
-
/** @deprecated - The functionality is no longer exposed publicly */
|
|
882
|
-
public get reSubmitFn() {
|
|
883
|
-
return (
|
|
884
|
-
type: ContainerMessageType,
|
|
885
|
-
contents: any,
|
|
886
|
-
localOpMetadata: unknown,
|
|
887
|
-
opMetadata: Record<string, unknown> | undefined,
|
|
888
|
-
) => this.reSubmitCore({ type, contents }, localOpMetadata, opMetadata);
|
|
889
|
-
// Note: compatDetails is not included in this deprecated API
|
|
890
|
-
}
|
|
891
|
-
|
|
892
886
|
private readonly submitFn: (
|
|
893
887
|
type: MessageType,
|
|
894
888
|
contents: any,
|
|
@@ -1097,10 +1091,15 @@ export class ContainerRuntime
|
|
|
1097
1091
|
*/
|
|
1098
1092
|
private nextSummaryNumber: number;
|
|
1099
1093
|
|
|
1100
|
-
/**
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1094
|
+
/** If false, loading or using a Tombstoned object should merely log, not fail */
|
|
1095
|
+
public get gcTombstoneEnforcementAllowed(): boolean {
|
|
1096
|
+
return this.garbageCollector.tombstoneEnforcementAllowed;
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
/** If true, throw an error when a tombstone data store is used. */
|
|
1100
|
+
public get gcThrowOnTombstoneUsage(): boolean {
|
|
1101
|
+
return this.garbageCollector.throwOnTombstoneUsage;
|
|
1102
|
+
}
|
|
1104
1103
|
|
|
1105
1104
|
/**
|
|
1106
1105
|
* GUID to identify a document in telemetry
|
|
@@ -1140,6 +1139,7 @@ export class ContainerRuntime
|
|
|
1140
1139
|
blobManagerSnapshot: IBlobManagerLoadInfo,
|
|
1141
1140
|
private readonly _storage: IDocumentStorageService,
|
|
1142
1141
|
idCompressor: (IIdCompressor & IIdCompressorCore) | undefined,
|
|
1142
|
+
provideEntryPoint: (containerRuntime: IContainerRuntime) => Promise<FluidObject>,
|
|
1143
1143
|
private readonly requestHandler?: (
|
|
1144
1144
|
request: IRequest,
|
|
1145
1145
|
runtime: IContainerRuntime,
|
|
@@ -1150,7 +1150,6 @@ export class ContainerRuntime
|
|
|
1150
1150
|
// the runtime configuration overrides
|
|
1151
1151
|
...runtimeOptions.summaryOptions?.summaryConfigOverrides,
|
|
1152
1152
|
},
|
|
1153
|
-
initializeEntryPoint?: (containerRuntime: IContainerRuntime) => Promise<FluidObject>,
|
|
1154
1153
|
) {
|
|
1155
1154
|
super();
|
|
1156
1155
|
|
|
@@ -1247,11 +1246,6 @@ export class ContainerRuntime
|
|
|
1247
1246
|
// Later updates come through calls to setConnectionState.
|
|
1248
1247
|
this._connected = connected;
|
|
1249
1248
|
|
|
1250
|
-
this.gcTombstoneEnforcementAllowed = shouldAllowGcTombstoneEnforcement(
|
|
1251
|
-
metadata?.gcFeatureMatrix?.tombstoneGeneration /* persisted */,
|
|
1252
|
-
this.runtimeOptions.gcOptions[gcTombstoneGenerationOptionName] /* current */,
|
|
1253
|
-
);
|
|
1254
|
-
|
|
1255
1249
|
this.mc.logger.sendTelemetryEvent({
|
|
1256
1250
|
eventName: "GCFeatureMatrix",
|
|
1257
1251
|
metadataValue: JSON.stringify(metadata?.gcFeatureMatrix),
|
|
@@ -1642,7 +1636,7 @@ export class ContainerRuntime
|
|
|
1642
1636
|
);
|
|
1643
1637
|
return this._summarizer;
|
|
1644
1638
|
}
|
|
1645
|
-
return
|
|
1639
|
+
return provideEntryPoint(this);
|
|
1646
1640
|
});
|
|
1647
1641
|
}
|
|
1648
1642
|
|
|
@@ -1733,7 +1727,10 @@ export class ContainerRuntime
|
|
|
1733
1727
|
}
|
|
1734
1728
|
: create404Response(request);
|
|
1735
1729
|
} else if (requestParser.pathParts.length > 0) {
|
|
1736
|
-
|
|
1730
|
+
// Differentiate between requesting the dataStore directly, or one of its children
|
|
1731
|
+
const requestForChild = !requestParser.isLeaf(1);
|
|
1732
|
+
const dataStore = await this.getDataStoreFromRequest(id, request, requestForChild);
|
|
1733
|
+
|
|
1737
1734
|
const subRequest = requestParser.createSubRequest(1);
|
|
1738
1735
|
// We always expect createSubRequest to include a leading slash, but asserting here to protect against
|
|
1739
1736
|
// unintentionally modifying the url if that changes.
|
|
@@ -1753,10 +1750,10 @@ export class ContainerRuntime
|
|
|
1753
1750
|
/**
|
|
1754
1751
|
* {@inheritDoc @fluidframework/container-definitions#IRuntime.getEntryPoint}
|
|
1755
1752
|
*/
|
|
1756
|
-
public async getEntryPoint
|
|
1753
|
+
public async getEntryPoint(): Promise<FluidObject> {
|
|
1757
1754
|
return this.entryPoint;
|
|
1758
1755
|
}
|
|
1759
|
-
private readonly entryPoint: LazyPromise<FluidObject
|
|
1756
|
+
private readonly entryPoint: LazyPromise<FluidObject>;
|
|
1760
1757
|
|
|
1761
1758
|
private internalId(maybeAlias: string): string {
|
|
1762
1759
|
return this.dataStores.aliases.get(maybeAlias) ?? maybeAlias;
|
|
@@ -1765,6 +1762,7 @@ export class ContainerRuntime
|
|
|
1765
1762
|
private async getDataStoreFromRequest(
|
|
1766
1763
|
id: string,
|
|
1767
1764
|
request: IRequest,
|
|
1765
|
+
requestForChild: boolean,
|
|
1768
1766
|
): Promise<IFluidDataStoreChannel> {
|
|
1769
1767
|
const headerData: RuntimeHeaderData = {};
|
|
1770
1768
|
if (typeof request.headers?.[RuntimeHeaders.wait] === "boolean") {
|
|
@@ -1776,24 +1774,36 @@ export class ContainerRuntime
|
|
|
1776
1774
|
if (typeof request.headers?.[AllowTombstoneRequestHeaderKey] === "boolean") {
|
|
1777
1775
|
headerData.allowTombstone = request.headers[AllowTombstoneRequestHeaderKey];
|
|
1778
1776
|
}
|
|
1777
|
+
if (typeof request.headers?.[AllowInactiveRequestHeaderKey] === "boolean") {
|
|
1778
|
+
headerData.allowInactive = request.headers[AllowInactiveRequestHeaderKey];
|
|
1779
|
+
}
|
|
1780
|
+
|
|
1781
|
+
// We allow Tombstone requests for sub-DataStore objects
|
|
1782
|
+
if (requestForChild) {
|
|
1783
|
+
headerData.allowTombstone = true;
|
|
1784
|
+
}
|
|
1779
1785
|
|
|
1780
1786
|
await this.dataStores.waitIfPendingAlias(id);
|
|
1781
1787
|
const internalId = this.internalId(id);
|
|
1782
1788
|
const dataStoreContext = await this.dataStores.getDataStore(internalId, headerData);
|
|
1783
|
-
const dataStoreChannel = await dataStoreContext.realize();
|
|
1784
1789
|
|
|
1785
1790
|
// Remove query params, leading and trailing slashes from the url. This is done to make sure the format is
|
|
1786
1791
|
// the same as GC nodes id.
|
|
1787
1792
|
const urlWithoutQuery = trimLeadingAndTrailingSlashes(request.url.split("?")[0]);
|
|
1793
|
+
// Get the initial snapshot details which contain the data store package path.
|
|
1794
|
+
const details = await dataStoreContext.getInitialSnapshotDetails();
|
|
1795
|
+
|
|
1796
|
+
// Note that this will throw if the data store is inactive or tombstoned and throwing on incorrect usage
|
|
1797
|
+
// is configured.
|
|
1788
1798
|
this.garbageCollector.nodeUpdated(
|
|
1789
1799
|
`/${urlWithoutQuery}`,
|
|
1790
1800
|
"Loaded",
|
|
1791
1801
|
undefined /* timestampMs */,
|
|
1792
|
-
|
|
1793
|
-
request
|
|
1802
|
+
details.pkg,
|
|
1803
|
+
request,
|
|
1804
|
+
headerData,
|
|
1794
1805
|
);
|
|
1795
|
-
|
|
1796
|
-
return dataStoreChannel;
|
|
1806
|
+
return dataStoreContext.realize();
|
|
1797
1807
|
}
|
|
1798
1808
|
|
|
1799
1809
|
/** Adds the container's metadata to the given summary tree. */
|
|
@@ -2338,6 +2348,7 @@ export class ContainerRuntime
|
|
|
2338
2348
|
* @param wait - True if you want to wait for it.
|
|
2339
2349
|
* @deprecated - Use getAliasedDataStoreEntryPoint instead to get an aliased data store's entry point.
|
|
2340
2350
|
*/
|
|
2351
|
+
// eslint-disable-next-line import/no-deprecated
|
|
2341
2352
|
public async getRootDataStore(id: string, wait = true): Promise<IFluidRouter> {
|
|
2342
2353
|
return this.getRootDataStoreChannel(id, wait);
|
|
2343
2354
|
}
|
|
@@ -2436,6 +2447,12 @@ export class ContainerRuntime
|
|
|
2436
2447
|
"entryPoint must be defined on data store runtime for using getAliasedDataStoreEntryPoint",
|
|
2437
2448
|
);
|
|
2438
2449
|
}
|
|
2450
|
+
this.garbageCollector.nodeUpdated(
|
|
2451
|
+
`/${internalId}`,
|
|
2452
|
+
"Loaded",
|
|
2453
|
+
undefined /* timestampMs */,
|
|
2454
|
+
context.packagePath,
|
|
2455
|
+
);
|
|
2439
2456
|
return channel.entryPoint;
|
|
2440
2457
|
}
|
|
2441
2458
|
|
|
@@ -2526,7 +2543,7 @@ export class ContainerRuntime
|
|
|
2526
2543
|
return false;
|
|
2527
2544
|
}
|
|
2528
2545
|
} else if (type === ContainerMessageType.FluidDataStoreOp) {
|
|
2529
|
-
const envelope = contents
|
|
2546
|
+
const envelope = contents;
|
|
2530
2547
|
if (envelope.address === agentSchedulerId) {
|
|
2531
2548
|
return false;
|
|
2532
2549
|
}
|
|
@@ -3664,7 +3681,7 @@ export class ContainerRuntime
|
|
|
3664
3681
|
case ContainerMessageType.FluidDataStoreOp:
|
|
3665
3682
|
// For operations, call rollbackDataStoreOp which will find the right store
|
|
3666
3683
|
// and trigger rollback on it.
|
|
3667
|
-
this.dataStores.rollbackDataStoreOp(contents
|
|
3684
|
+
this.dataStores.rollbackDataStoreOp(contents, localOpMetadata);
|
|
3668
3685
|
break;
|
|
3669
3686
|
default:
|
|
3670
3687
|
// Don't check message.compatDetails because this is for rolling back a local op so the type will be known
|
|
@@ -3914,6 +3931,7 @@ export class ContainerRuntime
|
|
|
3914
3931
|
* * Forms a function that will request a Summarizer.
|
|
3915
3932
|
* @param loaderRouter - the loader acting as an IFluidRouter
|
|
3916
3933
|
* */
|
|
3934
|
+
// eslint-disable-next-line import/no-deprecated
|
|
3917
3935
|
private formRequestSummarizerFn(loaderRouter: IFluidRouter) {
|
|
3918
3936
|
return async () => {
|
|
3919
3937
|
const request: IRequest = {
|
|
@@ -3929,6 +3947,7 @@ export class ContainerRuntime
|
|
|
3929
3947
|
url: "/_summarizer",
|
|
3930
3948
|
};
|
|
3931
3949
|
|
|
3950
|
+
// eslint-disable-next-line import/no-deprecated
|
|
3932
3951
|
const fluidObject = await requestFluidObject<FluidObject<ISummarizer>>(
|
|
3933
3952
|
loaderRouter,
|
|
3934
3953
|
request,
|
package/src/dataStore.ts
CHANGED
|
@@ -170,7 +170,7 @@ class DataStore implements IDataStore {
|
|
|
170
170
|
/**
|
|
171
171
|
* {@inheritDoc @fluidframework/runtime-definitions#IDataStore.entryPoint}
|
|
172
172
|
*/
|
|
173
|
-
get entryPoint(): IFluidHandle<FluidObject>
|
|
173
|
+
get entryPoint(): IFluidHandle<FluidObject> {
|
|
174
174
|
return this.fluidDataStoreChannel.entryPoint;
|
|
175
175
|
}
|
|
176
176
|
|
package/src/dataStoreContext.ts
CHANGED
|
@@ -78,7 +78,7 @@ import {
|
|
|
78
78
|
summarizerClientType,
|
|
79
79
|
} from "./summary";
|
|
80
80
|
import { ContainerRuntime } from "./containerRuntime";
|
|
81
|
-
import { sendGCUnexpectedUsageEvent
|
|
81
|
+
import { sendGCUnexpectedUsageEvent } from "./gc";
|
|
82
82
|
|
|
83
83
|
function createAttributes(
|
|
84
84
|
pkg: readonly string[],
|
|
@@ -325,11 +325,7 @@ export abstract class FluidDataStoreContext
|
|
|
325
325
|
this.mc.logger,
|
|
326
326
|
);
|
|
327
327
|
|
|
328
|
-
|
|
329
|
-
this.throwOnTombstoneUsage =
|
|
330
|
-
this.mc.config.getBoolean(throwOnTombstoneUsageKey) === true &&
|
|
331
|
-
this._containerRuntime.gcTombstoneEnforcementAllowed &&
|
|
332
|
-
this.clientDetails.type !== summarizerClientType;
|
|
328
|
+
this.throwOnTombstoneUsage = this._containerRuntime.gcThrowOnTombstoneUsage;
|
|
333
329
|
|
|
334
330
|
// By default, a data store can log maximum 10 local changes telemetry in summarizer.
|
|
335
331
|
this.localChangesTelemetryCount =
|
|
@@ -486,7 +482,16 @@ export abstract class FluidDataStoreContext
|
|
|
486
482
|
local: boolean,
|
|
487
483
|
localOpMetadata: unknown,
|
|
488
484
|
): void {
|
|
489
|
-
|
|
485
|
+
const safeTelemetryProps = extractSafePropertiesFromMessage(messageArg);
|
|
486
|
+
// On op process, tombstone error is logged in garbage collector. So, set "checkTombstone" to false when calling
|
|
487
|
+
// "verifyNotClosed" which logs tombstone errors. Throw error if tombstoned and throwing on load is configured.
|
|
488
|
+
this.verifyNotClosed("process", false /* checkTombstone */, safeTelemetryProps);
|
|
489
|
+
if (this.tombstoned && this.throwOnTombstoneUsage) {
|
|
490
|
+
throw new DataCorruptionError(
|
|
491
|
+
"Context is tombstoned! Call site [process]",
|
|
492
|
+
safeTelemetryProps,
|
|
493
|
+
);
|
|
494
|
+
}
|
|
490
495
|
|
|
491
496
|
const innerContents = messageArg.contents as FluidDataStoreMessage;
|
|
492
497
|
const message = {
|
|
@@ -740,11 +745,6 @@ export abstract class FluidDataStoreContext
|
|
|
740
745
|
this.makeLocallyVisibleFn();
|
|
741
746
|
}
|
|
742
747
|
|
|
743
|
-
/** @deprecated - To be replaced by calling makeLocallyVisible directly */
|
|
744
|
-
public bindToContext() {
|
|
745
|
-
this.makeLocallyVisibleFn();
|
|
746
|
-
}
|
|
747
|
-
|
|
748
748
|
protected bindRuntime(channel: IFluidDataStoreChannel) {
|
|
749
749
|
if (this.channel) {
|
|
750
750
|
throw new Error("Runtime already bound");
|
|
@@ -1094,7 +1094,7 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
|
|
|
1094
1094
|
return message;
|
|
1095
1095
|
}
|
|
1096
1096
|
|
|
1097
|
-
|
|
1097
|
+
private readonly initialSnapshotDetailsP = new LazyPromise<ISnapshotDetails>(async () => {
|
|
1098
1098
|
let snapshot = this.snapshotTree;
|
|
1099
1099
|
let attributes: ReadFluidDataStoreAttributes;
|
|
1100
1100
|
let isRootDataStore = false;
|
|
@@ -1127,6 +1127,10 @@ export class LocalFluidDataStoreContextBase extends FluidDataStoreContext {
|
|
|
1127
1127
|
isRootDataStore,
|
|
1128
1128
|
snapshot,
|
|
1129
1129
|
};
|
|
1130
|
+
});
|
|
1131
|
+
|
|
1132
|
+
public async getInitialSnapshotDetails(): Promise<ISnapshotDetails> {
|
|
1133
|
+
return this.initialSnapshotDetailsP;
|
|
1130
1134
|
}
|
|
1131
1135
|
|
|
1132
1136
|
/**
|
|
@@ -1206,7 +1210,7 @@ export class LocalDetachedFluidDataStoreContext
|
|
|
1206
1210
|
// of data store factories tends to construct the data object (at least kick off an async method that returns
|
|
1207
1211
|
// it); that code moved to the entryPoint initialization function, so we want to ensure it still executes
|
|
1208
1212
|
// before the data store is attached.
|
|
1209
|
-
await dataStoreChannel.entryPoint
|
|
1213
|
+
await dataStoreChannel.entryPoint.get();
|
|
1210
1214
|
|
|
1211
1215
|
if (await this.isRoot()) {
|
|
1212
1216
|
dataStoreChannel.makeVisibleAndAttachGraph();
|