From d90bf1a73cb4fc947bb7c5c331093d4edef60b96 Mon Sep 17 00:00:00 2001 From: Sven Strickroth Date: Sun, 15 Aug 2021 18:58:16 +0200 Subject: [PATCH] Don't die with LockedException when removing/restoring multiple files from trash fixes issue #16491 Signed-off-by: Sven Strickroth --- apps/files_trashbin/lib/Trashbin.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/files_trashbin/lib/Trashbin.php b/apps/files_trashbin/lib/Trashbin.php index 0e16c56ed8da3..6aec2f9821eec 100644 --- a/apps/files_trashbin/lib/Trashbin.php +++ b/apps/files_trashbin/lib/Trashbin.php @@ -968,9 +968,20 @@ private static function getVersionsFromTrash($filename, $timestamp, $user) { [$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));