From 5048485a851f078cb0fab12125fb4252ae020fde Mon Sep 17 00:00:00 2001 From: Florent BEAUCHAMP Date: Wed, 11 Oct 2023 10:29:47 +0200 Subject: [PATCH] feat(fs/s3): object lock mode need content md5 and the middleware consume addiitionnal memory --- @xen-orchestra/fs/src/s3.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/@xen-orchestra/fs/src/s3.js b/@xen-orchestra/fs/src/s3.js index adce0bb97ab..4026fed16c5 100644 --- a/@xen-orchestra/fs/src/s3.js +++ b/@xen-orchestra/fs/src/s3.js @@ -5,6 +5,7 @@ import { CreateMultipartUploadCommand, DeleteObjectCommand, GetObjectCommand, + GetObjectLockConfigurationCommand, HeadObjectCommand, ListObjectsV2Command, PutObjectCommand, @@ -71,9 +72,6 @@ export default class S3Handler extends RemoteHandlerAbstract { }), }) - // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673 - this.#s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this.#s3.config)) - const parts = split(path) this.#bucket = parts.shift() this.#dir = join(...parts) @@ -439,6 +437,24 @@ export default class S3Handler extends RemoteHandlerAbstract { async _closeFile(fd) {} + async _sync() { + await super._sync() + try { + // if Object Lock is enabled, each upload must come with a contentMD5 header + // the computation of this md5 is memory-intensive, especially when uploading a stream + const res = await this.#s3.send(new GetObjectLockConfigurationCommand({ Bucket: this.#bucket })) + if (res.ObjectLockConfiguration?.ObjectLockEnabled === 'Enabled') { + // Workaround for https://github.com/aws/aws-sdk-js-v3/issues/2673 + // will automatically add the contentMD5 header to any upload to S3 + this.#s3.middlewareStack.use(getApplyMd5BodyChecksumPlugin(this.#s3.config)) + } + } catch (error) { + if (error.Code !== 'ObjectLockConfigurationNotFoundError') { + throw error + } + } + } + useVhdDirectory() { return true }