From 5680d1fe4c6b2f98ccc7bc61c9cd6d6fcf10c003 Mon Sep 17 00:00:00 2001 From: Spoffy Date: Tue, 24 Sep 2024 01:12:18 +0100 Subject: [PATCH] Fixes an import error when using S3/Minio with no redis Error is caused due to these steps: - File is uploaded to Home server and attempts to import - Import ends up in `claimDocument` in `HostedStorageManager` - Tries to read doc metadata from DocWorkerMap, gets 'unknown' as md5 hash - Thinks local doc is out of date and erases it. - Downloads a non-existent file from S3, so import fails as it has no data. This fixes it by checking for DummyDocWorker's special 'unknown' MD5, forcing an S3 check. --- app/gen-server/lib/DocWorkerMap.ts | 2 ++ app/server/lib/DocManager.ts | 2 ++ app/server/lib/HostedStorageManager.ts | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/gen-server/lib/DocWorkerMap.ts b/app/gen-server/lib/DocWorkerMap.ts index 3a40a9479c5..4fa20a69358 100644 --- a/app/gen-server/lib/DocWorkerMap.ts +++ b/app/gen-server/lib/DocWorkerMap.ts @@ -580,8 +580,10 @@ let dummyDocWorkerMap: DummyDocWorkerMap|null = null; export function getDocWorkerMap(): IDocWorkerMap { if (process.env.REDIS_URL) { + log.info("Creating Redis-based DocWorker"); return new DocWorkerMap(); } else { + log.info("Creating local/dummy DocWorker"); dummyDocWorkerMap = dummyDocWorkerMap || new DummyDocWorkerMap(); return dummyDocWorkerMap; } diff --git a/app/server/lib/DocManager.ts b/app/server/lib/DocManager.ts index 460469043b2..9bebbcb8967 100644 --- a/app/server/lib/DocManager.ts +++ b/app/server/lib/DocManager.ts @@ -650,6 +650,7 @@ export class DocManager extends EventEmitter { throw new Error('Grist docs must be uploaded individually'); } const first = uploadInfo.files[0].origName; + log.debug(`DocManager._doImportDoc: Received doc with name ${first}`); const ext = extname(first); const basename = path.basename(first, ext).trim() || "Untitled upload"; let id: string; @@ -674,6 +675,7 @@ export class DocManager extends EventEmitter { } await options.register?.(id, basename); if (ext === '.grist') { + log.debug(`DocManager._doImportDoc: Importing .grist doc`); // If the import is a grist file, copy it to the docs directory. // TODO: We should be skeptical of the upload file to close a possible // security vulnerability. See https://phab.getgrist.com/T457. diff --git a/app/server/lib/HostedStorageManager.ts b/app/server/lib/HostedStorageManager.ts index 443ab52bba7..14fe9a5bda8 100644 --- a/app/server/lib/HostedStorageManager.ts +++ b/app/server/lib/HostedStorageManager.ts @@ -639,7 +639,7 @@ export class HostedStorageManager implements IDocStorageManager { const existsLocally = await fse.pathExists(this.getPath(docName)); if (existsLocally) { - if (!docStatus.docMD5 || docStatus.docMD5 === DELETED_TOKEN) { + if (!docStatus.docMD5 || docStatus.docMD5 === DELETED_TOKEN || docStatus.docMD5 === 'unknown') { // New doc appears to already exist, but may not exist in S3. // Let's check. const head = await this._ext.head(docName);