From e2219b8e4d7d7dacd612a90c4df5b2fcfcb2f0d8 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 31 Aug 2020 12:25:20 +0200 Subject: [PATCH 1/2] Don't lose filecache entry on s3 overwrite error If the object store errors we should not always delete the filecache entry. As this might lead to people losing access to their files. Signed-off-by: Roeland Jago Douma --- .../Files/ObjectStore/ObjectStoreStorage.php | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php index 10c72dd3a00..2dcc5e74967 100644 --- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php +++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php @@ -460,11 +460,22 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { $this->objectStore->writeObject($urn, $stream); } } catch (\Exception $ex) { - $this->getCache()->remove($uploadPath); - $this->logger->logException($ex, [ - 'app' => 'objectstore', - 'message' => 'Could not create object ' . $urn . ' for ' . $path, - ]); + if (!$exists) { + /* + * Only remove the entry if we are dealing with a new file. + * Else people lose access to existing files + */ + $this->getCache()->remove($uploadPath); + $this->logger->logException($ex, [ + 'app' => 'objectstore', + 'message' => 'Could not create object ' . $urn . ' for ' . $path, + ]); + } else { + $this->logger->logException($ex, [ + 'app' => 'objectstore', + 'message' => 'Could not update object ' . $urn . ' for ' . $path, + ]); + } throw $ex; // make this bubble up } From 0eeb1ea115e49f6a72bf2b56c9c45c9ed5b9287c Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Mon, 31 Aug 2020 12:28:04 +0200 Subject: [PATCH 2/2] Only update the filecache entry once the file has been written to S3 If we already update before we have no way to revert if the upload fails. Signed-off-by: Roeland Jago Douma --- .../Files/ObjectStore/ObjectStoreStorage.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php index 2dcc5e74967..291a283fe3f 100644 --- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php +++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php @@ -441,7 +441,13 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { $exists = $this->getCache()->inCache($path); $uploadPath = $exists ? $path : $path . '.part'; - $fileId = $this->getCache()->put($uploadPath, $stat); + + if ($exists) { + $fileId = $stat['fileid']; + } else { + $fileId = $this->getCache()->put($uploadPath, $stat); + } + $urn = $this->getURN($fileId); try { //upload to object storage @@ -456,6 +462,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { if (is_resource($countStream)) { fclose($countStream); } + $stat['size'] = $size; } else { $this->objectStore->writeObject($urn, $stream); } @@ -479,7 +486,9 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common { throw $ex; // make this bubble up } - if (!$exists) { + if ($exists) { + $this->getCache()->update($fileId, $stat); + } else { if ($this->objectStore->objectExists($urn)) { $this->getCache()->move($uploadPath, $path); } else {