]> source.dussan.org Git - nextcloud-server.git/commitdiff
optimize View::getPath if we already know the storage id 22867/head
authorRobin Appelman <robin@icewind.nl>
Tue, 15 Sep 2020 15:01:33 +0000 (17:01 +0200)
committerRobin Appelman <robin@icewind.nl>
Wed, 16 Sep 2020 11:49:07 +0000 (13:49 +0200)
Signed-off-by: Robin Appelman <robin@icewind.nl>
apps/files_sharing/lib/SharedStorage.php
lib/private/Files/Cache/NullWatcher.php
lib/private/Files/View.php

index 43896679a31dd1ee2137daf317f4808cd62ecc28..7625c0bba447af8b2368f54817402a7dbe96390b 100644 (file)
@@ -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,
                ];
        }
 
index 6ab886f05dcd0f20d800dd63ad4adf45d5ba0e48..57e43444fdc430e82683be98494a6018d662832d 100644 (file)
@@ -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) {
-
        }
 }
index ef8656258d164588a262d0ce72814299f4660c9e..16074a89ca83a0995138f89f2775dc8bc7bb872f 100644 (file)
@@ -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');