@fluidframework/container-runtime 0.54.2 → 0.56.0-49831
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +1 -1
- package/dist/blobManager.js +1 -1
- package/dist/blobManager.js.map +1 -1
- package/dist/containerRuntime.d.ts +20 -14
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +51 -58
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStoreContext.d.ts +57 -33
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +44 -54
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStores.d.ts +12 -2
- package/dist/dataStores.d.ts.map +1 -1
- package/dist/dataStores.js +106 -32
- package/dist/dataStores.js.map +1 -1
- package/dist/garbageCollection.d.ts +49 -14
- package/dist/garbageCollection.d.ts.map +1 -1
- package/dist/garbageCollection.js +122 -26
- package/dist/garbageCollection.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -17
- package/dist/index.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/runningSummarizer.d.ts.map +1 -1
- package/dist/runningSummarizer.js +2 -9
- package/dist/runningSummarizer.js.map +1 -1
- package/dist/summaryFormat.d.ts +2 -0
- package/dist/summaryFormat.d.ts.map +1 -1
- package/dist/summaryFormat.js +2 -4
- package/dist/summaryFormat.js.map +1 -1
- package/dist/summaryGenerator.d.ts +0 -5
- package/dist/summaryGenerator.d.ts.map +1 -1
- package/dist/summaryGenerator.js.map +1 -1
- package/dist/summaryManager.d.ts +1 -0
- package/dist/summaryManager.d.ts.map +1 -1
- package/dist/summaryManager.js +7 -2
- package/dist/summaryManager.js.map +1 -1
- package/garbageCollection.md +33 -0
- package/lib/blobManager.js +1 -1
- package/lib/blobManager.js.map +1 -1
- package/lib/containerRuntime.d.ts +20 -14
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +51 -58
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStoreContext.d.ts +57 -33
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +42 -52
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStores.d.ts +12 -2
- package/lib/dataStores.d.ts.map +1 -1
- package/lib/dataStores.js +107 -33
- package/lib/dataStores.js.map +1 -1
- package/lib/garbageCollection.d.ts +49 -14
- package/lib/garbageCollection.d.ts.map +1 -1
- package/lib/garbageCollection.js +122 -26
- package/lib/garbageCollection.js.map +1 -1
- package/lib/index.d.ts +7 -7
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -7
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/runningSummarizer.d.ts.map +1 -1
- package/lib/runningSummarizer.js +2 -9
- package/lib/runningSummarizer.js.map +1 -1
- package/lib/summaryFormat.d.ts +2 -0
- package/lib/summaryFormat.d.ts.map +1 -1
- package/lib/summaryFormat.js +2 -4
- package/lib/summaryFormat.js.map +1 -1
- package/lib/summaryGenerator.d.ts +0 -5
- package/lib/summaryGenerator.d.ts.map +1 -1
- package/lib/summaryGenerator.js.map +1 -1
- package/lib/summaryManager.d.ts +1 -0
- package/lib/summaryManager.d.ts.map +1 -1
- package/lib/summaryManager.js +7 -2
- package/lib/summaryManager.js.map +1 -1
- package/package.json +24 -23
- package/src/blobManager.ts +1 -1
- package/src/containerRuntime.ts +69 -65
- package/src/dataStoreContext.ts +105 -129
- package/src/dataStores.ts +118 -68
- package/src/garbageCollection.ts +156 -31
- package/src/index.ts +52 -6
- package/src/packageVersion.ts +1 -1
- package/src/runningSummarizer.ts +2 -7
- package/src/summaryFormat.ts +4 -4
- package/src/summaryGenerator.ts +0 -5
- package/src/summaryManager.ts +9 -3
package/.eslintrc.js
CHANGED
package/dist/blobManager.js
CHANGED
|
@@ -71,7 +71,7 @@ class BlobManager {
|
|
|
71
71
|
if (this.runtime.attachState === container_definitions_1.AttachState.Attaching) {
|
|
72
72
|
// blob upload is not supported in "Attaching" state
|
|
73
73
|
this.logger.sendTelemetryEvent({ eventName: "CreateBlobWhileAttaching" });
|
|
74
|
-
await new Promise((
|
|
74
|
+
await new Promise((resolve) => this.runtime.once("attached", resolve));
|
|
75
75
|
}
|
|
76
76
|
const response = await this.getStorage().createBlob(blob);
|
|
77
77
|
const handle = new BlobHandle(`${BlobManager.basePath}/${response.id}`, this.routeContext,
|
package/dist/blobManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobManager.js","sourceRoot":"","sources":["../src/blobManager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,iEAAmF;AAEnF,iEAA0E;AAE1E,+DAAgE;AAEhE,iFAAoE;AAEpE;;;;;;GAMG;AACH,MAAa,UAAU;IAWnB,YACoB,IAAY,EACZ,YAAiC,EAC1C,GAAuB;QAFd,SAAI,GAAJ,IAAI,CAAQ;QACZ,iBAAY,GAAZ,YAAY,CAAqB;QAC1C,QAAG,GAAH,GAAG,CAAoB;QAb1B,aAAQ,GAAY,KAAK,CAAC;QAe9B,IAAI,CAAC,YAAY,GAAG,yCAAyB,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3E,CAAC;IAdD,IAAW,YAAY,KAAmB,OAAO,IAAI,CAAC,CAAC,CAAC;IAExD,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAYM,WAAW;QACd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAEM,IAAI,CAAC,MAAoB;QAC5B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;CACJ;AA1BD,gCA0BC;AAUD,MAAa,WAAW;IAapB,YACqB,YAAiC,EAClD,QAA8B,EACb,UAAyC,EACzC,kBAA4C,EAC5C,OAA0B,EAC1B,MAAwB;QALxB,iBAAY,GAAZ,YAAY,CAAqB;QAEjC,eAAU,GAAV,UAAU,CAA+B;QACzC,uBAAkB,GAAlB,kBAAkB,CAA0B;QAC5C,YAAO,GAAP,OAAO,CAAmB;QAC1B,WAAM,GAAN,MAAM,CAAkB;QAhB7C,oBAAoB;QACH,YAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;QAClD,+GAA+G;QAC/G,mCAAmC;QAClB,mBAAc,GAAgC,IAAI,GAAG,EAAE,CAAC;QACzE,qDAAqD;QACpC,oBAAe,GAAgB,IAAI,GAAG,EAAE,CAAC;QAYtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC9B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE;gBAChD,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;aAC/E;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAEO,OAAO,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,MAAc;;QAC/B,MAAM,SAAS,eAAG,IAAI,CAAC,aAAa,0CAAE,GAAG,CAAC,MAAM,oCAAK,MAAM,CAAC;QAC5D,qBAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAExE,OAAO,IAAI,UAAU,CACjB,GAAG,WAAW,CAAC,QAAQ,IAAI,SAAS,EAAE,EACtC,IAAI,CAAC,YAAY,EACjB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CACpD,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAqB;;QACzC,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,mCAAW,CAAC,SAAS,EAAE;YACpD,oDAAoD;YACpD,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAAC,CAAC;YAC1E,MAAM,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;SACxE;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,UAAU,CACzB,GAAG,WAAW,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,EAAE,EACxC,IAAI,CAAC,YAAY;QACjB,oGAAoG;QACpG,oDAAoD;QACpD,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CACnE,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,mCAAW,CAAC,QAAQ,EAAE;YACnD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC;SACjB;QAED,oEAAoE;QACpE,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACtC,aAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,0CAAE,OAAO,CAAA,CAAC;SACvD;aAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;YACvC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,uBAAQ,EAAQ,CAAC,CAAC;YAE3D,oEAAoE;YACpE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACrC,aAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,0CAAE,OAAO,CAAA,CAAC;SACvD;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,mBAAmB,CAAC,MAAc,EAAE,KAAc;;QACrD,qBAAM,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC1G,MAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,0CAAE,OAAO,GAAG;QAC3C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,IAAI,CACpB,SAAoC,EACpC,YAAyD;QAEzD,IAAI,CAAC,SAAS,EAAE;YACZ,OAAO,EAAE,CAAC;SACb;QACD,IAAI,aAAa,CAAC;QAClB,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5D,IAAI,OAAO,EAAE;YACT,aAAa,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;SAC/C;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACK,IAAI,CAAC,QAA8B;;QACvC,IAAI,QAAQ,CAAC,GAAG,EAAE;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,mCAAW,CAAC,QAAQ,CAAC;YACnE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;SACrG;QACD,IAAI,QAAQ,CAAC,aAAa,EAAE;YACxB,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;SACxD;QACD,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC3B,SAAS,EAAE,uBAAuB;YAClC,KAAK,cAAE,QAAQ,CAAC,GAAG,0CAAE,MAAM,mCAAI,CAAC;YAChC,aAAa,QAAE,QAAQ,CAAC,aAAa,0CAAE,MAAM;SAChD,CAAC,CAAC;IACP,CAAC;IAEM,QAAQ;QACX,6GAA6G;QAC7G,kFAAkF;QAClF,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,mCAAW,CAAC,QAAQ,CAAC;QACtG,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QAC1E,MAAM,OAAO,GAAiB,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,mCAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE;YACnD,OAAO,CAAC,IAAI,CAAC,IAAI,6BAAa,CAC1B,WAAW,CAAC,qBAAqB,EACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAC5D,CAAC;SACL;QACD,OAAO,EAAE,OAAO,EAAE,CAAC;IACvB,CAAC;IAEM,gBAAgB,CAAC,KAA0B;QAC9C,qBAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,mCAAW,CAAC,QAAQ,EACpD,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACxE,qBAAM,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzE,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,KAAK,EAAE;YACtC,qBAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SAC/B;QACD,qBAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjG,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC/B,CAAC;;AAhKL,kCAiKC;AAhK0B,oBAAQ,GAAG,QAAQ,CAAC;AACnB,iCAAqB,GAAG,gBAAgB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle, IFluidHandleContext } from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { AttachmentTreeEntry, BlobTreeEntry } from \"@fluidframework/protocol-base\";\nimport { ISnapshotTree, ITree, ITreeEntry } from \"@fluidframework/protocol-definitions\";\nimport { generateHandleContextPath } from \"@fluidframework/runtime-utils\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, Deferred } from \"@fluidframework/common-utils\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\n\n/**\n * This class represents blob (long string)\n * This object is used only when creating (writing) new blob and serialization purposes.\n * De-serialization process goes through FluidObjectHandle and request flow:\n * DataObject.request() recognizes requests in the form of `/blobs/<id>`\n * and loads blob.\n */\nexport class BlobHandle implements IFluidHandle<ArrayBufferLike> {\n private attached: boolean = false;\n\n public get IFluidHandle(): IFluidHandle { return this; }\n\n public get isAttached(): boolean {\n return this.attached;\n }\n\n public readonly absolutePath: string;\n\n constructor(\n public readonly path: string,\n public readonly routeContext: IFluidHandleContext,\n public get: () => Promise<any>,\n ) {\n this.absolutePath = generateHandleContextPath(path, this.routeContext);\n }\n\n public attachGraph() {\n this.attached = true;\n }\n\n public bind(handle: IFluidHandle) {\n throw new Error(\"Cannot bind to blob handle\");\n }\n}\n\n/**\n * Information from a snapshot needed to load BlobManager\n */\nexport interface IBlobManagerLoadInfo {\n ids?: string[],\n redirectTable?: [string, string][],\n}\n\nexport class BlobManager {\n public static readonly basePath = \"_blobs\";\n private static readonly redirectTableBlobName = \".redirectTable\";\n // uploaded blob IDs\n private readonly blobIds: Set<string> = new Set();\n // blobs for which upload is pending. maps to a promise that will resolve once the blob has been uploaded and a\n // BlobAttach op has round-tripped.\n private readonly pendingBlobIds: Map<string, Deferred<void>> = new Map();\n // blobs uploaded while detached; cleared upon attach\n private readonly detachedBlobIds: Set<string> = new Set();\n // map of detached blob IDs to IDs used by storage. used to support blob handles given out while detached\n private redirectTable: Map<string, string> | undefined;\n\n constructor(\n private readonly routeContext: IFluidHandleContext,\n snapshot: IBlobManagerLoadInfo,\n private readonly getStorage: () => IDocumentStorageService,\n private readonly attachBlobCallback: (blobId: string) => void,\n private readonly runtime: IContainerRuntime,\n private readonly logger: ITelemetryLogger,\n ) {\n this.runtime.once(\"dispose\", () => {\n for (const promise of this.pendingBlobIds.values()) {\n promise.reject(new Error(\"runtime disposed while blobAttach op in flight\"));\n }\n });\n this.load(snapshot);\n }\n\n private hasBlob(id: string): boolean {\n return this.blobIds.has(id) || this.detachedBlobIds.has(id);\n }\n\n public async getBlob(blobId: string): Promise<IFluidHandle<ArrayBufferLike>> {\n const storageId = this.redirectTable?.get(blobId) ?? blobId;\n assert(this.hasBlob(storageId), 0x11f /* \"requesting unknown blobs\" */);\n\n return new BlobHandle(\n `${BlobManager.basePath}/${storageId}`,\n this.routeContext,\n async () => this.getStorage().readBlob(storageId),\n );\n }\n\n public async createBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>> {\n if (this.runtime.attachState === AttachState.Attaching) {\n // blob upload is not supported in \"Attaching\" state\n this.logger.sendTelemetryEvent({ eventName: \"CreateBlobWhileAttaching\" });\n await new Promise<void>((res) => this.runtime.once(\"attached\", res));\n }\n\n const response = await this.getStorage().createBlob(blob);\n const handle = new BlobHandle(\n `${BlobManager.basePath}/${response.id}`,\n this.routeContext,\n // get() should go through BlobManager.getBlob() so handles created while detached can be redirected\n // to the correct storage id after they are uploaded\n async () => this.getBlob(response.id).then(async (h) => h.get()),\n );\n\n if (this.runtime.attachState === AttachState.Detached) {\n this.detachedBlobIds.add(response.id);\n return handle;\n }\n\n // Note - server will de-dup blobs, so we might get existing blobId!\n if (this.pendingBlobIds.has(response.id)) {\n await this.pendingBlobIds.get(response.id)?.promise;\n } else if (!this.blobIds.has(response.id)) {\n this.pendingBlobIds.set(response.id, new Deferred<void>());\n\n // send blob attach op and wait until we see it to return the handle\n this.attachBlobCallback(response.id);\n await this.pendingBlobIds.get(response.id)?.promise;\n }\n\n return handle;\n }\n\n public processBlobAttachOp(blobId: string, local: boolean) {\n assert(!local || this.pendingBlobIds.has(blobId), 0x1f8 /* \"local BlobAttach op with no pending blob\" */);\n this.pendingBlobIds.get(blobId)?.resolve();\n this.pendingBlobIds.delete(blobId);\n this.blobIds.add(blobId);\n }\n\n /**\n * Reads blobs needed to load BlobManager from storage.\n */\n public static async load(\n blobsTree: ISnapshotTree | undefined,\n tryFetchBlob: (id: string) => Promise<[string, string][]>,\n ): Promise<IBlobManagerLoadInfo> {\n if (!blobsTree) {\n return {};\n }\n let redirectTable;\n const tableId = blobsTree.blobs[this.redirectTableBlobName];\n if (tableId) {\n redirectTable = await tryFetchBlob(tableId);\n }\n const ids = Object.entries(blobsTree.blobs)\n .filter(([k, _]) => k !== this.redirectTableBlobName).map(([_, v]) => v);\n return { ids, redirectTable };\n }\n\n /**\n * Load a set of previously attached blob IDs from a previous snapshot. Note\n * that BlobManager tracking and reporting attached blobs is a temporary\n * solution since storage expects attached blobs to be reported and any that\n * are not reported as attached may be GCed. In the future attached blob\n * IDs will be collected at summarization time, and runtime will not care\n * about the existence or specific formatting of this tree in returned\n * snapshots.\n *\n * @param blobsTree - Tree containing IDs of previously attached blobs. This\n * corresponds to snapshot() below. We look for the IDs in the blob entries\n * of the tree since the both the r11s and SPO drivers replace the\n * attachment types returned in snapshot() with blobs.\n */\n private load(snapshot: IBlobManagerLoadInfo): void {\n if (snapshot.ids) {\n const detached = this.runtime.attachState === AttachState.Detached;\n snapshot.ids.map((entry) => detached ? this.detachedBlobIds.add(entry) : this.blobIds.add(entry));\n }\n if (snapshot.redirectTable) {\n this.redirectTable = new Map(snapshot.redirectTable);\n }\n this.logger.sendTelemetryEvent({\n eventName: \"AttachmentBlobsLoaded\",\n count: snapshot.ids?.length ?? 0,\n redirectTable: snapshot.redirectTable?.length,\n });\n }\n\n public snapshot(): ITree {\n // If we have a redirect table it means the container is about to transition to \"Attaching\" state, so we need\n // to return an actual snapshot containing all the real storage IDs we know about.\n const attachingOrAttached = !!this.redirectTable || this.runtime.attachState !== AttachState.Detached;\n const blobIds = attachingOrAttached ? this.blobIds : this.detachedBlobIds;\n const entries: ITreeEntry[] = [...blobIds].map((id) => new AttachmentTreeEntry(id, id));\n if (this.redirectTable && this.redirectTable.size > 0) {\n entries.push(new BlobTreeEntry(\n BlobManager.redirectTableBlobName,\n JSON.stringify(Array.from(this.redirectTable.entries()))),\n );\n }\n return { entries };\n }\n\n public setRedirectTable(table: Map<string, string>) {\n assert(this.runtime.attachState === AttachState.Detached,\n 0x252 /* \"redirect table can only be set in detached container\" */);\n assert(!this.redirectTable, 0x253 /* \"redirect table already exists\" */);\n for (const [localId, storageId] of table) {\n assert(this.detachedBlobIds.delete(localId), 0x254 /* \"unrecognized id in redirect table\" */);\n this.blobIds.add(storageId);\n }\n assert(this.detachedBlobIds.size === 0, 0x255 /* \"detached blob id absent in redirect table\" */);\n this.redirectTable = table;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"blobManager.js","sourceRoot":"","sources":["../src/blobManager.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 { IFluidHandle, IFluidHandleContext } from \"@fluidframework/core-interfaces\";\nimport { IDocumentStorageService } from \"@fluidframework/driver-definitions\";\nimport { AttachmentTreeEntry, BlobTreeEntry } from \"@fluidframework/protocol-base\";\nimport { ISnapshotTree, ITree, ITreeEntry } from \"@fluidframework/protocol-definitions\";\nimport { generateHandleContextPath } from \"@fluidframework/runtime-utils\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { assert, Deferred } from \"@fluidframework/common-utils\";\nimport { IContainerRuntime } from \"@fluidframework/container-runtime-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\n\n/**\n * This class represents blob (long string)\n * This object is used only when creating (writing) new blob and serialization purposes.\n * De-serialization process goes through FluidObjectHandle and request flow:\n * DataObject.request() recognizes requests in the form of `/blobs/<id>`\n * and loads blob.\n */\nexport class BlobHandle implements IFluidHandle<ArrayBufferLike> {\n private attached: boolean = false;\n\n public get IFluidHandle(): IFluidHandle { return this; }\n\n public get isAttached(): boolean {\n return this.attached;\n }\n\n public readonly absolutePath: string;\n\n constructor(\n public readonly path: string,\n public readonly routeContext: IFluidHandleContext,\n public get: () => Promise<any>,\n ) {\n this.absolutePath = generateHandleContextPath(path, this.routeContext);\n }\n\n public attachGraph() {\n this.attached = true;\n }\n\n public bind(handle: IFluidHandle) {\n throw new Error(\"Cannot bind to blob handle\");\n }\n}\n\n/**\n * Information from a snapshot needed to load BlobManager\n */\nexport interface IBlobManagerLoadInfo {\n ids?: string[],\n redirectTable?: [string, string][],\n}\n\nexport class BlobManager {\n public static readonly basePath = \"_blobs\";\n private static readonly redirectTableBlobName = \".redirectTable\";\n // uploaded blob IDs\n private readonly blobIds: Set<string> = new Set();\n // blobs for which upload is pending. maps to a promise that will resolve once the blob has been uploaded and a\n // BlobAttach op has round-tripped.\n private readonly pendingBlobIds: Map<string, Deferred<void>> = new Map();\n // blobs uploaded while detached; cleared upon attach\n private readonly detachedBlobIds: Set<string> = new Set();\n // map of detached blob IDs to IDs used by storage. used to support blob handles given out while detached\n private redirectTable: Map<string, string> | undefined;\n\n constructor(\n private readonly routeContext: IFluidHandleContext,\n snapshot: IBlobManagerLoadInfo,\n private readonly getStorage: () => IDocumentStorageService,\n private readonly attachBlobCallback: (blobId: string) => void,\n private readonly runtime: IContainerRuntime,\n private readonly logger: ITelemetryLogger,\n ) {\n this.runtime.once(\"dispose\", () => {\n for (const promise of this.pendingBlobIds.values()) {\n promise.reject(new Error(\"runtime disposed while blobAttach op in flight\"));\n }\n });\n this.load(snapshot);\n }\n\n private hasBlob(id: string): boolean {\n return this.blobIds.has(id) || this.detachedBlobIds.has(id);\n }\n\n public async getBlob(blobId: string): Promise<IFluidHandle<ArrayBufferLike>> {\n const storageId = this.redirectTable?.get(blobId) ?? blobId;\n assert(this.hasBlob(storageId), 0x11f /* \"requesting unknown blobs\" */);\n\n return new BlobHandle(\n `${BlobManager.basePath}/${storageId}`,\n this.routeContext,\n async () => this.getStorage().readBlob(storageId),\n );\n }\n\n public async createBlob(blob: ArrayBufferLike): Promise<IFluidHandle<ArrayBufferLike>> {\n if (this.runtime.attachState === AttachState.Attaching) {\n // blob upload is not supported in \"Attaching\" state\n this.logger.sendTelemetryEvent({ eventName: \"CreateBlobWhileAttaching\" });\n await new Promise<void>((resolve) => this.runtime.once(\"attached\", resolve));\n }\n\n const response = await this.getStorage().createBlob(blob);\n const handle = new BlobHandle(\n `${BlobManager.basePath}/${response.id}`,\n this.routeContext,\n // get() should go through BlobManager.getBlob() so handles created while detached can be redirected\n // to the correct storage id after they are uploaded\n async () => this.getBlob(response.id).then(async (h) => h.get()),\n );\n\n if (this.runtime.attachState === AttachState.Detached) {\n this.detachedBlobIds.add(response.id);\n return handle;\n }\n\n // Note - server will de-dup blobs, so we might get existing blobId!\n if (this.pendingBlobIds.has(response.id)) {\n await this.pendingBlobIds.get(response.id)?.promise;\n } else if (!this.blobIds.has(response.id)) {\n this.pendingBlobIds.set(response.id, new Deferred<void>());\n\n // send blob attach op and wait until we see it to return the handle\n this.attachBlobCallback(response.id);\n await this.pendingBlobIds.get(response.id)?.promise;\n }\n\n return handle;\n }\n\n public processBlobAttachOp(blobId: string, local: boolean) {\n assert(!local || this.pendingBlobIds.has(blobId), 0x1f8 /* \"local BlobAttach op with no pending blob\" */);\n this.pendingBlobIds.get(blobId)?.resolve();\n this.pendingBlobIds.delete(blobId);\n this.blobIds.add(blobId);\n }\n\n /**\n * Reads blobs needed to load BlobManager from storage.\n */\n public static async load(\n blobsTree: ISnapshotTree | undefined,\n tryFetchBlob: (id: string) => Promise<[string, string][]>,\n ): Promise<IBlobManagerLoadInfo> {\n if (!blobsTree) {\n return {};\n }\n let redirectTable;\n const tableId = blobsTree.blobs[this.redirectTableBlobName];\n if (tableId) {\n redirectTable = await tryFetchBlob(tableId);\n }\n const ids = Object.entries(blobsTree.blobs)\n .filter(([k, _]) => k !== this.redirectTableBlobName).map(([_, v]) => v);\n return { ids, redirectTable };\n }\n\n /**\n * Load a set of previously attached blob IDs from a previous snapshot. Note\n * that BlobManager tracking and reporting attached blobs is a temporary\n * solution since storage expects attached blobs to be reported and any that\n * are not reported as attached may be GCed. In the future attached blob\n * IDs will be collected at summarization time, and runtime will not care\n * about the existence or specific formatting of this tree in returned\n * snapshots.\n *\n * @param blobsTree - Tree containing IDs of previously attached blobs. This\n * corresponds to snapshot() below. We look for the IDs in the blob entries\n * of the tree since the both the r11s and SPO drivers replace the\n * attachment types returned in snapshot() with blobs.\n */\n private load(snapshot: IBlobManagerLoadInfo): void {\n if (snapshot.ids) {\n const detached = this.runtime.attachState === AttachState.Detached;\n snapshot.ids.map((entry) => detached ? this.detachedBlobIds.add(entry) : this.blobIds.add(entry));\n }\n if (snapshot.redirectTable) {\n this.redirectTable = new Map(snapshot.redirectTable);\n }\n this.logger.sendTelemetryEvent({\n eventName: \"AttachmentBlobsLoaded\",\n count: snapshot.ids?.length ?? 0,\n redirectTable: snapshot.redirectTable?.length,\n });\n }\n\n public snapshot(): ITree {\n // If we have a redirect table it means the container is about to transition to \"Attaching\" state, so we need\n // to return an actual snapshot containing all the real storage IDs we know about.\n const attachingOrAttached = !!this.redirectTable || this.runtime.attachState !== AttachState.Detached;\n const blobIds = attachingOrAttached ? this.blobIds : this.detachedBlobIds;\n const entries: ITreeEntry[] = [...blobIds].map((id) => new AttachmentTreeEntry(id, id));\n if (this.redirectTable && this.redirectTable.size > 0) {\n entries.push(new BlobTreeEntry(\n BlobManager.redirectTableBlobName,\n JSON.stringify(Array.from(this.redirectTable.entries()))),\n );\n }\n return { entries };\n }\n\n public setRedirectTable(table: Map<string, string>) {\n assert(this.runtime.attachState === AttachState.Detached,\n 0x252 /* \"redirect table can only be set in detached container\" */);\n assert(!this.redirectTable, 0x253 /* \"redirect table already exists\" */);\n for (const [localId, storageId] of table) {\n assert(this.detachedBlobIds.delete(localId), 0x254 /* \"unrecognized id in redirect table\" */);\n this.blobIds.add(storageId);\n }\n assert(this.detachedBlobIds.size === 0, 0x255 /* \"detached blob id absent in redirect table\" */);\n this.redirectTable = table;\n }\n}\n"]}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
/// <reference types="node" />
|
|
6
6
|
import { EventEmitter } from "events";
|
|
7
7
|
import { ITelemetryLogger } from "@fluidframework/common-definitions";
|
|
8
|
-
import { FluidObject,
|
|
9
|
-
import { IAudience, IFluidTokenProvider, IContainerContext, IDeltaManager, IRuntime,
|
|
8
|
+
import { FluidObject, IFluidHandle, IFluidHandleContext, IFluidObject, IFluidRouter, IRequest, IResponse } from "@fluidframework/core-interfaces";
|
|
9
|
+
import { IAudience, IFluidTokenProvider, IContainerContext, IDeltaManager, IRuntime, ICriticalContainerError, AttachState, ILoaderOptions } from "@fluidframework/container-definitions";
|
|
10
10
|
import { IContainerRuntime, IContainerRuntimeEvents } from "@fluidframework/container-runtime-definitions";
|
|
11
11
|
import { TypedEventEmitter } from "@fluidframework/common-utils";
|
|
12
12
|
import { IDocumentStorageService } from "@fluidframework/driver-definitions";
|
|
@@ -98,6 +98,15 @@ export interface IContainerRuntimeOptions {
|
|
|
98
98
|
*/
|
|
99
99
|
loadSequenceNumberVerification?: "close" | "log" | "bypass";
|
|
100
100
|
}
|
|
101
|
+
export declare enum RuntimeMessage {
|
|
102
|
+
FluidDataStoreOp = "component",
|
|
103
|
+
Attach = "attach",
|
|
104
|
+
ChunkedOp = "chunkedOp",
|
|
105
|
+
BlobAttach = "blobAttach",
|
|
106
|
+
Rejoin = "rejoin",
|
|
107
|
+
Alias = "alias",
|
|
108
|
+
Operation = "op"
|
|
109
|
+
}
|
|
101
110
|
export declare function isRuntimeMessage(message: ISequencedDocumentMessage): boolean;
|
|
102
111
|
export declare function unpackRuntimeMessage(message: ISequencedDocumentMessage): ISequencedDocumentMessage;
|
|
103
112
|
/**
|
|
@@ -155,10 +164,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
155
164
|
* @param existing - (optional) When loading from an existing snapshot. Precedes context.existing if provided
|
|
156
165
|
*/
|
|
157
166
|
static load(context: IContainerContext, registryEntries: NamedFluidDataStoreRegistryEntries, requestHandler?: (request: IRequest, runtime: IContainerRuntime) => Promise<IResponse>, runtimeOptions?: IContainerRuntimeOptions, containerScope?: FluidObject, existing?: boolean): Promise<ContainerRuntime>;
|
|
158
|
-
/**
|
|
159
|
-
* @deprecated This will be removed in a later release. Deprecated in 0.53
|
|
160
|
-
*/
|
|
161
|
-
get id(): string;
|
|
162
167
|
get options(): ILoaderOptions;
|
|
163
168
|
get clientId(): string | undefined;
|
|
164
169
|
get clientDetails(): IClientDetails;
|
|
@@ -196,6 +201,7 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
196
201
|
get disposed(): boolean;
|
|
197
202
|
private dirtyContainer;
|
|
198
203
|
private emitDirtyDocumentEvent;
|
|
204
|
+
private summarizerWarning;
|
|
199
205
|
/**
|
|
200
206
|
* Summarizer is responsible for coordinating when to send generate and send summaries.
|
|
201
207
|
* It is the main entry point for summary work.
|
|
@@ -209,11 +215,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
209
215
|
private readonly garbageCollector;
|
|
210
216
|
private readonly chunkMap;
|
|
211
217
|
private readonly dataStores;
|
|
212
|
-
/**
|
|
213
|
-
* True, if GC data should be written at root of the summary tree.
|
|
214
|
-
* False, if data stores should write GC blobs in their summary tree.
|
|
215
|
-
*/
|
|
216
|
-
get writeGCDataAtRoot(): boolean;
|
|
217
218
|
/**
|
|
218
219
|
* True if generating summaries with isolated channels is
|
|
219
220
|
* explicitly disabled. This only affects how summaries are written,
|
|
@@ -229,7 +230,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
229
230
|
private constructor();
|
|
230
231
|
dispose(error?: Error): void;
|
|
231
232
|
get IFluidTokenProvider(): IFluidTokenProvider | undefined;
|
|
232
|
-
get IFluidConfiguration(): IFluidConfiguration;
|
|
233
233
|
/**
|
|
234
234
|
* Notifies this object about the request made to the container.
|
|
235
235
|
* @param request - Request made to the handler.
|
|
@@ -255,7 +255,7 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
255
255
|
* @deprecated - Use summarize to get summary of the container runtime.
|
|
256
256
|
*/
|
|
257
257
|
snapshot(): Promise<ITree>;
|
|
258
|
-
private
|
|
258
|
+
private addContainerStateToSummary;
|
|
259
259
|
private replayPendingStates;
|
|
260
260
|
/**
|
|
261
261
|
* Used to apply stashed ops at their reference sequence number.
|
|
@@ -286,7 +286,6 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
286
286
|
private canSendOps;
|
|
287
287
|
getQuorum(): IQuorumClients;
|
|
288
288
|
getAudience(): IAudience;
|
|
289
|
-
readonly raiseContainerWarning: (warning: ContainerWarning) => void;
|
|
290
289
|
/**
|
|
291
290
|
* Returns true of container is dirty, i.e. there are some pending local changes that
|
|
292
291
|
* either were not sent out to delta stream or were not yet acknowledged.
|
|
@@ -328,6 +327,13 @@ export declare class ContainerRuntime extends TypedEventEmitter<IContainerRuntim
|
|
|
328
327
|
/** True to run GC sweep phase after the mark phase */
|
|
329
328
|
runSweep?: boolean;
|
|
330
329
|
}): Promise<ISummaryTreeWithStats>;
|
|
330
|
+
/**
|
|
331
|
+
* Implementation of IGarbageCollectionRuntime::updateStateBeforeGC.
|
|
332
|
+
* Before GC runs, called by the garbage collector to update any pending GC state. This is mainly used to notify
|
|
333
|
+
* the garbage collector of references detected since the last GC run. Most references are notified immediately
|
|
334
|
+
* but there can be some for which async operation is required (such as detecting new root data stores).
|
|
335
|
+
*/
|
|
336
|
+
updateStateBeforeGC(): Promise<void>;
|
|
331
337
|
/**
|
|
332
338
|
* Implementation of IGarbageCollectionRuntime::getGCData.
|
|
333
339
|
* Generates and returns the GC data for this container.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containerRuntime.d.ts","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"containerRuntime.d.ts","sourceRoot":"","sources":["../src/containerRuntime.ts"],"names":[],"mappings":"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"}
|
package/dist/containerRuntime.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ContainerRuntime = exports.getDeviceSpec = exports.agentSchedulerId = exports.ScheduleManager = exports.unpackRuntimeMessage = exports.isRuntimeMessage = exports.ContainerMessageType = void 0;
|
|
7
|
+
exports.ContainerRuntime = exports.getDeviceSpec = exports.agentSchedulerId = exports.ScheduleManager = exports.unpackRuntimeMessage = exports.isRuntimeMessage = exports.RuntimeMessage = exports.ContainerMessageType = void 0;
|
|
8
8
|
const container_definitions_1 = require("@fluidframework/container-definitions");
|
|
9
9
|
const common_utils_1 = require("@fluidframework/common-utils");
|
|
10
10
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
@@ -59,21 +59,24 @@ const DefaultSummaryConfiguration = {
|
|
|
59
59
|
// the min of the two will be chosen
|
|
60
60
|
maxAckWaitTime: 120000,
|
|
61
61
|
};
|
|
62
|
+
;
|
|
62
63
|
// Local storage key to set the default flush mode to TurnBased
|
|
63
64
|
const turnBasedFlushModeKey = "Fluid.ContainerRuntime.FlushModeTurnBased";
|
|
65
|
+
var RuntimeMessage;
|
|
66
|
+
(function (RuntimeMessage) {
|
|
67
|
+
RuntimeMessage["FluidDataStoreOp"] = "component";
|
|
68
|
+
RuntimeMessage["Attach"] = "attach";
|
|
69
|
+
RuntimeMessage["ChunkedOp"] = "chunkedOp";
|
|
70
|
+
RuntimeMessage["BlobAttach"] = "blobAttach";
|
|
71
|
+
RuntimeMessage["Rejoin"] = "rejoin";
|
|
72
|
+
RuntimeMessage["Alias"] = "alias";
|
|
73
|
+
RuntimeMessage["Operation"] = "op";
|
|
74
|
+
})(RuntimeMessage = exports.RuntimeMessage || (exports.RuntimeMessage = {}));
|
|
64
75
|
function isRuntimeMessage(message) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
case ContainerMessageType.ChunkedOp:
|
|
68
|
-
case ContainerMessageType.Attach:
|
|
69
|
-
case ContainerMessageType.Alias:
|
|
70
|
-
case ContainerMessageType.BlobAttach:
|
|
71
|
-
case ContainerMessageType.Rejoin:
|
|
72
|
-
case protocol_definitions_1.MessageType.Operation:
|
|
73
|
-
return true;
|
|
74
|
-
default:
|
|
75
|
-
return false;
|
|
76
|
+
if (Object.values(RuntimeMessage).includes(message.type)) {
|
|
77
|
+
return true;
|
|
76
78
|
}
|
|
79
|
+
return false;
|
|
77
80
|
}
|
|
78
81
|
exports.isRuntimeMessage = isRuntimeMessage;
|
|
79
82
|
function unpackRuntimeMessage(message) {
|
|
@@ -351,6 +354,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
351
354
|
this._disposed = false;
|
|
352
355
|
this.dirtyContainer = false;
|
|
353
356
|
this.emitDirtyDocumentEvent = true;
|
|
357
|
+
this.summarizerWarning = (warning) => this.mc.logger.sendTelemetryEvent({ eventName: "summarizerWarning" }, warning);
|
|
354
358
|
/**
|
|
355
359
|
* Used to apply stashed ops at their reference sequence number.
|
|
356
360
|
* Normal op processing is synchronous, but applying stashed ops is async since the
|
|
@@ -372,10 +376,6 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
372
376
|
this.closeFn(telemetry_utils_1.normalizeError(error));
|
|
373
377
|
});
|
|
374
378
|
};
|
|
375
|
-
// @deprecated Needs to become private
|
|
376
|
-
this.raiseContainerWarning = (warning) => {
|
|
377
|
-
this.context.raiseContainerWarning(warning);
|
|
378
|
-
};
|
|
379
379
|
this.summarizeOnDemand = (...args) => {
|
|
380
380
|
if (this.clientDetails.type === summarizerClientElection_1.summarizerClientType) {
|
|
381
381
|
return this.summarizer.summarizeOnDemand(...args);
|
|
@@ -441,7 +441,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
441
441
|
const timestamp = client === null || client === void 0 ? void 0 : client.timestamp;
|
|
442
442
|
return (_c = (_b = (_a = this.deltaManager.lastMessage) === null || _a === void 0 ? void 0 : _a.timestamp) !== null && _b !== void 0 ? _b : timestamp) !== null && _c !== void 0 ? _c : Date.now();
|
|
443
443
|
};
|
|
444
|
-
this.garbageCollector = garbageCollection_1.GarbageCollector.create(this, this.runtimeOptions.gcOptions, (unusedRoutes) => this.dataStores.deleteUnusedRoutes(unusedRoutes), getCurrentTimestamp, context.baseSnapshot, async (id) => driver_utils_1.readAndParse(this.storage, id), this.mc.logger, existing, metadata);
|
|
444
|
+
this.garbageCollector = garbageCollection_1.GarbageCollector.create(this, this.runtimeOptions.gcOptions, (unusedRoutes) => this.dataStores.deleteUnusedRoutes(unusedRoutes), getCurrentTimestamp, this.closeFn, context.baseSnapshot, async (id) => driver_utils_1.readAndParse(this.storage, id), this.mc.logger, existing, metadata);
|
|
445
445
|
const loadedFromSequenceNumber = this.deltaManager.initialSequenceNumber;
|
|
446
446
|
this.summarizerNode = runtime_utils_1.createRootSummarizerNodeWithGC(telemetry_utils_1.ChildLogger.create(this.logger, "SummarizerNode"),
|
|
447
447
|
// Summarize function to call when summarize is called. Summarizer node always tracks summary state.
|
|
@@ -462,7 +462,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
462
462
|
if (this.context.baseSnapshot) {
|
|
463
463
|
this.summarizerNode.loadBaseSummaryWithoutDifferential(this.context.baseSnapshot);
|
|
464
464
|
}
|
|
465
|
-
this.dataStores = new dataStores_1.DataStores(dataStores_1.getSummaryForDatastores(context.baseSnapshot, metadata), this, (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg), (id, createParam) => (summarizeInternal, getGCDataFn,
|
|
465
|
+
this.dataStores = new dataStores_1.DataStores(dataStores_1.getSummaryForDatastores(context.baseSnapshot, metadata), this, (attachMsg) => this.submit(ContainerMessageType.Attach, attachMsg), (id, createParam) => (summarizeInternal, getGCDataFn, getBaseGCDetailsFn) => this.summarizerNode.createChild(summarizeInternal, id, createParam, undefined, getGCDataFn, getBaseGCDetailsFn), (id) => this.summarizerNode.deleteChild(id), this.mc.logger, async () => this.garbageCollector.getDataStoreBaseGCDetails(), (id) => this.garbageCollector.nodeChanged(id), new Map(dataStoreAliasMap), this.garbageCollector.writeDataAtRoot);
|
|
466
466
|
this.blobManager = new blobManager_1.BlobManager(this.handleContext, blobManagerSnapshot, () => this.storage, (blobId) => this.submit(ContainerMessageType.BlobAttach, undefined, undefined, { blobId }), this, this.logger);
|
|
467
467
|
this.scheduleManager = new ScheduleManager(context.deltaManager, this, telemetry_utils_1.ChildLogger.create(this.logger, "ScheduleManager"));
|
|
468
468
|
this.deltaSender = this.deltaManager;
|
|
@@ -515,7 +515,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
515
515
|
throttler_1.formExponentialFn({ coefficient: 20, initialDelay: 0 })), {
|
|
516
516
|
initialDelayMs: this.runtimeOptions.summaryOptions.initialSummarizerDelayMs,
|
|
517
517
|
}, this.runtimeOptions.summaryOptions.summarizerOptions);
|
|
518
|
-
this.summaryManager.on("summarizerWarning", this.
|
|
518
|
+
this.summaryManager.on("summarizerWarning", this.summarizerWarning);
|
|
519
519
|
this.summaryManager.start();
|
|
520
520
|
}
|
|
521
521
|
}
|
|
@@ -560,6 +560,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
560
560
|
static async load(context, registryEntries, requestHandler, runtimeOptions = {}, containerScope = context.scope, existing) {
|
|
561
561
|
var _a, _b, _c;
|
|
562
562
|
// If taggedLogger exists, use it. Otherwise, wrap the vanilla logger:
|
|
563
|
+
// back-compat: Remove the TaggedLoggerAdapter fallback once all the host are using loader > 0.45
|
|
563
564
|
const passLogger = (_a = context.taggedLogger) !== null && _a !== void 0 ? _a : new telemetry_utils_1.TaggedLoggerAdapter(context.logger);
|
|
564
565
|
const logger = telemetry_utils_1.ChildLogger.create(passLogger, undefined, {
|
|
565
566
|
all: {
|
|
@@ -637,12 +638,6 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
637
638
|
}, containerScope, logger, loadExisting, blobManagerSnapshot, requestHandler, storage);
|
|
638
639
|
return runtime;
|
|
639
640
|
}
|
|
640
|
-
/**
|
|
641
|
-
* @deprecated This will be removed in a later release. Deprecated in 0.53
|
|
642
|
-
*/
|
|
643
|
-
get id() {
|
|
644
|
-
return this.context.id;
|
|
645
|
-
}
|
|
646
641
|
get options() {
|
|
647
642
|
return this.context.options;
|
|
648
643
|
}
|
|
@@ -706,13 +701,6 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
706
701
|
return Object.assign(Object.assign(Object.assign({}, DefaultSummaryConfiguration), (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.serviceConfiguration) === null || _b === void 0 ? void 0 : _b.summary), (_c = this.runtimeOptions.summaryOptions) === null || _c === void 0 ? void 0 : _c.summaryConfigOverrides);
|
|
707
702
|
}
|
|
708
703
|
get disposed() { return this._disposed; }
|
|
709
|
-
/**
|
|
710
|
-
* True, if GC data should be written at root of the summary tree.
|
|
711
|
-
* False, if data stores should write GC blobs in their summary tree.
|
|
712
|
-
*/
|
|
713
|
-
get writeGCDataAtRoot() {
|
|
714
|
-
return this.garbageCollector.writeDataAtRoot;
|
|
715
|
-
}
|
|
716
704
|
get summarizer() {
|
|
717
705
|
common_utils_1.assert(this._summarizer !== undefined, 0x257 /* "This is not summarizing container" */);
|
|
718
706
|
return this._summarizer;
|
|
@@ -735,9 +723,10 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
735
723
|
attachState: this.attachState,
|
|
736
724
|
}, error);
|
|
737
725
|
if (this.summaryManager !== undefined) {
|
|
738
|
-
this.summaryManager.off("summarizerWarning", this.
|
|
726
|
+
this.summaryManager.off("summarizerWarning", this.summarizerWarning);
|
|
739
727
|
this.summaryManager.dispose();
|
|
740
728
|
}
|
|
729
|
+
this.garbageCollector.dispose();
|
|
741
730
|
(_a = this._summarizer) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
742
731
|
this.dataStores.dispose();
|
|
743
732
|
this.pendingStateManager.dispose();
|
|
@@ -753,9 +742,6 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
753
742
|
}
|
|
754
743
|
return undefined;
|
|
755
744
|
}
|
|
756
|
-
get IFluidConfiguration() {
|
|
757
|
-
return this.context.configuration;
|
|
758
|
-
}
|
|
759
745
|
/**
|
|
760
746
|
* Notifies this object about the request made to the container.
|
|
761
747
|
* @param request - Request made to the handler.
|
|
@@ -838,7 +824,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
838
824
|
return Object.assign(Object.assign({}, this.createContainerMetadata), { summaryCount: this.summaryCount, summaryFormatVersion: 1, disableIsolatedChannels: this.disableIsolatedChannels || undefined, gcFeature: this.garbageCollector.gcSummaryFeatureVersion,
|
|
839
825
|
// The last message processed at the time of summary. If there are no messages, nothing has changed from
|
|
840
826
|
// the base summary we loaded from. So, use the message from its metadata blob.
|
|
841
|
-
message: (_a = summaryFormat_1.extractSummaryMetadataMessage(this.deltaManager.lastMessage)) !== null && _a !== void 0 ? _a : this.baseSummaryMessage });
|
|
827
|
+
message: (_a = summaryFormat_1.extractSummaryMetadataMessage(this.deltaManager.lastMessage)) !== null && _a !== void 0 ? _a : this.baseSummaryMessage, sessionExpiryTimeoutMs: this.garbageCollector.sessionExpiryTimeoutMs });
|
|
842
828
|
}
|
|
843
829
|
/**
|
|
844
830
|
* Retrieves the runtime for a data store if it's referenced as per the initially summary that it is loaded with.
|
|
@@ -852,7 +838,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
852
838
|
const dataStoreContext = await this.dataStores.getDataStore(id, wait);
|
|
853
839
|
// The data store is referenced if used routes in the initial summary has a route to self.
|
|
854
840
|
// Older documents may not have used routes in the summary. They are considered referenced.
|
|
855
|
-
const usedRoutes = (await dataStoreContext.
|
|
841
|
+
const usedRoutes = (await dataStoreContext.getBaseGCDetails()).usedRoutes;
|
|
856
842
|
if (usedRoutes === undefined || usedRoutes.includes("") || usedRoutes.includes("/")) {
|
|
857
843
|
return dataStoreContext.realize();
|
|
858
844
|
}
|
|
@@ -874,7 +860,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
874
860
|
});
|
|
875
861
|
return runtime_utils_1.convertSummaryTreeToITree(summaryResult.summary);
|
|
876
862
|
}
|
|
877
|
-
|
|
863
|
+
addContainerStateToSummary(summaryTree) {
|
|
878
864
|
var _a;
|
|
879
865
|
runtime_utils_1.addBlobToSummary(summaryTree, summaryFormat_1.metadataBlobName, JSON.stringify(this.formMetadata()));
|
|
880
866
|
if (this.chunkMap.size > 0) {
|
|
@@ -896,7 +882,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
896
882
|
const blobsTree = runtime_utils_1.convertToSummaryTree(snapshot, false);
|
|
897
883
|
runtime_utils_1.addTreeToSummary(summaryTree, summaryFormat_1.blobsTreeName, blobsTree);
|
|
898
884
|
}
|
|
899
|
-
if (this.
|
|
885
|
+
if (this.garbageCollector.writeDataAtRoot) {
|
|
900
886
|
const gcSummary = this.garbageCollector.summarize();
|
|
901
887
|
if (gcSummary !== undefined) {
|
|
902
888
|
runtime_utils_1.addTreeToSummary(summaryTree, garbageCollection_1.gcTreeKey, gcSummary);
|
|
@@ -1084,21 +1070,19 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1084
1070
|
}
|
|
1085
1071
|
const savedFlushMode = this.flushMode;
|
|
1086
1072
|
this.setFlushMode(runtime_definitions_1.FlushMode.TurnBased);
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
this.setFlushMode(savedFlushMode);
|
|
1091
|
-
}
|
|
1092
|
-
catch (error) {
|
|
1093
|
-
this.closeFn(container_utils_1.CreateProcessingError(error, "orderSequentially"));
|
|
1094
|
-
throw error; // throw the original error for the consumer of the runtime
|
|
1095
|
-
}
|
|
1073
|
+
this.trackOrderSequentiallyCalls(callback);
|
|
1074
|
+
this.flush();
|
|
1075
|
+
this.setFlushMode(savedFlushMode);
|
|
1096
1076
|
}
|
|
1097
1077
|
trackOrderSequentiallyCalls(callback) {
|
|
1098
1078
|
try {
|
|
1099
1079
|
this._orderSequentiallyCalls++;
|
|
1100
1080
|
callback();
|
|
1101
1081
|
}
|
|
1082
|
+
catch (error) {
|
|
1083
|
+
this.closeFn(new container_utils_1.GenericError("orderSequentiallyCallbackException", error));
|
|
1084
|
+
throw error; // throw the original error for the consumer of the runtime
|
|
1085
|
+
}
|
|
1102
1086
|
finally {
|
|
1103
1087
|
this._orderSequentiallyCalls--;
|
|
1104
1088
|
}
|
|
@@ -1128,7 +1112,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1128
1112
|
return this.dataStores._createFluidDataStoreContext(Array.isArray(pkg) ? pkg : [pkg], id, isRoot).realize();
|
|
1129
1113
|
}
|
|
1130
1114
|
canSendOps() {
|
|
1131
|
-
return this.connected && !this.deltaManager.readonly;
|
|
1115
|
+
return this.connected && !this.deltaManager.readOnlyInfo.readonly;
|
|
1132
1116
|
}
|
|
1133
1117
|
getQuorum() {
|
|
1134
1118
|
return this.context.quorum;
|
|
@@ -1201,7 +1185,7 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1201
1185
|
// Wrap data store summaries in .channels subtree.
|
|
1202
1186
|
summaryFormat_1.wrapSummaryInChannelsTree(summarizeResult);
|
|
1203
1187
|
}
|
|
1204
|
-
this.
|
|
1188
|
+
this.addContainerStateToSummary(summarizeResult);
|
|
1205
1189
|
return summarizeResult.summary;
|
|
1206
1190
|
}
|
|
1207
1191
|
async getAbsoluteUrl(relativeUrl) {
|
|
@@ -1221,13 +1205,14 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1221
1205
|
summaryFormat_1.wrapSummaryInChannelsTree(summarizeResult);
|
|
1222
1206
|
pathPartsForChildren = [runtime_definitions_1.channelsTreeName];
|
|
1223
1207
|
}
|
|
1224
|
-
this.
|
|
1208
|
+
this.addContainerStateToSummary(summarizeResult);
|
|
1225
1209
|
return Object.assign(Object.assign({}, summarizeResult), { id: "", pathPartsForChildren });
|
|
1226
1210
|
}
|
|
1227
1211
|
/**
|
|
1228
1212
|
* Returns a summary of the runtime at the current sequence number.
|
|
1229
1213
|
*/
|
|
1230
1214
|
async summarize(options) {
|
|
1215
|
+
this.verifyNotClosed();
|
|
1231
1216
|
const { summaryLogger, fullTree = false, trackState = true, runGC = true, runSweep, fullGC } = options;
|
|
1232
1217
|
if (runGC) {
|
|
1233
1218
|
await this.collectGarbage({ logger: summaryLogger, runSweep, fullGC });
|
|
@@ -1236,6 +1221,15 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1236
1221
|
common_utils_1.assert(summarizeResult.summary.type === protocol_definitions_1.SummaryType.Tree, 0x12f /* "Container Runtime's summarize should always return a tree" */);
|
|
1237
1222
|
return summarizeResult;
|
|
1238
1223
|
}
|
|
1224
|
+
/**
|
|
1225
|
+
* Implementation of IGarbageCollectionRuntime::updateStateBeforeGC.
|
|
1226
|
+
* Before GC runs, called by the garbage collector to update any pending GC state. This is mainly used to notify
|
|
1227
|
+
* the garbage collector of references detected since the last GC run. Most references are notified immediately
|
|
1228
|
+
* but there can be some for which async operation is required (such as detecting new root data stores).
|
|
1229
|
+
*/
|
|
1230
|
+
async updateStateBeforeGC() {
|
|
1231
|
+
return this.dataStores.updateStateBeforeGC();
|
|
1232
|
+
}
|
|
1239
1233
|
/**
|
|
1240
1234
|
* Implementation of IGarbageCollectionRuntime::getGCData.
|
|
1241
1235
|
* Generates and returns the GC data for this container.
|
|
@@ -1346,10 +1340,9 @@ class ContainerRuntime extends common_utils_1.TypedEventEmitter {
|
|
|
1346
1340
|
try {
|
|
1347
1341
|
summarizeResult = await this.summarize({
|
|
1348
1342
|
summaryLogger,
|
|
1349
|
-
// If the GC
|
|
1350
|
-
//
|
|
1351
|
-
|
|
1352
|
-
fullTree: fullTree || this.garbageCollector.hasGCVersionChanged,
|
|
1343
|
+
// If the GC state needs to be reset, we need to regenerate the summary and update the unreferenced
|
|
1344
|
+
// state of all the nodes.
|
|
1345
|
+
fullTree: fullTree || this.garbageCollector.summaryStateNeedsReset,
|
|
1353
1346
|
trackState: true,
|
|
1354
1347
|
runGC: this.garbageCollector.shouldRunGC,
|
|
1355
1348
|
});
|
|
@@ -1670,12 +1663,12 @@ exports.ContainerRuntime = ContainerRuntime;
|
|
|
1670
1663
|
* Wait for a specific sequence number. Promise should resolve when we reach that number,
|
|
1671
1664
|
* or reject if closed.
|
|
1672
1665
|
*/
|
|
1673
|
-
const waitForSeq = async (deltaManager, targetSeq) => new Promise((
|
|
1666
|
+
const waitForSeq = async (deltaManager, targetSeq) => new Promise((resolve, reject) => {
|
|
1674
1667
|
// TODO: remove cast to any when actual event is determined
|
|
1675
1668
|
deltaManager.on("closed", reject);
|
|
1676
1669
|
const handleOp = (message) => {
|
|
1677
1670
|
if (message.sequenceNumber >= targetSeq) {
|
|
1678
|
-
|
|
1671
|
+
resolve();
|
|
1679
1672
|
deltaManager.off("op", handleOp);
|
|
1680
1673
|
}
|
|
1681
1674
|
};
|