Skip to content

Commit b431506

Browse files
committed
perf: only update shares for users once
Signed-off-by: Robin Appelman <robin@icewind.nl>
1 parent 94f3346 commit b431506

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

apps/files_sharing/lib/AppInfo/Application.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
use OCP\Files\Events\BeforeDirectFileDownloadEvent;
4949
use OCP\Files\Events\BeforeZipCreatedEvent;
5050
use OCP\Files\Events\Node\BeforeNodeReadEvent;
51+
use OCP\Files\Events\Node\FilesystemTornDownEvent;
5152
use OCP\Group\Events\GroupChangedEvent;
5253
use OCP\Group\Events\GroupDeletedEvent;
5354
use OCP\Group\Events\UserAddedEvent;
@@ -119,6 +120,7 @@ function () use ($c) {
119120
$context->registerEventListener(UserAddedEvent::class, SharesUpdatedListener::class);
120121
$context->registerEventListener(UserRemovedEvent::class, SharesUpdatedListener::class);
121122
$context->registerEventListener(UserShareAccessUpdatedEvent::class, SharesUpdatedListener::class);
123+
$context->registerEventListener(FilesystemTornDownEvent::class, SharesUpdatedListener::class);
122124

123125
$context->registerConfigLexicon(ConfigLexicon::class);
124126
}

apps/files_sharing/lib/Listener/SharesUpdatedListener.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
use OCA\Files_Sharing\Event\UserShareAccessUpdatedEvent;
1212
use OCA\Files_Sharing\MountProvider;
1313
use OCA\Files_Sharing\ShareTargetValidator;
14+
use OCP\Cache\CappedMemoryCache;
1415
use OCP\EventDispatcher\Event;
1516
use OCP\EventDispatcher\IEventListener;
1617
use OCP\Files\Config\ICachedMountInfo;
1718
use OCP\Files\Config\IUserMountCache;
19+
use OCP\Files\Events\Node\FilesystemTornDownEvent;
1820
use OCP\Group\Events\UserAddedEvent;
1921
use OCP\Group\Events\UserRemovedEvent;
2022
use OCP\IUser;
@@ -25,18 +27,23 @@
2527
/**
2628
* Listen to various events that can change what shares a user has access to
2729
*
28-
* @template-implements IEventListener<UserAddedEvent|UserRemovedEvent|ShareCreatedEvent|BeforeShareDeletedEvent|UserShareAccessUpdatedEvent>
30+
* @template-implements IEventListener<UserAddedEvent|UserRemovedEvent|ShareCreatedEvent|BeforeShareDeletedEvent|UserShareAccessUpdatedEvent|FilesystemTornDownEvent>
2931
*/
3032
class SharesUpdatedListener implements IEventListener {
33+
private CappedMemoryCache $updatedUsers;
34+
3135
public function __construct(
3236
private readonly IManager $shareManager,
3337
private readonly IUserMountCache $userMountCache,
3438
private readonly MountProvider $shareMountProvider,
3539
private readonly ShareTargetValidator $shareTargetValidator,
3640
) {
41+
$this->updatedUsers = new CappedMemoryCache();
3742
}
38-
3943
public function handle(Event $event): void {
44+
if ($event instanceof FilesystemTornDownEvent) {
45+
$this->updatedUsers = new CappedMemoryCache();
46+
}
4047
if ($event instanceof UserAddedEvent || $event instanceof UserRemovedEvent || $event instanceof UserShareAccessUpdatedEvent) {
4148
$this->updateForUser($event->getUser());
4249
}
@@ -48,6 +55,11 @@ public function handle(Event $event): void {
4855
}
4956

5057
private function updateForUser(IUser $user): void {
58+
if (isset($this->updatedUsers[$user->getUID()])) {
59+
return;
60+
}
61+
$this->updatedUsers[$user->getUID()] = true;
62+
5163
$cachedMounts = $this->userMountCache->getMountsForUser($user);
5264
$mountPoints = array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $cachedMounts);
5365
$mountsByPath = array_combine($mountPoints, $cachedMounts);

0 commit comments

Comments
 (0)