From 244fd6ae49dd1712d07bf64d1d27b8cfafe441ad Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Sep 2020 16:29:21 +0200 Subject: [PATCH 1/2] disable update checking for shared storages update checking is already handled by the share source Signed-off-by: Robin Appelman --- apps/files_sharing/lib/SharedStorage.php | 19 ++++--- lib/composer/composer/autoload_classmap.php | 1 + lib/composer/composer/autoload_static.php | 1 + lib/private/Files/Cache/NullWatcher.php | 56 +++++++++++++++++++++ 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 lib/private/Files/Cache/NullWatcher.php diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php index 1735cab43f..43896679a3 100644 --- a/apps/files_sharing/lib/SharedStorage.php +++ b/apps/files_sharing/lib/SharedStorage.php @@ -33,6 +33,8 @@ namespace OCA\Files_Sharing; use OC\Files\Cache\FailedCache; +use OC\Files\Cache\LazyWatcher; +use OC\Files\Cache\NullWatcher; use OC\Files\Filesystem; use OC\Files\Storage\FailedStorage; use OC\Files\Storage\Wrapper\PermissionsMask; @@ -126,7 +128,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto try { Filesystem::initMountPoints($this->superShare->getShareOwner()); $sourcePath = $this->ownerView->getPath($this->superShare->getNodeId()); - list($this->nonMaskedStorage, $this->rootPath) = $this->ownerView->resolvePath($sourcePath); + [$this->nonMaskedStorage, $this->rootPath] = $this->ownerView->resolvePath($sourcePath); $this->storage = new PermissionsMask([ 'storage' => $this->nonMaskedStorage, 'mask' => $this->superShare->getPermissions() @@ -160,7 +162,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto if ($class === '\OC\Files\Storage\Common') { return true; } - if (in_array($class, ['\OC\Files\Storage\Home', '\OC\Files\ObjectStore\HomeObjectStoreStorage'])) { + if (in_array($class, ['\OC\Files\Storage\Home', '\OC\Files\ObjectStore\HomeObjectStoreStorage', '\OCP\Files\IHomeStorage'])) { return false; } return parent::instanceOfStorage($class); @@ -223,7 +225,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto } /** @var IStorage $storage */ /** @var string $internalPath */ - list($storage, $internalPath) = $this->resolvePath($path); + [$storage, $internalPath] = $this->resolvePath($path); return $storage->isReadable($internalPath); } @@ -397,6 +399,11 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto return $this->superShare->getShareOwner(); } + public function getWatcher($path = '', $storage = null) { + // cache updating is handled by the share source + return new NullWatcher(); + } + /** * unshare complete storage, also the grouped shares * @@ -417,7 +424,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto */ public function acquireLock($path, $type, ILockingProvider $provider) { /** @var \OCP\Files\Storage $targetStorage */ - list($targetStorage, $targetInternalPath) = $this->resolvePath($path); + [$targetStorage, $targetInternalPath] = $this->resolvePath($path); $targetStorage->acquireLock($targetInternalPath, $type, $provider); // lock the parent folders of the owner when locking the share as recipient if ($path === '') { @@ -433,7 +440,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto */ public function releaseLock($path, $type, ILockingProvider $provider) { /** @var \OCP\Files\Storage $targetStorage */ - list($targetStorage, $targetInternalPath) = $this->resolvePath($path); + [$targetStorage, $targetInternalPath] = $this->resolvePath($path); $targetStorage->releaseLock($targetInternalPath, $type, $provider); // unlock the parent folders of the owner when unlocking the share as recipient if ($path === '') { @@ -449,7 +456,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto */ public function changeLock($path, $type, ILockingProvider $provider) { /** @var \OCP\Files\Storage $targetStorage */ - list($targetStorage, $targetInternalPath) = $this->resolvePath($path); + [$targetStorage, $targetInternalPath] = $this->resolvePath($path); $targetStorage->changeLock($targetInternalPath, $type, $provider); } diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index a217a70444..a1960f678f 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1011,6 +1011,7 @@ return array( 'OC\\Files\\Cache\\HomePropagator' => $baseDir . '/lib/private/Files/Cache/HomePropagator.php', 'OC\\Files\\Cache\\LocalRootScanner' => $baseDir . '/lib/private/Files/Cache/LocalRootScanner.php', 'OC\\Files\\Cache\\MoveFromCacheTrait' => $baseDir . '/lib/private/Files/Cache/MoveFromCacheTrait.php', + 'OC\\Files\\Cache\\NullWatcher' => $baseDir . '/lib/private/Files/Cache/NullWatcher.php', 'OC\\Files\\Cache\\Propagator' => $baseDir . '/lib/private/Files/Cache/Propagator.php', 'OC\\Files\\Cache\\QuerySearchHelper' => $baseDir . '/lib/private/Files/Cache/QuerySearchHelper.php', 'OC\\Files\\Cache\\Scanner' => $baseDir . '/lib/private/Files/Cache/Scanner.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 9e46855f1e..8c7db5e572 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1040,6 +1040,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Files\\Cache\\HomePropagator' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/HomePropagator.php', 'OC\\Files\\Cache\\LocalRootScanner' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/LocalRootScanner.php', 'OC\\Files\\Cache\\MoveFromCacheTrait' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/MoveFromCacheTrait.php', + 'OC\\Files\\Cache\\NullWatcher' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/NullWatcher.php', 'OC\\Files\\Cache\\Propagator' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/Propagator.php', 'OC\\Files\\Cache\\QuerySearchHelper' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/QuerySearchHelper.php', 'OC\\Files\\Cache\\Scanner' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/Scanner.php', diff --git a/lib/private/Files/Cache/NullWatcher.php b/lib/private/Files/Cache/NullWatcher.php new file mode 100644 index 0000000000..6ab886f05d --- /dev/null +++ b/lib/private/Files/Cache/NullWatcher.php @@ -0,0 +1,56 @@ + + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OC\Files\Cache; + +class NullWatcher extends Watcher { + private $policy; + + public function __construct() { + + } + + public function setPolicy($policy) { + $this->policy = $policy; + } + + public function getPolicy() { + return $this->policy; + } + + public function checkUpdate($path, $cachedEntry = null) { + return false; + } + + public function update($path, $cachedData) { + + } + + public function needsUpdate($path, $cachedData) { + return false; + } + + public function cleanFolder($path) { + + } +} From cfde74442c67b9a6e639536536c18e4c6d4f7a0e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Sep 2020 17:01:33 +0200 Subject: [PATCH 2/2] optimize View::getPath if we already know the storage id Signed-off-by: Robin Appelman --- apps/files_sharing/lib/SharedStorage.php | 10 ++++---- lib/private/Files/Cache/NullWatcher.php | 3 --- lib/private/Files/View.php | 29 +++++++++++++++--------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php index 43896679a3..7625c0bba4 100644 --- a/apps/files_sharing/lib/SharedStorage.php +++ b/apps/files_sharing/lib/SharedStorage.php @@ -33,7 +33,6 @@ namespace OCA\Files_Sharing; use OC\Files\Cache\FailedCache; -use OC\Files\Cache\LazyWatcher; use OC\Files\Cache\NullWatcher; use OC\Files\Filesystem; use OC\Files\Storage\FailedStorage; @@ -127,11 +126,12 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto $this->initialized = true; try { Filesystem::initMountPoints($this->superShare->getShareOwner()); - $sourcePath = $this->ownerView->getPath($this->superShare->getNodeId()); + $storageId = $this->superShare->getNodeCacheEntry() ? $this->superShare->getNodeCacheEntry()->getStorageId() : null; + $sourcePath = $this->ownerView->getPath($this->superShare->getNodeId(), $storageId); [$this->nonMaskedStorage, $this->rootPath] = $this->ownerView->resolvePath($sourcePath); $this->storage = new PermissionsMask([ 'storage' => $this->nonMaskedStorage, - 'mask' => $this->superShare->getPermissions() + 'mask' => $this->superShare->getPermissions(), ]); } catch (NotFoundException $e) { // original file not accessible or deleted, set FailedStorage @@ -379,7 +379,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto if (!$storage) { $storage = $this; } - $sourceRoot = $this->getSourceRootInfo(); + $sourceRoot = $this->getSourceRootInfo(); if ($this->storage instanceof FailedStorage) { return new FailedCache(); } @@ -467,7 +467,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto // shares do not participate in availability logic return [ 'available' => true, - 'last_checked' => 0 + 'last_checked' => 0, ]; } diff --git a/lib/private/Files/Cache/NullWatcher.php b/lib/private/Files/Cache/NullWatcher.php index 6ab886f05d..57e43444fd 100644 --- a/lib/private/Files/Cache/NullWatcher.php +++ b/lib/private/Files/Cache/NullWatcher.php @@ -27,7 +27,6 @@ class NullWatcher extends Watcher { private $policy; public function __construct() { - } public function setPolicy($policy) { @@ -43,7 +42,6 @@ class NullWatcher extends Watcher { } public function update($path, $cachedData) { - } public function needsUpdate($path, $cachedData) { @@ -51,6 +49,5 @@ class NullWatcher extends Watcher { } public function cleanFolder($path) { - } } diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index ef8656258d..16074a89ca 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -239,7 +239,7 @@ class View { public function getLocalFile($path) { $parent = substr($path, 0, strrpos($path, '/')); $path = $this->getAbsolutePath($path); - list($storage, $internalPath) = Filesystem::resolvePath($path); + [$storage, $internalPath] = Filesystem::resolvePath($path); if (Filesystem::isValidPath($parent) and $storage) { return $storage->getLocalFile($internalPath); } else { @@ -254,7 +254,7 @@ class View { public function getLocalFolder($path) { $parent = substr($path, 0, strrpos($path, '/')); $path = $this->getAbsolutePath($path); - list($storage, $internalPath) = Filesystem::resolvePath($path); + [$storage, $internalPath] = Filesystem::resolvePath($path); if (Filesystem::isValidPath($parent) and $storage) { return $storage->getLocalFolder($internalPath); } else { @@ -668,10 +668,10 @@ class View { $this->changeLock($path, ILockingProvider::LOCK_EXCLUSIVE); /** @var \OC\Files\Storage\Storage $storage */ - list($storage, $internalPath) = $this->resolvePath($path); + [$storage, $internalPath] = $this->resolvePath($path); $target = $storage->fopen($internalPath, 'w'); if ($target) { - list(, $result) = \OC_Helper::streamCopy($data, $target); + [, $result] = \OC_Helper::streamCopy($data, $target); fclose($target); fclose($data); @@ -1089,7 +1089,7 @@ class View { [Filesystem::signal_param_path => $this->getHookPath($path)] ); } - list($storage, $internalPath) = Filesystem::resolvePath($absolutePath . $postFix); + [$storage, $internalPath] = Filesystem::resolvePath($absolutePath . $postFix); if ($storage) { return $storage->hash($type, $internalPath, $raw); } @@ -1143,7 +1143,7 @@ class View { $run = $this->runHooks($hooks, $path); /** @var \OC\Files\Storage\Storage $storage */ - list($storage, $internalPath) = Filesystem::resolvePath($absolutePath . $postFix); + [$storage, $internalPath] = Filesystem::resolvePath($absolutePath . $postFix); if ($run and $storage) { if (in_array('write', $hooks) || in_array('delete', $hooks)) { try { @@ -1568,7 +1568,7 @@ class View { * @var \OC\Files\Storage\Storage $storage * @var string $internalPath */ - list($storage, $internalPath) = Filesystem::resolvePath($path); + [$storage, $internalPath] = Filesystem::resolvePath($path); if ($storage) { $cache = $storage->getCache($path); @@ -1705,7 +1705,7 @@ class View { * @var Storage\Storage $storage * @var string $internalPath */ - list($storage, $internalPath) = $this->resolvePath($path); + [$storage, $internalPath] = $this->resolvePath($path); if ($storage) { return $storage->getETag($internalPath); } else { @@ -1719,10 +1719,11 @@ class View { * Note that the resulting path is not guarantied to be unique for the id, multiple paths can point to the same file * * @param int $id - * @throws NotFoundException + * @param int|null $storageId * @return string + * @throws NotFoundException */ - public function getPath($id) { + public function getPath($id, int $storageId = null) { $id = (int)$id; $manager = Filesystem::getMountManager(); $mounts = $manager->findIn($this->fakeRoot); @@ -1737,6 +1738,12 @@ class View { return $a instanceof SharedMount && (!$b instanceof SharedMount) ? 1 : -1; }); + if (!is_null($storageId)) { + $mounts = array_filter($mounts, function (IMountPoint $mount) use ($storageId) { + return $mount->getNumericStorageId() === $storageId; + }); + } + foreach ($mounts as $mount) { /** * @var \OC\Files\Mount\MountPoint $mount @@ -1844,7 +1851,7 @@ class View { public function verifyPath($path, $fileName) { try { /** @type \OCP\Files\Storage $storage */ - list($storage, $internalPath) = $this->resolvePath($path); + [$storage, $internalPath] = $this->resolvePath($path); $storage->verifyPath($internalPath, $fileName); } catch (ReservedWordException $ex) { $l = \OC::$server->getL10N('lib');