From be730ae3f02ceffd6a3f3e246bcf4c87d3eeb4f9 Mon Sep 17 00:00:00 2001 From: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> Date: Mon, 22 Jun 2026 23:05:53 +0200 Subject: [PATCH] perf: reuse known storages in shares Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> --- apps/files_sharing/lib/MountProvider.php | 2 ++ apps/files_sharing/lib/SharedStorage.php | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index 32af0dd84e34c..e772b7f5af38c 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -262,6 +262,7 @@ public function getMountsFromSuperShares( $newMaxValidatedShare = $maxValidatedShare; $appConfig = Server::get(IAppConfig::class); $cacheDependencies = Server::get(CacheDependencies::class); + $storagesCache = (Server::get(ICacheFactory::class))->createInMemory(); foreach ($superShares as $share) { [$parentShare, $groupedShares] = $share; @@ -293,6 +294,7 @@ public function getMountsFromSuperShares( 'shareManager' => $this->shareManager, 'appConfig' => $appConfig, 'cacheDependencies' => $cacheDependencies, + 'storagesCache' => $storagesCache, ], $loader, $this->eventDispatcher, diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php index 827061c032c2d..110008721bbe9 100644 --- a/apps/files_sharing/lib/SharedStorage.php +++ b/apps/files_sharing/lib/SharedStorage.php @@ -95,12 +95,15 @@ class SharedStorage extends Jail implements LegacyISharedStorage, ISharedStorage private static int $initDepth = 0; private CacheDependencies $cacheDependencies; + private ?\OCP\ICache $storagesCache; + public function __construct(array $parameters) { $this->ownerView = $parameters['ownerView']; $this->logger = $parameters['logger'] ?? Server::get(LoggerInterface::class); $this->appConfig = $parameters['appConfig'] ?? Server::get(IAppConfig::class); $this->shareManager = $parameters['shareManager'] ?? Server::get(IShareManager::class); $this->cacheDependencies = $parameters['cacheDependencies'] ?? Server::get(CacheDependencies::class); + $this->storagesCache = $parameters['storagesCache'] ?? null; $this->superShare = $parameters['superShare']; $this->groupedShares = $parameters['groupedShares']; @@ -160,6 +163,21 @@ private function init() { throw new \Exception('Maximum share depth reached'); } + $storageId = $this->superShare->getNodeCacheEntry()?->getStorageId(); + if ($storageId !== null) { + /** @var IStorage $cachedStorage */ + $cachedStorage = $this->storagesCache?->get((string)$storageId); + if ($cachedStorage !== null) { + $this->nonMaskedStorage = $cachedStorage; + $this->storage = new PermissionsMask([ + 'storage' => $cachedStorage, + 'mask' => $this->superShare->getPermissions(), + ]); + self::$initDepth--; + return; + } + } + /** @var IRootFolder $rootFolder */ $rootFolder = Server::get(IRootFolder::class); $this->ownerUserFolder = $rootFolder->getUserFolder($this->superShare->getShareOwner()); @@ -192,6 +210,7 @@ private function init() { 'storage' => $this->nonMaskedStorage, 'mask' => $this->superShare->getPermissions(), ]); + $this->storagesCache?->set((string)$this->nonMaskedStorage->getCache()->getNumericStorageId(), $this->nonMaskedStorage); } } catch (NotFoundException $e) { // original file not accessible or deleted, set FailedStorage