Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 41 additions & 20 deletions lib/private/Files/SetupManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
use OCP\Constants;
use OCP\Diagnostics\IEventLogger;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\Config\IAuthoritativeMountProvider;
use OCP\Files\Config\ICachedMountInfo;
use OCP\Files\Config\IHomeMountProvider;
use OCP\Files\Config\IMountProvider;
Expand Down Expand Up @@ -226,6 +227,24 @@ function ($mountPoint, IStorage $storage, IMountPoint $mount) use ($reSharingEna
Filesystem::logWarningWhenAddingStorageWrapper($prevLogging);
}

/**
* Update the cached mounts for all non-authoritative mount providers for a user.
*/
private function updateNonAuthoritativeProviders(IUser $user): void {
$providers = $this->mountProviderCollection->getProviders();
$nonAuthoritativeProviders = array_filter(
$providers,
fn (IMountProvider $provider) => !(
$provider instanceof IAuthoritativeMountProvider
|| $provider instanceof IRootMountProvider
|| $provider instanceof IHomeMountProvider
)
);
$providerNames = array_map(fn (IMountProvider $provider) => get_class($provider), $nonAuthoritativeProviders);
$mount = $this->mountProviderCollection->getUserMountsForProviderClasses($user, $providerNames);
$this->userMountCache->registerMounts($user, $mount, $providerNames);
}

/**
* Setup the full filesystem for the specified user
*/
Expand Down Expand Up @@ -335,12 +354,16 @@ private function afterUserFullySetup(IUser $user, array $previouslySetupProvider
});
$this->registerMounts($user, $mounts, $newProviders);

$this->markUserMountsCached($user);
$this->eventLogger->end('fs:setup:user:full:post');
}

private function markUserMountsCached(IUser $user): void {
$cacheDuration = $this->config->getSystemValueInt('fs_mount_cache_duration', 5 * 60);
if ($cacheDuration > 0) {
$this->cache->set($user->getUID(), true, $cacheDuration);
$this->fullSetupRequired[$user->getUID()] = false;
}
$this->eventLogger->end('fs:setup:user:full:post');
}

/**
Expand Down Expand Up @@ -434,8 +457,8 @@ public function setupForPath(string $path, bool $includeChildren = false): void
}

if ($this->fullSetupRequired($user)) {
$this->setupForUser($user);
return;
$this->updateNonAuthoritativeProviders($user);
$this->markUserMountsCached($user);
}

// for the user's home folder, and includes children we need everything always
Expand Down Expand Up @@ -505,11 +528,10 @@ public function setupForPath(string $path, bool $includeChildren = false): void
$subCachedMounts = $this->userMountCache->getMountsInPath($user, $path);
$this->eventLogger->end('fs:setup:user:path:find');

$needsFullSetup
= array_any(
$subCachedMounts,
fn (ICachedMountInfo $info) => $info->getMountProvider() === ''
);
$needsFullSetup = array_any(
$subCachedMounts,
fn (ICachedMountInfo $info) => $info->getMountProvider() === ''
);

if ($needsFullSetup) {
$this->logger->debug('mount has no provider set, performing full setup');
Expand Down Expand Up @@ -542,11 +564,10 @@ public function setupForPath(string $path, bool $includeChildren = false): void

$currentProviders[] = $mountProvider;
$setupProviders[] = $mountProvider;
$fullProviderMounts[]
= $this->mountProviderCollection->getUserMountsForProviderClasses(
$user,
[$mountProvider]
);
$fullProviderMounts[] = $this->mountProviderCollection->getUserMountsForProviderClasses(
$user,
[$mountProvider]
);
}

if (!empty($authoritativeCachedMounts)) {
Expand All @@ -573,13 +594,12 @@ static function (ICachedMountInfo $info) use ($rootsMetadata) {
},
$cachedMounts
));
$authoritativeMounts[]
= $this->mountProviderCollection->getUserMountsFromProviderByPath(
$providerClass,
$path,
true,
$providerArgs,
);
$authoritativeMounts[] = $this->mountProviderCollection->getUserMountsFromProviderByPath(
$providerClass,
$path,
true,
$providerArgs,
);
}
}
} else {
Expand Down Expand Up @@ -758,6 +778,7 @@ private function registerMounts(IUser $user, array $mounts, ?array $mountProvide

/**
* Drops partially set-up mounts for the given user
*
* @param class-string<IMountProvider>[] $providers
*/
public function dropPartialMountsForUser(IUser $user, array $providers = []): void {
Expand Down
Loading