diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php index 759f2d15f84f..7710a28a8ca7 100644 --- a/apps/files/ajax/scan.php +++ b/apps/files/ajax/scan.php @@ -47,7 +47,7 @@ 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 99ce64e09cc9..31ae555e0419 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 @@ protected function configure() { } 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 @@ protected function scanFiles($user, $path, $quiet, OutputInterface $output) { $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 460c8007bf4c..85ca734c146c 100644 --- a/lib/private/files/utils/scanner.php +++ b/lib/private/files/utils/scanner.php @@ -32,6 +32,8 @@ 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,13 @@ public function scan($dir = '') { 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->logger->logException($e); + $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 192768d04afd..1b51030d4a31 100644 --- a/tests/lib/files/etagtest.php +++ b/tests/lib/files/etagtest.php @@ -59,7 +59,7 @@ public function testNewUser() { $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 5492774f42e3..b731c6992e80 100644 --- a/tests/lib/files/utils/scanner.php +++ b/tests/lib/files/utils/scanner.php @@ -70,7 +70,7 @@ public function testReuseExistingRoot() { $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 @@ public function testReuseExistingFile() { $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 @@ public function testScanSubMount() { $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 @@ public function testChangePropagator() { $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 @@ public function invalidPathProvider() { * @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); } }