@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.
Files changed (223) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/dist/blobManager.d.ts +3 -6
  3. package/dist/blobManager.d.ts.map +1 -1
  4. package/dist/blobManager.js +23 -48
  5. package/dist/blobManager.js.map +1 -1
  6. package/dist/containerHandleContext.js +3 -3
  7. package/dist/containerHandleContext.js.map +1 -1
  8. package/dist/containerRuntime.d.ts +13 -14
  9. package/dist/containerRuntime.d.ts.map +1 -1
  10. package/dist/containerRuntime.js +253 -237
  11. package/dist/containerRuntime.js.map +1 -1
  12. package/dist/dataStore.js +9 -9
  13. package/dist/dataStore.js.map +1 -1
  14. package/dist/dataStoreContext.d.ts +2 -3
  15. package/dist/dataStoreContext.d.ts.map +1 -1
  16. package/dist/dataStoreContext.js +88 -87
  17. package/dist/dataStoreContext.js.map +1 -1
  18. package/dist/dataStoreRegistry.js +3 -3
  19. package/dist/dataStoreRegistry.js.map +1 -1
  20. package/dist/dataStores.d.ts +0 -16
  21. package/dist/dataStores.d.ts.map +1 -1
  22. package/dist/dataStores.js +0 -48
  23. package/dist/dataStores.js.map +1 -1
  24. package/dist/deltaManagerProxyBase.js +4 -4
  25. package/dist/deltaManagerProxyBase.js.map +1 -1
  26. package/dist/deltaManagerSummarizerProxy.js +6 -6
  27. package/dist/deltaManagerSummarizerProxy.js.map +1 -1
  28. package/dist/deltaScheduler.js.map +1 -1
  29. package/dist/gc/garbageCollection.d.ts +12 -3
  30. package/dist/gc/garbageCollection.d.ts.map +1 -1
  31. package/dist/gc/garbageCollection.js +54 -31
  32. package/dist/gc/garbageCollection.js.map +1 -1
  33. package/dist/gc/gcConfigs.d.ts +1 -0
  34. package/dist/gc/gcConfigs.d.ts.map +1 -1
  35. package/dist/gc/gcConfigs.js +12 -2
  36. package/dist/gc/gcConfigs.js.map +1 -1
  37. package/dist/gc/gcDefinitions.d.ts +25 -22
  38. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  39. package/dist/gc/gcDefinitions.js.map +1 -1
  40. package/dist/gc/gcTelemetry.d.ts +13 -7
  41. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  42. package/dist/gc/gcTelemetry.js +74 -42
  43. package/dist/gc/gcTelemetry.js.map +1 -1
  44. package/dist/gc/gcUnreferencedStateTracker.js +3 -3
  45. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  46. package/dist/gc/index.d.ts +2 -2
  47. package/dist/gc/index.d.ts.map +1 -1
  48. package/dist/gc/index.js +1 -5
  49. package/dist/gc/index.js.map +1 -1
  50. package/dist/id-compressor/appendOnlySortedMap.js.map +1 -1
  51. package/dist/id-compressor/idCompressor.js.map +1 -1
  52. package/dist/id-compressor/identifiers.d.ts +3 -3
  53. package/dist/id-compressor/identifiers.d.ts.map +1 -1
  54. package/dist/messageTypes.d.ts +17 -17
  55. package/dist/messageTypes.d.ts.map +1 -1
  56. package/dist/messageTypes.js +1 -1
  57. package/dist/messageTypes.js.map +1 -1
  58. package/dist/opLifecycle/batchManager.js +6 -6
  59. package/dist/opLifecycle/batchManager.js.map +1 -1
  60. package/dist/opLifecycle/definitions.d.ts +2 -2
  61. package/dist/opLifecycle/definitions.d.ts.map +1 -1
  62. package/dist/packageVersion.d.ts +1 -1
  63. package/dist/packageVersion.js +1 -1
  64. package/dist/packageVersion.js.map +1 -1
  65. package/dist/pendingStateManager.d.ts +3 -19
  66. package/dist/pendingStateManager.d.ts.map +1 -1
  67. package/dist/pendingStateManager.js +20 -39
  68. package/dist/pendingStateManager.js.map +1 -1
  69. package/dist/summary/orderedClientElection.d.ts +3 -3
  70. package/dist/summary/orderedClientElection.d.ts.map +1 -1
  71. package/dist/summary/orderedClientElection.js +54 -54
  72. package/dist/summary/orderedClientElection.js.map +1 -1
  73. package/dist/summary/runWhileConnectedCoordinator.js +6 -6
  74. package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
  75. package/dist/summary/runningSummarizer.js +37 -37
  76. package/dist/summary/runningSummarizer.js.map +1 -1
  77. package/dist/summary/summarizer.d.ts.map +1 -1
  78. package/dist/summary/summarizer.js +8 -6
  79. package/dist/summary/summarizer.js.map +1 -1
  80. package/dist/summary/summarizerClientElection.js +6 -6
  81. package/dist/summary/summarizerClientElection.js.map +1 -1
  82. package/dist/summary/summarizerHeuristics.js +9 -9
  83. package/dist/summary/summarizerHeuristics.js.map +1 -1
  84. package/dist/summary/summarizerNode/summarizerNode.js +7 -7
  85. package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
  86. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  87. package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  88. package/dist/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  89. package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  90. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
  91. package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  92. package/dist/summary/summarizerTypes.d.ts +12 -12
  93. package/dist/summary/summarizerTypes.d.ts.map +1 -1
  94. package/dist/summary/summaryCollection.d.ts +2 -2
  95. package/dist/summary/summaryCollection.d.ts.map +1 -1
  96. package/dist/summary/summaryCollection.js +21 -21
  97. package/dist/summary/summaryCollection.js.map +1 -1
  98. package/dist/summary/summaryFormat.d.ts +5 -5
  99. package/dist/summary/summaryFormat.d.ts.map +1 -1
  100. package/dist/summary/summaryGenerator.d.ts +3 -3
  101. package/dist/summary/summaryGenerator.d.ts.map +1 -1
  102. package/dist/summary/summaryManager.js +7 -7
  103. package/dist/summary/summaryManager.js.map +1 -1
  104. package/dist/throttler.js +16 -16
  105. package/dist/throttler.js.map +1 -1
  106. package/dist/tsdoc-metadata.json +1 -1
  107. package/lib/blobManager.d.ts +3 -6
  108. package/lib/blobManager.d.ts.map +1 -1
  109. package/lib/blobManager.js +24 -49
  110. package/lib/blobManager.js.map +1 -1
  111. package/lib/containerHandleContext.js +3 -3
  112. package/lib/containerHandleContext.js.map +1 -1
  113. package/lib/containerRuntime.d.ts +13 -14
  114. package/lib/containerRuntime.d.ts.map +1 -1
  115. package/lib/containerRuntime.js +249 -235
  116. package/lib/containerRuntime.js.map +1 -1
  117. package/lib/dataStore.js +9 -9
  118. package/lib/dataStore.js.map +1 -1
  119. package/lib/dataStoreContext.d.ts +2 -3
  120. package/lib/dataStoreContext.d.ts.map +1 -1
  121. package/lib/dataStoreContext.js +89 -88
  122. package/lib/dataStoreContext.js.map +1 -1
  123. package/lib/dataStoreRegistry.js +3 -3
  124. package/lib/dataStoreRegistry.js.map +1 -1
  125. package/lib/dataStores.d.ts +0 -16
  126. package/lib/dataStores.d.ts.map +1 -1
  127. package/lib/dataStores.js +2 -50
  128. package/lib/dataStores.js.map +1 -1
  129. package/lib/deltaManagerProxyBase.js +4 -4
  130. package/lib/deltaManagerProxyBase.js.map +1 -1
  131. package/lib/deltaManagerSummarizerProxy.js +6 -6
  132. package/lib/deltaManagerSummarizerProxy.js.map +1 -1
  133. package/lib/deltaScheduler.js.map +1 -1
  134. package/lib/gc/garbageCollection.d.ts +12 -3
  135. package/lib/gc/garbageCollection.d.ts.map +1 -1
  136. package/lib/gc/garbageCollection.js +55 -32
  137. package/lib/gc/garbageCollection.js.map +1 -1
  138. package/lib/gc/gcConfigs.d.ts +1 -0
  139. package/lib/gc/gcConfigs.d.ts.map +1 -1
  140. package/lib/gc/gcConfigs.js +14 -4
  141. package/lib/gc/gcConfigs.js.map +1 -1
  142. package/lib/gc/gcDefinitions.d.ts +25 -22
  143. package/lib/gc/gcDefinitions.d.ts.map +1 -1
  144. package/lib/gc/gcDefinitions.js.map +1 -1
  145. package/lib/gc/gcTelemetry.d.ts +13 -7
  146. package/lib/gc/gcTelemetry.d.ts.map +1 -1
  147. package/lib/gc/gcTelemetry.js +74 -42
  148. package/lib/gc/gcTelemetry.js.map +1 -1
  149. package/lib/gc/gcUnreferencedStateTracker.js +3 -3
  150. package/lib/gc/gcUnreferencedStateTracker.js.map +1 -1
  151. package/lib/gc/index.d.ts +2 -2
  152. package/lib/gc/index.d.ts.map +1 -1
  153. package/lib/gc/index.js +2 -2
  154. package/lib/gc/index.js.map +1 -1
  155. package/lib/id-compressor/appendOnlySortedMap.js.map +1 -1
  156. package/lib/id-compressor/idCompressor.js.map +1 -1
  157. package/lib/id-compressor/identifiers.d.ts +3 -3
  158. package/lib/id-compressor/identifiers.d.ts.map +1 -1
  159. package/lib/messageTypes.d.ts +17 -17
  160. package/lib/messageTypes.d.ts.map +1 -1
  161. package/lib/opLifecycle/batchManager.js +6 -6
  162. package/lib/opLifecycle/batchManager.js.map +1 -1
  163. package/lib/opLifecycle/definitions.d.ts +2 -2
  164. package/lib/opLifecycle/definitions.d.ts.map +1 -1
  165. package/lib/packageVersion.d.ts +1 -1
  166. package/lib/packageVersion.js +1 -1
  167. package/lib/packageVersion.js.map +1 -1
  168. package/lib/pendingStateManager.d.ts +3 -19
  169. package/lib/pendingStateManager.d.ts.map +1 -1
  170. package/lib/pendingStateManager.js +20 -39
  171. package/lib/pendingStateManager.js.map +1 -1
  172. package/lib/summary/orderedClientElection.d.ts +3 -3
  173. package/lib/summary/orderedClientElection.d.ts.map +1 -1
  174. package/lib/summary/orderedClientElection.js +54 -54
  175. package/lib/summary/orderedClientElection.js.map +1 -1
  176. package/lib/summary/runWhileConnectedCoordinator.js +6 -6
  177. package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
  178. package/lib/summary/runningSummarizer.js +37 -37
  179. package/lib/summary/runningSummarizer.js.map +1 -1
  180. package/lib/summary/summarizer.d.ts.map +1 -1
  181. package/lib/summary/summarizer.js +8 -6
  182. package/lib/summary/summarizer.js.map +1 -1
  183. package/lib/summary/summarizerClientElection.js +6 -6
  184. package/lib/summary/summarizerClientElection.js.map +1 -1
  185. package/lib/summary/summarizerHeuristics.js +9 -9
  186. package/lib/summary/summarizerHeuristics.js.map +1 -1
  187. package/lib/summary/summarizerNode/summarizerNode.js +7 -7
  188. package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
  189. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
  190. package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
  191. package/lib/summary/summarizerNode/summarizerNodeUtils.js +3 -3
  192. package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
  193. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +2 -2
  194. package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
  195. package/lib/summary/summarizerTypes.d.ts +12 -12
  196. package/lib/summary/summarizerTypes.d.ts.map +1 -1
  197. package/lib/summary/summaryCollection.d.ts +2 -2
  198. package/lib/summary/summaryCollection.d.ts.map +1 -1
  199. package/lib/summary/summaryCollection.js +21 -21
  200. package/lib/summary/summaryCollection.js.map +1 -1
  201. package/lib/summary/summaryFormat.d.ts +5 -5
  202. package/lib/summary/summaryFormat.d.ts.map +1 -1
  203. package/lib/summary/summaryGenerator.d.ts +3 -3
  204. package/lib/summary/summaryGenerator.d.ts.map +1 -1
  205. package/lib/summary/summaryManager.js +6 -6
  206. package/lib/summary/summaryManager.js.map +1 -1
  207. package/lib/throttler.js +16 -16
  208. package/lib/throttler.js.map +1 -1
  209. package/package.json +53 -21
  210. package/src/blobManager.ts +18 -58
  211. package/src/containerRuntime.ts +68 -49
  212. package/src/dataStore.ts +1 -1
  213. package/src/dataStoreContext.ts +18 -14
  214. package/src/dataStores.ts +2 -80
  215. package/src/gc/garbageCollection.ts +53 -24
  216. package/src/gc/gcConfigs.ts +22 -4
  217. package/src/gc/gcDefinitions.ts +23 -20
  218. package/src/gc/gcEarlyAdoption.md +1 -1
  219. package/src/gc/gcTelemetry.ts +103 -56
  220. package/src/gc/index.ts +0 -4
  221. package/src/packageVersion.ts +1 -1
  222. package/src/pendingStateManager.ts +7 -46
  223. package/src/summary/summarizer.ts +3 -1
@@ -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
- viaHandle?: boolean;
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
- "inactiveTimeoutMs" | "sweepTimeoutMs"
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. Some scenarios where we won't log:
99
- * 1. When a DDS is changed or loaded. The corresponding data store's event will be logged instead.
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 an event indicating object is used when its not active.
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
- // If the node is not unreferenced, skip logging.
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
- // We log these events once per event per node. A unique id is generated by joining node state (inactive / sweep ready),
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
- ...eventProps,
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: taggedId, fromId: taggedFromId, ...otherProps } = eventProps;
219
+ const { id, fromId, headers, ...detailedProps } = unrefEventProps;
210
220
  const event = {
211
221
  eventName: `${state}Object_${nodeUsageProps.usageType}`,
212
- pkg: tagCodeArtifacts({ pkg: nodeUsageProps.packagePath?.join("/") }).pkg,
222
+ ...tagCodeArtifacts({ pkg: nodeUsageProps.packagePath?.join("/") }),
213
223
  stack: generateStack(),
214
- id: taggedId,
215
- fromId: taggedFromId,
216
- details: JSON.stringify({
217
- ...otherProps,
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";
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/container-runtime";
9
- export const pkgVersion = "2.0.0-internal.6.4.0";
9
+ export const pkgVersion = "2.0.0-internal.7.0.1";
@@ -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 IPendingMessageNew {
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: IPendingState[];
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<IPendingMessageNew>();
103
- private readonly initialMessages = new Deque<IPendingMessageNew>();
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: IPendingMessageNew[] = [];
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
- for (const initialState of initialLocalState.pendingStates) {
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: IPendingMessageNew = {
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
- : await requestFluidObject<FluidObject<ISummarizer>>(resolvedContainer, {
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) {