Skip to content

Commit

Permalink
invalidate mount cache on circles change
Browse files Browse the repository at this point in the history
Signed-off-by: Robin Appelman <robin@icewind.nl>
  • Loading branch information
icewind1991 committed Mar 17, 2022
1 parent a0f9331 commit 781a13b
Showing 1 changed file with 43 additions and 18 deletions.
61 changes: 43 additions & 18 deletions lib/private/Files/SetupManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,22 +103,7 @@ public function __construct(
$this->cache = $cacheFactory->createDistributed('setupmanager::');
$this->listeningForProviders = false;

$this->eventDispatcher->addListener(UserAddedEvent::class, function(UserAddedEvent $event) {
$this->cache->remove($event->getUser()->getUID());
});
$this->eventDispatcher->addListener(UserRemovedEvent::class, function(UserRemovedEvent $event) {
$this->cache->remove($event->getUser()->getUID());
});
$eventDispatcher->addListener(ShareCreatedEvent::class, function(ShareCreatedEvent $event) {
$this->cache->remove($event->getShare()->getSharedWith());
});
$eventDispatcher->addListener(InvalidateMountCacheEvent::class, function(InvalidateMountCacheEvent $event) {
if ($user = $event->getUser()) {
$this->cache->remove($user->getUID());
} else {
$this->cache->clear();
}
});
$this->setupListeners();
}

private function isSetupStarted(IUser $user): bool {
Expand Down Expand Up @@ -213,7 +198,9 @@ public function setupForUser(IUser $user): void {
}

$this->setupForUserWith($user, function () use ($user) {
$this->mountProviderCollection->addMountForUser($user, $this->mountManager, function (IMountProvider $provider) use ($user) {
$this->mountProviderCollection->addMountForUser($user, $this->mountManager, function (
IMountProvider $provider
) use ($user) {
return !in_array(get_class($provider), $this->setupUserMountProviders[$user->getUID()]);
});
});
Expand Down Expand Up @@ -433,7 +420,9 @@ public function tearDown() {
private function listenForNewMountProviders() {
if (!$this->listeningForProviders) {
$this->listeningForProviders = true;
$this->mountProviderCollection->listen('\OC\Files\Config', 'registerMountProvider', function (IMountProvider $provider) {
$this->mountProviderCollection->listen('\OC\Files\Config', 'registerMountProvider', function (
IMountProvider $provider
) {
foreach ($this->setupUsers as $userId) {
$user = $this->userManager->get($userId);
if ($user) {
Expand All @@ -444,4 +433,40 @@ private function listenForNewMountProviders() {
});
}
}

private function setupListeners() {
// note that this event handling is intentionally pessimistic
// clearing the cache to often is better than not enough

$this->eventDispatcher->addListener(UserAddedEvent::class, function (UserAddedEvent $event) {
$this->cache->remove($event->getUser()->getUID());
});
$this->eventDispatcher->addListener(UserRemovedEvent::class, function (UserRemovedEvent $event) {
$this->cache->remove($event->getUser()->getUID());
});
$this->eventDispatcher->addListener(ShareCreatedEvent::class, function (ShareCreatedEvent $event) {
$this->cache->remove($event->getShare()->getSharedWith());
});
$this->eventDispatcher->addListener(InvalidateMountCacheEvent::class, function (InvalidateMountCacheEvent $event
) {
if ($user = $event->getUser()) {
$this->cache->remove($user->getUID());
} else {
$this->cache->clear();
}
});

$genericEvents = [
'\OCA\Circles::onCircleCreation',
'\OCA\Circles::onCircleDestruction',
'\OCA\Circles::onMemberNew',
'\OCA\Circles::onMemberLeaving',
];

foreach ($genericEvents as $genericEvent) {
$this->eventDispatcher->addListener($genericEvent, function($event) {
$this->cache->clear();
});
}
}
}

0 comments on commit 781a13b

Please sign in to comment.