summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@users.noreply.github.com>2020-09-18 11:35:26 +0200
committerGitHub <noreply@github.com>2020-09-18 11:35:26 +0200
commitc364b0cb193f66ad15e2950c27113b40037d1bf6 (patch)
tree21b17fda6c708a8f773c1e832e890dde20c29d95 /core
parentbd9af41808175f60aca3c50af09863d0693e2a84 (diff)
parent24744dcaec04363721b31a8af30bc61bbdd2959f (diff)
downloadnextcloud-server-c364b0cb193f66ad15e2950c27113b40037d1bf6.tar.gz
nextcloud-server-c364b0cb193f66ad15e2950c27113b40037d1bf6.zip
Merge pull request #22911 from nextcloud/enh/noid/allow-to-run-preview-repair-parallel
Allow to run occ preview:repair in parallel
Diffstat (limited to 'core')
-rw-r--r--core/Command/Preview/Repair.php34
1 files changed, 22 insertions, 12 deletions
diff --git a/core/Command/Preview/Repair.php b/core/Command/Preview/Repair.php
index 845b9dbda92..8c83ce2ebea 100644
--- a/core/Command/Preview/Repair.php
+++ b/core/Command/Preview/Repair.php
@@ -33,6 +33,8 @@ use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\IConfig;
use OCP\ILogger;
+use OCP\Lock\ILockingProvider;
+use OCP\Lock\LockedException;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputInterface;
@@ -54,11 +56,14 @@ class Repair extends Command {
private $memoryLimit;
/** @var int */
private $memoryTreshold;
+ /** @var ILockingProvider */
+ private $lockingProvider;
- public function __construct(IConfig $config, IRootFolder $rootFolder, ILogger $logger, IniGetWrapper $phpIni) {
+ public function __construct(IConfig $config, IRootFolder $rootFolder, ILogger $logger, IniGetWrapper $phpIni, ILockingProvider $lockingProvider) {
$this->config = $config;
$this->rootFolder = $rootFolder;
$this->logger = $logger;
+ $this->lockingProvider = $lockingProvider;
$this->memoryLimit = $phpIni->getBytes('memory_limit');
$this->memoryTreshold = $this->memoryLimit - 25 * 1024 * 1024;
@@ -95,8 +100,6 @@ class Repair extends Command {
$output->writeln("");
}
- $verbose = $output->isVerbose();
-
$instanceId = $this->config->getSystemValueString('instanceid');
$output->writeln("This will migrate all previews from the old preview location to the new one.");
@@ -218,14 +221,21 @@ class Repair extends Command {
return 1;
}
+ $lockName = 'occ preview:repair lock ' . $oldPreviewFolder->getId();
+ try {
+ $section1->writeln(" Locking \"$lockName\" …", OutputInterface::VERBOSITY_VERBOSE);
+ $this->lockingProvider->acquireLock($lockName, ILockingProvider::LOCK_EXCLUSIVE);
+ } catch (LockedException $e) {
+ $section1->writeln(" Skipping because it is locked - another process seems to work on this …");
+ continue;
+ }
+
$previews = $oldPreviewFolder->getDirectoryListing();
if ($previews !== []) {
try {
$this->rootFolder->get("appdata_$instanceId/preview/$newFoldername");
} catch (NotFoundException $e) {
- if ($verbose) {
- $section1->writeln(" Create folder preview/$newFoldername");
- }
+ $section1->writeln(" Create folder preview/$newFoldername", OutputInterface::VERBOSITY_VERBOSE);
if (!$dryMode) {
$this->rootFolder->newFolder("appdata_$instanceId/preview/$newFoldername");
}
@@ -240,9 +250,7 @@ class Repair extends Command {
$progressBar->advance();
continue;
}
- if ($verbose) {
- $section1->writeln(" Move preview/$name/$previewName to preview/$newFoldername");
- }
+ $section1->writeln(" Move preview/$name/$previewName to preview/$newFoldername", OutputInterface::VERBOSITY_VERBOSE);
if (!$dryMode) {
try {
$preview->move("appdata_$instanceId/preview/$newFoldername/$previewName");
@@ -253,9 +261,7 @@ class Repair extends Command {
}
}
if ($oldPreviewFolder->getDirectoryListing() === []) {
- if ($verbose) {
- $section1->writeln(" Delete empty folder preview/$name");
- }
+ $section1->writeln(" Delete empty folder preview/$name", OutputInterface::VERBOSITY_VERBOSE);
if (!$dryMode) {
try {
$oldPreviewFolder->delete();
@@ -264,6 +270,10 @@ class Repair extends Command {
}
}
}
+
+ $this->lockingProvider->releaseLock($lockName, ILockingProvider::LOCK_EXCLUSIVE);
+ $section1->writeln(" Unlocked", OutputInterface::VERBOSITY_VERBOSE);
+
$section1->writeln(" Finished migrating previews of file with fileId $name …");
$progressBar->advance();
}