]> source.dussan.org Git - nextcloud-server.git/commitdiff
Unlock when promoting to exclusive lock fails 23995/head
authorAshod Nakashian <ashod.nakashian@collabora.co.uk>
Wed, 28 Oct 2020 02:57:24 +0000 (22:57 -0400)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Mon, 9 Nov 2020 10:03:15 +0000 (10:03 +0000)
In certain cases changeLock to EXCLUSIVE fails
and throws LockedException. This leaves the
file locked as SHARED in file_put_contents,
which prevents retrying (because on second
call file_put_contents takes another SHARED
lock on the same file, and changeLock doesn't
allow more than a single SHARED lock to promote
to EXCLUSIVE).

To avoid this case, we catch the LockedException
and unlock before re-throwing.

Signed-off-by: Ashod Nakashian <ashod.nakashian@collabora.co.uk>
lib/private/Files/View.php

index 16074a89ca83a0995138f89f2775dc8bc7bb872f..fba412c37d4e3f3fd05641f8218d5d1d67c5f838 100644 (file)
@@ -665,7 +665,13 @@ class View {
                                        return false;
                                }
 
-                               $this->changeLock($path, ILockingProvider::LOCK_EXCLUSIVE);
+                               try {
+                                       $this->changeLock($path, ILockingProvider::LOCK_EXCLUSIVE);
+                               } catch (\Exception $e) {
+                                       // Release the shared lock before throwing.
+                                       $this->unlockFile($path, ILockingProvider::LOCK_SHARED);
+                                       throw $e;
+                               }
 
                                /** @var \OC\Files\Storage\Storage $storage */
                                [$storage, $internalPath] = $this->resolvePath($path);