From 7fa3f89ef93110efbd3af344c218fc279fcffe30 Mon Sep 17 00:00:00 2001 From: Julius Knorr Date: Mon, 7 Apr 2025 20:47:11 +0200 Subject: [PATCH 1/2] fix: Proper order for checking path prefix for getting file by id from cache Signed-off-by: Julius Knorr --- lib/private/Files/Node/Root.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php index d4ec241654b..18062eab6f0 100644 --- a/lib/private/Files/Node/Root.php +++ b/lib/private/Files/Node/Root.php @@ -384,7 +384,7 @@ class Root extends Folder implements IRootFolder { // scope the cache by user, so we don't return nodes for different users if ($this->user) { $cachedPath = $this->pathByIdCache->get($this->user->getUID() . '::' . $id); - if ($cachedPath && str_starts_with($path, $cachedPath)) { + if ($cachedPath && str_starts_with($cachedPath, $path)) { // getting the node by path is significantly cheaper than finding it by id $node = $this->get($cachedPath); // by validating that the cached path still has the requested fileid we can work around the need to invalidate the cached path From 7ff80cc0168437a8b683344c5425e1213b0d8b23 Mon Sep 17 00:00:00 2001 From: Julius Knorr Date: Tue, 8 Apr 2025 09:17:35 +0200 Subject: [PATCH 2/2] fix: Catch old cached paths and fetch the new one Signed-off-by: Julius Knorr --- lib/private/Files/Node/Root.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php index 18062eab6f0..d82ec08f362 100644 --- a/lib/private/Files/Node/Root.php +++ b/lib/private/Files/Node/Root.php @@ -386,11 +386,15 @@ class Root extends Folder implements IRootFolder { $cachedPath = $this->pathByIdCache->get($this->user->getUID() . '::' . $id); if ($cachedPath && str_starts_with($cachedPath, $path)) { // getting the node by path is significantly cheaper than finding it by id - $node = $this->get($cachedPath); - // by validating that the cached path still has the requested fileid we can work around the need to invalidate the cached path - // if the cached path is invalid or a different file now we fall back to the uncached logic - if ($node && $node->getId() === $id) { - return $node; + try { + $node = $this->get($cachedPath); + // by validating that the cached path still has the requested fileid we can work around the need to invalidate the cached path + // if the cached path is invalid or a different file now we fall back to the uncached logic + if ($node && $node->getId() === $id) { + return $node; + } + } catch (NotFoundException|NotPermittedException) { + // The file may be moved but the old path still in cache } } }