mirror of
https://github.com/nextcloud/server.git
synced 2026-05-28 04:32:30 -04:00
Merge pull request #30531 from nextcloud/performance/optimize-filesystemtags-flow-groupfolder
Optimize FileSystemTags workflow for groupfolder
This commit is contained in:
commit
992c26f8ed
2 changed files with 42 additions and 11 deletions
|
|
@ -36,6 +36,7 @@ use OCP\SystemTag\ISystemTagObjectMapper;
|
|||
use OCP\SystemTag\TagNotFoundException;
|
||||
use OCP\WorkflowEngine\ICheck;
|
||||
use OCP\WorkflowEngine\IFileCheck;
|
||||
use OC\Files\Storage\Wrapper\Wrapper;
|
||||
|
||||
class FileSystemTags implements ICheck, IFileCheck {
|
||||
use TFileCheck;
|
||||
|
|
@ -132,13 +133,26 @@ class FileSystemTags implements ICheck, IFileCheck {
|
|||
* @return int[]
|
||||
*/
|
||||
protected function getFileIds(ICache $cache, $path, $isExternalStorage) {
|
||||
// TODO: Fix caching inside group folders
|
||||
// Do not cache file ids inside group folders because multiple file ids might be mapped to
|
||||
// the same combination of cache id + path.
|
||||
/** @psalm-suppress InvalidArgument */
|
||||
$shouldCacheFileIds = !$this->storage->instanceOfStorage(\OCA\GroupFolders\Mount\GroupFolderStorage::class);
|
||||
$cacheId = $cache->getNumericStorageId();
|
||||
if ($shouldCacheFileIds && isset($this->fileIds[$cacheId][$path])) {
|
||||
if ($this->storage->instanceOfStorage(\OCA\GroupFolders\Mount\GroupFolderStorage::class)) {
|
||||
// Special implementation for groupfolder since all groupfolders share the same storage
|
||||
// id so add the group folder id in the cache key too.
|
||||
$groupFolderStorage = $this->storage;
|
||||
if ($this->storage instanceof Wrapper) {
|
||||
$groupFolderStorage = $this->storage->getInstanceOfStorage(\OCA\GroupFolders\Mount\GroupFolderStorage::class);
|
||||
}
|
||||
if ($groupFolderStorage === null) {
|
||||
throw new \LogicException('Should not happen: Storage is instance of GroupFolderStorage but no group folder storage found while unwrapping.');
|
||||
}
|
||||
/**
|
||||
* @psalm-suppress UndefinedDocblockClass
|
||||
* @psalm-suppress UndefinedInterfaceMethod
|
||||
*/
|
||||
$cacheId = $cache->getNumericStorageId() . '/' . $groupFolderStorage->getFolderId();
|
||||
} else {
|
||||
$cacheId = $cache->getNumericStorageId();
|
||||
}
|
||||
if (isset($this->fileIds[$cacheId][$path])) {
|
||||
return $this->fileIds[$cacheId][$path];
|
||||
}
|
||||
|
||||
|
|
@ -151,12 +165,10 @@ class FileSystemTags implements ICheck, IFileCheck {
|
|||
|
||||
$fileId = $cache->getId($path);
|
||||
if ($fileId !== -1) {
|
||||
$parentIds[] = $cache->getId($path);
|
||||
$parentIds[] = $fileId;
|
||||
}
|
||||
|
||||
if ($shouldCacheFileIds) {
|
||||
$this->fileIds[$cacheId][$path] = $parentIds;
|
||||
}
|
||||
$this->fileIds[$cacheId][$path] = $parentIds;
|
||||
|
||||
return $parentIds;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -486,7 +486,7 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
|
|||
/**
|
||||
* Check if the storage is an instance of $class or is a wrapper for a storage that is an instance of $class
|
||||
*
|
||||
* @param string $class
|
||||
* @param class-string<IStorage> $class
|
||||
* @return bool
|
||||
*/
|
||||
public function instanceOfStorage($class) {
|
||||
|
|
@ -497,6 +497,25 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
|
|||
return is_a($this, $class) or $this->getWrapperStorage()->instanceOfStorage($class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @psalm-template T of IStorage
|
||||
* @psalm-param class-string<T> $class
|
||||
* @psalm-return T|null
|
||||
*/
|
||||
public function getInstanceOfStorage(string $class) {
|
||||
$storage = $this;
|
||||
while ($storage instanceof Wrapper) {
|
||||
if ($storage instanceof $class) {
|
||||
break;
|
||||
}
|
||||
$storage = $storage->getWrapperStorage();
|
||||
}
|
||||
if (!($storage instanceof $class)) {
|
||||
return null;
|
||||
}
|
||||
return $storage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pass any methods custom to specific storage implementations to the wrapped storage
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in a new issue