diff options
author | Sven Strickroth <email@cs-ware.de> | 2021-08-15 18:58:16 +0200 |
---|---|---|
committer | Sven Strickroth <email@cs-ware.de> | 2021-08-19 16:43:44 +0200 |
commit | 1c736abc352e27231e046ea249be5a51f3b3f4d7 (patch) | |
tree | de51fabd387872b6f547901de5937c6636963c8e /apps/files_trashbin/lib | |
parent | 35e73e437613e5313fdf9792c6699bb18c0072e3 (diff) | |
download | nextcloud-server-1c736abc352e27231e046ea249be5a51f3b3f4d7.tar.gz nextcloud-server-1c736abc352e27231e046ea249be5a51f3b3f4d7.zip |
Don't die with LockedException when removing/restoring multiple files from trash
fixes issue #16491
Signed-off-by: Sven Strickroth <email@cs-ware.de>
Diffstat (limited to 'apps/files_trashbin/lib')
-rw-r--r-- | apps/files_trashbin/lib/Trashbin.php | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/apps/files_trashbin/lib/Trashbin.php b/apps/files_trashbin/lib/Trashbin.php index 0e16c56ed8d..6aec2f9821e 100644 --- a/apps/files_trashbin/lib/Trashbin.php +++ b/apps/files_trashbin/lib/Trashbin.php @@ -968,9 +968,20 @@ class Trashbin { [$storage,] = $view->resolvePath('/'); //force rescan of versions, local storage may not have updated the cache - if (!self::$scannedVersions) { - $storage->getScanner()->scan('files_trashbin/versions'); - self::$scannedVersions = true; + $waitstart = time(); + while (!self::$scannedVersions) { + try { + $storage->getScanner()->scan('files_trashbin/versions'); + self::$scannedVersions = true; + } catch (LockedException $e) { + /* a concurrent remove/restore from trash occurred, + * retry with a maximum wait time of approx. 15 seconds + */ + if (time() - $waitstart > 15) { + throw $e; + } + usleep(50000 + rand(0, 10000)); + } } $pattern = \OC::$server->getDatabaseConnection()->escapeLikeParameter(basename($filename)); |