@fluidframework/container-runtime 2.0.0-dev-rc.1.0.0.225277 → 2.0.0-dev-rc.1.0.0.228517
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 +34 -0
- package/README.md +1 -7
- package/api-report/container-runtime.api.md +1 -0
- package/dist/{batchTracker.cjs → batchTracker.js} +1 -1
- package/dist/batchTracker.js.map +1 -0
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/{blobManager.cjs → blobManager.js} +9 -3
- package/dist/blobManager.js.map +1 -0
- package/dist/{connectionTelemetry.cjs → connectionTelemetry.js} +1 -1
- package/dist/connectionTelemetry.js.map +1 -0
- package/dist/container-runtime-alpha.d.ts +2 -0
- package/dist/container-runtime-untrimmed.d.ts +2 -0
- package/dist/{containerHandleContext.cjs → containerHandleContext.js} +1 -1
- package/dist/containerHandleContext.js.map +1 -0
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/{containerRuntime.cjs → containerRuntime.js} +23 -18
- package/dist/containerRuntime.js.map +1 -0
- package/dist/{dataStore.cjs → dataStore.js} +1 -1
- package/dist/dataStore.js.map +1 -0
- package/dist/dataStoreContext.d.ts +3 -0
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/{dataStoreContext.cjs → dataStoreContext.js} +11 -4
- package/dist/dataStoreContext.js.map +1 -0
- package/dist/{dataStoreContexts.cjs → dataStoreContexts.js} +1 -1
- package/dist/dataStoreContexts.js.map +1 -0
- package/dist/{dataStoreRegistry.cjs → dataStoreRegistry.js} +1 -1
- package/dist/dataStoreRegistry.js.map +1 -0
- package/dist/dataStores.d.ts +5 -1
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/{dataStores.cjs → dataStores.js} +54 -14
- package/dist/dataStores.js.map +1 -0
- package/dist/{deltaManagerProxyBase.cjs → deltaManagerProxyBase.js} +1 -1
- package/dist/deltaManagerProxyBase.js.map +1 -0
- package/dist/{deltaManagerSummarizerProxy.cjs → deltaManagerSummarizerProxy.js} +3 -3
- package/dist/deltaManagerSummarizerProxy.js.map +1 -0
- package/dist/{deltaScheduler.cjs → deltaScheduler.js} +1 -1
- package/dist/deltaScheduler.js.map +1 -0
- package/dist/{error.cjs → error.js} +1 -1
- package/dist/error.js.map +1 -0
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/{garbageCollection.cjs → garbageCollection.js} +39 -13
- package/dist/gc/garbageCollection.js.map +1 -0
- package/dist/gc/{gcConfigs.cjs → gcConfigs.js} +3 -3
- package/dist/gc/gcConfigs.js.map +1 -0
- package/dist/gc/gcDefinitions.d.ts +2 -0
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/{gcDefinitions.cjs → gcDefinitions.js} +4 -2
- package/dist/gc/gcDefinitions.js.map +1 -0
- package/dist/gc/{gcHelpers.cjs → gcHelpers.js} +1 -1
- package/dist/gc/gcHelpers.js.map +1 -0
- package/dist/gc/{gcReferenceGraphAlgorithm.cjs → gcReferenceGraphAlgorithm.js} +1 -1
- package/dist/gc/gcReferenceGraphAlgorithm.js.map +1 -0
- package/dist/gc/{gcSummaryDefinitions.cjs → gcSummaryDefinitions.js} +1 -1
- package/dist/gc/gcSummaryDefinitions.js.map +1 -0
- package/dist/gc/{gcSummaryStateTracker.cjs → gcSummaryStateTracker.js} +2 -2
- package/dist/gc/gcSummaryStateTracker.js.map +1 -0
- package/dist/gc/{gcTelemetry.cjs → gcTelemetry.js} +2 -2
- package/dist/gc/gcTelemetry.js.map +1 -0
- package/dist/gc/{gcUnreferencedStateTracker.cjs → gcUnreferencedStateTracker.js} +2 -2
- package/dist/gc/gcUnreferencedStateTracker.js.map +1 -0
- package/dist/gc/index.d.ts +1 -1
- package/dist/gc/index.d.ts.map +1 -1
- package/dist/gc/{index.cjs → index.js} +10 -9
- package/dist/gc/index.js.map +1 -0
- package/dist/{index.cjs → index.js} +7 -7
- package/dist/index.js.map +1 -0
- package/dist/{messageTypes.cjs → messageTypes.js} +1 -1
- package/dist/messageTypes.js.map +1 -0
- package/dist/{metadata.cjs → metadata.js} +1 -1
- package/dist/metadata.js.map +1 -0
- package/dist/opLifecycle/{batchManager.cjs → batchManager.js} +1 -1
- package/dist/opLifecycle/batchManager.js.map +1 -0
- package/dist/opLifecycle/{definitions.cjs → definitions.js} +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -0
- package/dist/opLifecycle/{index.cjs → index.js} +8 -8
- package/dist/opLifecycle/index.js.map +1 -0
- package/dist/opLifecycle/{opCompressor.cjs → opCompressor.js} +3 -3
- package/dist/opLifecycle/opCompressor.js.map +1 -0
- package/dist/opLifecycle/{opDecompressor.cjs → opDecompressor.js} +2 -2
- package/dist/opLifecycle/opDecompressor.js.map +1 -0
- package/dist/opLifecycle/{opGroupingManager.cjs → opGroupingManager.js} +1 -1
- package/dist/opLifecycle/opGroupingManager.js.map +1 -0
- package/dist/opLifecycle/{opSplitter.cjs → opSplitter.js} +3 -3
- package/dist/opLifecycle/opSplitter.js.map +1 -0
- package/dist/opLifecycle/{outbox.cjs → outbox.js} +2 -2
- package/dist/opLifecycle/outbox.js.map +1 -0
- package/dist/opLifecycle/{remoteMessageProcessor.cjs → remoteMessageProcessor.js} +2 -2
- package/dist/opLifecycle/remoteMessageProcessor.js.map +1 -0
- package/dist/{opProperties.cjs → opProperties.js} +1 -1
- package/dist/opProperties.js.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/{packageVersion.cjs → packageVersion.js} +2 -2
- package/dist/packageVersion.js.map +1 -0
- package/dist/{pendingStateManager.cjs → pendingStateManager.js} +2 -2
- package/dist/pendingStateManager.js.map +1 -0
- package/dist/{scheduleManager.cjs → scheduleManager.js} +3 -3
- package/dist/scheduleManager.js.map +1 -0
- package/dist/{storageServiceWithAttachBlobs.cjs → storageServiceWithAttachBlobs.js} +1 -1
- package/dist/storageServiceWithAttachBlobs.js.map +1 -0
- package/dist/summary/{index.cjs → index.js} +12 -12
- package/dist/summary/index.js.map +1 -0
- package/dist/summary/{orderedClientElection.cjs → orderedClientElection.js} +2 -2
- package/dist/summary/orderedClientElection.js.map +1 -0
- package/dist/summary/{runWhileConnectedCoordinator.cjs → runWhileConnectedCoordinator.js} +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -0
- package/dist/summary/runningSummarizer.d.ts +5 -0
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/{runningSummarizer.cjs → runningSummarizer.js} +50 -21
- package/dist/summary/runningSummarizer.js.map +1 -0
- package/dist/summary/{summarizer.cjs → summarizer.js} +4 -4
- package/dist/summary/summarizer.js.map +1 -0
- package/dist/summary/{summarizerClientElection.cjs → summarizerClientElection.js} +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -0
- package/dist/summary/{summarizerHeuristics.cjs → summarizerHeuristics.js} +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -0
- package/dist/summary/summarizerNode/{index.cjs → index.js} +3 -3
- package/dist/summary/summarizerNode/index.js.map +1 -0
- package/dist/summary/summarizerNode/{summarizerNode.cjs → summarizerNode.js} +2 -2
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -0
- package/dist/summary/summarizerNode/{summarizerNodeUtils.cjs → summarizerNodeUtils.js} +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -0
- package/dist/summary/summarizerNode/{summarizerNodeWithGc.cjs → summarizerNodeWithGc.js} +4 -4
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -0
- package/dist/summary/summarizerTypes.d.ts +2 -0
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/{summarizerTypes.cjs → summarizerTypes.js} +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -0
- package/dist/summary/{summaryCollection.cjs → summaryCollection.js} +1 -1
- package/dist/summary/summaryCollection.js.map +1 -0
- package/dist/summary/{summaryFormat.cjs → summaryFormat.js} +1 -1
- package/dist/summary/summaryFormat.js.map +1 -0
- package/dist/summary/{summaryGenerator.cjs → summaryGenerator.js} +1 -1
- package/dist/summary/summaryGenerator.js.map +1 -0
- package/dist/summary/{summaryManager.cjs → summaryManager.js} +2 -2
- package/dist/summary/summaryManager.js.map +1 -0
- package/dist/{throttler.cjs → throttler.js} +1 -1
- package/dist/throttler.js.map +1 -0
- package/lib/blobManager.d.mts.map +1 -1
- package/lib/blobManager.mjs +7 -1
- package/lib/blobManager.mjs.map +1 -1
- package/lib/container-runtime-alpha.d.mts +2 -0
- package/lib/container-runtime-untrimmed.d.mts +2 -0
- package/lib/containerRuntime.d.mts.map +1 -1
- package/lib/containerRuntime.mjs +6 -1
- package/lib/containerRuntime.mjs.map +1 -1
- package/lib/dataStoreContext.d.mts +3 -0
- package/lib/dataStoreContext.d.mts.map +1 -1
- package/lib/dataStoreContext.mjs +9 -2
- package/lib/dataStoreContext.mjs.map +1 -1
- package/lib/dataStores.d.mts +5 -1
- package/lib/dataStores.d.mts.map +1 -1
- package/lib/dataStores.mjs +46 -7
- package/lib/dataStores.mjs.map +1 -1
- package/lib/gc/garbageCollection.d.mts.map +1 -1
- package/lib/gc/garbageCollection.mjs +29 -3
- package/lib/gc/garbageCollection.mjs.map +1 -1
- package/lib/gc/gcDefinitions.d.mts +2 -0
- package/lib/gc/gcDefinitions.d.mts.map +1 -1
- package/lib/gc/gcDefinitions.mjs +2 -0
- package/lib/gc/gcDefinitions.mjs.map +1 -1
- package/lib/gc/index.d.mts +1 -1
- package/lib/gc/index.d.mts.map +1 -1
- package/lib/gc/index.mjs +1 -1
- package/lib/gc/index.mjs.map +1 -1
- package/lib/packageVersion.d.mts +1 -1
- package/lib/packageVersion.mjs +1 -1
- package/lib/packageVersion.mjs.map +1 -1
- package/lib/summary/runningSummarizer.d.mts +5 -0
- package/lib/summary/runningSummarizer.d.mts.map +1 -1
- package/lib/summary/runningSummarizer.mjs +46 -17
- package/lib/summary/runningSummarizer.mjs.map +1 -1
- package/lib/summary/summarizerTypes.d.mts +2 -0
- package/lib/summary/summarizerTypes.d.mts.map +1 -1
- package/lib/summary/summarizerTypes.mjs.map +1 -1
- package/package.json +40 -36
- package/src/blobManager.ts +7 -1
- package/src/containerRuntime.ts +7 -0
- package/src/dataStoreContext.ts +9 -2
- package/src/dataStores.ts +56 -5
- package/src/gc/garbageCollection.ts +32 -2
- package/src/gc/gcDefinitions.ts +2 -0
- package/src/gc/index.ts +2 -0
- package/src/packageVersion.ts +1 -1
- package/src/summary/runningSummarizer.ts +58 -25
- package/src/summary/summarizerTypes.ts +2 -0
- package/dist/batchTracker.cjs.map +0 -1
- package/dist/blobManager.cjs.map +0 -1
- package/dist/connectionTelemetry.cjs.map +0 -1
- package/dist/containerHandleContext.cjs.map +0 -1
- package/dist/containerRuntime.cjs.map +0 -1
- package/dist/dataStore.cjs.map +0 -1
- package/dist/dataStoreContext.cjs.map +0 -1
- package/dist/dataStoreContexts.cjs.map +0 -1
- package/dist/dataStoreRegistry.cjs.map +0 -1
- package/dist/dataStores.cjs.map +0 -1
- package/dist/deltaManagerProxyBase.cjs.map +0 -1
- package/dist/deltaManagerSummarizerProxy.cjs.map +0 -1
- package/dist/deltaScheduler.cjs.map +0 -1
- package/dist/error.cjs.map +0 -1
- package/dist/gc/garbageCollection.cjs.map +0 -1
- package/dist/gc/gcConfigs.cjs.map +0 -1
- package/dist/gc/gcDefinitions.cjs.map +0 -1
- package/dist/gc/gcHelpers.cjs.map +0 -1
- package/dist/gc/gcReferenceGraphAlgorithm.cjs.map +0 -1
- package/dist/gc/gcSummaryDefinitions.cjs.map +0 -1
- package/dist/gc/gcSummaryStateTracker.cjs.map +0 -1
- package/dist/gc/gcTelemetry.cjs.map +0 -1
- package/dist/gc/gcUnreferencedStateTracker.cjs.map +0 -1
- package/dist/gc/index.cjs.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/messageTypes.cjs.map +0 -1
- package/dist/metadata.cjs.map +0 -1
- package/dist/opLifecycle/batchManager.cjs.map +0 -1
- package/dist/opLifecycle/definitions.cjs.map +0 -1
- package/dist/opLifecycle/index.cjs.map +0 -1
- package/dist/opLifecycle/opCompressor.cjs.map +0 -1
- package/dist/opLifecycle/opDecompressor.cjs.map +0 -1
- package/dist/opLifecycle/opGroupingManager.cjs.map +0 -1
- package/dist/opLifecycle/opSplitter.cjs.map +0 -1
- package/dist/opLifecycle/outbox.cjs.map +0 -1
- package/dist/opLifecycle/remoteMessageProcessor.cjs.map +0 -1
- package/dist/opProperties.cjs.map +0 -1
- package/dist/packageVersion.cjs.map +0 -1
- package/dist/pendingStateManager.cjs.map +0 -1
- package/dist/scheduleManager.cjs.map +0 -1
- package/dist/storageServiceWithAttachBlobs.cjs.map +0 -1
- package/dist/summary/index.cjs.map +0 -1
- package/dist/summary/orderedClientElection.cjs.map +0 -1
- package/dist/summary/runWhileConnectedCoordinator.cjs.map +0 -1
- package/dist/summary/runningSummarizer.cjs.map +0 -1
- package/dist/summary/summarizer.cjs.map +0 -1
- package/dist/summary/summarizerClientElection.cjs.map +0 -1
- package/dist/summary/summarizerHeuristics.cjs.map +0 -1
- package/dist/summary/summarizerNode/index.cjs.map +0 -1
- package/dist/summary/summarizerNode/summarizerNode.cjs.map +0 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.cjs.map +0 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.cjs.map +0 -1
- package/dist/summary/summarizerTypes.cjs.map +0 -1
- package/dist/summary/summaryCollection.cjs.map +0 -1
- package/dist/summary/summaryFormat.cjs.map +0 -1
- package/dist/summary/summaryGenerator.cjs.map +0 -1
- package/dist/summary/summaryManager.cjs.map +0 -1
- package/dist/throttler.cjs.map +0 -1
- package/tsc-multi.test.json +0 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/container-runtime",
|
|
3
|
-
"version": "2.0.0-dev-rc.1.0.0.
|
|
3
|
+
"version": "2.0.0-dev-rc.1.0.0.228517",
|
|
4
4
|
"description": "Fluid container runtime",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"exports": {
|
|
15
15
|
".": {
|
|
16
16
|
"types": "./dist/index.d.ts",
|
|
17
|
-
"default": "./dist/index.
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
18
|
},
|
|
19
19
|
"./test/containerRuntime": {
|
|
20
20
|
"import": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"require": {
|
|
25
25
|
"types": "./dist/containerRuntime.d.ts",
|
|
26
|
-
"default": "./dist/containerRuntime.
|
|
26
|
+
"default": "./dist/containerRuntime.js"
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
29
|
"./test/deltaScheduler": {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"require": {
|
|
35
35
|
"types": "./dist/deltaScheduler.d.ts",
|
|
36
|
-
"default": "./dist/deltaScheduler.
|
|
36
|
+
"default": "./dist/deltaScheduler.js"
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"./test/scheduleManager": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"require": {
|
|
45
45
|
"types": "./dist/scheduleManager.d.ts",
|
|
46
|
-
"default": "./dist/scheduleManager.
|
|
46
|
+
"default": "./dist/scheduleManager.js"
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"./test/blobManager": {
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
},
|
|
54
54
|
"require": {
|
|
55
55
|
"types": "./dist/blobManager.d.ts",
|
|
56
|
-
"default": "./dist/blobManager.
|
|
56
|
+
"default": "./dist/blobManager.js"
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
"./test/summary": {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
},
|
|
64
64
|
"require": {
|
|
65
65
|
"types": "./dist/summary/index.d.ts",
|
|
66
|
-
"default": "./dist/summary/index.
|
|
66
|
+
"default": "./dist/summary/index.js"
|
|
67
67
|
}
|
|
68
68
|
},
|
|
69
69
|
"./test/gc": {
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
},
|
|
74
74
|
"require": {
|
|
75
75
|
"types": "./gc/index.d.ts",
|
|
76
|
-
"default": "./gc/index.
|
|
76
|
+
"default": "./gc/index.js"
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
79
|
"./alpha": {
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
},
|
|
84
84
|
"require": {
|
|
85
85
|
"types": "./dist/container-runtime-alpha.d.ts",
|
|
86
|
-
"default": "./dist/index.
|
|
86
|
+
"default": "./dist/index.js"
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
89
|
"./beta": {
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
},
|
|
94
94
|
"require": {
|
|
95
95
|
"types": "./dist/container-runtime-beta.d.ts",
|
|
96
|
-
"default": "./dist/index.
|
|
96
|
+
"default": "./dist/index.js"
|
|
97
97
|
}
|
|
98
98
|
},
|
|
99
99
|
"./internal": {
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
},
|
|
104
104
|
"require": {
|
|
105
105
|
"types": "./dist/index.d.ts",
|
|
106
|
-
"default": "./dist/index.
|
|
106
|
+
"default": "./dist/index.js"
|
|
107
107
|
}
|
|
108
108
|
},
|
|
109
109
|
"./public": {
|
|
@@ -113,11 +113,11 @@
|
|
|
113
113
|
},
|
|
114
114
|
"require": {
|
|
115
115
|
"types": "./dist/container-runtime-public.d.ts",
|
|
116
|
-
"default": "./dist/index.
|
|
116
|
+
"default": "./dist/index.js"
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
},
|
|
120
|
-
"main": "dist/index.
|
|
120
|
+
"main": "dist/index.js",
|
|
121
121
|
"module": "lib/index.mjs",
|
|
122
122
|
"types": "dist/index.d.ts",
|
|
123
123
|
"c8": {
|
|
@@ -141,36 +141,36 @@
|
|
|
141
141
|
"temp-directory": "nyc/.nyc_output"
|
|
142
142
|
},
|
|
143
143
|
"dependencies": {
|
|
144
|
-
"@fluid-internal/client-utils": "2.0.0-dev-rc.1.0.0.
|
|
145
|
-
"@fluidframework/container-definitions": "2.0.0-dev-rc.1.0.0.
|
|
146
|
-
"@fluidframework/container-runtime-definitions": "2.0.0-dev-rc.1.0.0.
|
|
147
|
-
"@fluidframework/core-interfaces": "2.0.0-dev-rc.1.0.0.
|
|
148
|
-
"@fluidframework/core-utils": "2.0.0-dev-rc.1.0.0.
|
|
149
|
-
"@fluidframework/datastore": "2.0.0-dev-rc.1.0.0.
|
|
150
|
-
"@fluidframework/driver-definitions": "2.0.0-dev-rc.1.0.0.
|
|
151
|
-
"@fluidframework/driver-utils": "2.0.0-dev-rc.1.0.0.
|
|
152
|
-
"@fluidframework/id-compressor": "2.0.0-dev-rc.1.0.0.
|
|
153
|
-
"@fluidframework/protocol-definitions": "^3.1.0
|
|
154
|
-
"@fluidframework/runtime-definitions": "2.0.0-dev-rc.1.0.0.
|
|
155
|
-
"@fluidframework/runtime-utils": "2.0.0-dev-rc.1.0.0.
|
|
156
|
-
"@fluidframework/telemetry-utils": "2.0.0-dev-rc.1.0.0.
|
|
144
|
+
"@fluid-internal/client-utils": "2.0.0-dev-rc.1.0.0.228517",
|
|
145
|
+
"@fluidframework/container-definitions": "2.0.0-dev-rc.1.0.0.228517",
|
|
146
|
+
"@fluidframework/container-runtime-definitions": "2.0.0-dev-rc.1.0.0.228517",
|
|
147
|
+
"@fluidframework/core-interfaces": "2.0.0-dev-rc.1.0.0.228517",
|
|
148
|
+
"@fluidframework/core-utils": "2.0.0-dev-rc.1.0.0.228517",
|
|
149
|
+
"@fluidframework/datastore": "2.0.0-dev-rc.1.0.0.228517",
|
|
150
|
+
"@fluidframework/driver-definitions": "2.0.0-dev-rc.1.0.0.228517",
|
|
151
|
+
"@fluidframework/driver-utils": "2.0.0-dev-rc.1.0.0.228517",
|
|
152
|
+
"@fluidframework/id-compressor": "2.0.0-dev-rc.1.0.0.228517",
|
|
153
|
+
"@fluidframework/protocol-definitions": "^3.1.0",
|
|
154
|
+
"@fluidframework/runtime-definitions": "2.0.0-dev-rc.1.0.0.228517",
|
|
155
|
+
"@fluidframework/runtime-utils": "2.0.0-dev-rc.1.0.0.228517",
|
|
156
|
+
"@fluidframework/telemetry-utils": "2.0.0-dev-rc.1.0.0.228517",
|
|
157
|
+
"@tylerbu/sorted-btree-es6": "^1.8.0",
|
|
157
158
|
"double-ended-queue": "^2.1.0-0",
|
|
158
159
|
"events": "^3.1.0",
|
|
159
160
|
"lz4js": "^0.2.0",
|
|
160
|
-
"sorted-btree": "^1.8.0",
|
|
161
161
|
"uuid": "^9.0.0"
|
|
162
162
|
},
|
|
163
163
|
"devDependencies": {
|
|
164
164
|
"@arethetypeswrong/cli": "^0.13.3",
|
|
165
|
-
"@fluid-private/stochastic-test-utils": "2.0.0-dev-rc.1.0.0.
|
|
165
|
+
"@fluid-private/stochastic-test-utils": "2.0.0-dev-rc.1.0.0.228517",
|
|
166
166
|
"@fluid-tools/benchmark": "^0.48.0",
|
|
167
|
-
"@fluid-tools/build-cli": "0.29.0
|
|
167
|
+
"@fluid-tools/build-cli": "^0.29.0",
|
|
168
168
|
"@fluidframework/build-common": "^2.0.3",
|
|
169
|
-
"@fluidframework/build-tools": "0.29.0
|
|
169
|
+
"@fluidframework/build-tools": "^0.29.0",
|
|
170
170
|
"@fluidframework/container-runtime-previous": "npm:@fluidframework/container-runtime@2.0.0-internal.8.0.0",
|
|
171
|
-
"@fluidframework/eslint-config-fluid": "^3.
|
|
172
|
-
"@fluidframework/mocha-test-setup": "2.0.0-dev-rc.1.0.0.
|
|
173
|
-
"@fluidframework/test-runtime-utils": "2.0.0-dev-rc.1.0.0.
|
|
171
|
+
"@fluidframework/eslint-config-fluid": "^3.2.0",
|
|
172
|
+
"@fluidframework/mocha-test-setup": "2.0.0-dev-rc.1.0.0.228517",
|
|
173
|
+
"@fluidframework/test-runtime-utils": "2.0.0-dev-rc.1.0.0.228517",
|
|
174
174
|
"@microsoft/api-extractor": "^7.38.3",
|
|
175
175
|
"@types/double-ended-queue": "^2.1.0",
|
|
176
176
|
"@types/events": "^3.0.0",
|
|
@@ -204,7 +204,11 @@
|
|
|
204
204
|
}
|
|
205
205
|
},
|
|
206
206
|
"typeValidation": {
|
|
207
|
-
"broken": {
|
|
207
|
+
"broken": {
|
|
208
|
+
"ClassDeclaration_ContainerRuntime": {
|
|
209
|
+
"forwardCompat": false
|
|
210
|
+
}
|
|
211
|
+
}
|
|
208
212
|
},
|
|
209
213
|
"scripts": {
|
|
210
214
|
"api": "fluid-build . --task api",
|
|
@@ -216,7 +220,7 @@
|
|
|
216
220
|
"build:docs": "fluid-build . --task api",
|
|
217
221
|
"build:esnext": "tsc-multi --config ../../../common/build/build-common/tsc-multi.esm.json",
|
|
218
222
|
"build:genver": "gen-version",
|
|
219
|
-
"build:test": "tsc
|
|
223
|
+
"build:test": "tsc --project ./src/test/tsconfig.json",
|
|
220
224
|
"check:are-the-types-wrong": "attw --pack . --entrypoints .",
|
|
221
225
|
"check:release-tags": "api-extractor run --local --config ./api-extractor-lint.json",
|
|
222
226
|
"ci:build:docs": "api-extractor run",
|
|
@@ -233,7 +237,7 @@
|
|
|
233
237
|
"test:coverage": "c8 npm test",
|
|
234
238
|
"test:mocha": "mocha --ignore \"dist/test/types/*\" --recursive dist/test -r node_modules/@fluidframework/mocha-test-setup",
|
|
235
239
|
"test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
|
|
236
|
-
"tsc": "tsc
|
|
240
|
+
"tsc": "tsc",
|
|
237
241
|
"tsc:watch": "tsc --watch",
|
|
238
242
|
"typetests:gen": "fluid-type-test-generator",
|
|
239
243
|
"typetests:prepare": "flub typetests --dir . --reset --previous --normalize"
|
package/src/blobManager.ts
CHANGED
|
@@ -772,10 +772,16 @@ export class BlobManager extends TypedEventEmitter<IBlobManagerEvents> {
|
|
|
772
772
|
const maybeUnusedStorageIds: Set<string> = new Set();
|
|
773
773
|
for (const route of blobRoutes) {
|
|
774
774
|
const blobId = getBlobIdFromGCNodePath(route);
|
|
775
|
+
// If the blob hasn't already been deleted, log an error because this should never happen.
|
|
776
|
+
// If the blob has already been deleted, log a telemetry event. This can happen because multiple GC
|
|
777
|
+
// sweep ops can contain the same data store. It would be interesting to track how often this happens.
|
|
778
|
+
const alreadyDeleted = this.isBlobDeleted(route);
|
|
775
779
|
if (!this.redirectTable.has(blobId)) {
|
|
776
|
-
this.mc.logger.
|
|
780
|
+
this.mc.logger.sendTelemetryEvent({
|
|
777
781
|
eventName: "DeletedAttachmentBlobNotFound",
|
|
782
|
+
category: alreadyDeleted ? "generic" : "error",
|
|
778
783
|
blobId,
|
|
784
|
+
details: { alreadyDeleted },
|
|
779
785
|
});
|
|
780
786
|
continue;
|
|
781
787
|
}
|
package/src/containerRuntime.ts
CHANGED
|
@@ -2268,6 +2268,7 @@ export class ContainerRuntime
|
|
|
2268
2268
|
messageWithContext.message,
|
|
2269
2269
|
local,
|
|
2270
2270
|
localOpMetadata,
|
|
2271
|
+
(from, to) => this.garbageCollector.addedOutboundReference(from, to),
|
|
2271
2272
|
);
|
|
2272
2273
|
break;
|
|
2273
2274
|
case ContainerMessageType.BlobAttach:
|
|
@@ -2679,6 +2680,12 @@ export class ContainerRuntime
|
|
|
2679
2680
|
this.blobManager.setRedirectTable(blobRedirectTable);
|
|
2680
2681
|
}
|
|
2681
2682
|
|
|
2683
|
+
// We can finalize any allocated IDs since we're the only client
|
|
2684
|
+
const idRange = this.idCompressor?.takeNextCreationRange();
|
|
2685
|
+
if (idRange !== undefined) {
|
|
2686
|
+
this.idCompressor?.finalizeCreationRange(idRange);
|
|
2687
|
+
}
|
|
2688
|
+
|
|
2682
2689
|
const summarizeResult = this.dataStores.createSummary(telemetryContext);
|
|
2683
2690
|
// Wrap data store summaries in .channels subtree.
|
|
2684
2691
|
wrapSummaryInChannelsTree(summarizeResult);
|
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 } from "./gc";
|
|
81
|
+
import { detectOutboundRoutesViaDDSKey, sendGCUnexpectedUsageEvent } from "./gc";
|
|
82
82
|
|
|
83
83
|
function createAttributes(
|
|
84
84
|
pkg: readonly string[],
|
|
@@ -650,13 +650,20 @@ export abstract class FluidDataStoreContext
|
|
|
650
650
|
}
|
|
651
651
|
|
|
652
652
|
/**
|
|
653
|
+
* @deprecated There is no replacement for this, its functionality is no longer needed.
|
|
654
|
+
* It will be removed in a future release, sometime after 2.0.0-internal.8.0.0
|
|
655
|
+
*
|
|
653
656
|
* Called when a new outbound reference is added to another node. This is used by garbage collection to identify
|
|
654
657
|
* all references added in the system.
|
|
655
658
|
* @param srcHandle - The handle of the node that added the reference.
|
|
656
659
|
* @param outboundHandle - The handle of the outbound node that is referenced.
|
|
657
660
|
*/
|
|
658
661
|
public addedGCOutboundReference(srcHandle: IFluidHandle, outboundHandle: IFluidHandle) {
|
|
659
|
-
this.
|
|
662
|
+
// By default, skip this call since the ContainerRuntime will detect the outbound route directly.
|
|
663
|
+
if (this.mc.config.getBoolean(detectOutboundRoutesViaDDSKey) === true) {
|
|
664
|
+
// Note: The ContainerRuntime code will check this same setting to avoid double counting.
|
|
665
|
+
this._containerRuntime.addedGCOutboundReference(srcHandle, outboundHandle);
|
|
666
|
+
}
|
|
660
667
|
}
|
|
661
668
|
|
|
662
669
|
/**
|
package/src/dataStores.ts
CHANGED
|
@@ -33,6 +33,7 @@ import {
|
|
|
33
33
|
create404Response,
|
|
34
34
|
createResponseError,
|
|
35
35
|
GCDataBuilder,
|
|
36
|
+
isSerializedHandle,
|
|
36
37
|
responseToException,
|
|
37
38
|
SummaryTreeBuilder,
|
|
38
39
|
unpackChildNodesUsedRoutes,
|
|
@@ -61,7 +62,7 @@ import {
|
|
|
61
62
|
} from "./dataStoreContext";
|
|
62
63
|
import { StorageServiceWithAttachBlobs } from "./storageServiceWithAttachBlobs";
|
|
63
64
|
import { IDataStoreAliasMessage, isDataStoreAliasMessage } from "./dataStore";
|
|
64
|
-
import { GCNodeType, disableDatastoreSweepKey } from "./gc";
|
|
65
|
+
import { GCNodeType, detectOutboundRoutesViaDDSKey, disableDatastoreSweepKey } from "./gc";
|
|
65
66
|
import { IContainerRuntimeMetadata, nonDataStorePaths, rootHasIsolatedChannels } from "./summary";
|
|
66
67
|
|
|
67
68
|
type PendingAliasResolve = (success: boolean) => void;
|
|
@@ -441,6 +442,7 @@ export class DataStores implements IDisposable {
|
|
|
441
442
|
message: ISequencedDocumentMessage,
|
|
442
443
|
local: boolean,
|
|
443
444
|
localMessageMetadata: unknown,
|
|
445
|
+
addedOutboundReference: (fromNodePath: string, toNodePath: string) => void,
|
|
444
446
|
) {
|
|
445
447
|
const envelope = message.contents as IEnvelope;
|
|
446
448
|
const transformed = { ...message, contents: envelope.contents };
|
|
@@ -462,6 +464,13 @@ export class DataStores implements IDisposable {
|
|
|
462
464
|
assert(!!context, 0x162 /* "There should be a store context for the op" */);
|
|
463
465
|
context.process(transformed, local, localMessageMetadata);
|
|
464
466
|
|
|
467
|
+
// By default, we use the new behavior of detecting outbound routes here.
|
|
468
|
+
// If this setting is true, then DataStoreContext would be notifying GC instead.
|
|
469
|
+
if (this.mc.config.getBoolean(detectOutboundRoutesViaDDSKey) !== true) {
|
|
470
|
+
// Notify GC of any outbound references that were added by this op.
|
|
471
|
+
detectOutboundReferences(envelope, addedOutboundReference);
|
|
472
|
+
}
|
|
473
|
+
|
|
465
474
|
// Notify that a GC node for the data store changed. This is used to detect if a deleted data store is
|
|
466
475
|
// being used.
|
|
467
476
|
this.gcNodeUpdated(
|
|
@@ -830,12 +839,15 @@ export class DataStores implements IDisposable {
|
|
|
830
839
|
|
|
831
840
|
const dataStoreContext = this.contexts.get(dataStoreId);
|
|
832
841
|
if (dataStoreContext === undefined) {
|
|
833
|
-
this.
|
|
842
|
+
// If the data store hasn't already been deleted, log an error because this should never happen.
|
|
843
|
+
// If the data store has already been deleted, log a telemetry event. This can happen because multiple GC
|
|
844
|
+
// sweep ops can contain the same data store. It would be interesting to track how often this happens.
|
|
845
|
+
const alreadyDeleted = this.isDataStoreDeleted(`/${dataStoreId}`);
|
|
846
|
+
this.mc.logger.sendTelemetryEvent({
|
|
834
847
|
eventName: "DeletedDataStoreNotFound",
|
|
848
|
+
category: alreadyDeleted ? "generic" : "error",
|
|
835
849
|
...tagCodeArtifacts({ id: dataStoreId }),
|
|
836
|
-
details: {
|
|
837
|
-
alreadyDeleted: this.isDataStoreDeleted(dataStoreId),
|
|
838
|
-
},
|
|
850
|
+
details: { alreadyDeleted },
|
|
839
851
|
});
|
|
840
852
|
continue;
|
|
841
853
|
}
|
|
@@ -947,3 +959,42 @@ export function getSummaryForDatastores(
|
|
|
947
959
|
};
|
|
948
960
|
}
|
|
949
961
|
}
|
|
962
|
+
|
|
963
|
+
/**
|
|
964
|
+
* Traverse this op's contents and detect any outbound routes that were added by this op.
|
|
965
|
+
*/
|
|
966
|
+
export function detectOutboundReferences(
|
|
967
|
+
envelope: IEnvelope,
|
|
968
|
+
addedOutboundReference: (fromNodePath: string, toNodePath: string) => void,
|
|
969
|
+
): void {
|
|
970
|
+
// These will be built up as we traverse the envelope contents
|
|
971
|
+
const outboundPaths: string[] = [];
|
|
972
|
+
let ddsAddress: string | undefined;
|
|
973
|
+
|
|
974
|
+
function recursivelyFindHandles(obj: unknown) {
|
|
975
|
+
if (typeof obj === "object" && obj !== null) {
|
|
976
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
977
|
+
// If 'value' is a serialized IFluidHandle, it represents a new outbound route.
|
|
978
|
+
if (isSerializedHandle(value)) {
|
|
979
|
+
outboundPaths.push(value.url);
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// NOTE: This is taking a hard dependency on the fact that in our DataStore implementation,
|
|
983
|
+
// the address of the DDS is stored in a property called "address". This is not ideal.
|
|
984
|
+
// An alternative would be for the op envelope to include the absolute path (built up as it is submitted)
|
|
985
|
+
if (key === "address" && ddsAddress === undefined) {
|
|
986
|
+
ddsAddress = value;
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
recursivelyFindHandles(value);
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
recursivelyFindHandles(envelope.contents);
|
|
995
|
+
|
|
996
|
+
// GC node paths are all absolute paths, hence the "" prefix.
|
|
997
|
+
// e.g. this will yield "/dataStoreId/ddsId"
|
|
998
|
+
const fromPath = ["", envelope.address, ddsAddress].join("/");
|
|
999
|
+
outboundPaths.forEach((toPath) => addedOutboundReference(fromPath, toPath));
|
|
1000
|
+
}
|
|
@@ -20,7 +20,9 @@ import {
|
|
|
20
20
|
ITelemetryLoggerExt,
|
|
21
21
|
MonitoringContext,
|
|
22
22
|
PerformanceEvent,
|
|
23
|
+
tagCodeArtifacts,
|
|
23
24
|
} from "@fluidframework/telemetry-utils";
|
|
25
|
+
import { BlobManager } from "../blobManager";
|
|
24
26
|
import {
|
|
25
27
|
InactiveResponseHeaderKey,
|
|
26
28
|
RuntimeHeaderData,
|
|
@@ -261,7 +263,7 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
261
263
|
const currentReferenceTimestampMs = this.runtime.getCurrentReferenceTimestampMs();
|
|
262
264
|
assert(
|
|
263
265
|
currentReferenceTimestampMs !== undefined,
|
|
264
|
-
|
|
266
|
+
0x8a4 /* Trying to initialize GC state without current timestamp */,
|
|
265
267
|
);
|
|
266
268
|
|
|
267
269
|
/**
|
|
@@ -1005,6 +1007,18 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1005
1007
|
return;
|
|
1006
1008
|
}
|
|
1007
1009
|
|
|
1010
|
+
if (!toNodePath.startsWith("/")) {
|
|
1011
|
+
// A long time ago we stored handles with relatives paths. We don't expect to see these cases though
|
|
1012
|
+
// because GC was enabled only after we made the switch to always using absolute paths.
|
|
1013
|
+
this.mc.logger.sendErrorEvent({
|
|
1014
|
+
eventName: "InvalidRelativeOutboundRoute",
|
|
1015
|
+
...tagCodeArtifacts({ fromId: fromNodePath, id: toNodePath }),
|
|
1016
|
+
});
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
assert(fromNodePath.startsWith("/"), 0x8a5 /* fromNodePath must be an absolute path */);
|
|
1021
|
+
|
|
1008
1022
|
const outboundRoutes = this.newReferencesSinceLastRun.get(fromNodePath) ?? [];
|
|
1009
1023
|
outboundRoutes.push(toNodePath);
|
|
1010
1024
|
this.newReferencesSinceLastRun.set(fromNodePath, outboundRoutes);
|
|
@@ -1120,9 +1134,25 @@ export class GarbageCollector implements IGarbageCollector {
|
|
|
1120
1134
|
deletedAttachmentBlobCount: 0,
|
|
1121
1135
|
};
|
|
1122
1136
|
|
|
1137
|
+
// The runtime can't reliably identify the type of deleted nodes. So, get the type here. This should
|
|
1138
|
+
// be good enough because the only types that participate in GC today are data stores, DDSes and blobs.
|
|
1139
|
+
const getDeletedNodeType = (nodeId: string): GCNodeType => {
|
|
1140
|
+
const pathParts = nodeId.split("/");
|
|
1141
|
+
if (pathParts[1] === BlobManager.basePath) {
|
|
1142
|
+
return GCNodeType.Blob;
|
|
1143
|
+
}
|
|
1144
|
+
if (pathParts.length === 2) {
|
|
1145
|
+
return GCNodeType.DataStore;
|
|
1146
|
+
}
|
|
1147
|
+
if (pathParts.length === 3) {
|
|
1148
|
+
return GCNodeType.SubDataStore;
|
|
1149
|
+
}
|
|
1150
|
+
return GCNodeType.Other;
|
|
1151
|
+
};
|
|
1152
|
+
|
|
1123
1153
|
for (const nodeId of deletedNodes) {
|
|
1124
1154
|
sweepPhaseStats.deletedNodeCount++;
|
|
1125
|
-
const nodeType =
|
|
1155
|
+
const nodeType = getDeletedNodeType(nodeId);
|
|
1126
1156
|
if (nodeType === GCNodeType.DataStore) {
|
|
1127
1157
|
sweepPhaseStats.deletedDataStoreCount++;
|
|
1128
1158
|
} else if (nodeType === GCNodeType.Blob) {
|
package/src/gc/gcDefinitions.ts
CHANGED
|
@@ -74,6 +74,8 @@ export const gcVersionUpgradeToV4Key = "Fluid.GarbageCollection.GCVersionUpgrade
|
|
|
74
74
|
export const disableDatastoreSweepKey = "Fluid.GarbageCollection.DisableDataStoreSweep";
|
|
75
75
|
/** Config key to disable GC sweep for attachment blobs. */
|
|
76
76
|
export const disableAttachmentBlobSweepKey = "Fluid.GarbageCollection.DisableAttachmentBlobSweep";
|
|
77
|
+
/** Config key to revert new paradigm of detecting outbound routes in ContainerRuntime layer (use true) */
|
|
78
|
+
export const detectOutboundRoutesViaDDSKey = "Fluid.GarbageCollection.DetectOutboundRoutesViaDDS";
|
|
77
79
|
|
|
78
80
|
// One day in milliseconds.
|
|
79
81
|
export const oneDayMs = 1 * 24 * 60 * 60 * 1000;
|
package/src/gc/index.ts
CHANGED
|
@@ -34,9 +34,11 @@ export {
|
|
|
34
34
|
stableGCVersion,
|
|
35
35
|
disableAttachmentBlobSweepKey,
|
|
36
36
|
disableDatastoreSweepKey,
|
|
37
|
+
detectOutboundRoutesViaDDSKey,
|
|
37
38
|
UnreferencedState,
|
|
38
39
|
throwOnTombstoneLoadOverrideKey,
|
|
39
40
|
GarbageCollectionMessage,
|
|
41
|
+
ISweepMessage,
|
|
40
42
|
} from "./gcDefinitions";
|
|
41
43
|
export {
|
|
42
44
|
cloneGCData,
|
package/src/packageVersion.ts
CHANGED
|
@@ -693,7 +693,9 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
693
693
|
* Tries to summarize with retries where retry is based on the failure params.
|
|
694
694
|
* For example, summarization may be retried for failures with "retryAfterSeconds" param.
|
|
695
695
|
*/
|
|
696
|
-
private async trySummarizeWithRetries(
|
|
696
|
+
private async trySummarizeWithRetries(
|
|
697
|
+
reason: SummarizeReason,
|
|
698
|
+
): Promise<ISummarizeResults | undefined> {
|
|
697
699
|
// Helper to set summarize options, telemetry properties and call summarize.
|
|
698
700
|
const attemptSummarize = (attemptNumber: number, finalAttempt: boolean) => {
|
|
699
701
|
const summarizeOptions: ISummarizeOptions = {
|
|
@@ -732,24 +734,23 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
732
734
|
let currentAttempt = 0;
|
|
733
735
|
let retryAfterSeconds: number | undefined;
|
|
734
736
|
let done = false;
|
|
735
|
-
let
|
|
737
|
+
let status: "success" | "failure" | "canceled" = "success";
|
|
738
|
+
let results: ISummarizeResults | undefined;
|
|
736
739
|
do {
|
|
737
740
|
currentAttempt++;
|
|
738
741
|
if (this.cancellationToken.cancelled) {
|
|
739
|
-
|
|
742
|
+
status = "canceled";
|
|
740
743
|
done = true;
|
|
741
744
|
break;
|
|
742
745
|
}
|
|
743
746
|
|
|
744
|
-
const
|
|
745
|
-
|
|
746
|
-
false /* finalAttempt */,
|
|
747
|
-
);
|
|
747
|
+
const attemptResult = attemptSummarize(currentAttempt, false /* finalAttempt */);
|
|
748
|
+
results = attemptResult.summarizeResult;
|
|
748
749
|
|
|
749
750
|
// Ack / nack is the final step, so if it succeeds we're done.
|
|
750
|
-
const ackNackResult = await
|
|
751
|
+
const ackNackResult = await results.receivedSummaryAckOrNack;
|
|
751
752
|
if (ackNackResult.success) {
|
|
752
|
-
|
|
753
|
+
status = "success";
|
|
753
754
|
done = true;
|
|
754
755
|
break;
|
|
755
756
|
}
|
|
@@ -758,7 +759,7 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
758
759
|
// If submit summary failed, use the params from "summarySubmitted" result. Else, use the params
|
|
759
760
|
// from "receivedSummaryAckOrNack" result.
|
|
760
761
|
// Note: Check "summarySubmitted" result first because if it fails, ack nack would fail as well.
|
|
761
|
-
const submitSummaryResult = await
|
|
762
|
+
const submitSummaryResult = await results.summarySubmitted;
|
|
762
763
|
if (!submitSummaryResult.success) {
|
|
763
764
|
maxAttempts = this.maxAttemptsForSubmitFailures;
|
|
764
765
|
retryAfterSeconds = submitSummaryResult.data?.retryAfterSeconds;
|
|
@@ -768,9 +769,9 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
768
769
|
}
|
|
769
770
|
|
|
770
771
|
// Emit "summarize" event for this failed attempt.
|
|
771
|
-
|
|
772
|
+
status = "failure";
|
|
772
773
|
const eventProps: ISummarizeEventProps = {
|
|
773
|
-
result,
|
|
774
|
+
result: status,
|
|
774
775
|
currentAttempt,
|
|
775
776
|
maxAttempts,
|
|
776
777
|
error: ackNackResult.error,
|
|
@@ -791,16 +792,16 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
791
792
|
summaryNackDelay: ackNackResult.data?.retryAfterSeconds !== undefined,
|
|
792
793
|
stage: submitSummaryResult.data?.stage,
|
|
793
794
|
dynamicRetries: true, // To differentiate this telemetry from regular retry logic
|
|
794
|
-
...summarizeProps,
|
|
795
|
+
...attemptResult.summarizeProps,
|
|
795
796
|
});
|
|
796
797
|
await delay(retryAfterSeconds * 1000);
|
|
797
798
|
}
|
|
798
799
|
} while (!done);
|
|
799
800
|
|
|
800
801
|
// If summarize attempt did not fail, emit "summarize" event and return. A failed attempt may be retried below.
|
|
801
|
-
if (
|
|
802
|
-
this.emit("summarize", { result, currentAttempt, maxAttempts });
|
|
803
|
-
return;
|
|
802
|
+
if (status !== "failure") {
|
|
803
|
+
this.emit("summarize", { result: status, currentAttempt, maxAttempts });
|
|
804
|
+
return results;
|
|
804
805
|
}
|
|
805
806
|
|
|
806
807
|
// If summarization wasn't successful above and the failure contains "retryAfterSeconds", perform one last
|
|
@@ -809,20 +810,44 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
809
810
|
const { summarizeResult } = attemptSummarize(++currentAttempt, true /* finalAttempt */);
|
|
810
811
|
// Ack / nack is the final step, so if it succeeds we're done.
|
|
811
812
|
const ackNackResult = await summarizeResult.receivedSummaryAckOrNack;
|
|
812
|
-
|
|
813
|
+
status = ackNackResult.success ? "success" : "failure";
|
|
813
814
|
const eventProps: ISummarizeEventProps = {
|
|
814
|
-
result,
|
|
815
|
+
result: status,
|
|
815
816
|
currentAttempt,
|
|
816
817
|
maxAttempts,
|
|
817
818
|
error: ackNackResult.success ? undefined : ackNackResult.error,
|
|
818
819
|
};
|
|
819
820
|
this.emit("summarize", eventProps);
|
|
821
|
+
results = summarizeResult;
|
|
820
822
|
}
|
|
821
823
|
|
|
822
824
|
// If summarization is still unsuccessful, stop the summarizer.
|
|
823
|
-
if (
|
|
825
|
+
if (status === "failure") {
|
|
824
826
|
this.stopSummarizerCallback("failToSummarize");
|
|
825
827
|
}
|
|
828
|
+
return results;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/**
|
|
832
|
+
* Attempts to generate a summary on demand with retries in case of failures. The retry logic is the same
|
|
833
|
+
* as heuristics based summaries.
|
|
834
|
+
*/
|
|
835
|
+
private async summarizeOnDemandWithRetries(
|
|
836
|
+
reason: SummarizeReason,
|
|
837
|
+
resultsBuilder: SummarizeResultBuilder,
|
|
838
|
+
) {
|
|
839
|
+
const results = await this.trySummarizeWithRetries(reason);
|
|
840
|
+
if (results === undefined) {
|
|
841
|
+
resultsBuilder.fail("Summarization was canceled", undefined);
|
|
842
|
+
return resultsBuilder.build();
|
|
843
|
+
}
|
|
844
|
+
const submitResult = await results.summarySubmitted;
|
|
845
|
+
const summaryOpBroadcastedResult = await results.summaryOpBroadcasted;
|
|
846
|
+
const ackNackResult = await results.receivedSummaryAckOrNack;
|
|
847
|
+
resultsBuilder.summarySubmitted.resolve(submitResult);
|
|
848
|
+
resultsBuilder.summaryOpBroadcasted.resolve(summaryOpBroadcastedResult);
|
|
849
|
+
resultsBuilder.receivedSummaryAckOrNack.resolve(ackNackResult);
|
|
850
|
+
return resultsBuilder.build();
|
|
826
851
|
}
|
|
827
852
|
|
|
828
853
|
/** {@inheritdoc (ISummarizer:interface).summarizeOnDemand} */
|
|
@@ -842,12 +867,20 @@ export class RunningSummarizer extends TypedEventEmitter<ISummarizerEvents> impl
|
|
|
842
867
|
}
|
|
843
868
|
|
|
844
869
|
const { reason, ...summarizeOptions } = options;
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
870
|
+
if (options.retryOnFailure === true) {
|
|
871
|
+
this.summarizeOnDemandWithRetries(`onDemand;${reason}`, resultsBuilder).catch(
|
|
872
|
+
(error) => {
|
|
873
|
+
resultsBuilder.fail("summarize failed", error);
|
|
874
|
+
},
|
|
875
|
+
);
|
|
876
|
+
} else {
|
|
877
|
+
this.trySummarizeOnce(
|
|
878
|
+
{ summarizeReason: `onDemand/${reason}` },
|
|
879
|
+
summarizeOptions,
|
|
880
|
+
resultsBuilder,
|
|
881
|
+
);
|
|
882
|
+
}
|
|
883
|
+
return resultsBuilder.build();
|
|
851
884
|
}
|
|
852
885
|
|
|
853
886
|
/** {@inheritdoc (ISummarizer:interface).enqueueSummarize} */
|
|
@@ -149,6 +149,8 @@ export interface ISubmitSummaryOptions extends ISummarizeOptions {
|
|
|
149
149
|
export interface IOnDemandSummarizeOptions extends ISummarizeOptions {
|
|
150
150
|
/** Reason for generating summary. */
|
|
151
151
|
readonly reason: string;
|
|
152
|
+
/** In case of a failure, will attempt to retry based on if the failure is retriable. */
|
|
153
|
+
readonly retryOnFailure?: boolean;
|
|
152
154
|
}
|
|
153
155
|
|
|
154
156
|
/**
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"batchTracker.cjs","sourceRoot":"","sources":["../src/batchTracker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,qEAAyF;AACzF,2DAAoD;AACpD,+DAA2D;AAI3D,MAAa,YAAY;IAMxB,YACkB,iBAA+B,EAChD,MAA4B,EAC5B,oBAA4B,EAC5B,sBAA8B,EAC9B,mBAAiC,GAAG,EAAE,CAAC,0BAAW,CAAC,GAAG,EAAE;QAJvC,sBAAiB,GAAjB,iBAAiB,CAAc;QAJzC,sBAAiB,GAAW,CAAC,CAAC;QAUrC,IAAI,CAAC,MAAM,GAAG,IAAA,mCAAiB,EAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAkC,EAAE,EAAE;YAC9E,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;YACvD,IAAI,CAAC,6BAA6B,GAAG,gBAAgB,EAAE,CAAC;YACxD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,CAAC,EAAE,CACxB,UAAU,EACV,CAAC,KAAsB,EAAE,OAAkC,EAAE,EAAE;YAC9D,IAAA,mBAAM,EACL,IAAI,CAAC,wBAAwB,KAAK,SAAS;gBAC1C,IAAI,CAAC,6BAA6B,KAAK,SAAS,EACjD,KAAK,CAAC,4CAA4C,CAClD,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;YAC1E,IAAI,MAAM,IAAI,oBAAoB,EAAE;gBACnC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAChC,SAAS,EAAE,cAAc;oBACzB,MAAM;oBACN,SAAS,EAAE,oBAAoB;oBAC/B,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;oBACjE,UAAU,EAAE,KAAK,KAAK,SAAS;iBAC/B,CAAC,CAAC;aACH;YAED,IAAI,IAAI,CAAC,iBAAiB,GAAG,sBAAsB,KAAK,CAAC,EAAE;gBAC1D,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;oBAChC,SAAS,EAAE,QAAQ;oBACnB,MAAM;oBACN,YAAY,EAAE,sBAAsB;oBACpC,sBAAsB,EAAE,OAAO,CAAC,cAAc;oBAC9C,QAAQ,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,6BAA6B;iBACjE,CAAC,CAAC;aACH;YAED,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,6BAA6B,GAAG,SAAS,CAAC;QAChD,CAAC,CACD,CAAC;IACH,CAAC;CACD;AAzDD,oCAyDC;AAED;;;;;;;GAOG;AACI,MAAM,gBAAgB,GAAG,CAC/B,iBAA+B,EAC/B,MAA2B,EAC3B,uBAA+B,IAAI,EACnC,yBAAiC,IAAI,EACpC,EAAE,CAAC,IAAI,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;AALlF,QAAA,gBAAgB,oBAKkE","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { EventEmitter } from \"events\";\nimport { ITelemetryLoggerExt, createChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { performance } from \"@fluid-internal/client-utils\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/core-interfaces\";\n\nexport class BatchTracker {\n\tprivate readonly logger: ITelemetryLoggerExt;\n\tprivate startBatchSequenceNumber: number | undefined;\n\tprivate trackedBatchCount: number = 0;\n\tprivate batchProcessingStartTimeStamp: number | undefined;\n\n\tconstructor(\n\t\tprivate readonly batchEventEmitter: EventEmitter,\n\t\tlogger: ITelemetryBaseLogger,\n\t\tbatchLengthThreshold: number,\n\t\tbatchCountSamplingRate: number,\n\t\tdateTimeProvider: () => number = () => performance.now(),\n\t) {\n\t\tthis.logger = createChildLogger({ logger, namespace: \"Batching\" });\n\n\t\tthis.batchEventEmitter.on(\"batchBegin\", (message: ISequencedDocumentMessage) => {\n\t\t\tthis.startBatchSequenceNumber = message.sequenceNumber;\n\t\t\tthis.batchProcessingStartTimeStamp = dateTimeProvider();\n\t\t\tthis.trackedBatchCount++;\n\t\t});\n\n\t\tthis.batchEventEmitter.on(\n\t\t\t\"batchEnd\",\n\t\t\t(error: any | undefined, message: ISequencedDocumentMessage) => {\n\t\t\t\tassert(\n\t\t\t\t\tthis.startBatchSequenceNumber !== undefined &&\n\t\t\t\t\t\tthis.batchProcessingStartTimeStamp !== undefined,\n\t\t\t\t\t0x2ba /* \"batchBegin must fire before batchEnd\" */,\n\t\t\t\t);\n\n\t\t\t\tconst length = message.sequenceNumber - this.startBatchSequenceNumber + 1;\n\t\t\t\tif (length >= batchLengthThreshold) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"LengthTooBig\",\n\t\t\t\t\t\tlength,\n\t\t\t\t\t\tthreshold: batchLengthThreshold,\n\t\t\t\t\t\tbatchEndSequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\tduration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n\t\t\t\t\t\tbatchError: error !== undefined,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this.trackedBatchCount % batchCountSamplingRate === 0) {\n\t\t\t\t\tthis.logger.sendPerformanceEvent({\n\t\t\t\t\t\teventName: \"Length\",\n\t\t\t\t\t\tlength,\n\t\t\t\t\t\tsamplingRate: batchCountSamplingRate,\n\t\t\t\t\t\tbatchEndSequenceNumber: message.sequenceNumber,\n\t\t\t\t\t\tduration: dateTimeProvider() - this.batchProcessingStartTimeStamp,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis.startBatchSequenceNumber = undefined;\n\t\t\t\tthis.batchProcessingStartTimeStamp = undefined;\n\t\t\t},\n\t\t);\n\t}\n}\n\n/**\n * Track batch sizes in terms of op counts and processing times\n *\n * @param batchEventEmitter - event emitter which tracks the lifecycle of batch operations\n * @param logger - See {@link @fluidframework/core-interfaces#ITelemetryLoggerExt}\n * @param batchLengthThreshold - threshold for the length of a batch when to send an error event\n * @param batchCountSamplingRate - rate for batches for which to send an event with its characteristics\n */\nexport const BindBatchTracker = (\n\tbatchEventEmitter: EventEmitter,\n\tlogger: ITelemetryLoggerExt,\n\tbatchLengthThreshold: number = 1000,\n\tbatchCountSamplingRate: number = 1000,\n) => new BatchTracker(batchEventEmitter, logger, batchLengthThreshold, batchCountSamplingRate);\n"]}
|