perf: only update shares for users once

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2026-01-19 15:42:28 +01:00 committed by Louis Chmn
parent ffa6784bba
commit 7e16d3fe49
2 changed files with 16 additions and 2 deletions

View file

@ -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);
}

View file

@ -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<UserAddedEvent|UserRemovedEvent|ShareCreatedEvent|BeforeShareDeletedEvent|UserShareAccessUpdatedEvent>
* @template-implements IEventListener<UserAddedEvent|UserRemovedEvent|ShareCreatedEvent|BeforeShareDeletedEvent|UserShareAccessUpdatedEvent|FilesystemTornDownEvent>
*/
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);