]> source.dussan.org Git - nextcloud-server.git/commitdiff
Remove inefficient fed share scanner 30686/head
authorVincent Petry <vincent@nextcloud.com>
Wed, 5 Jan 2022 16:19:24 +0000 (17:19 +0100)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Fri, 14 Jan 2022 16:09:00 +0000 (16:09 +0000)
Remove scanAll which relies on the "shareinfo" endpoint that returns the
full cache tree.
The latter can become big for big shares and result in timeouts.
Furthermode, the full tree would be retrieved again for each and every
detected change which can become expensive quickly.

Signed-off-by: Vincent Petry <vincent@nextcloud.com>
apps/files_sharing/lib/External/Scanner.php
apps/files_sharing/tests/External/ScannerTest.php

index 870ce6c2f3b642868c1ba71e6038c24a0b312e15..e09ea3bf0f5de3582a06f1c2f8353cb883c846ec 100644 (file)
@@ -31,29 +31,11 @@ use OC\ForbiddenException;
 use OCP\Files\NotFoundException;
 use OCP\Files\StorageInvalidException;
 use OCP\Files\StorageNotAvailableException;
-use OCP\Http\Client\LocalServerException;
-use Psr\Log\LoggerInterface;
 
 class Scanner extends \OC\Files\Cache\Scanner {
        /** @var \OCA\Files_Sharing\External\Storage */
        protected $storage;
 
-       /** {@inheritDoc} */
-       public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $lock = true) {
-               try {
-                       if (!$this->storage->remoteIsOwnCloud()) {
-                               return parent::scan($path, $recursive, $reuse, $lock);
-                       }
-               } catch (LocalServerException $e) {
-                       // Scanner doesn't have dependency injection
-                       \OC::$server->get(LoggerInterface::class)
-                               ->warning('Trying to scan files inside invalid external storage: ' . $this->storage->getRemote() . ' for mountpoint ' . $this->storage->getMountPoint() . ' and id ' . $this->storage->getId());
-                       return;
-               }
-
-               $this->scanAll();
-       }
-
        /**
         * Scan a single file and store it in the cache.
         * If an exception happened while accessing the external storage,
@@ -83,56 +65,4 @@ class Scanner extends \OC\Files\Cache\Scanner {
                        $this->storage->checkStorageAvailability();
                }
        }
-
-       /**
-        * Checks the remote share for changes.
-        * If changes are available, scan them and update
-        * the cache.
-        * @throws NotFoundException
-        * @throws StorageInvalidException
-        * @throws \Exception
-        */
-       public function scanAll() {
-               try {
-                       $data = $this->storage->getShareInfo();
-               } catch (\Exception $e) {
-                       $this->storage->checkStorageAvailability();
-                       throw new \Exception(
-                               'Error while scanning remote share: "' .
-                               $this->storage->getRemote() . '" ' .
-                               $e->getMessage()
-                       );
-               }
-               if ($data['status'] === 'success') {
-                       $this->addResult($data['data'], '');
-               } else {
-                       throw new \Exception(
-                               'Error while scanning remote share: "' .
-                               $this->storage->getRemote() . '"'
-                       );
-               }
-       }
-
-       /**
-        * @param array $data
-        * @param string $path
-        */
-       private function addResult($data, $path) {
-               $id = $this->cache->put($path, $data);
-               if (isset($data['children'])) {
-                       $children = [];
-                       foreach ($data['children'] as $child) {
-                               $children[$child['name']] = true;
-                               $this->addResult($child, ltrim($path . '/' . $child['name'], '/'));
-                       }
-
-                       $existingCache = $this->cache->getFolderContentsById($id);
-                       foreach ($existingCache as $existingChild) {
-                               // if an existing child is not in the new data, remove it
-                               if (!isset($children[$existingChild['name']])) {
-                                       $this->cache->remove(ltrim($path . '/' . $existingChild['name'], '/'));
-                               }
-                       }
-               }
-       }
 }
index 843f106af8102d4437ad8c8a847eaa39bd02e478..ae05eca2b18bbe1d0925f1460e2964295d3e6f5d 100644 (file)
@@ -51,18 +51,6 @@ class ScannerTest extends TestCase {
                $this->scanner = new Scanner($this->storage);
        }
 
-       public function testScanAll() {
-               $this->storage->expects($this->any())
-                       ->method('getShareInfo')
-                       ->willReturn(['status' => 'success', 'data' => []]);
-
-               // FIXME add real tests, we are currently only checking for
-               // Declaration of OCA\Files_Sharing\External\Scanner::*() should be
-               // compatible with OC\Files\Cache\Scanner::*()
-               $this->scanner->scanAll();
-               $this->addToAssertionCount(1);
-       }
-
        public function testScan() {
                $this->storage->expects($this->any())
                        ->method('getShareInfo')