From 210726a0b2d35212713389dce8f6a9b6c78e7e4b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 15 Sep 2020 17:01:33 +0200 Subject: [PATCH] optimize View::getPath if we already know the storage id Signed-off-by: Robin Appelman --- apps/files_sharing/lib/SharedStorage.php | 2 +- lib/private/Files/View.php | 29 +++++++++++++++--------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php index 43896679a31dd..2033cf7b19bdc 100644 --- a/apps/files_sharing/lib/SharedStorage.php +++ b/apps/files_sharing/lib/SharedStorage.php @@ -127,7 +127,7 @@ private function init() { $this->initialized = true; try { Filesystem::initMountPoints($this->superShare->getShareOwner()); - $sourcePath = $this->ownerView->getPath($this->superShare->getNodeId()); + $sourcePath = $this->ownerView->getPath($this->superShare->getNodeId(), $this->superShare->getNodeCacheEntry()->getStorageId()); [$this->nonMaskedStorage, $this->rootPath] = $this->ownerView->resolvePath($sourcePath); $this->storage = new PermissionsMask([ 'storage' => $this->nonMaskedStorage, diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index ef8656258d164..16074a89ca83a 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -239,7 +239,7 @@ public function resolvePath($path) { 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 @@ public function getLocalFile($path) { 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 @@ public function file_put_contents($path, $data) { $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 @@ public function hash($type, $path, $raw = false) { [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 @@ private function basicOperation($operation, $path, $hooks = [], $extraParam = nu $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 @@ public function putFileInfo($path, $data) { * @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 @@ public function getETag($path) { * @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 @@ public function getETag($path) { * 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 @@ public function getPath($id) { 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 @@ private function getPartFileInfo($path) { 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');