@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/src/gc/gcTelemetry.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
MonitoringContext,
|
|
12
12
|
tagCodeArtifacts,
|
|
13
13
|
} from "@fluidframework/telemetry-utils";
|
|
14
|
+
import { RuntimeHeaderData } from "../containerRuntime";
|
|
14
15
|
import { ICreateContainerMetadata } from "../summary";
|
|
15
16
|
import {
|
|
16
17
|
disableSweepLogKey,
|
|
@@ -32,7 +33,7 @@ interface ICommonProps {
|
|
|
32
33
|
completedGCRuns: number;
|
|
33
34
|
isTombstoned: boolean;
|
|
34
35
|
lastSummaryTime?: number;
|
|
35
|
-
|
|
36
|
+
headers?: RuntimeHeaderData;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
/** The event that is logged when unreferenced node is used after a certain time. */
|
|
@@ -80,10 +81,13 @@ export class GCTelemetryTracker {
|
|
|
80
81
|
private readonly mc: MonitoringContext,
|
|
81
82
|
private readonly configs: Pick<
|
|
82
83
|
IGarbageCollectorConfigs,
|
|
83
|
-
|
|
84
|
+
| "inactiveTimeoutMs"
|
|
85
|
+
| "sweepTimeoutMs"
|
|
86
|
+
| "tombstoneEnforcementAllowed"
|
|
87
|
+
| "throwOnTombstoneLoad"
|
|
88
|
+
| "throwOnTombstoneUsage"
|
|
84
89
|
>,
|
|
85
90
|
private readonly isSummarizerClient: boolean,
|
|
86
|
-
private readonly gcTombstoneEnforcementAllowed: boolean,
|
|
87
91
|
private readonly createContainerMetadata: ICreateContainerMetadata,
|
|
88
92
|
private readonly getNodeType: (nodeId: string) => GCNodeType,
|
|
89
93
|
private readonly getNodeStateTracker: (
|
|
@@ -95,12 +99,12 @@ export class GCTelemetryTracker {
|
|
|
95
99
|
) {}
|
|
96
100
|
|
|
97
101
|
/**
|
|
98
|
-
* Returns whether an event should be logged for a node that isn't active anymore.
|
|
99
|
-
*
|
|
102
|
+
* Returns whether an event should be logged for a node that isn't active anymore. This does not apply to
|
|
103
|
+
* tombstoned nodes for which an event is always logged. Some scenarios where we won't log:
|
|
104
|
+
* 1. When a DDS is changed. The corresponding data store's event will be logged instead.
|
|
100
105
|
* 2. An event is logged only once per container instance per event per node.
|
|
101
106
|
*/
|
|
102
107
|
private shouldLogNonActiveEvent(
|
|
103
|
-
nodeId: string,
|
|
104
108
|
nodeType: GCNodeType,
|
|
105
109
|
usageType: NodeUsageType,
|
|
106
110
|
nodeStateTracker: UnreferencedStateTracker,
|
|
@@ -119,6 +123,8 @@ export class GCTelemetryTracker {
|
|
|
119
123
|
return false;
|
|
120
124
|
}
|
|
121
125
|
|
|
126
|
+
// Non-tombstone events are logged once per event per node. A unique id is generated by joining
|
|
127
|
+
// node state (inactive / sweep ready), node's id and usage (loaded / changed / revived).
|
|
122
128
|
if (this.loggedUnreferencedEvents.has(uniqueEventId)) {
|
|
123
129
|
return false;
|
|
124
130
|
}
|
|
@@ -126,24 +132,61 @@ export class GCTelemetryTracker {
|
|
|
126
132
|
}
|
|
127
133
|
|
|
128
134
|
/**
|
|
129
|
-
* Called when a node is used. If the node is not active, log
|
|
135
|
+
* Called when a node is used. If the node is not active or tombstoned, log telemetry indicating object is used
|
|
136
|
+
* when it should not have been.
|
|
130
137
|
*/
|
|
131
138
|
public nodeUsed(nodeUsageProps: INodeUsageProps) {
|
|
132
139
|
// If there is no reference timestamp to work with, no ops have been processed after creation. If so, skip
|
|
133
140
|
// logging as nothing interesting would have happened worth logging.
|
|
134
|
-
|
|
135
|
-
const nodeStateTracker = this.getNodeStateTracker(nodeUsageProps.id);
|
|
136
|
-
if (!nodeStateTracker || nodeUsageProps.currentReferenceTimestampMs === undefined) {
|
|
141
|
+
if (nodeUsageProps.currentReferenceTimestampMs === undefined) {
|
|
137
142
|
return;
|
|
138
143
|
}
|
|
139
144
|
|
|
140
|
-
|
|
141
|
-
// node's id and usage (loaded / changed / revived).
|
|
142
|
-
const uniqueEventId = `${nodeStateTracker.state}-${nodeUsageProps.id}-${nodeUsageProps.usageType}`;
|
|
145
|
+
const nodeStateTracker = this.getNodeStateTracker(nodeUsageProps.id);
|
|
143
146
|
const nodeType = this.getNodeType(nodeUsageProps.id);
|
|
147
|
+
const {
|
|
148
|
+
usageType,
|
|
149
|
+
currentReferenceTimestampMs,
|
|
150
|
+
packagePath,
|
|
151
|
+
id: untaggedId,
|
|
152
|
+
fromId: untaggedFromId,
|
|
153
|
+
...propsToLog
|
|
154
|
+
} = nodeUsageProps;
|
|
155
|
+
const unrefEventProps: Omit<IUnreferencedEventProps, "state" | "usageType"> = {
|
|
156
|
+
type: nodeType,
|
|
157
|
+
unrefTime: nodeStateTracker?.unreferencedTimestampMs ?? -1,
|
|
158
|
+
age:
|
|
159
|
+
nodeStateTracker !== undefined
|
|
160
|
+
? nodeUsageProps.currentReferenceTimestampMs -
|
|
161
|
+
nodeStateTracker.unreferencedTimestampMs
|
|
162
|
+
: -1,
|
|
163
|
+
timeout:
|
|
164
|
+
nodeStateTracker?.state === UnreferencedState.Inactive
|
|
165
|
+
? this.configs.inactiveTimeoutMs
|
|
166
|
+
: this.configs.sweepTimeoutMs,
|
|
167
|
+
...tagCodeArtifacts({ id: untaggedId, fromId: untaggedFromId }),
|
|
168
|
+
...propsToLog,
|
|
169
|
+
...this.createContainerMetadata,
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// If the node that is used is tombstoned, log a tombstone telemetry.
|
|
173
|
+
// Note that this is done before checking if "nodeStateTracker" is undefined below because unreferenced
|
|
174
|
+
// tracking may not have yet been enabled. That happens only after the client transitions to write mode.
|
|
175
|
+
if (nodeUsageProps.isTombstoned) {
|
|
176
|
+
this.logTombstoneUsageTelemetry(nodeUsageProps, unrefEventProps, nodeType, usageType);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// After logging tombstone telemetry, if the node's unreferenced state is not tracked, there is nothing
|
|
180
|
+
// else to log.
|
|
181
|
+
if (nodeStateTracker === undefined) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const state = nodeStateTracker.state;
|
|
186
|
+
const uniqueEventId = `${state}-${nodeUsageProps.id}-${nodeUsageProps.usageType}`;
|
|
187
|
+
|
|
144
188
|
if (
|
|
145
189
|
!this.shouldLogNonActiveEvent(
|
|
146
|
-
nodeUsageProps.id,
|
|
147
190
|
nodeType,
|
|
148
191
|
nodeUsageProps.usageType,
|
|
149
192
|
nodeStateTracker,
|
|
@@ -153,42 +196,9 @@ export class GCTelemetryTracker {
|
|
|
153
196
|
return;
|
|
154
197
|
}
|
|
155
198
|
|
|
156
|
-
// Add the unique event id so that we don't generate a log for this event again in this session
|
|
199
|
+
// Add the unique event id so that we don't generate a log for this event again in this session.
|
|
157
200
|
this.loggedUnreferencedEvents.add(uniqueEventId);
|
|
158
201
|
|
|
159
|
-
const state = nodeStateTracker.state;
|
|
160
|
-
const { usageType, currentReferenceTimestampMs, packagePath, id, fromId, ...propsToLog } =
|
|
161
|
-
nodeUsageProps;
|
|
162
|
-
const eventProps: Omit<IUnreferencedEventProps, "state" | "usageType"> = {
|
|
163
|
-
type: nodeType,
|
|
164
|
-
unrefTime: nodeStateTracker.unreferencedTimestampMs,
|
|
165
|
-
age:
|
|
166
|
-
nodeUsageProps.currentReferenceTimestampMs -
|
|
167
|
-
nodeStateTracker.unreferencedTimestampMs,
|
|
168
|
-
timeout:
|
|
169
|
-
state === UnreferencedState.Inactive
|
|
170
|
-
? this.configs.inactiveTimeoutMs
|
|
171
|
-
: this.configs.sweepTimeoutMs,
|
|
172
|
-
...tagCodeArtifacts({ id, fromId }),
|
|
173
|
-
...propsToLog,
|
|
174
|
-
...this.createContainerMetadata,
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// This will log the following events:
|
|
178
|
-
// GC_Tombstone_DataStore_Revived, GC_Tombstone_SubDataStore_Revived, GC_Tombstone_Blob_Revived
|
|
179
|
-
if (nodeUsageProps.usageType === "Revived" && nodeUsageProps.isTombstoned) {
|
|
180
|
-
sendGCUnexpectedUsageEvent(
|
|
181
|
-
this.mc,
|
|
182
|
-
{
|
|
183
|
-
eventName: `GC_Tombstone_${nodeType}_Revived`,
|
|
184
|
-
category: "generic",
|
|
185
|
-
...tagCodeArtifacts({ url: id }),
|
|
186
|
-
gcTombstoneEnforcementAllowed: this.gcTombstoneEnforcementAllowed,
|
|
187
|
-
},
|
|
188
|
-
undefined /* packagePath */,
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
202
|
// For summarizer client, queue the event so it is logged the next time GC runs if the event is still valid.
|
|
193
203
|
// For non-summarizer client, log the event now since GC won't run on it. This may result in false positives
|
|
194
204
|
// but it's a good signal nonetheless and we can consume it with a grain of salt.
|
|
@@ -196,7 +206,7 @@ export class GCTelemetryTracker {
|
|
|
196
206
|
// SweepReady errors are usages of Objects that will be deleted by GC Sweep!
|
|
197
207
|
if (this.isSummarizerClient) {
|
|
198
208
|
this.pendingEventsQueue.push({
|
|
199
|
-
...
|
|
209
|
+
...unrefEventProps,
|
|
200
210
|
usageType: nodeUsageProps.usageType,
|
|
201
211
|
state,
|
|
202
212
|
});
|
|
@@ -206,16 +216,15 @@ export class GCTelemetryTracker {
|
|
|
206
216
|
// Events generated:
|
|
207
217
|
// InactiveObject_Loaded, SweepReadyObject_Loaded
|
|
208
218
|
if (nodeUsageProps.usageType === "Loaded") {
|
|
209
|
-
const { id
|
|
219
|
+
const { id, fromId, headers, ...detailedProps } = unrefEventProps;
|
|
210
220
|
const event = {
|
|
211
221
|
eventName: `${state}Object_${nodeUsageProps.usageType}`,
|
|
212
|
-
|
|
222
|
+
...tagCodeArtifacts({ pkg: nodeUsageProps.packagePath?.join("/") }),
|
|
213
223
|
stack: generateStack(),
|
|
214
|
-
id
|
|
215
|
-
fromId
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}),
|
|
224
|
+
id,
|
|
225
|
+
fromId,
|
|
226
|
+
headers: { ...headers },
|
|
227
|
+
details: detailedProps,
|
|
219
228
|
};
|
|
220
229
|
|
|
221
230
|
// Do not log the inactive object x events as error events as they are not the best signal for
|
|
@@ -229,6 +238,44 @@ export class GCTelemetryTracker {
|
|
|
229
238
|
}
|
|
230
239
|
}
|
|
231
240
|
|
|
241
|
+
/**
|
|
242
|
+
* Logs telemetry when a tombstoned object is changed, revived or loaded.
|
|
243
|
+
*/
|
|
244
|
+
private logTombstoneUsageTelemetry(
|
|
245
|
+
nodeUsageProps: INodeUsageProps,
|
|
246
|
+
unrefEventProps: Omit<IUnreferencedEventProps, "state" | "usageType">,
|
|
247
|
+
nodeType: GCNodeType,
|
|
248
|
+
usageType: NodeUsageType,
|
|
249
|
+
) {
|
|
250
|
+
// This will log the following events:
|
|
251
|
+
// GC_Tombstone_DataStore_Requested, GC_Tombstone_DataStore_Changed, GC_Tombstone_DataStore_Revived
|
|
252
|
+
// GC_Tombstone_SubDataStore_Requested, GC_Tombstone_SubDataStore_Changed, GC_Tombstone_SubDataStore_Revived
|
|
253
|
+
// GC_Tombstone_Blob_Requested, GC_Tombstone_Blob_Changed, GC_Tombstone_Blob_Revived
|
|
254
|
+
const { id, fromId, headers, ...detailedProps } = unrefEventProps;
|
|
255
|
+
const eventUsageName = usageType === "Loaded" ? "Requested" : usageType;
|
|
256
|
+
const event = {
|
|
257
|
+
eventName: `GC_Tombstone_${nodeType}_${eventUsageName}`,
|
|
258
|
+
pkg: tagCodeArtifacts({ pkg: nodeUsageProps.packagePath?.join("/") }).pkg,
|
|
259
|
+
stack: generateStack(),
|
|
260
|
+
id,
|
|
261
|
+
fromId,
|
|
262
|
+
headers: { ...headers },
|
|
263
|
+
details: detailedProps,
|
|
264
|
+
gcTombstoneEnforcementAllowed: this.configs.tombstoneEnforcementAllowed,
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
if (
|
|
268
|
+
(usageType === "Loaded" &&
|
|
269
|
+
this.configs.throwOnTombstoneLoad &&
|
|
270
|
+
!headers?.allowTombstone) ||
|
|
271
|
+
(usageType === "Changed" && this.configs.throwOnTombstoneUsage)
|
|
272
|
+
) {
|
|
273
|
+
this.mc.logger.sendErrorEvent(event);
|
|
274
|
+
} else {
|
|
275
|
+
this.mc.logger.sendTelemetryEvent(event);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
232
279
|
/**
|
|
233
280
|
* Log all new references or outbound routes in the current graph that haven't been explicitly notified to GC.
|
|
234
281
|
* The principle is that every new reference or outbound route must be notified to GC via the
|
package/src/gc/index.ts
CHANGED
|
@@ -31,15 +31,11 @@ export {
|
|
|
31
31
|
stableGCVersion,
|
|
32
32
|
disableAttachmentBlobSweepKey,
|
|
33
33
|
disableDatastoreSweepKey,
|
|
34
|
-
throwOnTombstoneLoadKey,
|
|
35
|
-
throwOnTombstoneUsageKey,
|
|
36
34
|
UnreferencedState,
|
|
37
35
|
} from "./gcDefinitions";
|
|
38
36
|
export {
|
|
39
37
|
cloneGCData,
|
|
40
38
|
concatGarbageCollectionStates,
|
|
41
|
-
shouldAllowGcTombstoneEnforcement,
|
|
42
|
-
shouldAllowGcSweep,
|
|
43
39
|
trimLeadingAndTrailingSlashes,
|
|
44
40
|
unpackChildNodesGCDetails,
|
|
45
41
|
} from "./gcHelpers";
|
package/src/packageVersion.ts
CHANGED
|
@@ -15,24 +15,11 @@ import { ContainerMessageType, InboundSequencedContainerRuntimeMessage } from ".
|
|
|
15
15
|
import { pkgVersion } from "./packageVersion";
|
|
16
16
|
import { IBatchMetadata } from "./metadata";
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* ! TODO: Remove this interface in "2.0.0-internal.7.0.0" once we only read IPendingMessageNew (AB#4763)
|
|
20
|
-
*/
|
|
21
|
-
export interface IPendingMessageOld {
|
|
22
|
-
type: "message";
|
|
23
|
-
messageType: ContainerMessageType;
|
|
24
|
-
clientSequenceNumber: number;
|
|
25
|
-
referenceSequenceNumber: number;
|
|
26
|
-
content: any;
|
|
27
|
-
localOpMetadata: unknown;
|
|
28
|
-
opMetadata: Record<string, unknown> | undefined;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
18
|
/**
|
|
32
19
|
* This represents a message that has been submitted and is added to the pending queue when `submit` is called on the
|
|
33
20
|
* ContainerRuntime. This message has either not been ack'd by the server or has not been submitted to the server yet.
|
|
34
21
|
*/
|
|
35
|
-
export interface
|
|
22
|
+
export interface IPendingMessage {
|
|
36
23
|
type: "message";
|
|
37
24
|
clientSequenceNumber: number;
|
|
38
25
|
referenceSequenceNumber: number;
|
|
@@ -41,16 +28,11 @@ export interface IPendingMessageNew {
|
|
|
41
28
|
opMetadata: Record<string, unknown> | undefined;
|
|
42
29
|
}
|
|
43
30
|
|
|
44
|
-
/**
|
|
45
|
-
* ! TODO: Remove this type in "2.0.0-internal.7.0.0" (AB#4763)
|
|
46
|
-
*/
|
|
47
|
-
export type IPendingState = IPendingMessageOld | IPendingMessageNew;
|
|
48
|
-
|
|
49
31
|
export interface IPendingLocalState {
|
|
50
32
|
/**
|
|
51
33
|
* list of pending states, including ops and batch information
|
|
52
34
|
*/
|
|
53
|
-
pendingStates:
|
|
35
|
+
pendingStates: IPendingMessage[];
|
|
54
36
|
}
|
|
55
37
|
|
|
56
38
|
export interface IPendingBatchMessage {
|
|
@@ -99,13 +81,13 @@ function buildPendingMessageContent(
|
|
|
99
81
|
* It verifies that all the ops are acked, are received in the right order and batch information is correct.
|
|
100
82
|
*/
|
|
101
83
|
export class PendingStateManager implements IDisposable {
|
|
102
|
-
private readonly pendingMessages = new Deque<
|
|
103
|
-
private readonly initialMessages = new Deque<
|
|
84
|
+
private readonly pendingMessages = new Deque<IPendingMessage>();
|
|
85
|
+
private readonly initialMessages = new Deque<IPendingMessage>();
|
|
104
86
|
|
|
105
87
|
/**
|
|
106
88
|
* Sequenced local ops that are saved when stashing since pending ops may depend on them
|
|
107
89
|
*/
|
|
108
|
-
private savedOps:
|
|
90
|
+
private savedOps: IPendingMessage[] = [];
|
|
109
91
|
|
|
110
92
|
private readonly disposeOnce = new Lazy<void>(() => {
|
|
111
93
|
this.initialMessages.clear();
|
|
@@ -169,29 +151,8 @@ export class PendingStateManager implements IDisposable {
|
|
|
169
151
|
initialLocalState: IPendingLocalState | undefined,
|
|
170
152
|
private readonly logger: ITelemetryLoggerExt | undefined,
|
|
171
153
|
) {
|
|
172
|
-
/**
|
|
173
|
-
* Convert old local state format to the new format (IPendingMessageOld to IPendingMessageNew)
|
|
174
|
-
* ! TODO: Remove this conversion in "2.0.0-internal.7.0.0" (AB#4763)
|
|
175
|
-
*/
|
|
176
154
|
if (initialLocalState?.pendingStates) {
|
|
177
|
-
|
|
178
|
-
let messageContent = initialState.content;
|
|
179
|
-
if (
|
|
180
|
-
(initialState as IPendingMessageOld).messageType !== undefined &&
|
|
181
|
-
typeof initialState.content !== "string"
|
|
182
|
-
) {
|
|
183
|
-
// Convert IPendingMessageOld to IPendingMessageNew
|
|
184
|
-
messageContent = JSON.stringify({
|
|
185
|
-
type: (initialState as IPendingMessageOld).messageType,
|
|
186
|
-
contents: initialState.content,
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
// Note: this object may contain "messageType" prop, but it should not be easily accesible due to interface being used
|
|
190
|
-
this.initialMessages.push({
|
|
191
|
-
...initialState,
|
|
192
|
-
content: messageContent,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
155
|
+
this.initialMessages.push(...initialLocalState.pendingStates);
|
|
195
156
|
}
|
|
196
157
|
}
|
|
197
158
|
|
|
@@ -213,7 +174,7 @@ export class PendingStateManager implements IDisposable {
|
|
|
213
174
|
localOpMetadata: unknown,
|
|
214
175
|
opMetadata: Record<string, unknown> | undefined,
|
|
215
176
|
) {
|
|
216
|
-
const pendingMessage:
|
|
177
|
+
const pendingMessage: IPendingMessage = {
|
|
217
178
|
type: "message",
|
|
218
179
|
clientSequenceNumber: -1, // dummy value (not to be used anywhere)
|
|
219
180
|
referenceSequenceNumber,
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
} from "@fluidframework/telemetry-utils";
|
|
16
16
|
import { ILoader, LoaderHeader } from "@fluidframework/container-definitions";
|
|
17
17
|
import { DriverHeader } from "@fluidframework/driver-definitions";
|
|
18
|
+
// eslint-disable-next-line import/no-deprecated
|
|
18
19
|
import { requestFluidObject } from "@fluidframework/runtime-utils";
|
|
19
20
|
import { FluidObject, IFluidHandleContext, IRequest } from "@fluidframework/core-interfaces";
|
|
20
21
|
import { ISummaryConfiguration } from "../containerRuntime";
|
|
@@ -125,7 +126,8 @@ export class Summarizer extends TypedEventEmitter<ISummarizerEvents> implements
|
|
|
125
126
|
const resolvedContainer = await loader.resolve(request);
|
|
126
127
|
const fluidObject: FluidObject<ISummarizer> | undefined = resolvedContainer.getEntryPoint
|
|
127
128
|
? await resolvedContainer.getEntryPoint?.()
|
|
128
|
-
:
|
|
129
|
+
: // eslint-disable-next-line import/no-deprecated
|
|
130
|
+
await requestFluidObject<FluidObject<ISummarizer>>(resolvedContainer, {
|
|
129
131
|
url: "_summarizer",
|
|
130
132
|
});
|
|
131
133
|
if (fluidObject?.ISummarizer === undefined) {
|