From d400dd41677503604f7b0fed8dbbeac99c131b85 Mon Sep 17 00:00:00 2001 From: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> Date: Wed, 11 Feb 2026 19:19:25 +0100 Subject: [PATCH] fix: avoid recomputing list of mounts by provider Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> --- lib/private/Files/Mount/Manager.php | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/private/Files/Mount/Manager.php b/lib/private/Files/Mount/Manager.php index 72b38f38575b7..3d586ba4c5911 100644 --- a/lib/private/Files/Mount/Manager.php +++ b/lib/private/Files/Mount/Manager.php @@ -20,6 +20,7 @@ class Manager implements IMountManager { /** @var array */ private array $mounts = []; + private array $mountsByProvider = []; private bool $areMountsSorted = false; /** @var list|null $mountKeys */ private ?array $mountKeys = null; @@ -36,7 +37,11 @@ public function __construct(SetupManagerFactory $setupManagerFactory) { } public function addMount(IMountPoint $mount): void { - $this->mounts[$mount->getMountPoint()] = $mount; + $mountPoint = $mount->getMountPoint(); + $mountProvider = $mount->getMountProvider(); + $this->mounts[$mountPoint] = $mount; + $this->mountsByProvider[$mountProvider] ??= []; + $this->mountsByProvider[$mountProvider][$mountPoint] = $mount; $this->pathCache->clear(); $this->inPathCache->clear(); $this->areMountsSorted = false; @@ -167,6 +172,7 @@ private function binarySearch(array $sortedArray, array $sortedKeys, string $pre public function clear(): void { $this->mounts = []; + $this->mountsByProvider = []; $this->pathCache->clear(); $this->inPathCache->clear(); } @@ -236,15 +242,18 @@ public function getSetupManager(): SetupManager { * @param string[] $mountProviders * @return array */ - public function getMountsByMountProvider(string $path, array $mountProviders) { + public function getMountsByMountProvider(string $path, array $mountProviders): array { $this->getSetupManager()->setupForProvider($path, $mountProviders); - if (in_array('', $mountProviders)) { + if (\in_array('', $mountProviders)) { return $this->mounts; - } else { - return array_filter($this->mounts, function ($mount) use ($mountProviders) { - return in_array($mount->getMountProvider(), $mountProviders); - }); } + + $mounts = []; + foreach ($mountProviders as $mountProvider) { + $mounts[] = $this->mountsByProvider[$mountProvider] ?? []; + } + + return array_merge(...$mounts); } /**