From ae71f80f4a3262e3f12de4c71af1cc388904425d Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 27 Nov 2015 14:02:50 +0100 Subject: [PATCH] Skip unavailable storages in scanner --- apps/files/ajax/scan.php | 2 +- apps/files/command/scan.php | 6 +++++- lib/private/files/utils/scanner.php | 18 ++++++++++++++++-- tests/lib/files/etagtest.php | 2 +- tests/lib/files/utils/scanner.php | 10 +++++----- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php index 759f2d15f8..7710a28a8c 100644 --- a/apps/files/ajax/scan.php +++ b/apps/files/ajax/scan.php @@ -47,7 +47,7 @@ $listener = new ScanListener($eventSource); foreach ($users as $user) { $eventSource->send('user', $user); - $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection()); + $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', array($listener, 'file')); try { if ($force) { diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php index 99ce64e09c..31ae555e04 100644 --- a/apps/files/command/scan.php +++ b/apps/files/command/scan.php @@ -26,6 +26,7 @@ namespace OCA\Files\Command; use OC\ForbiddenException; +use OCP\Files\StorageNotAvailableException; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -74,7 +75,7 @@ class Scan extends Command { } protected function scanFiles($user, $path, $quiet, OutputInterface $output) { - $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection()); + $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); if (!$quiet) { $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) { $output->writeln("Scanning file $path"); @@ -82,6 +83,9 @@ class Scan extends Command { $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) { $output->writeln("Scanning folder $path"); }); + $scanner->listen('\OC\Files\Utils\Scanner', 'StorageNotAvailable', function (StorageNotAvailableException $e) use ($output) { + $output->writeln("Error while scanning, storage not available (" . $e->getMessage() . ")"); + }); } try { $scanner->scan($path); diff --git a/lib/private/files/utils/scanner.php b/lib/private/files/utils/scanner.php index 460c8007bf..9b3bae0b9a 100644 --- a/lib/private/files/utils/scanner.php +++ b/lib/private/files/utils/scanner.php @@ -32,6 +32,8 @@ use OC\Files\Filesystem; use OC\ForbiddenException; use OC\Hooks\PublicEmitter; use OC\Lock\DBLockingProvider; +use OCP\Files\StorageNotAvailableException; +use OCP\ILogger; /** * Class Scanner @@ -58,11 +60,18 @@ class Scanner extends PublicEmitter { */ protected $db; + /** + * @var ILogger + */ + protected $logger; + /** * @param string $user * @param \OCP\IDBConnection $db + * @param ILogger $logger */ - public function __construct($user, $db) { + public function __construct($user, $db, ILogger $logger) { + $this->logger = $logger; $this->user = $user; $this->propagator = new ChangePropagator(new View('')); $this->db = $db; @@ -161,7 +170,12 @@ class Scanner extends PublicEmitter { if (!$isDbLocking) { $this->db->beginTransaction(); } - $scanner->scan($relativePath, \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG | \OC\Files\Cache\Scanner::REUSE_SIZE); + try { + $scanner->scan($relativePath, \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG | \OC\Files\Cache\Scanner::REUSE_SIZE); + } catch (StorageNotAvailableException $e) { + $this->logger->error('Storage ' . $storage->getId() . ' not available'); + $this->emit('\OC\Files\Utils\Scanner', 'StorageNotAvailable', [$e]); + } if (!$isDbLocking) { $this->db->commit(); } diff --git a/tests/lib/files/etagtest.php b/tests/lib/files/etagtest.php index 192768d04a..1b51030d4a 100644 --- a/tests/lib/files/etagtest.php +++ b/tests/lib/files/etagtest.php @@ -59,7 +59,7 @@ class EtagTest extends \Test\TestCase { $files = array('/foo.txt', '/folder/bar.txt', '/folder/subfolder', '/folder/subfolder/qwerty.txt'); $originalEtags = $this->getEtags($files); - $scanner = new \OC\Files\Utils\Scanner($user1, \OC::$server->getDatabaseConnection()); + $scanner = new \OC\Files\Utils\Scanner($user1, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); $scanner->backgroundScan('/'); $newEtags = $this->getEtags($files); diff --git a/tests/lib/files/utils/scanner.php b/tests/lib/files/utils/scanner.php index 5492774f42..b731c6992e 100644 --- a/tests/lib/files/utils/scanner.php +++ b/tests/lib/files/utils/scanner.php @@ -70,7 +70,7 @@ class Scanner extends \Test\TestCase { $storage->file_put_contents('foo.txt', 'qwerty'); $storage->file_put_contents('folder/bar.txt', 'qwerty'); - $scanner = new TestScanner('', \OC::$server->getDatabaseConnection()); + $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); $scanner->addMount($mount); $scanner->scan(''); @@ -92,7 +92,7 @@ class Scanner extends \Test\TestCase { $storage->file_put_contents('foo.txt', 'qwerty'); $storage->file_put_contents('folder/bar.txt', 'qwerty'); - $scanner = new TestScanner('', \OC::$server->getDatabaseConnection()); + $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); $scanner->addMount($mount); $scanner->scan(''); @@ -130,7 +130,7 @@ class Scanner extends \Test\TestCase { $storage->file_put_contents('foo.txt', 'qwerty'); $storage->file_put_contents('folder/bar.txt', 'qwerty'); - $scanner = new \OC\Files\Utils\Scanner($uid, \OC::$server->getDatabaseConnection()); + $scanner = new \OC\Files\Utils\Scanner($uid, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); $this->assertFalse($cache->inCache('folder/bar.txt')); $scanner->scan('/' . $uid . '/files/foo'); @@ -152,7 +152,7 @@ class Scanner extends \Test\TestCase { $storage->file_put_contents('foo.txt', 'qwerty'); $storage->file_put_contents('folder/bar.txt', 'qwerty'); - $scanner = new TestScanner('', \OC::$server->getDatabaseConnection()); + $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); $originalPropagator = $scanner->getPropagator(); $scanner->setPropagator($propagator); $scanner->addMount($mount); @@ -214,7 +214,7 @@ class Scanner extends \Test\TestCase { * @param string $invalidPath */ public function testInvalidPathScanning($invalidPath) { - $scanner = new TestScanner('', \OC::$server->getDatabaseConnection()); + $scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); $scanner->scan($invalidPath); } }