mirror of
https://github.com/nextcloud/server.git
synced 2026-04-15 22:11:17 -04:00
Merge pull request #36465 from nextcloud/bugfix/trashbin-concurrency
This commit is contained in:
commit
63696fe2e3
4 changed files with 15 additions and 39 deletions
|
|
@ -68,13 +68,6 @@ class Trashbin {
|
|||
// unit: percentage; 50% of available disk space/quota
|
||||
public const DEFAULTMAXSIZE = 50;
|
||||
|
||||
/**
|
||||
* Whether versions have already be rescanned during this PHP request
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private static $scannedVersions = false;
|
||||
|
||||
/**
|
||||
* Ensure we don't need to scan the file during the move to trash
|
||||
* by triggering the scan in the pre-hook
|
||||
|
|
@ -980,23 +973,6 @@ class Trashbin {
|
|||
/** @var \OC\Files\Storage\Storage $storage */
|
||||
[$storage,] = $view->resolvePath('/');
|
||||
|
||||
//force rescan of versions, local storage may not have updated the cache
|
||||
$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));
|
||||
if ($timestamp) {
|
||||
// fetch for old versions
|
||||
|
|
|
|||
|
|
@ -25,6 +25,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
// eslint-disable-next-line import/no-unresolved, node/no-missing-import
|
||||
import PQueue from 'p-queue'
|
||||
|
||||
/* eslint-disable */
|
||||
(function() {
|
||||
var DELETED_REGEXP = new RegExp(/^(.+)\.d[0-9]+$/)
|
||||
|
|
@ -61,6 +64,7 @@
|
|||
var FileList = function($el, options) {
|
||||
this.client = options.client
|
||||
this.initialize($el, options)
|
||||
this.deleteOperationQueue = new PQueue({ concurrency: 4 })
|
||||
}
|
||||
FileList.prototype = _.extend({}, OCA.Files.FileList.prototype,
|
||||
/** @lends OCA.Trashbin.FileList.prototype */ {
|
||||
|
|
@ -185,12 +189,10 @@
|
|||
|
||||
this.fileMultiSelectMenu.toggleLoading('restore', true)
|
||||
var restorePromises = files.map(function(file) {
|
||||
return self.client.move(OC.joinPaths('trash', self.getCurrentDirectory(), file), OC.joinPaths('restore', file), true)
|
||||
.then(
|
||||
function() {
|
||||
self._removeCallback([file])
|
||||
}
|
||||
)
|
||||
return self.deleteOperationQueue.add(async () => {
|
||||
self.client.move(OC.joinPaths('trash', self.getCurrentDirectory(), file), OC.joinPaths('restore', file), true)
|
||||
self._removeCallback([file])
|
||||
})
|
||||
})
|
||||
return Promise.all(restorePromises).then(
|
||||
function() {
|
||||
|
|
@ -226,12 +228,10 @@
|
|||
} else {
|
||||
this.fileMultiSelectMenu.toggleLoading('delete', true)
|
||||
var deletePromises = files.map(function(file) {
|
||||
return self.client.remove(OC.joinPaths('trash', self.getCurrentDirectory(), file))
|
||||
.then(
|
||||
function() {
|
||||
self._removeCallback([file])
|
||||
}
|
||||
)
|
||||
return self.deleteOperationQueue.add(async () => {
|
||||
await self.client.remove(OC.joinPaths('trash', self.getCurrentDirectory(), file))
|
||||
self._removeCallback([file])
|
||||
})
|
||||
})
|
||||
return Promise.all(deletePromises).then(
|
||||
function() {
|
||||
|
|
|
|||
4
dist/files_trashbin-files_trashbin.js
vendored
4
dist/files_trashbin-files_trashbin.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files_trashbin-files_trashbin.js.map
vendored
2
dist/files_trashbin-files_trashbin.js.map
vendored
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue