@fluidframework/container-runtime 0.47.0 → 0.48.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"dataStores.d.ts","sourceRoot":"","sources":["../src/dataStores.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dataStores.d.ts","sourceRoot":"","sources":["../src/dataStores.ts"],"names":[],"mappings":"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"}
package/lib/dataStores.js CHANGED
@@ -5,7 +5,7 @@
5
5
  import { DataCorruptionError, extractSafePropertiesFromMessage } from "@fluidframework/container-utils";
6
6
  import { channelsTreeName, CreateSummarizerNodeSource, } from "@fluidframework/runtime-definitions";
7
7
  import { convertSnapshotTreeToSummaryTree, convertSummaryTreeToITree, convertToSummaryTree, create404Response, responseToException, SummaryTreeBuilder, } from "@fluidframework/runtime-utils";
8
- import { ChildLogger } from "@fluidframework/telemetry-utils";
8
+ import { ChildLogger, TelemetryDataTag } from "@fluidframework/telemetry-utils";
9
9
  import { AttachState } from "@fluidframework/container-definitions";
10
10
  import { BlobCacheStorageService, buildSnapshotTree } from "@fluidframework/driver-utils";
11
11
  import { assert, Lazy } from "@fluidframework/common-utils";
@@ -80,7 +80,11 @@ export class DataStores {
80
80
  }
81
81
  // If a non-local operation then go and create the object, otherwise mark it as officially attached.
82
82
  if (this.contexts.has(attachMessage.id)) {
83
- const error = new DataCorruptionError("duplicateDataStoreCreatedWithExistingId", extractSafePropertiesFromMessage(message));
83
+ // TODO: dataStoreId may require a different tag from PackageData #7488
84
+ const error = new DataCorruptionError("duplicateDataStoreCreatedWithExistingId", Object.assign(Object.assign({}, extractSafePropertiesFromMessage(message)), { dataStoreId: {
85
+ value: attachMessage.id,
86
+ tag: TelemetryDataTag.PackageData,
87
+ } }));
84
88
  throw error;
85
89
  }
86
90
  const flatBlobs = new Map();
@@ -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 { ITelemetryLogger, ITelemetryBaseLogger, IDisposable } from \"@fluidframework/common-definitions\";\nimport { DataCorruptionError, extractSafePropertiesFromMessage } from \"@fluidframework/container-utils\";\nimport {\n ISequencedDocumentMessage,\n ISnapshotTree,\n ITreeEntry,\n SummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n channelsTreeName,\n CreateChildSummarizerNodeFn,\n CreateChildSummarizerNodeParam,\n CreateSummarizerNodeSource,\n IAttachMessage,\n IEnvelope,\n IFluidDataStoreChannel,\n IFluidDataStoreContextDetached,\n IGarbageCollectionData,\n IInboundSignalMessage,\n InboundAttachMessage,\n ISummarizeResult,\n ISummaryTreeWithStats,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n convertSnapshotTreeToSummaryTree,\n convertSummaryTreeToITree,\n convertToSummaryTree,\n create404Response,\n responseToException,\n SummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils\";\nimport { ChildLogger } from \"@fluidframework/telemetry-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { BlobCacheStorageService, buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport { assert, Lazy } from \"@fluidframework/common-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport { TreeTreeEntry } from \"@fluidframework/protocol-base\";\nimport { GCDataBuilder, getChildNodesUsedRoutes } from \"@fluidframework/garbage-collector\";\nimport { DataStoreContexts } from \"./dataStoreContexts\";\nimport { ContainerRuntime } from \"./containerRuntime\";\nimport {\n FluidDataStoreContext,\n RemotedFluidDataStoreContext,\n LocalFluidDataStoreContext,\n createAttributesBlob,\n LocalDetachedFluidDataStoreContext,\n} from \"./dataStoreContext\";\nimport { IContainerRuntimeMetadata, nonDataStorePaths, rootHasIsolatedChannels } from \"./summaryFormat\";\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 // Stores tracked by the Domain\n private readonly pendingAttach = new Map<string, IAttachMessage>();\n // 0.24 back-compat attachingBeforeSummary\n public readonly attachOpFiredForDataStore = new Set<string>();\n\n private readonly logger: ITelemetryLogger;\n\n private readonly disposeOnce = new Lazy<void>(()=>this.contexts.dispose());\n\n constructor(\n private readonly baseSnapshot: ISnapshotTree | undefined,\n private readonly runtime: ContainerRuntime,\n private readonly submitAttachFn: (attachContent: any) => void,\n private readonly getCreateChildSummarizerNodeFn:\n (id: string, createParam: CreateChildSummarizerNodeParam) => CreateChildSummarizerNodeFn,\n private readonly deleteChildSummarizerNodeFn: (id: string) => void,\n baseLogger: ITelemetryBaseLogger,\n private readonly contexts: DataStoreContexts = new DataStoreContexts(baseLogger),\n ) {\n this.logger = ChildLogger.create(baseLogger);\n // Extract stores stored inside the snapshot\n const fluidDataStores = new Map<string, ISnapshotTree>();\n\n if (baseSnapshot) {\n for (const [key, value] of Object.entries(baseSnapshot.trees)) {\n fluidDataStores.set(key, value);\n }\n }\n\n let unreferencedDataStoreCount = 0;\n // Create a context for each of them\n for (const [key, value] of fluidDataStores) {\n let dataStoreContext: FluidDataStoreContext;\n\n // counting number of unreferenced data stores\n if (value.unreferenced) {\n unreferencedDataStoreCount++;\n }\n // If we have a detached container, then create local data store contexts.\n if (this.runtime.attachState !== AttachState.Detached) {\n dataStoreContext = new RemotedFluidDataStoreContext(\n key,\n value,\n this.runtime,\n this.runtime.storage,\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(key, { type: CreateSummarizerNodeSource.FromSummary }));\n } else {\n if (typeof value !== \"object\") {\n throw new Error(\"Snapshot should be there to load from!!\");\n }\n const snapshotTree = value;\n dataStoreContext = new LocalFluidDataStoreContext(\n key,\n undefined,\n this.runtime,\n this.runtime.storage,\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(key, { type: CreateSummarizerNodeSource.FromSummary }),\n (cr: IFluidDataStoreChannel) => this.bindFluidDataStore(cr),\n snapshotTree,\n undefined,\n );\n }\n this.contexts.addBoundOrRemoted(dataStoreContext);\n }\n this.logger.sendTelemetryEvent({\n eventName: \"ContainerLoadStats\",\n dataStoreCount: fluidDataStores.size,\n referencedDataStoreCount: fluidDataStores.size - unreferencedDataStoreCount,\n });\n }\n\n public processAttachMessage(message: ISequencedDocumentMessage, local: boolean) {\n const attachMessage = message.contents as InboundAttachMessage;\n // The local object has already been attached\n if (local) {\n assert(this.pendingAttach.has(attachMessage.id),\n 0x15e /* \"Local object does not have matching attach message id\" */);\n this.contexts.get(attachMessage.id)?.emit(\"attached\");\n this.pendingAttach.delete(attachMessage.id);\n return;\n }\n\n // If a non-local operation then go and create the object, otherwise mark it as officially attached.\n if (this.contexts.has(attachMessage.id)) {\n const error = new DataCorruptionError(\n \"duplicateDataStoreCreatedWithExistingId\",\n extractSafePropertiesFromMessage(message),\n );\n throw error;\n }\n\n const flatBlobs = new Map<string, ArrayBufferLike>();\n let snapshotTree: ISnapshotTree | undefined;\n if (attachMessage.snapshot) {\n snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatBlobs);\n }\n\n // Include the type of attach message which is the pkg of the store to be\n // used by RemotedFluidDataStoreContext in case it is not in the snapshot.\n const pkg = [attachMessage.type];\n const remotedFluidDataStoreContext = new RemotedFluidDataStoreContext(\n attachMessage.id,\n snapshotTree,\n this.runtime,\n new BlobCacheStorageService(this.runtime.storage, flatBlobs),\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(\n attachMessage.id,\n {\n type: CreateSummarizerNodeSource.FromAttach,\n sequenceNumber: message.sequenceNumber,\n snapshot: attachMessage.snapshot ?? {\n entries: [createAttributesBlob(\n pkg,\n true /* isRootDataStore */,\n this.runtime.disableIsolatedChannels,\n )],\n },\n }),\n pkg);\n\n // Resolve pending gets and store off any new ones\n this.contexts.addBoundOrRemoted(remotedFluidDataStoreContext);\n\n // Equivalent of nextTick() - Prefetch once all current ops have completed\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.resolve().then(async () => remotedFluidDataStoreContext.realize());\n }\n\n public bindFluidDataStore(fluidDataStoreRuntime: IFluidDataStoreChannel): void {\n const id = fluidDataStoreRuntime.id;\n const localContext = this.contexts.getUnbound(id);\n assert(!!localContext, 0x15f /* \"Could not find unbound context to bind\" */);\n\n // If the container is detached, we don't need to send OP or add to pending attach because\n // we will summarize it while uploading the create new summary and make it known to other\n // clients.\n if (this.runtime.attachState !== AttachState.Detached) {\n localContext.emit(\"attaching\");\n const message = localContext.generateAttachMessage();\n\n this.pendingAttach.set(id, message);\n this.submitAttachFn(message);\n this.attachOpFiredForDataStore.add(id);\n }\n\n this.contexts.bind(fluidDataStoreRuntime.id);\n }\n\n public createDetachedDataStoreCore(\n pkg: Readonly<string[]>,\n isRoot: boolean,\n id = uuid()): IFluidDataStoreContextDetached\n {\n const context = new LocalDetachedFluidDataStoreContext(\n id,\n pkg,\n this.runtime,\n this.runtime.storage,\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(id, { type: CreateSummarizerNodeSource.Local }),\n (cr: IFluidDataStoreChannel) => this.bindFluidDataStore(cr),\n isRoot,\n );\n this.contexts.addUnbound(context);\n return context;\n }\n\n public _createFluidDataStoreContext(pkg: string[], id: string, isRoot: boolean, props?: any) {\n const context = new LocalFluidDataStoreContext(\n id,\n pkg,\n this.runtime,\n this.runtime.storage,\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(id, { type: CreateSummarizerNodeSource.Local }),\n (cr: IFluidDataStoreChannel) => this.bindFluidDataStore(cr),\n undefined,\n isRoot,\n props,\n );\n this.contexts.addUnbound(context);\n return context;\n }\n\n public get disposed() {return this.disposeOnce.evaluated;}\n public readonly dispose = () => this.disposeOnce.value;\n\n public resubmitDataStoreOp(content: any, localOpMetadata: unknown) {\n const envelope = content as IEnvelope;\n const context = this.contexts.get(envelope.address);\n assert(!!context, 0x160 /* \"There should be a store context for the op\" */);\n context.reSubmit(envelope.contents, localOpMetadata);\n }\n\n public async applyStashedOp(content: any): Promise<unknown> {\n const envelope = content as IEnvelope;\n const context = this.contexts.get(envelope.address);\n assert(!!context, 0x161 /* \"There should be a store context for the op\" */);\n return context.applyStashedOp(envelope.contents);\n }\n\n public async applyStashedAttachOp(message: IAttachMessage) {\n this.pendingAttach.set(message.id, message);\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n this.processAttachMessage({ contents: message } as ISequencedDocumentMessage, false);\n }\n\n public processFluidDataStoreOp(message: ISequencedDocumentMessage, local: boolean, localMessageMetadata: unknown) {\n const envelope = message.contents as IEnvelope;\n const transformed = { ...message, contents: envelope.contents };\n const context = this.contexts.get(envelope.address);\n assert(!!context, 0x162 /* \"There should be a store context for the op\" */);\n context.process(transformed, local, localMessageMetadata);\n }\n\n public async getDataStore(id: string, wait: boolean): Promise<FluidDataStoreContext> {\n const context = await this.contexts.getBoundOrRemoted(id, wait);\n\n if (context === undefined) {\n // The requested data store does not exits. Throw a 404 response exception.\n const request = { url: id };\n throw responseToException(create404Response(request), request);\n }\n\n return context;\n }\n\n public processSignal(address: string, message: IInboundSignalMessage, local: boolean) {\n const context = this.contexts.get(address);\n if (!context) {\n // Attach message may not have been processed yet\n assert(!local, 0x163 /* \"Missing datastore for local signal\" */);\n this.logger.sendTelemetryEvent({\n eventName: \"SignalFluidDataStoreNotFound\",\n fluidDataStoreId: address,\n });\n return;\n }\n\n context.processSignal(message, local);\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n for (const [fluidDataStore, context] of this.contexts) {\n try {\n context.setConnectionState(connected, clientId);\n } catch (error) {\n this.logger.sendErrorEvent({\n eventName: \"SetConnectionStateError\",\n clientId,\n fluidDataStore,\n }, error);\n }\n }\n }\n\n public setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {\n let eventName: \"attaching\" | \"attached\";\n if (attachState === AttachState.Attaching) {\n eventName = \"attaching\";\n } else {\n eventName = \"attached\";\n }\n for (const [,context] of this.contexts) {\n // Fire only for bounded stores.\n if (!this.contexts.isNotBound(context.id)) {\n context.emit(eventName);\n }\n }\n }\n\n /**\n * Notifies this object to take the snapshot of the container.\n * @deprecated - Use summarize to get summary of the container runtime.\n */\n public async snapshot(): Promise<ITreeEntry[]> {\n // Iterate over each store and ask it to snapshot\n const fluidDataStoreSnapshotsP = Array.from(this.contexts).map(async ([fluidDataStoreId, value]) => {\n const summaryTree = await value.summarize(true /* fullTree */, false /* trackState */);\n assert(\n summaryTree.summary.type === SummaryType.Tree,\n 0x164 /* \"summarize should always return a tree when fullTree is true\" */);\n // back-compat summary - Remove this once snapshot is removed.\n const snapshot = convertSummaryTreeToITree(summaryTree.summary);\n\n // If ID exists then previous commit is still valid\n return {\n fluidDataStoreId,\n snapshot,\n };\n });\n\n const entries: ITreeEntry[] = [];\n\n // Add in module references to the store snapshots\n const fluidDataStoreSnapshots = await Promise.all(fluidDataStoreSnapshotsP);\n\n // Sort for better diffing of snapshots (in replay tool, used to find bugs in snapshotting logic)\n fluidDataStoreSnapshots.sort((a, b) => a?.fluidDataStoreId.localeCompare(b.fluidDataStoreId));\n\n for (const fluidDataStoreSnapshot of fluidDataStoreSnapshots) {\n entries.push(new TreeTreeEntry(\n fluidDataStoreSnapshot.fluidDataStoreId,\n fluidDataStoreSnapshot.snapshot,\n ));\n }\n return entries;\n }\n\n public get size(): number {\n return this.contexts.size;\n }\n\n public async summarize(fullTree: boolean, trackState: boolean): Promise<ISummaryTreeWithStats> {\n const summaryBuilder = new SummaryTreeBuilder();\n\n // Iterate over each store and ask it to snapshot\n await Promise.all(Array.from(this.contexts)\n .filter(([_, context]) => {\n // Summarizer works only with clients with no local changes!\n assert(context.attachState !== AttachState.Attaching,\n 0x165 /* \"Summarizer cannot work if client has local changes\" */);\n return context.attachState === AttachState.Attached;\n }).map(async ([contextId, context]) => {\n const contextSummary = await context.summarize(fullTree, trackState);\n summaryBuilder.addWithStats(contextId, contextSummary);\n }));\n\n return summaryBuilder.getSummaryTree();\n }\n\n public createSummary(): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n // Attaching graph of some stores can cause other stores to get bound too.\n // So keep taking summary until no new stores get bound.\n let notBoundContextsLength: number;\n do {\n const builderTree = builder.summary.tree;\n notBoundContextsLength = this.contexts.notBoundLength();\n // Iterate over each data store and ask it to snapshot\n Array.from(this.contexts)\n .filter(([key, _]) =>\n // Take summary of bounded data stores only, make sure we haven't summarized them already\n // and no attach op has been fired for that data store because for loader versions <= 0.24\n // we set attach state as \"attaching\" before taking createNew summary.\n !(this.contexts.isNotBound(key)\n || builderTree[key]\n || this.attachOpFiredForDataStore.has(key)),\n )\n .map(([key, value]) => {\n let dataStoreSummary: ISummarizeResult;\n if (value.isLoaded) {\n const snapshot = value.generateAttachMessage().snapshot;\n dataStoreSummary = convertToSummaryTree(snapshot, true);\n } else {\n // If this data store is not yet loaded, then there should be no changes in the snapshot from\n // which it was created as it is detached container. So just use the previous snapshot.\n assert(!!this.baseSnapshot,\n 0x166 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */);\n dataStoreSummary = convertSnapshotTreeToSummaryTree(this.baseSnapshot.trees[key]);\n }\n builder.addWithStats(key, dataStoreSummary);\n });\n } while (notBoundContextsLength !== this.contexts.notBoundLength());\n\n return builder.getSummaryTree();\n }\n\n /**\n * Generates data used for garbage collection. It does the following:\n * 1. Calls into each child data store context to get its GC data.\n * 2. Prefixs the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n * idenfied as belonging to the child.\n * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n * the GC data of this channel.\n * @param fullGC - true to bypass optimizations and force full generation of GC data.\n */\n public async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n const builder = new GCDataBuilder();\n // Iterate over each store and get their GC data.\n await Promise.all(Array.from(this.contexts)\n .filter(([_, context]) => {\n // Get GC data only for attached contexts. Detached contexts are not connected in the GC reference\n // graph so any references they might have won't be connected as well.\n return context.attachState === AttachState.Attached;\n }).map(async ([contextId, context]) => {\n const contextGCData = await context.getGCData(fullGC);\n // Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n // This also gradually builds the id of each node to be a path from the root.\n builder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n }));\n\n // Get the outbound routes and add a GC node for this channel.\n builder.addNode(\"/\", await this.getOutboundRoutes());\n return builder.getGCData();\n }\n\n /**\n * After GC has run, called to notify this Container's data stores of routes that are used in it.\n * @param usedRoutes - The routes that are used in all data stores in this Container.\n * @param gcTimestamp - The time when GC was run that generated these used routes. If any node node becomes\n * unreferenced as part of this GC run, this should be used to update the time when it happens.\n * @returns the total number of data stores and the number of data stores that are unused.\n */\n public updateUsedRoutes(usedRoutes: string[], gcTimestamp?: number) {\n // Get a map of data store ids to routes used in it.\n const usedDataStoreRoutes = getChildNodesUsedRoutes(usedRoutes);\n\n // Verify that the used routes are correct.\n for (const [id] of usedDataStoreRoutes) {\n assert(this.contexts.has(id), 0x167 /* \"Used route does not belong to any known data store\" */);\n }\n\n // Update the used routes in each data store. Used routes is empty for unused data stores.\n for (const [contextId, context] of this.contexts) {\n context.updateUsedRoutes(usedDataStoreRoutes.get(contextId) ?? [], gcTimestamp);\n }\n\n // Return the number of data stores that are unused.\n const dataStoreCount = this.contexts.size;\n return {\n dataStoreCount,\n unusedDataStoreCount: dataStoreCount - usedDataStoreRoutes.size,\n };\n }\n\n /**\n * When running GC in test mode, this is called to delete objects whose routes are unused. This enables testing\n * scenarios with accessing deleted content.\n * @param unusedRoutes - The routes that are unused in all data stores in this Container.\n */\n public deleteUnusedRoutes(unusedRoutes: string[]) {\n assert(this.runtime.gcTestMode, 0x1df /* \"Data stores should be deleted only in GC test mode\" */);\n for (const route of unusedRoutes) {\n const dataStoreId = route.split(\"/\")[1];\n // Delete the contexts of unused data stores.\n this.contexts.delete(dataStoreId);\n // Delete the summarizer node of the unused data stores.\n this.deleteChildSummarizerNodeFn(dataStoreId);\n }\n }\n\n /**\n * Returns the outbound routes of this channel. Only root data stores are considered referenced and their paths are\n * part of outbound routes.\n */\n private async getOutboundRoutes(): Promise<string[]> {\n const outboundRoutes: string[] = [];\n for (const [contextId, context] of this.contexts) {\n const isRootDataStore = await context.isRoot();\n if (isRootDataStore) {\n outboundRoutes.push(`/${contextId}`);\n }\n }\n return outboundRoutes;\n }\n}\n\nexport function getSummaryForDatastores(\n snapshot: ISnapshotTree | undefined,\n metadata?: IContainerRuntimeMetadata,\n): ISnapshotTree | undefined {\n if (!snapshot) {\n return undefined;\n }\n\n if (rootHasIsolatedChannels(metadata)) {\n const datastoresSnapshot = snapshot.trees[channelsTreeName];\n assert(!!datastoresSnapshot, 0x168 /* `expected ${channelsTreeName} tree in snapshot` */);\n return datastoresSnapshot;\n } else {\n // back-compat: strip out all non-datastore paths before giving to DataStores object.\n const datastoresTrees: ISnapshotTree[\"trees\"] = {};\n for (const [key, value] of Object.entries(snapshot.trees)) {\n if (!nonDataStorePaths.includes(key)) {\n datastoresTrees[key] = value;\n }\n }\n return {\n ...snapshot,\n trees: datastoresTrees,\n };\n }\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 { ITelemetryLogger, ITelemetryBaseLogger, IDisposable } from \"@fluidframework/common-definitions\";\nimport { DataCorruptionError, extractSafePropertiesFromMessage } from \"@fluidframework/container-utils\";\nimport {\n ISequencedDocumentMessage,\n ISnapshotTree,\n ITreeEntry,\n SummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport {\n channelsTreeName,\n CreateChildSummarizerNodeFn,\n CreateChildSummarizerNodeParam,\n CreateSummarizerNodeSource,\n IAttachMessage,\n IEnvelope,\n IFluidDataStoreChannel,\n IFluidDataStoreContextDetached,\n IGarbageCollectionData,\n IInboundSignalMessage,\n InboundAttachMessage,\n ISummarizeResult,\n ISummaryTreeWithStats,\n} from \"@fluidframework/runtime-definitions\";\nimport {\n convertSnapshotTreeToSummaryTree,\n convertSummaryTreeToITree,\n convertToSummaryTree,\n create404Response,\n responseToException,\n SummaryTreeBuilder,\n} from \"@fluidframework/runtime-utils\";\nimport { ChildLogger, TelemetryDataTag } from \"@fluidframework/telemetry-utils\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { BlobCacheStorageService, buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport { assert, Lazy } from \"@fluidframework/common-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport { TreeTreeEntry } from \"@fluidframework/protocol-base\";\nimport { GCDataBuilder, getChildNodesUsedRoutes } from \"@fluidframework/garbage-collector\";\nimport { DataStoreContexts } from \"./dataStoreContexts\";\nimport { ContainerRuntime } from \"./containerRuntime\";\nimport {\n FluidDataStoreContext,\n RemotedFluidDataStoreContext,\n LocalFluidDataStoreContext,\n createAttributesBlob,\n LocalDetachedFluidDataStoreContext,\n} from \"./dataStoreContext\";\nimport { IContainerRuntimeMetadata, nonDataStorePaths, rootHasIsolatedChannels } from \"./summaryFormat\";\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 // Stores tracked by the Domain\n private readonly pendingAttach = new Map<string, IAttachMessage>();\n // 0.24 back-compat attachingBeforeSummary\n public readonly attachOpFiredForDataStore = new Set<string>();\n\n private readonly logger: ITelemetryLogger;\n\n private readonly disposeOnce = new Lazy<void>(()=>this.contexts.dispose());\n\n constructor(\n private readonly baseSnapshot: ISnapshotTree | undefined,\n private readonly runtime: ContainerRuntime,\n private readonly submitAttachFn: (attachContent: any) => void,\n private readonly getCreateChildSummarizerNodeFn:\n (id: string, createParam: CreateChildSummarizerNodeParam) => CreateChildSummarizerNodeFn,\n private readonly deleteChildSummarizerNodeFn: (id: string) => void,\n baseLogger: ITelemetryBaseLogger,\n private readonly contexts: DataStoreContexts = new DataStoreContexts(baseLogger),\n ) {\n this.logger = ChildLogger.create(baseLogger);\n // Extract stores stored inside the snapshot\n const fluidDataStores = new Map<string, ISnapshotTree>();\n\n if (baseSnapshot) {\n for (const [key, value] of Object.entries(baseSnapshot.trees)) {\n fluidDataStores.set(key, value);\n }\n }\n\n let unreferencedDataStoreCount = 0;\n // Create a context for each of them\n for (const [key, value] of fluidDataStores) {\n let dataStoreContext: FluidDataStoreContext;\n\n // counting number of unreferenced data stores\n if (value.unreferenced) {\n unreferencedDataStoreCount++;\n }\n // If we have a detached container, then create local data store contexts.\n if (this.runtime.attachState !== AttachState.Detached) {\n dataStoreContext = new RemotedFluidDataStoreContext(\n key,\n value,\n this.runtime,\n this.runtime.storage,\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(key, { type: CreateSummarizerNodeSource.FromSummary }));\n } else {\n if (typeof value !== \"object\") {\n throw new Error(\"Snapshot should be there to load from!!\");\n }\n const snapshotTree = value;\n dataStoreContext = new LocalFluidDataStoreContext(\n key,\n undefined,\n this.runtime,\n this.runtime.storage,\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(key, { type: CreateSummarizerNodeSource.FromSummary }),\n (cr: IFluidDataStoreChannel) => this.bindFluidDataStore(cr),\n snapshotTree,\n undefined,\n );\n }\n this.contexts.addBoundOrRemoted(dataStoreContext);\n }\n this.logger.sendTelemetryEvent({\n eventName: \"ContainerLoadStats\",\n dataStoreCount: fluidDataStores.size,\n referencedDataStoreCount: fluidDataStores.size - unreferencedDataStoreCount,\n });\n }\n\n public processAttachMessage(message: ISequencedDocumentMessage, local: boolean) {\n const attachMessage = message.contents as InboundAttachMessage;\n // The local object has already been attached\n if (local) {\n assert(this.pendingAttach.has(attachMessage.id),\n 0x15e /* \"Local object does not have matching attach message id\" */);\n this.contexts.get(attachMessage.id)?.emit(\"attached\");\n this.pendingAttach.delete(attachMessage.id);\n return;\n }\n\n // If a non-local operation then go and create the object, otherwise mark it as officially attached.\n if (this.contexts.has(attachMessage.id)) {\n // TODO: dataStoreId may require a different tag from PackageData #7488\n const error = new DataCorruptionError(\n \"duplicateDataStoreCreatedWithExistingId\",\n {\n ...extractSafePropertiesFromMessage(message),\n dataStoreId: {\n value: attachMessage.id,\n tag: TelemetryDataTag.PackageData,\n },\n },\n );\n throw error;\n }\n\n const flatBlobs = new Map<string, ArrayBufferLike>();\n let snapshotTree: ISnapshotTree | undefined;\n if (attachMessage.snapshot) {\n snapshotTree = buildSnapshotTree(attachMessage.snapshot.entries, flatBlobs);\n }\n\n // Include the type of attach message which is the pkg of the store to be\n // used by RemotedFluidDataStoreContext in case it is not in the snapshot.\n const pkg = [attachMessage.type];\n const remotedFluidDataStoreContext = new RemotedFluidDataStoreContext(\n attachMessage.id,\n snapshotTree,\n this.runtime,\n new BlobCacheStorageService(this.runtime.storage, flatBlobs),\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(\n attachMessage.id,\n {\n type: CreateSummarizerNodeSource.FromAttach,\n sequenceNumber: message.sequenceNumber,\n snapshot: attachMessage.snapshot ?? {\n entries: [createAttributesBlob(\n pkg,\n true /* isRootDataStore */,\n this.runtime.disableIsolatedChannels,\n )],\n },\n }),\n pkg);\n\n // Resolve pending gets and store off any new ones\n this.contexts.addBoundOrRemoted(remotedFluidDataStoreContext);\n\n // Equivalent of nextTick() - Prefetch once all current ops have completed\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n Promise.resolve().then(async () => remotedFluidDataStoreContext.realize());\n }\n\n public bindFluidDataStore(fluidDataStoreRuntime: IFluidDataStoreChannel): void {\n const id = fluidDataStoreRuntime.id;\n const localContext = this.contexts.getUnbound(id);\n assert(!!localContext, 0x15f /* \"Could not find unbound context to bind\" */);\n\n // If the container is detached, we don't need to send OP or add to pending attach because\n // we will summarize it while uploading the create new summary and make it known to other\n // clients.\n if (this.runtime.attachState !== AttachState.Detached) {\n localContext.emit(\"attaching\");\n const message = localContext.generateAttachMessage();\n\n this.pendingAttach.set(id, message);\n this.submitAttachFn(message);\n this.attachOpFiredForDataStore.add(id);\n }\n\n this.contexts.bind(fluidDataStoreRuntime.id);\n }\n\n public createDetachedDataStoreCore(\n pkg: Readonly<string[]>,\n isRoot: boolean,\n id = uuid()): IFluidDataStoreContextDetached\n {\n const context = new LocalDetachedFluidDataStoreContext(\n id,\n pkg,\n this.runtime,\n this.runtime.storage,\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(id, { type: CreateSummarizerNodeSource.Local }),\n (cr: IFluidDataStoreChannel) => this.bindFluidDataStore(cr),\n isRoot,\n );\n this.contexts.addUnbound(context);\n return context;\n }\n\n public _createFluidDataStoreContext(pkg: string[], id: string, isRoot: boolean, props?: any) {\n const context = new LocalFluidDataStoreContext(\n id,\n pkg,\n this.runtime,\n this.runtime.storage,\n this.runtime.scope,\n this.getCreateChildSummarizerNodeFn(id, { type: CreateSummarizerNodeSource.Local }),\n (cr: IFluidDataStoreChannel) => this.bindFluidDataStore(cr),\n undefined,\n isRoot,\n props,\n );\n this.contexts.addUnbound(context);\n return context;\n }\n\n public get disposed() {return this.disposeOnce.evaluated;}\n public readonly dispose = () => this.disposeOnce.value;\n\n public resubmitDataStoreOp(content: any, localOpMetadata: unknown) {\n const envelope = content as IEnvelope;\n const context = this.contexts.get(envelope.address);\n assert(!!context, 0x160 /* \"There should be a store context for the op\" */);\n context.reSubmit(envelope.contents, localOpMetadata);\n }\n\n public async applyStashedOp(content: any): Promise<unknown> {\n const envelope = content as IEnvelope;\n const context = this.contexts.get(envelope.address);\n assert(!!context, 0x161 /* \"There should be a store context for the op\" */);\n return context.applyStashedOp(envelope.contents);\n }\n\n public async applyStashedAttachOp(message: IAttachMessage) {\n this.pendingAttach.set(message.id, message);\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n this.processAttachMessage({ contents: message } as ISequencedDocumentMessage, false);\n }\n\n public processFluidDataStoreOp(message: ISequencedDocumentMessage, local: boolean, localMessageMetadata: unknown) {\n const envelope = message.contents as IEnvelope;\n const transformed = { ...message, contents: envelope.contents };\n const context = this.contexts.get(envelope.address);\n assert(!!context, 0x162 /* \"There should be a store context for the op\" */);\n context.process(transformed, local, localMessageMetadata);\n }\n\n public async getDataStore(id: string, wait: boolean): Promise<FluidDataStoreContext> {\n const context = await this.contexts.getBoundOrRemoted(id, wait);\n\n if (context === undefined) {\n // The requested data store does not exits. Throw a 404 response exception.\n const request = { url: id };\n throw responseToException(create404Response(request), request);\n }\n\n return context;\n }\n\n public processSignal(address: string, message: IInboundSignalMessage, local: boolean) {\n const context = this.contexts.get(address);\n if (!context) {\n // Attach message may not have been processed yet\n assert(!local, 0x163 /* \"Missing datastore for local signal\" */);\n this.logger.sendTelemetryEvent({\n eventName: \"SignalFluidDataStoreNotFound\",\n fluidDataStoreId: address,\n });\n return;\n }\n\n context.processSignal(message, local);\n }\n\n public setConnectionState(connected: boolean, clientId?: string) {\n for (const [fluidDataStore, context] of this.contexts) {\n try {\n context.setConnectionState(connected, clientId);\n } catch (error) {\n this.logger.sendErrorEvent({\n eventName: \"SetConnectionStateError\",\n clientId,\n fluidDataStore,\n }, error);\n }\n }\n }\n\n public setAttachState(attachState: AttachState.Attaching | AttachState.Attached): void {\n let eventName: \"attaching\" | \"attached\";\n if (attachState === AttachState.Attaching) {\n eventName = \"attaching\";\n } else {\n eventName = \"attached\";\n }\n for (const [,context] of this.contexts) {\n // Fire only for bounded stores.\n if (!this.contexts.isNotBound(context.id)) {\n context.emit(eventName);\n }\n }\n }\n\n /**\n * Notifies this object to take the snapshot of the container.\n * @deprecated - Use summarize to get summary of the container runtime.\n */\n public async snapshot(): Promise<ITreeEntry[]> {\n // Iterate over each store and ask it to snapshot\n const fluidDataStoreSnapshotsP = Array.from(this.contexts).map(async ([fluidDataStoreId, value]) => {\n const summaryTree = await value.summarize(true /* fullTree */, false /* trackState */);\n assert(\n summaryTree.summary.type === SummaryType.Tree,\n 0x164 /* \"summarize should always return a tree when fullTree is true\" */);\n // back-compat summary - Remove this once snapshot is removed.\n const snapshot = convertSummaryTreeToITree(summaryTree.summary);\n\n // If ID exists then previous commit is still valid\n return {\n fluidDataStoreId,\n snapshot,\n };\n });\n\n const entries: ITreeEntry[] = [];\n\n // Add in module references to the store snapshots\n const fluidDataStoreSnapshots = await Promise.all(fluidDataStoreSnapshotsP);\n\n // Sort for better diffing of snapshots (in replay tool, used to find bugs in snapshotting logic)\n fluidDataStoreSnapshots.sort((a, b) => a?.fluidDataStoreId.localeCompare(b.fluidDataStoreId));\n\n for (const fluidDataStoreSnapshot of fluidDataStoreSnapshots) {\n entries.push(new TreeTreeEntry(\n fluidDataStoreSnapshot.fluidDataStoreId,\n fluidDataStoreSnapshot.snapshot,\n ));\n }\n return entries;\n }\n\n public get size(): number {\n return this.contexts.size;\n }\n\n public async summarize(fullTree: boolean, trackState: boolean): Promise<ISummaryTreeWithStats> {\n const summaryBuilder = new SummaryTreeBuilder();\n\n // Iterate over each store and ask it to snapshot\n await Promise.all(Array.from(this.contexts)\n .filter(([_, context]) => {\n // Summarizer works only with clients with no local changes!\n assert(context.attachState !== AttachState.Attaching,\n 0x165 /* \"Summarizer cannot work if client has local changes\" */);\n return context.attachState === AttachState.Attached;\n }).map(async ([contextId, context]) => {\n const contextSummary = await context.summarize(fullTree, trackState);\n summaryBuilder.addWithStats(contextId, contextSummary);\n }));\n\n return summaryBuilder.getSummaryTree();\n }\n\n public createSummary(): ISummaryTreeWithStats {\n const builder = new SummaryTreeBuilder();\n // Attaching graph of some stores can cause other stores to get bound too.\n // So keep taking summary until no new stores get bound.\n let notBoundContextsLength: number;\n do {\n const builderTree = builder.summary.tree;\n notBoundContextsLength = this.contexts.notBoundLength();\n // Iterate over each data store and ask it to snapshot\n Array.from(this.contexts)\n .filter(([key, _]) =>\n // Take summary of bounded data stores only, make sure we haven't summarized them already\n // and no attach op has been fired for that data store because for loader versions <= 0.24\n // we set attach state as \"attaching\" before taking createNew summary.\n !(this.contexts.isNotBound(key)\n || builderTree[key]\n || this.attachOpFiredForDataStore.has(key)),\n )\n .map(([key, value]) => {\n let dataStoreSummary: ISummarizeResult;\n if (value.isLoaded) {\n const snapshot = value.generateAttachMessage().snapshot;\n dataStoreSummary = convertToSummaryTree(snapshot, true);\n } else {\n // If this data store is not yet loaded, then there should be no changes in the snapshot from\n // which it was created as it is detached container. So just use the previous snapshot.\n assert(!!this.baseSnapshot,\n 0x166 /* \"BaseSnapshot should be there as detached container loaded from snapshot\" */);\n dataStoreSummary = convertSnapshotTreeToSummaryTree(this.baseSnapshot.trees[key]);\n }\n builder.addWithStats(key, dataStoreSummary);\n });\n } while (notBoundContextsLength !== this.contexts.notBoundLength());\n\n return builder.getSummaryTree();\n }\n\n /**\n * Generates data used for garbage collection. It does the following:\n * 1. Calls into each child data store context to get its GC data.\n * 2. Prefixs the child context's id to the GC nodes in the child's GC data. This makes sure that the node can be\n * idenfied as belonging to the child.\n * 3. Adds a GC node for this channel to the nodes received from the children. All these nodes together represent\n * the GC data of this channel.\n * @param fullGC - true to bypass optimizations and force full generation of GC data.\n */\n public async getGCData(fullGC: boolean = false): Promise<IGarbageCollectionData> {\n const builder = new GCDataBuilder();\n // Iterate over each store and get their GC data.\n await Promise.all(Array.from(this.contexts)\n .filter(([_, context]) => {\n // Get GC data only for attached contexts. Detached contexts are not connected in the GC reference\n // graph so any references they might have won't be connected as well.\n return context.attachState === AttachState.Attached;\n }).map(async ([contextId, context]) => {\n const contextGCData = await context.getGCData(fullGC);\n // Prefix the child's id to the ids of its GC nodes so they can be identified as belonging to the child.\n // This also gradually builds the id of each node to be a path from the root.\n builder.prefixAndAddNodes(contextId, contextGCData.gcNodes);\n }));\n\n // Get the outbound routes and add a GC node for this channel.\n builder.addNode(\"/\", await this.getOutboundRoutes());\n return builder.getGCData();\n }\n\n /**\n * After GC has run, called to notify this Container's data stores of routes that are used in it.\n * @param usedRoutes - The routes that are used in all data stores in this Container.\n * @param gcTimestamp - The time when GC was run that generated these used routes. If any node node becomes\n * unreferenced as part of this GC run, this should be used to update the time when it happens.\n * @returns the total number of data stores and the number of data stores that are unused.\n */\n public updateUsedRoutes(usedRoutes: string[], gcTimestamp?: number) {\n // Get a map of data store ids to routes used in it.\n const usedDataStoreRoutes = getChildNodesUsedRoutes(usedRoutes);\n\n // Verify that the used routes are correct.\n for (const [id] of usedDataStoreRoutes) {\n assert(this.contexts.has(id), 0x167 /* \"Used route does not belong to any known data store\" */);\n }\n\n // Update the used routes in each data store. Used routes is empty for unused data stores.\n for (const [contextId, context] of this.contexts) {\n context.updateUsedRoutes(usedDataStoreRoutes.get(contextId) ?? [], gcTimestamp);\n }\n\n // Return the number of data stores that are unused.\n const dataStoreCount = this.contexts.size;\n return {\n dataStoreCount,\n unusedDataStoreCount: dataStoreCount - usedDataStoreRoutes.size,\n };\n }\n\n /**\n * When running GC in test mode, this is called to delete objects whose routes are unused. This enables testing\n * scenarios with accessing deleted content.\n * @param unusedRoutes - The routes that are unused in all data stores in this Container.\n */\n public deleteUnusedRoutes(unusedRoutes: string[]) {\n assert(this.runtime.gcTestMode, 0x1df /* \"Data stores should be deleted only in GC test mode\" */);\n for (const route of unusedRoutes) {\n const dataStoreId = route.split(\"/\")[1];\n // Delete the contexts of unused data stores.\n this.contexts.delete(dataStoreId);\n // Delete the summarizer node of the unused data stores.\n this.deleteChildSummarizerNodeFn(dataStoreId);\n }\n }\n\n /**\n * Returns the outbound routes of this channel. Only root data stores are considered referenced and their paths are\n * part of outbound routes.\n */\n private async getOutboundRoutes(): Promise<string[]> {\n const outboundRoutes: string[] = [];\n for (const [contextId, context] of this.contexts) {\n const isRootDataStore = await context.isRoot();\n if (isRootDataStore) {\n outboundRoutes.push(`/${contextId}`);\n }\n }\n return outboundRoutes;\n }\n}\n\nexport function getSummaryForDatastores(\n snapshot: ISnapshotTree | undefined,\n metadata?: IContainerRuntimeMetadata,\n): ISnapshotTree | undefined {\n if (!snapshot) {\n return undefined;\n }\n\n if (rootHasIsolatedChannels(metadata)) {\n const datastoresSnapshot = snapshot.trees[channelsTreeName];\n assert(!!datastoresSnapshot, 0x168 /* `expected ${channelsTreeName} tree in snapshot` */);\n return datastoresSnapshot;\n } else {\n // back-compat: strip out all non-datastore paths before giving to DataStores object.\n const datastoresTrees: ISnapshotTree[\"trees\"] = {};\n for (const [key, value] of Object.entries(snapshot.trees)) {\n if (!nonDataStorePaths.includes(key)) {\n datastoresTrees[key] = value;\n }\n }\n return {\n ...snapshot,\n trees: datastoresTrees,\n };\n }\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/container-runtime";
8
- export declare const pkgVersion = "0.47.0";
8
+ export declare const pkgVersion = "0.48.0";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/container-runtime";
8
- export const pkgVersion = "0.47.0";
8
+ export const pkgVersion = "0.48.0";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-runtime\";\nexport const pkgVersion = \"0.47.0\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,mCAAmC,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/container-runtime\";\nexport const pkgVersion = \"0.48.0\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/container-runtime",
3
- "version": "0.47.0",
3
+ "version": "0.48.0",
4
4
  "description": "Fluid container runtime",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": "https://github.com/microsoft/FluidFramework",
@@ -59,26 +59,26 @@
59
59
  "@fluidframework/common-definitions": "^0.20.1",
60
60
  "@fluidframework/common-utils": "^0.32.1",
61
61
  "@fluidframework/container-definitions": "^0.39.8",
62
- "@fluidframework/container-runtime-definitions": "^0.47.0",
63
- "@fluidframework/container-utils": "^0.47.0",
62
+ "@fluidframework/container-runtime-definitions": "^0.48.0",
63
+ "@fluidframework/container-utils": "^0.48.0",
64
64
  "@fluidframework/core-interfaces": "^0.39.7",
65
- "@fluidframework/datastore": "^0.47.0",
65
+ "@fluidframework/datastore": "^0.48.0",
66
66
  "@fluidframework/driver-definitions": "^0.39.6",
67
- "@fluidframework/driver-utils": "^0.47.0",
68
- "@fluidframework/garbage-collector": "^0.47.0",
69
- "@fluidframework/protocol-base": "^0.1030.0",
67
+ "@fluidframework/driver-utils": "^0.48.0",
68
+ "@fluidframework/garbage-collector": "^0.48.0",
69
+ "@fluidframework/protocol-base": "^0.1031.0-37526",
70
70
  "@fluidframework/protocol-definitions": "^0.1024.0",
71
- "@fluidframework/runtime-definitions": "^0.47.0",
72
- "@fluidframework/runtime-utils": "^0.47.0",
73
- "@fluidframework/telemetry-utils": "^0.47.0",
71
+ "@fluidframework/runtime-definitions": "^0.48.0",
72
+ "@fluidframework/runtime-utils": "^0.48.0",
73
+ "@fluidframework/telemetry-utils": "^0.48.0",
74
74
  "double-ended-queue": "^2.1.0-0",
75
75
  "uuid": "^8.3.1"
76
76
  },
77
77
  "devDependencies": {
78
78
  "@fluidframework/build-common": "^0.23.0",
79
79
  "@fluidframework/eslint-config-fluid": "^0.23.0",
80
- "@fluidframework/mocha-test-setup": "^0.47.0",
81
- "@fluidframework/test-runtime-utils": "^0.47.0",
80
+ "@fluidframework/mocha-test-setup": "^0.48.0",
81
+ "@fluidframework/test-runtime-utils": "^0.48.0",
82
82
  "@microsoft/api-extractor": "^7.16.1",
83
83
  "@types/double-ended-queue": "^2.1.0",
84
84
  "@types/mocha": "^8.2.2",
@@ -215,6 +215,12 @@ export interface IGCRuntimeOptions {
215
215
  */
216
216
  runFullGC?: boolean;
217
217
 
218
+ /**
219
+ * Flag that if true, will run sweep which may delete unused objects that meet certain criteria. Only takes
220
+ * effect if GC is enabled.
221
+ */
222
+ runSweep?: boolean;
223
+
218
224
  /**
219
225
  * Allows additional GC options to be passed.
220
226
  */
@@ -277,6 +283,8 @@ interface IRuntimeMessageMetadata {
277
283
  const runGCKey = "FluidRunGC";
278
284
  // Local storage key to turn GC test mode on / off.
279
285
  const gcTestModeKey = "FluidGCTestMode";
286
+ // Local storage key to turn GC sweep on / off.
287
+ const runSweepKey = "FluidRunSweep";
280
288
  // Local storage key to set the default flush mode to TurnBased
281
289
  const turnBasedFlushModeKey = "FluidFlushModeTurnBased";
282
290
 
@@ -780,6 +788,8 @@ export class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents>
780
788
  private latestSummaryGCVersion: GCVersion;
781
789
  // This is the source of truth for whether GC is enabled or not.
782
790
  private readonly shouldRunGC: boolean;
791
+ // This is the source of truth for whether GC sweep phase should run or not.
792
+ private readonly shouldRunSweep: boolean;
783
793
  /**
784
794
  * True if generating summaries with isolated channels is
785
795
  * explicitly disabled. This only affects how summaries are written,
@@ -836,7 +846,7 @@ export class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents>
836
846
  this.latestSummaryGCVersion = prevSummaryGCVersion ??
837
847
  (this.runtimeOptions.gcOptions.gcAllowed === true ? this.currentGCVersion : 0);
838
848
 
839
- // Can override with localStorage flag.
849
+ // Whether GC should run or not. Can override with localStorage flag.
840
850
  this.shouldRunGC = getLocalStorageFeatureGate(runGCKey) ?? (
841
851
  // GC must be enabled for the document.
842
852
  this.gcEnabled
@@ -844,6 +854,11 @@ export class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents>
844
854
  && !this.runtimeOptions.gcOptions.disableGC
845
855
  );
846
856
 
857
+ // Whether GC sweep phase should run or not. If this is false, only GC mark phase is run. Can override with
858
+ // localStorage flag.
859
+ this.shouldRunSweep = this.shouldRunGC &&
860
+ (getLocalStorageFeatureGate(runSweepKey) ?? this.runtimeOptions.gcOptions.runSweep === true);
861
+
847
862
  // Default to false (enabled).
848
863
  this.disableIsolatedChannels = this.runtimeOptions.summaryOptions.disableIsolatedChannels ?? false;
849
864
 
@@ -873,6 +888,8 @@ export class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents>
873
888
  throwOnFailure: true,
874
889
  // If GC is disabled, let the summarizer node know so that it does not track GC state.
875
890
  gcDisabled: !this.shouldRunGC,
891
+ // The max duration for which objects can be unreferenced before they are eligible for deletion.
892
+ maxUnreferencedDurationMs: this.runtimeOptions.gcOptions.maxUnreferencedDurationMs,
876
893
  },
877
894
  );
878
895
 
@@ -1734,6 +1751,8 @@ export class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents>
1734
1751
  runGC?: boolean,
1735
1752
  /** True to generate full GC data; defaults to false */
1736
1753
  fullGC?: boolean,
1754
+ /** True to run GC sweep phase after the mark phase; defaults to false */
1755
+ runSweep?: boolean,
1737
1756
  }): Promise<ISummaryTreeWithStats> {
1738
1757
  const { summaryLogger, fullTree = false, trackState = true, runGC = true, fullGC = false } = options;
1739
1758
 
@@ -1838,6 +1857,7 @@ export class ContainerRuntime extends TypedEventEmitter<IContainerRuntimeEvents>
1838
1857
  trackState: true,
1839
1858
  runGC: this.shouldRunGC,
1840
1859
  fullGC: this.runtimeOptions.gcOptions.runFullGC || forceRegenerateData,
1860
+ runSweep: this.shouldRunSweep,
1841
1861
  });
1842
1862
  } catch (error) {
1843
1863
  return { stage: "base", referenceSequenceNumber: summaryRefSeqNum, error };
package/src/dataStores.ts CHANGED
@@ -34,7 +34,7 @@ import {
34
34
  responseToException,
35
35
  SummaryTreeBuilder,
36
36
  } from "@fluidframework/runtime-utils";
37
- import { ChildLogger } from "@fluidframework/telemetry-utils";
37
+ import { ChildLogger, TelemetryDataTag } from "@fluidframework/telemetry-utils";
38
38
  import { AttachState } from "@fluidframework/container-definitions";
39
39
  import { BlobCacheStorageService, buildSnapshotTree } from "@fluidframework/driver-utils";
40
40
  import { assert, Lazy } from "@fluidframework/common-utils";
@@ -143,9 +143,16 @@ export class DataStores implements IDisposable {
143
143
 
144
144
  // If a non-local operation then go and create the object, otherwise mark it as officially attached.
145
145
  if (this.contexts.has(attachMessage.id)) {
146
+ // TODO: dataStoreId may require a different tag from PackageData #7488
146
147
  const error = new DataCorruptionError(
147
148
  "duplicateDataStoreCreatedWithExistingId",
148
- extractSafePropertiesFromMessage(message),
149
+ {
150
+ ...extractSafePropertiesFromMessage(message),
151
+ dataStoreId: {
152
+ value: attachMessage.id,
153
+ tag: TelemetryDataTag.PackageData,
154
+ },
155
+ },
149
156
  );
150
157
  throw error;
151
158
  }
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/container-runtime";
9
- export const pkgVersion = "0.47.0";
9
+ export const pkgVersion = "0.48.0";