From 7e16d3fe49cec815eac2025d52182b8bb5d78d26 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 19 Jan 2026 15:42:28 +0100 Subject: [PATCH] perf: only update shares for users once Signed-off-by: Robin Appelman --- apps/files_sharing/lib/AppInfo/Application.php | 2 ++ .../lib/Listener/SharesUpdatedListener.php | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php index 9701191f018..9a67dad408b 100644 --- a/apps/files_sharing/lib/AppInfo/Application.php +++ b/apps/files_sharing/lib/AppInfo/Application.php @@ -48,6 +48,7 @@ use OCP\Files\Config\IMountProviderCollection; use OCP\Files\Events\BeforeDirectFileDownloadEvent; use OCP\Files\Events\BeforeZipCreatedEvent; use OCP\Files\Events\Node\BeforeNodeReadEvent; +use OCP\Files\Events\Node\FilesystemTornDownEvent; use OCP\Group\Events\GroupChangedEvent; use OCP\Group\Events\GroupDeletedEvent; use OCP\Group\Events\UserAddedEvent; @@ -121,6 +122,7 @@ class Application extends App implements IBootstrap { $context->registerEventListener(UserAddedEvent::class, SharesUpdatedListener::class); $context->registerEventListener(UserRemovedEvent::class, SharesUpdatedListener::class); $context->registerEventListener(UserShareAccessUpdatedEvent::class, SharesUpdatedListener::class); + $context->registerEventListener(FilesystemTornDownEvent::class, SharesUpdatedListener::class); $context->registerConfigLexicon(ConfigLexicon::class); } diff --git a/apps/files_sharing/lib/Listener/SharesUpdatedListener.php b/apps/files_sharing/lib/Listener/SharesUpdatedListener.php index 9a7941888d4..ba0073f41f5 100644 --- a/apps/files_sharing/lib/Listener/SharesUpdatedListener.php +++ b/apps/files_sharing/lib/Listener/SharesUpdatedListener.php @@ -11,10 +11,12 @@ namespace OCA\Files_Sharing\Listener; use OCA\Files_Sharing\Event\UserShareAccessUpdatedEvent; use OCA\Files_Sharing\MountProvider; use OCA\Files_Sharing\ShareTargetValidator; +use OCP\Cache\CappedMemoryCache; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; use OCP\Files\Config\ICachedMountInfo; use OCP\Files\Config\IUserMountCache; +use OCP\Files\Events\Node\FilesystemTornDownEvent; use OCP\Group\Events\UserAddedEvent; use OCP\Group\Events\UserRemovedEvent; use OCP\IUser; @@ -25,18 +27,23 @@ use OCP\Share\IManager; /** * Listen to various events that can change what shares a user has access to * - * @template-implements IEventListener + * @template-implements IEventListener */ class SharesUpdatedListener implements IEventListener { + private CappedMemoryCache $updatedUsers; + public function __construct( private readonly IManager $shareManager, private readonly IUserMountCache $userMountCache, private readonly MountProvider $shareMountProvider, private readonly ShareTargetValidator $shareTargetValidator, ) { + $this->updatedUsers = new CappedMemoryCache(); } - public function handle(Event $event): void { + if ($event instanceof FilesystemTornDownEvent) { + $this->updatedUsers = new CappedMemoryCache(); + } if ($event instanceof UserAddedEvent || $event instanceof UserRemovedEvent || $event instanceof UserShareAccessUpdatedEvent) { $this->updateForUser($event->getUser()); } @@ -48,6 +55,11 @@ class SharesUpdatedListener implements IEventListener { } private function updateForUser(IUser $user): void { + if (isset($this->updatedUsers[$user->getUID()])) { + return; + } + $this->updatedUsers[$user->getUID()] = true; + $cachedMounts = $this->userMountCache->getMountsForUser($user); $mountPoints = array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts); $mountsByPath = array_combine($mountPoints, $cachedMounts);