@fluidframework/container-runtime 2.0.0-rc.1.0.4 → 2.0.0-rc.1.0.6

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 (94) hide show
  1. package/api-report/container-runtime.api.md +5 -1
  2. package/dist/container-runtime-alpha.d.ts +5 -1
  3. package/dist/container-runtime-untrimmed.d.ts +5 -1
  4. package/dist/containerRuntime.d.ts +5 -1
  5. package/dist/containerRuntime.d.ts.map +1 -1
  6. package/dist/containerRuntime.js +8 -2
  7. package/dist/containerRuntime.js.map +1 -1
  8. package/dist/dataStoreContext.d.ts +41 -5
  9. package/dist/dataStoreContext.d.ts.map +1 -1
  10. package/dist/dataStoreContext.js +29 -12
  11. package/dist/dataStoreContext.js.map +1 -1
  12. package/dist/dataStores.d.ts +9 -2
  13. package/dist/dataStores.d.ts.map +1 -1
  14. package/dist/dataStores.js +46 -5
  15. package/dist/dataStores.js.map +1 -1
  16. package/dist/gc/garbageCollection.d.ts +17 -1
  17. package/dist/gc/garbageCollection.d.ts.map +1 -1
  18. package/dist/gc/garbageCollection.js +78 -30
  19. package/dist/gc/garbageCollection.js.map +1 -1
  20. package/dist/gc/gcDefinitions.d.ts +19 -3
  21. package/dist/gc/gcDefinitions.d.ts.map +1 -1
  22. package/dist/gc/gcDefinitions.js +5 -1
  23. package/dist/gc/gcDefinitions.js.map +1 -1
  24. package/dist/gc/gcSummaryStateTracker.d.ts +8 -1
  25. package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
  26. package/dist/gc/gcSummaryStateTracker.js +13 -1
  27. package/dist/gc/gcSummaryStateTracker.js.map +1 -1
  28. package/dist/gc/gcTelemetry.d.ts +1 -0
  29. package/dist/gc/gcTelemetry.d.ts.map +1 -1
  30. package/dist/gc/gcTelemetry.js +3 -3
  31. package/dist/gc/gcTelemetry.js.map +1 -1
  32. package/dist/gc/gcUnreferencedStateTracker.d.ts +5 -0
  33. package/dist/gc/gcUnreferencedStateTracker.d.ts.map +1 -1
  34. package/dist/gc/gcUnreferencedStateTracker.js +12 -1
  35. package/dist/gc/gcUnreferencedStateTracker.js.map +1 -1
  36. package/dist/gc/index.d.ts +1 -1
  37. package/dist/gc/index.d.ts.map +1 -1
  38. package/dist/gc/index.js +3 -1
  39. package/dist/gc/index.js.map +1 -1
  40. package/dist/packageVersion.d.ts +1 -1
  41. package/dist/packageVersion.js +1 -1
  42. package/dist/packageVersion.js.map +1 -1
  43. package/lib/container-runtime-alpha.d.mts +5 -1
  44. package/lib/container-runtime-untrimmed.d.mts +5 -1
  45. package/lib/containerRuntime.d.mts +5 -1
  46. package/lib/containerRuntime.d.mts.map +1 -1
  47. package/lib/containerRuntime.mjs +8 -2
  48. package/lib/containerRuntime.mjs.map +1 -1
  49. package/lib/dataStoreContext.d.mts +41 -5
  50. package/lib/dataStoreContext.d.mts.map +1 -1
  51. package/lib/dataStoreContext.mjs +30 -13
  52. package/lib/dataStoreContext.mjs.map +1 -1
  53. package/lib/dataStores.d.mts +9 -2
  54. package/lib/dataStores.d.mts.map +1 -1
  55. package/lib/dataStores.mjs +48 -7
  56. package/lib/dataStores.mjs.map +1 -1
  57. package/lib/gc/garbageCollection.d.mts +17 -1
  58. package/lib/gc/garbageCollection.d.mts.map +1 -1
  59. package/lib/gc/garbageCollection.mjs +80 -32
  60. package/lib/gc/garbageCollection.mjs.map +1 -1
  61. package/lib/gc/gcDefinitions.d.mts +19 -3
  62. package/lib/gc/gcDefinitions.d.mts.map +1 -1
  63. package/lib/gc/gcDefinitions.mjs +4 -0
  64. package/lib/gc/gcDefinitions.mjs.map +1 -1
  65. package/lib/gc/gcSummaryStateTracker.d.mts +8 -1
  66. package/lib/gc/gcSummaryStateTracker.d.mts.map +1 -1
  67. package/lib/gc/gcSummaryStateTracker.mjs +13 -1
  68. package/lib/gc/gcSummaryStateTracker.mjs.map +1 -1
  69. package/lib/gc/gcTelemetry.d.mts +1 -0
  70. package/lib/gc/gcTelemetry.d.mts.map +1 -1
  71. package/lib/gc/gcTelemetry.mjs +3 -3
  72. package/lib/gc/gcTelemetry.mjs.map +1 -1
  73. package/lib/gc/gcUnreferencedStateTracker.d.mts +5 -0
  74. package/lib/gc/gcUnreferencedStateTracker.d.mts.map +1 -1
  75. package/lib/gc/gcUnreferencedStateTracker.mjs +10 -0
  76. package/lib/gc/gcUnreferencedStateTracker.mjs.map +1 -1
  77. package/lib/gc/index.d.mts +1 -1
  78. package/lib/gc/index.d.mts.map +1 -1
  79. package/lib/gc/index.mjs +1 -1
  80. package/lib/gc/index.mjs.map +1 -1
  81. package/lib/packageVersion.d.mts +1 -1
  82. package/lib/packageVersion.mjs +1 -1
  83. package/lib/packageVersion.mjs.map +1 -1
  84. package/package.json +16 -16
  85. package/src/containerRuntime.ts +13 -3
  86. package/src/dataStoreContext.ts +60 -17
  87. package/src/dataStores.ts +63 -6
  88. package/src/gc/garbageCollection.ts +93 -31
  89. package/src/gc/gcDefinitions.ts +20 -4
  90. package/src/gc/gcSummaryStateTracker.ts +14 -1
  91. package/src/gc/gcTelemetry.ts +4 -3
  92. package/src/gc/gcUnreferencedStateTracker.ts +11 -0
  93. package/src/gc/index.ts +2 -0
  94. package/src/packageVersion.ts +1 -1
@@ -44,6 +44,8 @@ class DataStores {
44
44
  // root data stores that are added.
45
45
  this.dataStoresSinceLastGC = [];
46
46
  this.pendingAliasMap = new Map();
47
+ /** For sampling. Only log once per container */
48
+ this.shouldSendAttachLog = true;
47
49
  this.dispose = () => this.disposeOnce.value;
48
50
  this.mc = (0, telemetry_utils_1.createChildMonitoringContext)({ logger: baseLogger });
49
51
  this.containerRuntimeHandle = new datastore_1.FluidObjectHandle(this.runtime, "/", this.runtime.IFluidHandleContext);
@@ -114,6 +116,27 @@ class DataStores {
114
116
  processAttachMessage(message, local) {
115
117
  const attachMessage = message.contents;
116
118
  this.dataStoresSinceLastGC.push(attachMessage.id);
119
+ // We need to process the GC Data for both local and remote attach messages
120
+ const foundGCData = (0, runtime_utils_1.processAttachMessageGCData)(attachMessage.snapshot, (nodeId, toPath) => {
121
+ // nodeId is the relative path under the node being attached. Always starts with "/", but no trailing "/" after an id
122
+ const fromPath = `/${attachMessage.id}${nodeId === "/" ? "" : nodeId}`;
123
+ this.runtime.addedGCOutboundReference({ absolutePath: fromPath }, { absolutePath: toPath });
124
+ });
125
+ // Only log once per container to avoid noise/cost.
126
+ // Allows longitudinal tracking of various state (e.g. foundGCData), and some sampled details
127
+ if (this.shouldSendAttachLog) {
128
+ this.shouldSendAttachLog = false;
129
+ this.mc.logger.sendTelemetryEvent({
130
+ eventName: "dataStoreAttachMessage_sampled",
131
+ ...(0, telemetry_utils_1.tagCodeArtifacts)({ id: attachMessage.id, pkg: attachMessage.type }),
132
+ details: {
133
+ local,
134
+ snapshot: !!attachMessage.snapshot,
135
+ foundGCData,
136
+ },
137
+ ...(0, telemetry_utils_1.extractSafePropertiesFromMessage)(message),
138
+ });
139
+ }
117
140
  // The local object has already been attached
118
141
  if (local) {
119
142
  (0, core_utils_1.assert)(this.pendingAttach.has(attachMessage.id), 0x15e /* "Local object does not have matching attach message id" */);
@@ -196,9 +219,24 @@ class DataStores {
196
219
  alreadyProcessed(id) {
197
220
  return this.aliasMap.get(id) !== undefined || this.contexts.get(id) !== undefined;
198
221
  }
222
+ /** Package up the context's attach summary etc into an IAttachMessage */
223
+ generateAttachMessage(localContext) {
224
+ const { attachSummary, type, gcData } = localContext.getAttachData(
225
+ /* includeGCData: */ true);
226
+ if (gcData !== undefined) {
227
+ (0, runtime_utils_1.addBlobToSummary)(attachSummary, runtime_definitions_1.gcDataBlobKey, JSON.stringify(gcData));
228
+ }
229
+ // Attach message needs the summary in ITree format. Convert the ISummaryTree into an ITree.
230
+ const snapshot = (0, runtime_utils_1.convertSummaryTreeToITree)(attachSummary.summary);
231
+ return {
232
+ id: localContext.id,
233
+ snapshot,
234
+ type,
235
+ };
236
+ }
199
237
  /**
200
- * Make the data stores locally visible in the container graph by moving the data store context from unbound to
201
- * bound list. This data store can now be reached from the root.
238
+ * Make the data store locally visible in the container graph by moving the data store context from unbound to
239
+ * bound list and submitting the attach message. This data store can now be reached from the root.
202
240
  * @param id - The id of the data store context to make visible.
203
241
  */
204
242
  makeDataStoreLocallyVisible(id) {
@@ -211,7 +249,7 @@ class DataStores {
211
249
  */
212
250
  if (this.runtime.attachState !== container_definitions_1.AttachState.Detached) {
213
251
  localContext.emit("attaching");
214
- const message = localContext.generateAttachMessage();
252
+ const message = this.generateAttachMessage(localContext);
215
253
  this.pendingAttach.set(id, message);
216
254
  this.submitAttachFn(message);
217
255
  this.attachOpFiredForDataStore.add(id);
@@ -455,6 +493,9 @@ class DataStores {
455
493
  }));
456
494
  return summaryBuilder.getSummaryTree();
457
495
  }
496
+ /**
497
+ * Create a summary. Used when attaching or serializing a detached container.
498
+ */
458
499
  createSummary(telemetryContext) {
459
500
  const builder = new runtime_utils_1.SummaryTreeBuilder();
460
501
  // Attaching graph of some stores can cause other stores to get bound too.
@@ -475,8 +516,8 @@ class DataStores {
475
516
  .map(([key, value]) => {
476
517
  let dataStoreSummary;
477
518
  if (value.isLoaded) {
478
- const snapshot = value.generateAttachMessage().snapshot;
479
- dataStoreSummary = (0, runtime_utils_1.convertToSummaryTree)(snapshot, true);
519
+ dataStoreSummary = value.getAttachData(
520
+ /* includeGCCData: */ false, telemetryContext).attachSummary;
480
521
  }
481
522
  else {
482
523
  // If this data store is not yet loaded, then there should be no changes in the snapshot from
@@ -1 +1 @@
1
- {"version":3,"file":"dataStores.js","sourceRoot":"","sources":["../src/dataStores.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryBaseLogger,\n\tIDisposable,\n\tIFluidHandle,\n\tIRequest,\n} from \"@fluidframework/core-interfaces\";\nimport { FluidObjectHandle } from \"@fluidframework/datastore\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tAliasResult,\n\tchannelsTreeName,\n\tCreateChildSummarizerNodeFn,\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tIAttachMessage,\n\tIEnvelope,\n\tIFluidDataStoreContextDetached,\n\tIGarbageCollectionData,\n\tIInboundSignalMessage,\n\tInboundAttachMessage,\n\tISummarizeResult,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\tconvertSnapshotTreeToSummaryTree,\n\tconvertToSummaryTree,\n\tcreate404Response,\n\tcreateResponseError,\n\tGCDataBuilder,\n\tisSerializedHandle,\n\tresponseToException,\n\tSummaryTreeBuilder,\n\tunpackChildNodesUsedRoutes,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tcreateChildMonitoringContext,\n\tDataCorruptionError,\n\tDataProcessingError,\n\textractSafePropertiesFromMessage,\n\tLoggingError,\n\tMonitoringContext,\n\ttagCodeArtifacts,\n} from \"@fluidframework/telemetry-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport { assert, Lazy } from \"@fluidframework/core-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport { DataStoreContexts } from \"./dataStoreContexts\";\nimport { ContainerRuntime, defaultRuntimeHeaderData, RuntimeHeaderData } from \"./containerRuntime\";\nimport {\n\tFluidDataStoreContext,\n\tRemoteFluidDataStoreContext,\n\tLocalFluidDataStoreContext,\n\tcreateAttributesBlob,\n\tLocalDetachedFluidDataStoreContext,\n} from \"./dataStoreContext\";\nimport { StorageServiceWithAttachBlobs } from \"./storageServiceWithAttachBlobs\";\nimport { GCNodeType, detectOutboundRoutesViaDDSKey } from \"./gc\";\nimport { IDataStoreAliasMessage, isDataStoreAliasMessage } from \"./dataStore\";\nimport { IContainerRuntimeMetadata, nonDataStorePaths, rootHasIsolatedChannels } from \"./summary\";\n\ntype PendingAliasResolve = (success: boolean) => void;\n\n/**\n * This class encapsulates data store handling. Currently it is only used by the container runtime,\n * but eventually could be hosted on any channel once we formalize the channel api boundary.\n */\nexport class DataStores implements IDisposable {\n\t// Stores tracked by the Domain\n\tprivate readonly pendingAttach = new Map<string, IAttachMessage>();\n\t// 0.24 back-compat attachingBeforeSummary\n\tpublic readonly attachOpFiredForDataStore = new Set<string>();\n\n\tprivate readonly mc: MonitoringContext;\n\n\tprivate readonly disposeOnce = new Lazy<void>(() => this.contexts.dispose());\n\n\tpublic readonly containerLoadStats: {\n\t\t// number of dataStores during loadContainer\n\t\treadonly containerLoadDataStoreCount: number;\n\t\t// number of unreferenced dataStores during loadContainer\n\t\treadonly referencedDataStoreCount: number;\n\t};\n\n\t// Stores the ids of new data stores between two GC runs. This is used to notify the garbage collector of new\n\t// root data stores that are added.\n\tprivate dataStoresSinceLastGC: string[] = [];\n\t// The handle to the container runtime. This is used mainly for GC purposes to represent outbound reference from\n\t// the container runtime to other nodes.\n\tprivate readonly containerRuntimeHandle: IFluidHandle;\n\tprivate readonly pendingAliasMap: Map<string, Promise<AliasResult>> = new Map<\n\t\tstring,\n\t\tPromise<AliasResult>\n\t>();\n\n\tconstructor(\n\t\tprivate readonly baseSnapshot: ISnapshotTree | undefined,\n\t\tprivate readonly runtime: ContainerRuntime,\n\t\tprivate readonly submitAttachFn: (attachContent: IAttachMessage) => void,\n\t\tprivate readonly getCreateChildSummarizerNodeFn: (\n\t\t\tid: string,\n\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t) => CreateChildSummarizerNodeFn,\n\t\tprivate readonly deleteChildSummarizerNodeFn: (id: string) => void,\n\t\tbaseLogger: ITelemetryBaseLogger,\n\t\tprivate readonly gcNodeUpdated: (\n\t\t\tnodePath: string,\n\t\t\ttimestampMs: number,\n\t\t\tpackagePath?: readonly string[],\n\t\t) => void,\n\t\tprivate readonly isDataStoreDeleted: (nodePath: string) => boolean,\n\t\tprivate readonly aliasMap: Map<string, string>,\n\t\tprivate readonly contexts: DataStoreContexts = new DataStoreContexts(baseLogger),\n\t) {\n\t\tthis.mc = createChildMonitoringContext({ logger: baseLogger });\n\t\tthis.containerRuntimeHandle = new FluidObjectHandle(\n\t\t\tthis.runtime,\n\t\t\t\"/\",\n\t\t\tthis.runtime.IFluidHandleContext,\n\t\t);\n\n\t\t// Extract stores stored inside the snapshot\n\t\tconst fluidDataStores = new Map<string, ISnapshotTree>();\n\t\tif (baseSnapshot) {\n\t\t\tfor (const [key, value] of Object.entries(baseSnapshot.trees)) {\n\t\t\t\tfluidDataStores.set(key, value);\n\t\t\t}\n\t\t}\n\n\t\tlet unreferencedDataStoreCount = 0;\n\t\t// Create a context for each of them\n\t\tfor (const [key, value] of fluidDataStores) {\n\t\t\tlet dataStoreContext: FluidDataStoreContext;\n\n\t\t\t// counting number of unreferenced data stores\n\t\t\tif (value.unreferenced) {\n\t\t\t\tunreferencedDataStoreCount++;\n\t\t\t}\n\t\t\t// If we have a detached container, then create local data store contexts.\n\t\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\t\tdataStoreContext = new RemoteFluidDataStoreContext({\n\t\t\t\t\tid: key,\n\t\t\t\t\tsnapshotTree: value,\n\t\t\t\t\truntime: this.runtime,\n\t\t\t\t\tstorage: this.runtime.storage,\n\t\t\t\t\tscope: this.runtime.scope,\n\t\t\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {\n\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (typeof value !== \"object\") {\n\t\t\t\t\tthrow new LoggingError(\"Snapshot should be there to load from!!\");\n\t\t\t\t}\n\t\t\t\tconst snapshotTree = value;\n\t\t\t\tdataStoreContext = new LocalFluidDataStoreContext({\n\t\t\t\t\tid: key,\n\t\t\t\t\tpkg: undefined,\n\t\t\t\t\truntime: this.runtime,\n\t\t\t\t\tstorage: this.runtime.storage,\n\t\t\t\t\tscope: this.runtime.scope,\n\t\t\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {\n\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t}),\n\t\t\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(key),\n\t\t\t\t\tsnapshotTree,\n\t\t\t\t\tisRootDataStore: undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.contexts.addBoundOrRemoted(dataStoreContext);\n\t\t}\n\t\tthis.containerLoadStats = {\n\t\t\tcontainerLoadDataStoreCount: fluidDataStores.size,\n\t\t\treferencedDataStoreCount: fluidDataStores.size - unreferencedDataStoreCount,\n\t\t};\n\t}\n\n\tpublic get aliases(): ReadonlyMap<string, string> {\n\t\treturn this.aliasMap;\n\t}\n\n\tpublic get pendingAliases(): Map<string, Promise<AliasResult>> {\n\t\treturn this.pendingAliasMap;\n\t}\n\n\tpublic async waitIfPendingAlias(maybeAlias: string): Promise<AliasResult> {\n\t\tconst pendingAliasPromise = this.pendingAliases.get(maybeAlias);\n\t\treturn pendingAliasPromise ?? \"Success\";\n\t}\n\n\tpublic processAttachMessage(message: ISequencedDocumentMessage, local: boolean) {\n\t\tconst attachMessage = message.contents as InboundAttachMessage;\n\n\t\tthis.dataStoresSinceLastGC.push(attachMessage.id);\n\n\t\t// The local object has already been attached\n\t\tif (local) {\n\t\t\tassert(\n\t\t\t\tthis.pendingAttach.has(attachMessage.id),\n\t\t\t\t0x15e /* \"Local object does not have matching attach message id\" */,\n\t\t\t);\n\t\t\tthis.contexts.get(attachMessage.id)?.emit(\"attached\");\n\t\t\tthis.pendingAttach.delete(attachMessage.id);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a non-local operation then go and create the object, otherwise mark it as officially attached.\n\t\tif (this.alreadyProcessed(attachMessage.id)) {\n\t\t\t// TODO: dataStoreId may require a different tag from PackageData #7488\n\t\t\tconst error = new DataCorruptionError(\n\t\t\t\t// pre-0.58 error message: duplicateDataStoreCreatedWithExistingId\n\t\t\t\t\"Duplicate DataStore created with existing id\",\n\t\t\t\t{\n\t\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t\t\t...tagCodeArtifacts({ dataStoreId: attachMessage.id }),\n\t\t\t\t},\n\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst flatAttachBlobs = new Map<string, ArrayBufferLike>();\n\t\tlet snapshotTree: ISnapshotTree | undefined;\n\t\tif (attachMessage.snapshot) {\n\t\t\tsnapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatAttachBlobs);\n\t\t}\n\n\t\t// Include the type of attach message which is the pkg of the store to be\n\t\t// used by RemoteFluidDataStoreContext in case it is not in the snapshot.\n\t\tconst pkg = [attachMessage.type];\n\t\tconst remoteFluidDataStoreContext = new RemoteFluidDataStoreContext({\n\t\t\tid: attachMessage.id,\n\t\t\tsnapshotTree,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: new StorageServiceWithAttachBlobs(this.runtime.storage, flatAttachBlobs),\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(attachMessage.id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.FromAttach,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\tsnapshot: attachMessage.snapshot ?? {\n\t\t\t\t\tentries: [createAttributesBlob(pkg, true /* isRootDataStore */)],\n\t\t\t\t},\n\t\t\t}),\n\t\t\tpkg,\n\t\t});\n\n\t\tthis.contexts.addBoundOrRemoted(remoteFluidDataStoreContext);\n\t}\n\n\tpublic processAliasMessage(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocalOpMetadata: unknown,\n\t\tlocal: boolean,\n\t): void {\n\t\tconst aliasMessage = message.contents as IDataStoreAliasMessage;\n\t\tif (!isDataStoreAliasMessage(aliasMessage)) {\n\t\t\tthrow new DataCorruptionError(\"malformedDataStoreAliasMessage\", {\n\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t});\n\t\t}\n\n\t\tconst resolve = localOpMetadata as PendingAliasResolve;\n\t\tconst aliasResult = this.processAliasMessageCore(aliasMessage);\n\t\tif (local) {\n\t\t\tresolve(aliasResult);\n\t\t}\n\t}\n\n\tpublic processAliasMessageCore(aliasMessage: IDataStoreAliasMessage): boolean {\n\t\tif (this.alreadyProcessed(aliasMessage.alias)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst context = this.contexts.get(aliasMessage.internalId);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted a signal.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\taliasMessage.internalId,\n\t\t\t\tcontext,\n\t\t\t\t\"Changed\",\n\t\t\t\t\"processAliasMessageCore\",\n\t\t\t)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (context === undefined) {\n\t\t\tthis.mc.logger.sendErrorEvent({\n\t\t\t\teventName: \"AliasFluidDataStoreNotFound\",\n\t\t\t\tfluidDataStoreId: aliasMessage.internalId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\tconst handle = new FluidObjectHandle(\n\t\t\tcontext,\n\t\t\taliasMessage.internalId,\n\t\t\tthis.runtime.IFluidHandleContext,\n\t\t);\n\t\tthis.runtime.addedGCOutboundReference(this.containerRuntimeHandle, handle);\n\n\t\tthis.aliasMap.set(aliasMessage.alias, context.id);\n\t\tcontext.setInMemoryRoot();\n\t\treturn true;\n\t}\n\n\tprivate alreadyProcessed(id: string): boolean {\n\t\treturn this.aliasMap.get(id) !== undefined || this.contexts.get(id) !== undefined;\n\t}\n\n\t/**\n\t * Make the data stores locally visible in the container graph by moving the data store context from unbound to\n\t * bound list. This data store can now be reached from the root.\n\t * @param id - The id of the data store context to make visible.\n\t */\n\tprivate makeDataStoreLocallyVisible(id: string): void {\n\t\tconst localContext = this.contexts.getUnbound(id);\n\t\tassert(!!localContext, 0x15f /* \"Could not find unbound context to bind\" */);\n\n\t\t/**\n\t\t * If the container is not detached, it is globally visible to all clients. This data store should also be\n\t\t * globally visible. Move it to attaching state and send an \"attach\" op for it.\n\t\t * If the container is detached, this data store will be part of the summary that makes the container attached.\n\t\t */\n\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\tlocalContext.emit(\"attaching\");\n\t\t\tconst message = localContext.generateAttachMessage();\n\n\t\t\tthis.pendingAttach.set(id, message);\n\t\t\tthis.submitAttachFn(message);\n\t\t\tthis.attachOpFiredForDataStore.add(id);\n\t\t}\n\n\t\tthis.contexts.bind(id);\n\t}\n\n\tpublic createDetachedDataStoreCore(\n\t\tpkg: Readonly<string[]>,\n\t\tisRoot: boolean,\n\t\tid = uuid(),\n\t): IFluidDataStoreContextDetached {\n\t\tassert(!id.includes(\"/\"), 0x30c /* Id cannot contain slashes */);\n\n\t\tconst context = new LocalDetachedFluidDataStoreContext({\n\t\t\tid,\n\t\t\tpkg,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: this.runtime.storage,\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t}),\n\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),\n\t\t\tsnapshotTree: undefined,\n\t\t\tisRootDataStore: isRoot,\n\t\t});\n\t\tthis.contexts.addUnbound(context);\n\t\treturn context;\n\t}\n\n\tpublic _createFluidDataStoreContext(pkg: string[], id: string, props?: any) {\n\t\tassert(!id.includes(\"/\"), 0x30d /* Id cannot contain slashes */);\n\t\tconst context = new LocalFluidDataStoreContext({\n\t\t\tid,\n\t\t\tpkg,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: this.runtime.storage,\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t}),\n\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),\n\t\t\tsnapshotTree: undefined,\n\t\t\tisRootDataStore: false,\n\t\t\tcreateProps: props,\n\t\t});\n\t\tthis.contexts.addUnbound(context);\n\t\treturn context;\n\t}\n\n\tpublic get disposed() {\n\t\treturn this.disposeOnce.evaluated;\n\t}\n\tpublic readonly dispose = () => this.disposeOnce.value;\n\n\tpublic resubmitDataStoreOp(envelope: IEnvelope, localOpMetadata: unknown) {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and throw an error. If there are local changes for a\n\t\t// deleted data store, it can otherwise lead to inconsistent state when compared to other clients.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"resubmitDataStoreOp\")\n\t\t) {\n\t\t\tthrow new DataCorruptionError(\"Context is deleted!\", {\n\t\t\t\tcallSite: \"resubmitDataStoreOp\",\n\t\t\t\t...tagCodeArtifacts({ id: envelope.address }),\n\t\t\t});\n\t\t}\n\t\tassert(!!context, 0x160 /* \"There should be a store context for the op\" */);\n\t\tcontext.reSubmit(envelope.contents, localOpMetadata);\n\t}\n\n\tpublic rollbackDataStoreOp(envelope: IEnvelope, localOpMetadata: unknown) {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and throw an error. If there are local changes for a\n\t\t// deleted data store, it can otherwise lead to inconsistent state when compared to other clients.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"rollbackDataStoreOp\")\n\t\t) {\n\t\t\tthrow new DataCorruptionError(\"Context is deleted!\", {\n\t\t\t\tcallSite: \"rollbackDataStoreOp\",\n\t\t\t\t...tagCodeArtifacts({ id: envelope.address }),\n\t\t\t});\n\t\t}\n\t\tassert(!!context, 0x2e8 /* \"There should be a store context for the op\" */);\n\t\tcontext.rollback(envelope.contents, localOpMetadata);\n\t}\n\n\tpublic async applyStashedOp(envelope: IEnvelope): Promise<unknown> {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case the data store that stashed the op is deleted.\n\t\tif (this.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"applyStashedOp\")) {\n\t\t\treturn undefined;\n\t\t}\n\t\tassert(!!context, 0x161 /* \"There should be a store context for the op\" */);\n\t\treturn context.applyStashedOp(envelope.contents);\n\t}\n\n\tpublic async applyStashedAttachOp(message: IAttachMessage) {\n\t\tthis.pendingAttach.set(message.id, message);\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tthis.processAttachMessage({ contents: message } as ISequencedDocumentMessage, false);\n\t}\n\n\tpublic processFluidDataStoreOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalMessageMetadata: unknown,\n\t\taddedOutboundReference: (fromNodePath: string, toNodePath: string) => void,\n\t) {\n\t\tconst envelope = message.contents as IEnvelope;\n\t\tconst transformed = { ...message, contents: envelope.contents };\n\t\tconst context = this.contexts.get(envelope.address);\n\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted an op.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tenvelope.address,\n\t\t\t\tcontext,\n\t\t\t\t\"Changed\",\n\t\t\t\t\"processFluidDataStoreOp\",\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (context === undefined) {\n\t\t\t// Former assert 0x162\n\t\t\tthrow DataProcessingError.create(\n\t\t\t\t\"No context for op\",\n\t\t\t\t\"processFluidDataStoreOp\",\n\t\t\t\tmessage,\n\t\t\t\t{\n\t\t\t\t\tlocal,\n\t\t\t\t\tmessageDetails: JSON.stringify({\n\t\t\t\t\t\ttype: message.type,\n\t\t\t\t\t\tcontentType: typeof message.contents,\n\t\t\t\t\t}),\n\t\t\t\t\t...tagCodeArtifacts({ address: envelope.address }),\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tcontext.process(transformed, local, localMessageMetadata);\n\n\t\t// By default, we use the new behavior of detecting outbound routes here.\n\t\t// If this setting is true, then DataStoreContext would be notifying GC instead.\n\t\tif (this.mc.config.getBoolean(detectOutboundRoutesViaDDSKey) !== true) {\n\t\t\t// Notify GC of any outbound references that were added by this op.\n\t\t\tdetectOutboundReferences(envelope, addedOutboundReference);\n\t\t}\n\n\t\t// Notify that a GC node for the data store changed. This is used to detect if a deleted data store is\n\t\t// being used.\n\t\tthis.gcNodeUpdated(\n\t\t\t`/${envelope.address}`,\n\t\t\tmessage.timestamp,\n\t\t\tcontext.isLoaded ? context.packagePath : undefined,\n\t\t);\n\t}\n\n\tpublic async getDataStore(\n\t\tid: string,\n\t\trequestHeaderData: RuntimeHeaderData,\n\t): Promise<FluidDataStoreContext> {\n\t\tconst headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tid,\n\t\t\t\tthis.contexts.get(id),\n\t\t\t\t\"Requested\",\n\t\t\t\t\"getDataStore\",\n\t\t\t\trequestHeaderData,\n\t\t\t)\n\t\t) {\n\t\t\t// The requested data store has been deleted by gc. Create a 404 response exception.\n\t\t\tconst request: IRequest = { url: id };\n\t\t\tthrow responseToException(\n\t\t\t\tcreateResponseError(404, \"DataStore was deleted\", request),\n\t\t\t\trequest,\n\t\t\t);\n\t\t}\n\n\t\tconst context = await this.contexts.getBoundOrRemoted(id, headerData.wait);\n\t\tif (context === undefined) {\n\t\t\t// The requested data store does not exits. Throw a 404 response exception.\n\t\t\tconst request: IRequest = { url: id };\n\t\t\tthrow responseToException(create404Response(request), request);\n\t\t}\n\t\treturn context;\n\t}\n\n\t/**\n\t * Returns the data store requested with the given id if available. Otherwise, returns undefined.\n\t */\n\tpublic async getDataStoreIfAvailable(\n\t\tid: string,\n\t\trequestHeaderData: RuntimeHeaderData,\n\t): Promise<FluidDataStoreContext | undefined> {\n\t\t// If the data store has been deleted, log an error and return undefined.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tid,\n\t\t\t\tthis.contexts.get(id),\n\t\t\t\t\"Requested\",\n\t\t\t\t\"getDataStoreIfAvailable\",\n\t\t\t\trequestHeaderData,\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };\n\t\tconst context = await this.contexts.getBoundOrRemoted(id, headerData.wait);\n\t\tif (context === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn context;\n\t}\n\n\t/**\n\t * Checks if the data store has been deleted by GC. If so, log an error.\n\t * @param id - The data store's id.\n\t * @param context - The data store context.\n\t * @param callSite - The function name this is called from.\n\t * @param requestHeaderData - The request header information to log if the data store is deleted.\n\t * @returns true if the data store is deleted. Otherwise, returns false.\n\t */\n\tprivate checkAndLogIfDeleted(\n\t\tid: string,\n\t\tcontext: FluidDataStoreContext | undefined,\n\t\tdeletedLogSuffix: string,\n\t\tcallSite: string,\n\t\trequestHeaderData?: RuntimeHeaderData,\n\t) {\n\t\tconst dataStoreNodePath = `/${id}`;\n\t\tif (!this.isDataStoreDeleted(dataStoreNodePath)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.mc.logger.sendErrorEvent({\n\t\t\teventName: `GC_Deleted_DataStore_${deletedLogSuffix}`,\n\t\t\t...tagCodeArtifacts({ id }),\n\t\t\tcallSite,\n\t\t\theaders: JSON.stringify(requestHeaderData),\n\t\t\texists: context !== undefined,\n\t\t});\n\t\treturn true;\n\t}\n\n\tpublic processSignal(fluidDataStoreId: string, message: IInboundSignalMessage, local: boolean) {\n\t\tconst context = this.contexts.get(fluidDataStoreId);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted a signal.\n\t\tif (this.checkAndLogIfDeleted(fluidDataStoreId, context, \"Changed\", \"processSignal\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!context) {\n\t\t\t// Attach message may not have been processed yet\n\t\t\tassert(!local, 0x163 /* \"Missing datastore for local signal\" */);\n\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"SignalFluidDataStoreNotFound\",\n\t\t\t\t...tagCodeArtifacts({\n\t\t\t\t\tfluidDataStoreId,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.processSignal(message, local);\n\t}\n\n\tpublic setConnectionState(connected: boolean, clientId?: string) {\n\t\tfor (const [fluidDataStoreId, context] of this.contexts) {\n\t\t\ttry {\n\t\t\t\tcontext.setConnectionState(connected, clientId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"SetConnectionStateError\",\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t...tagCodeArtifacts({\n\t\t\t\t\t\t\tfluidDataStoreId,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t\truntimeConnected: this.runtime.connected,\n\t\t\t\t\t\t\tconnected,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {\n\t\tconst eventName = attachState === AttachState.Attaching ? \"attaching\" : \"attached\";\n\t\tfor (const [, context] of this.contexts) {\n\t\t\t// Fire only for bounded stores.\n\t\t\tif (!this.contexts.isNotBound(context.id)) {\n\t\t\t\tcontext.emit(eventName);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic get size(): number {\n\t\treturn this.contexts.size;\n\t}\n\n\tpublic async summarize(\n\t\tfullTree: boolean,\n\t\ttrackState: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Iterate over each store and ask it to snapshot\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([_, context]) => {\n\t\t\t\t\t// Summarizer works only with clients with no local changes. A data store in attaching\n\t\t\t\t\t// state indicates an op was sent to attach a local data store, and the the attach op\n\t\t\t\t\t// had not yet round tripped back to the client.\n\t\t\t\t\tif (context.attachState === AttachState.Attaching) {\n\t\t\t\t\t\t// Formerly assert 0x588\n\t\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t\t\"Local data store detected in attaching state during summarize\",\n\t\t\t\t\t\t\t\"summarize\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\treturn context.attachState === AttachState.Attached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextSummary = await context.summarize(\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t\ttrackState,\n\t\t\t\t\t\ttelemetryContext,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryBuilder.addWithStats(contextId, contextSummary);\n\t\t\t\t}),\n\t\t);\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\tpublic createSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\t// Attaching graph of some stores can cause other stores to get bound too.\n\t\t// So keep taking summary until no new stores get bound.\n\t\tlet notBoundContextsLength: number;\n\t\tdo {\n\t\t\tconst builderTree = builder.summary.tree;\n\t\t\tnotBoundContextsLength = this.contexts.notBoundLength();\n\t\t\t// Iterate over each data store and ask it to snapshot\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(\n\t\t\t\t\t([key, _]) =>\n\t\t\t\t\t\t// Take summary of bounded data stores only, make sure we haven't summarized them already\n\t\t\t\t\t\t// and no attach op has been fired for that data store because for loader versions <= 0.24\n\t\t\t\t\t\t// we set attach state as \"attaching\" before taking createNew summary.\n\t\t\t\t\t\t!(\n\t\t\t\t\t\t\tthis.contexts.isNotBound(key) ||\n\t\t\t\t\t\t\tbuilderTree[key] ||\n\t\t\t\t\t\t\tthis.attachOpFiredForDataStore.has(key)\n\t\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\tlet dataStoreSummary: ISummarizeResult;\n\t\t\t\t\tif (value.isLoaded) {\n\t\t\t\t\t\tconst snapshot = value.generateAttachMessage().snapshot;\n\t\t\t\t\t\tdataStoreSummary = convertToSummaryTree(snapshot, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If this data store is not yet loaded, then there should be no changes in the snapshot from\n\t\t\t\t\t\t// which it was created as it is detached container. So just use the previous snapshot.\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t!!this.baseSnapshot,\n\t\t\t\t\t\t\t0x166 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdataStoreSummary = convertSnapshotTreeToSummaryTree(\n\t\t\t\t\t\t\tthis.baseSnapshot.trees[key],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbuilder.addWithStats(key, dataStoreSummary);\n\t\t\t\t});\n\t\t} while (notBoundContextsLength !== this.contexts.notBoundLength());\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\t/**\n\t * Before GC runs, called by the garbage collector to update any pending GC state.\n\t * The garbage collector needs to know all outbound references that are added. Since root data stores are not\n\t * explicitly marked as referenced, notify GC of new root data stores that were added since the last GC run.\n\t */\n\tpublic async updateStateBeforeGC(): Promise<void> {\n\t\tfor (const id of this.dataStoresSinceLastGC) {\n\t\t\tconst context = this.contexts.get(id);\n\t\t\tassert(context !== undefined, 0x2b6 /* Missing data store context */);\n\t\t\tif (await context.isRoot()) {\n\t\t\t\t// A root data store is basically a reference from the container runtime to the data store.\n\t\t\t\tconst handle = new FluidObjectHandle(context, id, this.runtime.IFluidHandleContext);\n\t\t\t\tthis.runtime.addedGCOutboundReference(this.containerRuntimeHandle, handle);\n\t\t\t}\n\t\t}\n\t\tthis.dataStoresSinceLastGC = [];\n\t}\n\n\t/**\n\t * Generates data used for garbage collection. It does the following:\n\t *\n\t * 1. Calls into each child data store context to get its GC data.\n\t *\n\t * 2. Prefixes the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n\t * identified as belonging to the child.\n\t *\n\t * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n\t * the GC data of this channel.\n\t *\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tpublic async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n\t\tconst builder = new GCDataBuilder();\n\t\t// Iterate over each store and get their GC data.\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([_, context]) => {\n\t\t\t\t\t// Summarizer client and hence GC works only with clients with no local changes. A data store in\n\t\t\t\t\t// attaching state indicates an op was sent to attach a local data store, and the the attach op\n\t\t\t\t\t// had not yet round tripped back to the client.\n\t\t\t\t\t// Formerly assert 0x589\n\t\t\t\t\tif (context.attachState === AttachState.Attaching) {\n\t\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t\t\"Local data store detected in attaching state while running GC\",\n\t\t\t\t\t\t\t\"getGCData\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn context.attachState === AttachState.Attached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextGCData = await context.getGCData(fullGC);\n\t\t\t\t\t// Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n\t\t\t\t\t// This also gradually builds the id of each node to be a path from the root.\n\t\t\t\t\tbuilder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n\t\t\t\t}),\n\t\t);\n\n\t\t// Get the outbound routes and add a GC node for this channel.\n\t\tbuilder.addNode(\"/\", await this.getOutboundRoutes());\n\t\treturn builder.getGCData();\n\t}\n\n\t/**\n\t * After GC has run, called to notify this Container's data stores of routes that are used in it.\n\t * @param usedRoutes - The routes that are used in all data stores in this Container.\n\t */\n\tpublic updateUsedRoutes(usedRoutes: readonly string[]) {\n\t\t// Get a map of data store ids to routes used in it.\n\t\tconst usedDataStoreRoutes = unpackChildNodesUsedRoutes(usedRoutes);\n\n\t\t// Verify that the used routes are correct.\n\t\tfor (const [id] of usedDataStoreRoutes) {\n\t\t\tassert(\n\t\t\t\tthis.contexts.has(id),\n\t\t\t\t0x167 /* \"Used route does not belong to any known data store\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Update the used routes in each data store. Used routes is empty for unused data stores.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.updateUsedRoutes(usedDataStoreRoutes.get(contextId) ?? []);\n\t\t}\n\t}\n\n\t/**\n\t * This is called to update objects whose routes are unused. The unused objects are deleted.\n\t * @param unusedRoutes - The routes that are unused in all data stores in this Container.\n\t */\n\tpublic updateUnusedRoutes(unusedRoutes: readonly string[]) {\n\t\tfor (const route of unusedRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\t// Delete data store only if its route (/datastoreId) is in unusedRoutes. We don't want to delete a data\n\t\t\t// store based on its DDS being unused.\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst dataStoreId = pathParts[1];\n\t\t\tassert(this.contexts.has(dataStoreId), 0x2d7 /* No data store with specified id */);\n\t\t\t// Delete the contexts of unused data stores.\n\t\t\tthis.contexts.delete(dataStoreId);\n\t\t\t// Delete the summarizer node of the unused data stores.\n\t\t\tthis.deleteChildSummarizerNodeFn(dataStoreId);\n\t\t}\n\t}\n\n\t/**\n\t * Delete data stores and its objects that are sweep ready.\n\t * @param sweepReadyDataStoreRoutes - The routes of data stores and its objects that are sweep ready and should\n\t * be deleted.\n\t * @returns The routes of data stores and its objects that were deleted.\n\t */\n\tpublic deleteSweepReadyNodes(sweepReadyDataStoreRoutes: readonly string[]): readonly string[] {\n\t\tfor (const route of sweepReadyDataStoreRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\tconst dataStoreId = pathParts[1];\n\n\t\t\t// Ignore sub-data store routes because a data store and its sub-routes are deleted together, so, we only\n\t\t\t// need to delete the data store.\n\t\t\t// These routes will still be returned below as among the deleted routes\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst dataStoreContext = this.contexts.get(dataStoreId);\n\t\t\tif (dataStoreContext === undefined) {\n\t\t\t\t// If the data store hasn't already been deleted, log an error because this should never happen.\n\t\t\t\t// If the data store has already been deleted, log a telemetry event. This can happen because multiple GC\n\t\t\t\t// sweep ops can contain the same data store. It would be interesting to track how often this happens.\n\t\t\t\tconst alreadyDeleted = this.isDataStoreDeleted(`/${dataStoreId}`);\n\t\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\t\teventName: \"DeletedDataStoreNotFound\",\n\t\t\t\t\tcategory: alreadyDeleted ? \"generic\" : \"error\",\n\t\t\t\t\t...tagCodeArtifacts({ id: dataStoreId }),\n\t\t\t\t\tdetails: { alreadyDeleted },\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdataStoreContext.delete();\n\n\t\t\t// Delete the contexts of sweep ready data stores.\n\t\t\tthis.contexts.delete(dataStoreId);\n\t\t\t// Delete the summarizer node of the sweep ready data stores.\n\t\t\tthis.deleteChildSummarizerNodeFn(dataStoreId);\n\t\t}\n\t\treturn Array.from(sweepReadyDataStoreRoutes);\n\t}\n\n\t/**\n\t * This is called to update objects whose routes are tombstones.\n\t *\n\t * A Tombstoned object has been unreferenced long enough that GC knows it won't be referenced again.\n\t * Tombstoned objects are eventually deleted by GC.\n\t *\n\t * @param tombstonedRoutes - The routes that are tombstones in all data stores in this Container.\n\t */\n\tpublic updateTombstonedRoutes(tombstonedRoutes: readonly string[]) {\n\t\tconst tombstonedDataStoresSet: Set<string> = new Set();\n\t\tfor (const route of tombstonedRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\t// Tombstone data store only if its route (/datastoreId) is directly in tombstoneRoutes.\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst dataStoreId = pathParts[1];\n\t\t\tassert(this.contexts.has(dataStoreId), 0x510 /* No data store with specified id */);\n\t\t\ttombstonedDataStoresSet.add(dataStoreId);\n\t\t}\n\n\t\t// Update the used routes in each data store. Used routes is empty for unused data stores.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.setTombstone(tombstonedDataStoresSet.has(contextId));\n\t\t}\n\t}\n\n\t/**\n\t * Returns the outbound routes of this channel. Only root data stores are considered referenced and their paths are\n\t * part of outbound routes.\n\t */\n\tprivate async getOutboundRoutes(): Promise<string[]> {\n\t\tconst outboundRoutes: string[] = [];\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tconst isRootDataStore = await context.isRoot();\n\t\t\tif (isRootDataStore) {\n\t\t\t\toutboundRoutes.push(`/${contextId}`);\n\t\t\t}\n\t\t}\n\t\treturn outboundRoutes;\n\t}\n\n\t/**\n\t * Called by GC to retrieve the package path of a data store node with the given path.\n\t */\n\tpublic async getDataStorePackagePath(nodePath: string): Promise<readonly string[] | undefined> {\n\t\t// If the node belongs to a data store, return its package path. For DDSes, we return the package path of the\n\t\t// data store that contains it.\n\t\tconst context = this.contexts.get(nodePath.split(\"/\")[1]);\n\t\treturn (await context?.getInitialSnapshotDetails())?.pkg;\n\t}\n\n\t/**\n\t * Called by GC to determine if a node is for a data store or for an object within a data store (for e.g. DDS).\n\t * @returns the GC node type if the node belongs to a data store or object within data store, undefined otherwise.\n\t */\n\tpublic getGCNodeType(nodePath: string): GCNodeType | undefined {\n\t\tconst pathParts = nodePath.split(\"/\");\n\t\tif (!this.contexts.has(pathParts[1])) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Data stores paths are of the format \"/dataStoreId\".\n\t\t// Sub data store paths are of the format \"/dataStoreId/subPath/...\".\n\t\tif (pathParts.length === 2) {\n\t\t\treturn GCNodeType.DataStore;\n\t\t}\n\t\treturn GCNodeType.SubDataStore;\n\t}\n}\n\nexport function getSummaryForDatastores(\n\tsnapshot: ISnapshotTree | undefined,\n\tmetadata?: IContainerRuntimeMetadata,\n): ISnapshotTree | undefined {\n\tif (!snapshot) {\n\t\treturn undefined;\n\t}\n\n\tif (rootHasIsolatedChannels(metadata)) {\n\t\tconst datastoresSnapshot = snapshot.trees[channelsTreeName];\n\t\tassert(!!datastoresSnapshot, 0x168 /* Expected tree in snapshot not found */);\n\t\treturn datastoresSnapshot;\n\t} else {\n\t\t// back-compat: strip out all non-datastore paths before giving to DataStores object.\n\t\tconst datastoresTrees: ISnapshotTree[\"trees\"] = {};\n\t\tfor (const [key, value] of Object.entries(snapshot.trees)) {\n\t\t\tif (!nonDataStorePaths.includes(key)) {\n\t\t\t\tdatastoresTrees[key] = value;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\t...snapshot,\n\t\t\ttrees: datastoresTrees,\n\t\t};\n\t}\n}\n\n/**\n * Traverse this op's contents and detect any outbound routes that were added by this op.\n */\nexport function detectOutboundReferences(\n\tenvelope: IEnvelope,\n\taddedOutboundReference: (fromNodePath: string, toNodePath: string) => void,\n): void {\n\t// These will be built up as we traverse the envelope contents\n\tconst outboundPaths: string[] = [];\n\tlet ddsAddress: string | undefined;\n\n\tfunction recursivelyFindHandles(obj: unknown) {\n\t\tif (typeof obj === \"object\" && obj !== null) {\n\t\t\tfor (const [key, value] of Object.entries(obj)) {\n\t\t\t\t// If 'value' is a serialized IFluidHandle, it represents a new outbound route.\n\t\t\t\tif (isSerializedHandle(value)) {\n\t\t\t\t\toutboundPaths.push(value.url);\n\t\t\t\t}\n\n\t\t\t\t// NOTE: This is taking a hard dependency on the fact that in our DataStore implementation,\n\t\t\t\t// the address of the DDS is stored in a property called \"address\". This is not ideal.\n\t\t\t\t// An alternative would be for the op envelope to include the absolute path (built up as it is submitted)\n\t\t\t\tif (key === \"address\" && ddsAddress === undefined) {\n\t\t\t\t\tddsAddress = value;\n\t\t\t\t}\n\n\t\t\t\trecursivelyFindHandles(value);\n\t\t\t}\n\t\t}\n\t}\n\n\trecursivelyFindHandles(envelope.contents);\n\n\t// GC node paths are all absolute paths, hence the \"\" prefix.\n\t// e.g. this will yield \"/dataStoreId/ddsId\"\n\tconst fromPath = [\"\", envelope.address, ddsAddress].join(\"/\");\n\toutboundPaths.forEach((toPath) => addedOutboundReference(fromPath, toPath));\n}\n"]}
1
+ {"version":3,"file":"dataStores.js","sourceRoot":"","sources":["../src/dataStores.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tITelemetryBaseLogger,\n\tIDisposable,\n\tIFluidHandle,\n\tIRequest,\n} from \"@fluidframework/core-interfaces\";\nimport { FluidObjectHandle } from \"@fluidframework/datastore\";\nimport { ISequencedDocumentMessage, ISnapshotTree } from \"@fluidframework/protocol-definitions\";\nimport {\n\tAliasResult,\n\tchannelsTreeName,\n\tCreateChildSummarizerNodeFn,\n\tCreateChildSummarizerNodeParam,\n\tCreateSummarizerNodeSource,\n\tgcDataBlobKey,\n\tIAttachMessage,\n\tIEnvelope,\n\tIFluidDataStoreContextDetached,\n\tIGarbageCollectionData,\n\tIInboundSignalMessage,\n\tInboundAttachMessage,\n\tISummarizeResult,\n\tISummaryTreeWithStats,\n\tITelemetryContext,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n\taddBlobToSummary,\n\tconvertSnapshotTreeToSummaryTree,\n\tconvertSummaryTreeToITree,\n\tcreate404Response,\n\tcreateResponseError,\n\tGCDataBuilder,\n\tisSerializedHandle,\n\tprocessAttachMessageGCData,\n\tresponseToException,\n\tSummaryTreeBuilder,\n\tunpackChildNodesUsedRoutes,\n} from \"@fluidframework/runtime-utils\";\nimport {\n\tcreateChildMonitoringContext,\n\tDataCorruptionError,\n\tDataProcessingError,\n\textractSafePropertiesFromMessage,\n\tLoggingError,\n\tMonitoringContext,\n\ttagCodeArtifacts,\n} from \"@fluidframework/telemetry-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport { assert, Lazy } from \"@fluidframework/core-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport { DataStoreContexts } from \"./dataStoreContexts\";\nimport { ContainerRuntime, defaultRuntimeHeaderData, RuntimeHeaderData } from \"./containerRuntime\";\nimport {\n\tFluidDataStoreContext,\n\tRemoteFluidDataStoreContext,\n\tLocalFluidDataStoreContext,\n\tcreateAttributesBlob,\n\tLocalDetachedFluidDataStoreContext,\n} from \"./dataStoreContext\";\nimport { StorageServiceWithAttachBlobs } from \"./storageServiceWithAttachBlobs\";\nimport { GCNodeType, detectOutboundRoutesViaDDSKey } from \"./gc\";\nimport { IDataStoreAliasMessage, isDataStoreAliasMessage } from \"./dataStore\";\nimport { IContainerRuntimeMetadata, nonDataStorePaths, rootHasIsolatedChannels } from \"./summary\";\n\ntype PendingAliasResolve = (success: boolean) => void;\n\n/**\n * This class encapsulates data store handling. Currently it is only used by the container runtime,\n * but eventually could be hosted on any channel once we formalize the channel api boundary.\n */\nexport class DataStores implements IDisposable {\n\t// Stores tracked by the Domain\n\tprivate readonly pendingAttach = new Map<string, IAttachMessage>();\n\t// 0.24 back-compat attachingBeforeSummary\n\tpublic readonly attachOpFiredForDataStore = new Set<string>();\n\n\tprivate readonly mc: MonitoringContext;\n\n\tprivate readonly disposeOnce = new Lazy<void>(() => this.contexts.dispose());\n\n\tpublic readonly containerLoadStats: {\n\t\t// number of dataStores during loadContainer\n\t\treadonly containerLoadDataStoreCount: number;\n\t\t// number of unreferenced dataStores during loadContainer\n\t\treadonly referencedDataStoreCount: number;\n\t};\n\n\t// Stores the ids of new data stores between two GC runs. This is used to notify the garbage collector of new\n\t// root data stores that are added.\n\tprivate dataStoresSinceLastGC: string[] = [];\n\t// The handle to the container runtime. This is used mainly for GC purposes to represent outbound reference from\n\t// the container runtime to other nodes.\n\tprivate readonly containerRuntimeHandle: IFluidHandle;\n\tprivate readonly pendingAliasMap: Map<string, Promise<AliasResult>> = new Map<\n\t\tstring,\n\t\tPromise<AliasResult>\n\t>();\n\n\tconstructor(\n\t\tprivate readonly baseSnapshot: ISnapshotTree | undefined,\n\t\tprivate readonly runtime: ContainerRuntime,\n\t\tprivate readonly submitAttachFn: (attachContent: IAttachMessage) => void,\n\t\tprivate readonly getCreateChildSummarizerNodeFn: (\n\t\t\tid: string,\n\t\t\tcreateParam: CreateChildSummarizerNodeParam,\n\t\t) => CreateChildSummarizerNodeFn,\n\t\tprivate readonly deleteChildSummarizerNodeFn: (id: string) => void,\n\t\tbaseLogger: ITelemetryBaseLogger,\n\t\tprivate readonly gcNodeUpdated: (\n\t\t\tnodePath: string,\n\t\t\ttimestampMs: number,\n\t\t\tpackagePath?: readonly string[],\n\t\t) => void,\n\t\tprivate readonly isDataStoreDeleted: (nodePath: string) => boolean,\n\t\tprivate readonly aliasMap: Map<string, string>,\n\t\tprivate readonly contexts: DataStoreContexts = new DataStoreContexts(baseLogger),\n\t) {\n\t\tthis.mc = createChildMonitoringContext({ logger: baseLogger });\n\t\tthis.containerRuntimeHandle = new FluidObjectHandle(\n\t\t\tthis.runtime,\n\t\t\t\"/\",\n\t\t\tthis.runtime.IFluidHandleContext,\n\t\t);\n\n\t\t// Extract stores stored inside the snapshot\n\t\tconst fluidDataStores = new Map<string, ISnapshotTree>();\n\t\tif (baseSnapshot) {\n\t\t\tfor (const [key, value] of Object.entries(baseSnapshot.trees)) {\n\t\t\t\tfluidDataStores.set(key, value);\n\t\t\t}\n\t\t}\n\n\t\tlet unreferencedDataStoreCount = 0;\n\t\t// Create a context for each of them\n\t\tfor (const [key, value] of fluidDataStores) {\n\t\t\tlet dataStoreContext: FluidDataStoreContext;\n\n\t\t\t// counting number of unreferenced data stores\n\t\t\tif (value.unreferenced) {\n\t\t\t\tunreferencedDataStoreCount++;\n\t\t\t}\n\t\t\t// If we have a detached container, then create local data store contexts.\n\t\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\t\tdataStoreContext = new RemoteFluidDataStoreContext({\n\t\t\t\t\tid: key,\n\t\t\t\t\tsnapshotTree: value,\n\t\t\t\t\truntime: this.runtime,\n\t\t\t\t\tstorage: this.runtime.storage,\n\t\t\t\t\tscope: this.runtime.scope,\n\t\t\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {\n\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (typeof value !== \"object\") {\n\t\t\t\t\tthrow new LoggingError(\"Snapshot should be there to load from!!\");\n\t\t\t\t}\n\t\t\t\tconst snapshotTree = value;\n\t\t\t\tdataStoreContext = new LocalFluidDataStoreContext({\n\t\t\t\t\tid: key,\n\t\t\t\t\tpkg: undefined,\n\t\t\t\t\truntime: this.runtime,\n\t\t\t\t\tstorage: this.runtime.storage,\n\t\t\t\t\tscope: this.runtime.scope,\n\t\t\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(key, {\n\t\t\t\t\t\ttype: CreateSummarizerNodeSource.FromSummary,\n\t\t\t\t\t}),\n\t\t\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(key),\n\t\t\t\t\tsnapshotTree,\n\t\t\t\t\tisRootDataStore: undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.contexts.addBoundOrRemoted(dataStoreContext);\n\t\t}\n\t\tthis.containerLoadStats = {\n\t\t\tcontainerLoadDataStoreCount: fluidDataStores.size,\n\t\t\treferencedDataStoreCount: fluidDataStores.size - unreferencedDataStoreCount,\n\t\t};\n\t}\n\n\tpublic get aliases(): ReadonlyMap<string, string> {\n\t\treturn this.aliasMap;\n\t}\n\n\tpublic get pendingAliases(): Map<string, Promise<AliasResult>> {\n\t\treturn this.pendingAliasMap;\n\t}\n\n\tpublic async waitIfPendingAlias(maybeAlias: string): Promise<AliasResult> {\n\t\tconst pendingAliasPromise = this.pendingAliases.get(maybeAlias);\n\t\treturn pendingAliasPromise ?? \"Success\";\n\t}\n\n\t/** For sampling. Only log once per container */\n\tprivate shouldSendAttachLog = true;\n\n\tpublic processAttachMessage(message: ISequencedDocumentMessage, local: boolean) {\n\t\tconst attachMessage = message.contents as InboundAttachMessage;\n\n\t\tthis.dataStoresSinceLastGC.push(attachMessage.id);\n\n\t\t// We need to process the GC Data for both local and remote attach messages\n\t\tconst foundGCData = processAttachMessageGCData(attachMessage.snapshot, (nodeId, toPath) => {\n\t\t\t// nodeId is the relative path under the node being attached. Always starts with \"/\", but no trailing \"/\" after an id\n\t\t\tconst fromPath = `/${attachMessage.id}${nodeId === \"/\" ? \"\" : nodeId}`;\n\t\t\tthis.runtime.addedGCOutboundReference(\n\t\t\t\t{ absolutePath: fromPath },\n\t\t\t\t{ absolutePath: toPath },\n\t\t\t);\n\t\t});\n\n\t\t// Only log once per container to avoid noise/cost.\n\t\t// Allows longitudinal tracking of various state (e.g. foundGCData), and some sampled details\n\t\tif (this.shouldSendAttachLog) {\n\t\t\tthis.shouldSendAttachLog = false;\n\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"dataStoreAttachMessage_sampled\",\n\t\t\t\t...tagCodeArtifacts({ id: attachMessage.id, pkg: attachMessage.type }),\n\t\t\t\tdetails: {\n\t\t\t\t\tlocal,\n\t\t\t\t\tsnapshot: !!attachMessage.snapshot,\n\t\t\t\t\tfoundGCData,\n\t\t\t\t},\n\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t});\n\t\t}\n\n\t\t// The local object has already been attached\n\t\tif (local) {\n\t\t\tassert(\n\t\t\t\tthis.pendingAttach.has(attachMessage.id),\n\t\t\t\t0x15e /* \"Local object does not have matching attach message id\" */,\n\t\t\t);\n\t\t\tthis.contexts.get(attachMessage.id)?.emit(\"attached\");\n\t\t\tthis.pendingAttach.delete(attachMessage.id);\n\t\t\treturn;\n\t\t}\n\n\t\t// If a non-local operation then go and create the object, otherwise mark it as officially attached.\n\t\tif (this.alreadyProcessed(attachMessage.id)) {\n\t\t\t// TODO: dataStoreId may require a different tag from PackageData #7488\n\t\t\tconst error = new DataCorruptionError(\n\t\t\t\t// pre-0.58 error message: duplicateDataStoreCreatedWithExistingId\n\t\t\t\t\"Duplicate DataStore created with existing id\",\n\t\t\t\t{\n\t\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t\t\t...tagCodeArtifacts({ dataStoreId: attachMessage.id }),\n\t\t\t\t},\n\t\t\t);\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst flatAttachBlobs = new Map<string, ArrayBufferLike>();\n\t\tlet snapshotTree: ISnapshotTree | undefined;\n\t\tif (attachMessage.snapshot) {\n\t\t\tsnapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatAttachBlobs);\n\t\t}\n\n\t\t// Include the type of attach message which is the pkg of the store to be\n\t\t// used by RemoteFluidDataStoreContext in case it is not in the snapshot.\n\t\tconst pkg = [attachMessage.type];\n\t\tconst remoteFluidDataStoreContext = new RemoteFluidDataStoreContext({\n\t\t\tid: attachMessage.id,\n\t\t\tsnapshotTree,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: new StorageServiceWithAttachBlobs(this.runtime.storage, flatAttachBlobs),\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(attachMessage.id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.FromAttach,\n\t\t\t\tsequenceNumber: message.sequenceNumber,\n\t\t\t\tsnapshot: attachMessage.snapshot ?? {\n\t\t\t\t\tentries: [createAttributesBlob(pkg, true /* isRootDataStore */)],\n\t\t\t\t},\n\t\t\t}),\n\t\t\tpkg,\n\t\t});\n\n\t\tthis.contexts.addBoundOrRemoted(remoteFluidDataStoreContext);\n\t}\n\n\tpublic processAliasMessage(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocalOpMetadata: unknown,\n\t\tlocal: boolean,\n\t): void {\n\t\tconst aliasMessage = message.contents as IDataStoreAliasMessage;\n\t\tif (!isDataStoreAliasMessage(aliasMessage)) {\n\t\t\tthrow new DataCorruptionError(\"malformedDataStoreAliasMessage\", {\n\t\t\t\t...extractSafePropertiesFromMessage(message),\n\t\t\t});\n\t\t}\n\n\t\tconst resolve = localOpMetadata as PendingAliasResolve;\n\t\tconst aliasResult = this.processAliasMessageCore(aliasMessage);\n\t\tif (local) {\n\t\t\tresolve(aliasResult);\n\t\t}\n\t}\n\n\tpublic processAliasMessageCore(aliasMessage: IDataStoreAliasMessage): boolean {\n\t\tif (this.alreadyProcessed(aliasMessage.alias)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst context = this.contexts.get(aliasMessage.internalId);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted a signal.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\taliasMessage.internalId,\n\t\t\t\tcontext,\n\t\t\t\t\"Changed\",\n\t\t\t\t\"processAliasMessageCore\",\n\t\t\t)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (context === undefined) {\n\t\t\tthis.mc.logger.sendErrorEvent({\n\t\t\t\teventName: \"AliasFluidDataStoreNotFound\",\n\t\t\t\tfluidDataStoreId: aliasMessage.internalId,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\n\t\tconst handle = new FluidObjectHandle(\n\t\t\tcontext,\n\t\t\taliasMessage.internalId,\n\t\t\tthis.runtime.IFluidHandleContext,\n\t\t);\n\t\tthis.runtime.addedGCOutboundReference(this.containerRuntimeHandle, handle);\n\n\t\tthis.aliasMap.set(aliasMessage.alias, context.id);\n\t\tcontext.setInMemoryRoot();\n\t\treturn true;\n\t}\n\n\tprivate alreadyProcessed(id: string): boolean {\n\t\treturn this.aliasMap.get(id) !== undefined || this.contexts.get(id) !== undefined;\n\t}\n\n\t/** Package up the context's attach summary etc into an IAttachMessage */\n\tprivate generateAttachMessage(localContext: LocalFluidDataStoreContext): IAttachMessage {\n\t\tconst { attachSummary, type, gcData } = localContext.getAttachData(\n\t\t\t/* includeGCData: */ true,\n\t\t);\n\n\t\tif (gcData !== undefined) {\n\t\t\taddBlobToSummary(attachSummary, gcDataBlobKey, JSON.stringify(gcData));\n\t\t}\n\n\t\t// Attach message needs the summary in ITree format. Convert the ISummaryTree into an ITree.\n\t\tconst snapshot = convertSummaryTreeToITree(attachSummary.summary);\n\n\t\treturn {\n\t\t\tid: localContext.id,\n\t\t\tsnapshot,\n\t\t\ttype,\n\t\t} satisfies IAttachMessage;\n\t}\n\n\t/**\n\t * Make the data store locally visible in the container graph by moving the data store context from unbound to\n\t * bound list and submitting the attach message. This data store can now be reached from the root.\n\t * @param id - The id of the data store context to make visible.\n\t */\n\tprivate makeDataStoreLocallyVisible(id: string): void {\n\t\tconst localContext = this.contexts.getUnbound(id);\n\t\tassert(!!localContext, 0x15f /* \"Could not find unbound context to bind\" */);\n\n\t\t/**\n\t\t * If the container is not detached, it is globally visible to all clients. This data store should also be\n\t\t * globally visible. Move it to attaching state and send an \"attach\" op for it.\n\t\t * If the container is detached, this data store will be part of the summary that makes the container attached.\n\t\t */\n\t\tif (this.runtime.attachState !== AttachState.Detached) {\n\t\t\tlocalContext.emit(\"attaching\");\n\t\t\tconst message = this.generateAttachMessage(localContext);\n\n\t\t\tthis.pendingAttach.set(id, message);\n\t\t\tthis.submitAttachFn(message);\n\t\t\tthis.attachOpFiredForDataStore.add(id);\n\t\t}\n\n\t\tthis.contexts.bind(id);\n\t}\n\n\tpublic createDetachedDataStoreCore(\n\t\tpkg: Readonly<string[]>,\n\t\tisRoot: boolean,\n\t\tid = uuid(),\n\t): IFluidDataStoreContextDetached {\n\t\tassert(!id.includes(\"/\"), 0x30c /* Id cannot contain slashes */);\n\n\t\tconst context = new LocalDetachedFluidDataStoreContext({\n\t\t\tid,\n\t\t\tpkg,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: this.runtime.storage,\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t}),\n\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),\n\t\t\tsnapshotTree: undefined,\n\t\t\tisRootDataStore: isRoot,\n\t\t});\n\t\tthis.contexts.addUnbound(context);\n\t\treturn context;\n\t}\n\n\tpublic _createFluidDataStoreContext(pkg: string[], id: string, props?: any) {\n\t\tassert(!id.includes(\"/\"), 0x30d /* Id cannot contain slashes */);\n\t\tconst context = new LocalFluidDataStoreContext({\n\t\t\tid,\n\t\t\tpkg,\n\t\t\truntime: this.runtime,\n\t\t\tstorage: this.runtime.storage,\n\t\t\tscope: this.runtime.scope,\n\t\t\tcreateSummarizerNodeFn: this.getCreateChildSummarizerNodeFn(id, {\n\t\t\t\ttype: CreateSummarizerNodeSource.Local,\n\t\t\t}),\n\t\t\tmakeLocallyVisibleFn: () => this.makeDataStoreLocallyVisible(id),\n\t\t\tsnapshotTree: undefined,\n\t\t\tisRootDataStore: false,\n\t\t\tcreateProps: props,\n\t\t});\n\t\tthis.contexts.addUnbound(context);\n\t\treturn context;\n\t}\n\n\tpublic get disposed() {\n\t\treturn this.disposeOnce.evaluated;\n\t}\n\tpublic readonly dispose = () => this.disposeOnce.value;\n\n\tpublic resubmitDataStoreOp(envelope: IEnvelope, localOpMetadata: unknown) {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and throw an error. If there are local changes for a\n\t\t// deleted data store, it can otherwise lead to inconsistent state when compared to other clients.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"resubmitDataStoreOp\")\n\t\t) {\n\t\t\tthrow new DataCorruptionError(\"Context is deleted!\", {\n\t\t\t\tcallSite: \"resubmitDataStoreOp\",\n\t\t\t\t...tagCodeArtifacts({ id: envelope.address }),\n\t\t\t});\n\t\t}\n\t\tassert(!!context, 0x160 /* \"There should be a store context for the op\" */);\n\t\tcontext.reSubmit(envelope.contents, localOpMetadata);\n\t}\n\n\tpublic rollbackDataStoreOp(envelope: IEnvelope, localOpMetadata: unknown) {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and throw an error. If there are local changes for a\n\t\t// deleted data store, it can otherwise lead to inconsistent state when compared to other clients.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"rollbackDataStoreOp\")\n\t\t) {\n\t\t\tthrow new DataCorruptionError(\"Context is deleted!\", {\n\t\t\t\tcallSite: \"rollbackDataStoreOp\",\n\t\t\t\t...tagCodeArtifacts({ id: envelope.address }),\n\t\t\t});\n\t\t}\n\t\tassert(!!context, 0x2e8 /* \"There should be a store context for the op\" */);\n\t\tcontext.rollback(envelope.contents, localOpMetadata);\n\t}\n\n\tpublic async applyStashedOp(envelope: IEnvelope): Promise<unknown> {\n\t\tconst context = this.contexts.get(envelope.address);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case the data store that stashed the op is deleted.\n\t\tif (this.checkAndLogIfDeleted(envelope.address, context, \"Changed\", \"applyStashedOp\")) {\n\t\t\treturn undefined;\n\t\t}\n\t\tassert(!!context, 0x161 /* \"There should be a store context for the op\" */);\n\t\treturn context.applyStashedOp(envelope.contents);\n\t}\n\n\tpublic async applyStashedAttachOp(message: IAttachMessage) {\n\t\tthis.pendingAttach.set(message.id, message);\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tthis.processAttachMessage({ contents: message } as ISequencedDocumentMessage, false);\n\t}\n\n\tpublic processFluidDataStoreOp(\n\t\tmessage: ISequencedDocumentMessage,\n\t\tlocal: boolean,\n\t\tlocalMessageMetadata: unknown,\n\t\taddedOutboundReference: (fromNodePath: string, toNodePath: string) => void,\n\t) {\n\t\tconst envelope = message.contents as IEnvelope;\n\t\tconst transformed = { ...message, contents: envelope.contents };\n\t\tconst context = this.contexts.get(envelope.address);\n\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted an op.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tenvelope.address,\n\t\t\t\tcontext,\n\t\t\t\t\"Changed\",\n\t\t\t\t\"processFluidDataStoreOp\",\n\t\t\t)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (context === undefined) {\n\t\t\t// Former assert 0x162\n\t\t\tthrow DataProcessingError.create(\n\t\t\t\t\"No context for op\",\n\t\t\t\t\"processFluidDataStoreOp\",\n\t\t\t\tmessage,\n\t\t\t\t{\n\t\t\t\t\tlocal,\n\t\t\t\t\tmessageDetails: JSON.stringify({\n\t\t\t\t\t\ttype: message.type,\n\t\t\t\t\t\tcontentType: typeof message.contents,\n\t\t\t\t\t}),\n\t\t\t\t\t...tagCodeArtifacts({ address: envelope.address }),\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\tcontext.process(transformed, local, localMessageMetadata);\n\n\t\t// By default, we use the new behavior of detecting outbound routes here.\n\t\t// If this setting is true, then DataStoreContext would be notifying GC instead.\n\t\tif (this.mc.config.getBoolean(detectOutboundRoutesViaDDSKey) !== true) {\n\t\t\t// Notify GC of any outbound references that were added by this op.\n\t\t\tdetectOutboundReferences(envelope, addedOutboundReference);\n\t\t}\n\n\t\t// Notify that a GC node for the data store changed. This is used to detect if a deleted data store is\n\t\t// being used.\n\t\tthis.gcNodeUpdated(\n\t\t\t`/${envelope.address}`,\n\t\t\tmessage.timestamp,\n\t\t\tcontext.isLoaded ? context.packagePath : undefined,\n\t\t);\n\t}\n\n\tpublic async getDataStore(\n\t\tid: string,\n\t\trequestHeaderData: RuntimeHeaderData,\n\t): Promise<FluidDataStoreContext> {\n\t\tconst headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tid,\n\t\t\t\tthis.contexts.get(id),\n\t\t\t\t\"Requested\",\n\t\t\t\t\"getDataStore\",\n\t\t\t\trequestHeaderData,\n\t\t\t)\n\t\t) {\n\t\t\t// The requested data store has been deleted by gc. Create a 404 response exception.\n\t\t\tconst request: IRequest = { url: id };\n\t\t\tthrow responseToException(\n\t\t\t\tcreateResponseError(404, \"DataStore was deleted\", request),\n\t\t\t\trequest,\n\t\t\t);\n\t\t}\n\n\t\tconst context = await this.contexts.getBoundOrRemoted(id, headerData.wait);\n\t\tif (context === undefined) {\n\t\t\t// The requested data store does not exits. Throw a 404 response exception.\n\t\t\tconst request: IRequest = { url: id };\n\t\t\tthrow responseToException(create404Response(request), request);\n\t\t}\n\t\treturn context;\n\t}\n\n\t/**\n\t * Returns the data store requested with the given id if available. Otherwise, returns undefined.\n\t */\n\tpublic async getDataStoreIfAvailable(\n\t\tid: string,\n\t\trequestHeaderData: RuntimeHeaderData,\n\t): Promise<FluidDataStoreContext | undefined> {\n\t\t// If the data store has been deleted, log an error and return undefined.\n\t\tif (\n\t\t\tthis.checkAndLogIfDeleted(\n\t\t\t\tid,\n\t\t\t\tthis.contexts.get(id),\n\t\t\t\t\"Requested\",\n\t\t\t\t\"getDataStoreIfAvailable\",\n\t\t\t\trequestHeaderData,\n\t\t\t)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst headerData = { ...defaultRuntimeHeaderData, ...requestHeaderData };\n\t\tconst context = await this.contexts.getBoundOrRemoted(id, headerData.wait);\n\t\tif (context === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn context;\n\t}\n\n\t/**\n\t * Checks if the data store has been deleted by GC. If so, log an error.\n\t * @param id - The data store's id.\n\t * @param context - The data store context.\n\t * @param callSite - The function name this is called from.\n\t * @param requestHeaderData - The request header information to log if the data store is deleted.\n\t * @returns true if the data store is deleted. Otherwise, returns false.\n\t */\n\tprivate checkAndLogIfDeleted(\n\t\tid: string,\n\t\tcontext: FluidDataStoreContext | undefined,\n\t\tdeletedLogSuffix: string,\n\t\tcallSite: string,\n\t\trequestHeaderData?: RuntimeHeaderData,\n\t) {\n\t\tconst dataStoreNodePath = `/${id}`;\n\t\tif (!this.isDataStoreDeleted(dataStoreNodePath)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.mc.logger.sendErrorEvent({\n\t\t\teventName: `GC_Deleted_DataStore_${deletedLogSuffix}`,\n\t\t\t...tagCodeArtifacts({ id }),\n\t\t\tcallSite,\n\t\t\theaders: JSON.stringify(requestHeaderData),\n\t\t\texists: context !== undefined,\n\t\t});\n\t\treturn true;\n\t}\n\n\tpublic processSignal(fluidDataStoreId: string, message: IInboundSignalMessage, local: boolean) {\n\t\tconst context = this.contexts.get(fluidDataStoreId);\n\t\t// If the data store has been deleted, log an error and ignore this message. This helps prevent document\n\t\t// corruption in case a deleted data store accidentally submitted a signal.\n\t\tif (this.checkAndLogIfDeleted(fluidDataStoreId, context, \"Changed\", \"processSignal\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!context) {\n\t\t\t// Attach message may not have been processed yet\n\t\t\tassert(!local, 0x163 /* \"Missing datastore for local signal\" */);\n\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\teventName: \"SignalFluidDataStoreNotFound\",\n\t\t\t\t...tagCodeArtifacts({\n\t\t\t\t\tfluidDataStoreId,\n\t\t\t\t}),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.processSignal(message, local);\n\t}\n\n\tpublic setConnectionState(connected: boolean, clientId?: string) {\n\t\tfor (const [fluidDataStoreId, context] of this.contexts) {\n\t\t\ttry {\n\t\t\t\tcontext.setConnectionState(connected, clientId);\n\t\t\t} catch (error) {\n\t\t\t\tthis.mc.logger.sendErrorEvent(\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"SetConnectionStateError\",\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t...tagCodeArtifacts({\n\t\t\t\t\t\t\tfluidDataStoreId,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tdetails: JSON.stringify({\n\t\t\t\t\t\t\truntimeConnected: this.runtime.connected,\n\t\t\t\t\t\t\tconnected,\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {\n\t\tconst eventName = attachState === AttachState.Attaching ? \"attaching\" : \"attached\";\n\t\tfor (const [, context] of this.contexts) {\n\t\t\t// Fire only for bounded stores.\n\t\t\tif (!this.contexts.isNotBound(context.id)) {\n\t\t\t\tcontext.emit(eventName);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic get size(): number {\n\t\treturn this.contexts.size;\n\t}\n\n\tpublic async summarize(\n\t\tfullTree: boolean,\n\t\ttrackState: boolean,\n\t\ttelemetryContext?: ITelemetryContext,\n\t): Promise<ISummaryTreeWithStats> {\n\t\tconst summaryBuilder = new SummaryTreeBuilder();\n\n\t\t// Iterate over each store and ask it to snapshot\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([_, context]) => {\n\t\t\t\t\t// Summarizer works only with clients with no local changes. A data store in attaching\n\t\t\t\t\t// state indicates an op was sent to attach a local data store, and the the attach op\n\t\t\t\t\t// had not yet round tripped back to the client.\n\t\t\t\t\tif (context.attachState === AttachState.Attaching) {\n\t\t\t\t\t\t// Formerly assert 0x588\n\t\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t\t\"Local data store detected in attaching state during summarize\",\n\t\t\t\t\t\t\t\"summarize\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\treturn context.attachState === AttachState.Attached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextSummary = await context.summarize(\n\t\t\t\t\t\tfullTree,\n\t\t\t\t\t\ttrackState,\n\t\t\t\t\t\ttelemetryContext,\n\t\t\t\t\t);\n\t\t\t\t\tsummaryBuilder.addWithStats(contextId, contextSummary);\n\t\t\t\t}),\n\t\t);\n\n\t\treturn summaryBuilder.getSummaryTree();\n\t}\n\n\t/**\n\t * Create a summary. Used when attaching or serializing a detached container.\n\t */\n\tpublic createSummary(telemetryContext?: ITelemetryContext): ISummaryTreeWithStats {\n\t\tconst builder = new SummaryTreeBuilder();\n\t\t// Attaching graph of some stores can cause other stores to get bound too.\n\t\t// So keep taking summary until no new stores get bound.\n\t\tlet notBoundContextsLength: number;\n\t\tdo {\n\t\t\tconst builderTree = builder.summary.tree;\n\t\t\tnotBoundContextsLength = this.contexts.notBoundLength();\n\t\t\t// Iterate over each data store and ask it to snapshot\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(\n\t\t\t\t\t([key, _]) =>\n\t\t\t\t\t\t// Take summary of bounded data stores only, make sure we haven't summarized them already\n\t\t\t\t\t\t// and no attach op has been fired for that data store because for loader versions <= 0.24\n\t\t\t\t\t\t// we set attach state as \"attaching\" before taking createNew summary.\n\t\t\t\t\t\t!(\n\t\t\t\t\t\t\tthis.contexts.isNotBound(key) ||\n\t\t\t\t\t\t\tbuilderTree[key] ||\n\t\t\t\t\t\t\tthis.attachOpFiredForDataStore.has(key)\n\t\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\tlet dataStoreSummary: ISummarizeResult;\n\t\t\t\t\tif (value.isLoaded) {\n\t\t\t\t\t\tdataStoreSummary = value.getAttachData(\n\t\t\t\t\t\t\t/* includeGCCData: */ false,\n\t\t\t\t\t\t\ttelemetryContext,\n\t\t\t\t\t\t).attachSummary;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If this data store is not yet loaded, then there should be no changes in the snapshot from\n\t\t\t\t\t\t// which it was created as it is detached container. So just use the previous snapshot.\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t!!this.baseSnapshot,\n\t\t\t\t\t\t\t0x166 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdataStoreSummary = convertSnapshotTreeToSummaryTree(\n\t\t\t\t\t\t\tthis.baseSnapshot.trees[key],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbuilder.addWithStats(key, dataStoreSummary);\n\t\t\t\t});\n\t\t} while (notBoundContextsLength !== this.contexts.notBoundLength());\n\n\t\treturn builder.getSummaryTree();\n\t}\n\n\t/**\n\t * Before GC runs, called by the garbage collector to update any pending GC state.\n\t * The garbage collector needs to know all outbound references that are added. Since root data stores are not\n\t * explicitly marked as referenced, notify GC of new root data stores that were added since the last GC run.\n\t */\n\tpublic async updateStateBeforeGC(): Promise<void> {\n\t\tfor (const id of this.dataStoresSinceLastGC) {\n\t\t\tconst context = this.contexts.get(id);\n\t\t\tassert(context !== undefined, 0x2b6 /* Missing data store context */);\n\t\t\tif (await context.isRoot()) {\n\t\t\t\t// A root data store is basically a reference from the container runtime to the data store.\n\t\t\t\tconst handle = new FluidObjectHandle(context, id, this.runtime.IFluidHandleContext);\n\t\t\t\tthis.runtime.addedGCOutboundReference(this.containerRuntimeHandle, handle);\n\t\t\t}\n\t\t}\n\t\tthis.dataStoresSinceLastGC = [];\n\t}\n\n\t/**\n\t * Generates data used for garbage collection. It does the following:\n\t *\n\t * 1. Calls into each child data store context to get its GC data.\n\t *\n\t * 2. Prefixes the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n\t * identified as belonging to the child.\n\t *\n\t * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n\t * the GC data of this channel.\n\t *\n\t * @param fullGC - true to bypass optimizations and force full generation of GC data.\n\t */\n\tpublic async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n\t\tconst builder = new GCDataBuilder();\n\t\t// Iterate over each store and get their GC data.\n\t\tawait Promise.all(\n\t\t\tArray.from(this.contexts)\n\t\t\t\t.filter(([_, context]) => {\n\t\t\t\t\t// Summarizer client and hence GC works only with clients with no local changes. A data store in\n\t\t\t\t\t// attaching state indicates an op was sent to attach a local data store, and the the attach op\n\t\t\t\t\t// had not yet round tripped back to the client.\n\t\t\t\t\t// Formerly assert 0x589\n\t\t\t\t\tif (context.attachState === AttachState.Attaching) {\n\t\t\t\t\t\tconst error = DataProcessingError.create(\n\t\t\t\t\t\t\t\"Local data store detected in attaching state while running GC\",\n\t\t\t\t\t\t\t\"getGCData\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn context.attachState === AttachState.Attached;\n\t\t\t\t})\n\t\t\t\t.map(async ([contextId, context]) => {\n\t\t\t\t\tconst contextGCData = await context.getGCData(fullGC);\n\t\t\t\t\t// Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n\t\t\t\t\t// This also gradually builds the id of each node to be a path from the root.\n\t\t\t\t\tbuilder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n\t\t\t\t}),\n\t\t);\n\n\t\t// Get the outbound routes and add a GC node for this channel.\n\t\tbuilder.addNode(\"/\", await this.getOutboundRoutes());\n\t\treturn builder.getGCData();\n\t}\n\n\t/**\n\t * After GC has run, called to notify this Container's data stores of routes that are used in it.\n\t * @param usedRoutes - The routes that are used in all data stores in this Container.\n\t */\n\tpublic updateUsedRoutes(usedRoutes: readonly string[]) {\n\t\t// Get a map of data store ids to routes used in it.\n\t\tconst usedDataStoreRoutes = unpackChildNodesUsedRoutes(usedRoutes);\n\n\t\t// Verify that the used routes are correct.\n\t\tfor (const [id] of usedDataStoreRoutes) {\n\t\t\tassert(\n\t\t\t\tthis.contexts.has(id),\n\t\t\t\t0x167 /* \"Used route does not belong to any known data store\" */,\n\t\t\t);\n\t\t}\n\n\t\t// Update the used routes in each data store. Used routes is empty for unused data stores.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.updateUsedRoutes(usedDataStoreRoutes.get(contextId) ?? []);\n\t\t}\n\t}\n\n\t/**\n\t * This is called to update objects whose routes are unused. The unused objects are deleted.\n\t * @param unusedRoutes - The routes that are unused in all data stores in this Container.\n\t */\n\tpublic updateUnusedRoutes(unusedRoutes: readonly string[]) {\n\t\tfor (const route of unusedRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\t// Delete data store only if its route (/datastoreId) is in unusedRoutes. We don't want to delete a data\n\t\t\t// store based on its DDS being unused.\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst dataStoreId = pathParts[1];\n\t\t\tassert(this.contexts.has(dataStoreId), 0x2d7 /* No data store with specified id */);\n\t\t\t// Delete the contexts of unused data stores.\n\t\t\tthis.contexts.delete(dataStoreId);\n\t\t\t// Delete the summarizer node of the unused data stores.\n\t\t\tthis.deleteChildSummarizerNodeFn(dataStoreId);\n\t\t}\n\t}\n\n\t/**\n\t * Delete data stores and its objects that are sweep ready.\n\t * @param sweepReadyDataStoreRoutes - The routes of data stores and its objects that are sweep ready and should\n\t * be deleted.\n\t * @returns The routes of data stores and its objects that were deleted.\n\t */\n\tpublic deleteSweepReadyNodes(sweepReadyDataStoreRoutes: readonly string[]): readonly string[] {\n\t\tfor (const route of sweepReadyDataStoreRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\tconst dataStoreId = pathParts[1];\n\n\t\t\t// Ignore sub-data store routes because a data store and its sub-routes are deleted together, so, we only\n\t\t\t// need to delete the data store.\n\t\t\t// These routes will still be returned below as among the deleted routes\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst dataStoreContext = this.contexts.get(dataStoreId);\n\t\t\tif (dataStoreContext === undefined) {\n\t\t\t\t// If the data store hasn't already been deleted, log an error because this should never happen.\n\t\t\t\t// If the data store has already been deleted, log a telemetry event. This can happen because multiple GC\n\t\t\t\t// sweep ops can contain the same data store. It would be interesting to track how often this happens.\n\t\t\t\tconst alreadyDeleted = this.isDataStoreDeleted(`/${dataStoreId}`);\n\t\t\t\tthis.mc.logger.sendTelemetryEvent({\n\t\t\t\t\teventName: \"DeletedDataStoreNotFound\",\n\t\t\t\t\tcategory: alreadyDeleted ? \"generic\" : \"error\",\n\t\t\t\t\t...tagCodeArtifacts({ id: dataStoreId }),\n\t\t\t\t\tdetails: { alreadyDeleted },\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdataStoreContext.delete();\n\n\t\t\t// Delete the contexts of sweep ready data stores.\n\t\t\tthis.contexts.delete(dataStoreId);\n\t\t\t// Delete the summarizer node of the sweep ready data stores.\n\t\t\tthis.deleteChildSummarizerNodeFn(dataStoreId);\n\t\t}\n\t\treturn Array.from(sweepReadyDataStoreRoutes);\n\t}\n\n\t/**\n\t * This is called to update objects whose routes are tombstones.\n\t *\n\t * A Tombstoned object has been unreferenced long enough that GC knows it won't be referenced again.\n\t * Tombstoned objects are eventually deleted by GC.\n\t *\n\t * @param tombstonedRoutes - The routes that are tombstones in all data stores in this Container.\n\t */\n\tpublic updateTombstonedRoutes(tombstonedRoutes: readonly string[]) {\n\t\tconst tombstonedDataStoresSet: Set<string> = new Set();\n\t\tfor (const route of tombstonedRoutes) {\n\t\t\tconst pathParts = route.split(\"/\");\n\t\t\t// Tombstone data store only if its route (/datastoreId) is directly in tombstoneRoutes.\n\t\t\tif (pathParts.length > 2) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst dataStoreId = pathParts[1];\n\t\t\tassert(this.contexts.has(dataStoreId), 0x510 /* No data store with specified id */);\n\t\t\ttombstonedDataStoresSet.add(dataStoreId);\n\t\t}\n\n\t\t// Update the used routes in each data store. Used routes is empty for unused data stores.\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tcontext.setTombstone(tombstonedDataStoresSet.has(contextId));\n\t\t}\n\t}\n\n\t/**\n\t * Returns the outbound routes of this channel. Only root data stores are considered referenced and their paths are\n\t * part of outbound routes.\n\t */\n\tprivate async getOutboundRoutes(): Promise<string[]> {\n\t\tconst outboundRoutes: string[] = [];\n\t\tfor (const [contextId, context] of this.contexts) {\n\t\t\tconst isRootDataStore = await context.isRoot();\n\t\t\tif (isRootDataStore) {\n\t\t\t\toutboundRoutes.push(`/${contextId}`);\n\t\t\t}\n\t\t}\n\t\treturn outboundRoutes;\n\t}\n\n\t/**\n\t * Called by GC to retrieve the package path of a data store node with the given path.\n\t */\n\tpublic async getDataStorePackagePath(nodePath: string): Promise<readonly string[] | undefined> {\n\t\t// If the node belongs to a data store, return its package path. For DDSes, we return the package path of the\n\t\t// data store that contains it.\n\t\tconst context = this.contexts.get(nodePath.split(\"/\")[1]);\n\t\treturn (await context?.getInitialSnapshotDetails())?.pkg;\n\t}\n\n\t/**\n\t * Called by GC to determine if a node is for a data store or for an object within a data store (for e.g. DDS).\n\t * @returns the GC node type if the node belongs to a data store or object within data store, undefined otherwise.\n\t */\n\tpublic getGCNodeType(nodePath: string): GCNodeType | undefined {\n\t\tconst pathParts = nodePath.split(\"/\");\n\t\tif (!this.contexts.has(pathParts[1])) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Data stores paths are of the format \"/dataStoreId\".\n\t\t// Sub data store paths are of the format \"/dataStoreId/subPath/...\".\n\t\tif (pathParts.length === 2) {\n\t\t\treturn GCNodeType.DataStore;\n\t\t}\n\t\treturn GCNodeType.SubDataStore;\n\t}\n}\n\nexport function getSummaryForDatastores(\n\tsnapshot: ISnapshotTree | undefined,\n\tmetadata?: IContainerRuntimeMetadata,\n): ISnapshotTree | undefined {\n\tif (!snapshot) {\n\t\treturn undefined;\n\t}\n\n\tif (rootHasIsolatedChannels(metadata)) {\n\t\tconst datastoresSnapshot = snapshot.trees[channelsTreeName];\n\t\tassert(!!datastoresSnapshot, 0x168 /* Expected tree in snapshot not found */);\n\t\treturn datastoresSnapshot;\n\t} else {\n\t\t// back-compat: strip out all non-datastore paths before giving to DataStores object.\n\t\tconst datastoresTrees: ISnapshotTree[\"trees\"] = {};\n\t\tfor (const [key, value] of Object.entries(snapshot.trees)) {\n\t\t\tif (!nonDataStorePaths.includes(key)) {\n\t\t\t\tdatastoresTrees[key] = value;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\t...snapshot,\n\t\t\ttrees: datastoresTrees,\n\t\t};\n\t}\n}\n\n/**\n * Traverse this op's contents and detect any outbound routes that were added by this op.\n */\nexport function detectOutboundReferences(\n\tenvelope: IEnvelope,\n\taddedOutboundReference: (fromNodePath: string, toNodePath: string) => void,\n): void {\n\t// These will be built up as we traverse the envelope contents\n\tconst outboundPaths: string[] = [];\n\tlet ddsAddress: string | undefined;\n\n\tfunction recursivelyFindHandles(obj: unknown) {\n\t\tif (typeof obj === \"object\" && obj !== null) {\n\t\t\tfor (const [key, value] of Object.entries(obj)) {\n\t\t\t\t// If 'value' is a serialized IFluidHandle, it represents a new outbound route.\n\t\t\t\tif (isSerializedHandle(value)) {\n\t\t\t\t\toutboundPaths.push(value.url);\n\t\t\t\t}\n\n\t\t\t\t// NOTE: This is taking a hard dependency on the fact that in our DataStore implementation,\n\t\t\t\t// the address of the DDS is stored in a property called \"address\". This is not ideal.\n\t\t\t\t// An alternative would be for the op envelope to include the absolute path (built up as it is submitted)\n\t\t\t\tif (key === \"address\" && ddsAddress === undefined) {\n\t\t\t\t\tddsAddress = value;\n\t\t\t\t}\n\n\t\t\t\trecursivelyFindHandles(value);\n\t\t\t}\n\t\t}\n\t}\n\n\trecursivelyFindHandles(envelope.contents);\n\n\t// GC node paths are all absolute paths, hence the \"\" prefix.\n\t// e.g. this will yield \"/dataStoreId/ddsId\"\n\tconst fromPath = [\"\", envelope.address, ddsAddress].join(\"/\");\n\toutboundPaths.forEach((toPath) => addedOutboundReference(fromPath, toPath));\n}\n"]}
@@ -43,6 +43,11 @@ export declare class GarbageCollector implements IGarbageCollector {
43
43
  private readonly baseSnapshotDataP;
44
44
  private readonly initializeGCStateFromBaseSnapshotP;
45
45
  private readonly baseGCDetailsP;
46
+ /**
47
+ * Map of node ids to their unreferenced state tracker
48
+ * NOTE: The set of keys in this map is considered as the set of unreferenced nodes
49
+ * as of the last GC run. So in between runs, nothing should be added or removed.
50
+ */
46
51
  private readonly unreferencedNodesState;
47
52
  private sessionExpiryTimer;
48
53
  private completedRuns;
@@ -196,14 +201,25 @@ export declare class GarbageCollector implements IGarbageCollector {
196
201
  * @param requestHeaders - If the node was loaded via request path, the headers in the request.
197
202
  */
198
203
  nodeUpdated(nodePath: string, reason: "Loaded" | "Changed", timestampMs?: number, packagePath?: readonly string[], request?: IRequest, headerData?: RuntimeHeaderData): void;
204
+ /**
205
+ * The given node should have its unreferenced state reset in the next GC,
206
+ * even if the true GC graph shows it is unreferenced. This will
207
+ * prevent it from being deleted by Sweep (after the Grace Period).
208
+ *
209
+ * Submit a GC op indicating that the Tombstone with the given path has been loaded.
210
+ * Broadcasting this information in the op stream allows the Summarizer to reset unreferenced state
211
+ * before runnint GC next.
212
+ */
213
+ private triggerAutoRecovery;
199
214
  /**
200
215
  * Called when an outbound reference is added to a node. This is used to identify all nodes that have been
201
216
  * referenced between summaries so that their unreferenced timestamp can be reset.
202
217
  *
203
218
  * @param fromNodePath - The node from which the reference is added.
204
219
  * @param toNodePath - The node to which the reference is added.
220
+ * @param autorecovery - This reference is added artificially, for autorecovery. Used for logging.
205
221
  */
206
- addedOutboundReference(fromNodePath: string, toNodePath: string): void;
222
+ addedOutboundReference(fromNodePath: string, toNodePath: string, autorecovery?: true): void;
207
223
  /**
208
224
  * Returns whether a node with the given path has been deleted or not. This can be used by the runtime to identify
209
225
  * cases where objects are used after they are deleted and throw / log errors accordingly.
@@ -1 +1 @@
1
- {"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"garbageCollection.d.ts","sourceRoot":"","sources":["../../src/gc/garbageCollection.ts"],"names":[],"mappings":"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"}