improve di performance for cache

Signed-off-by: Robin Appelman <robin@icewind.nl>
pull/39889/head
Robin Appelman 2023-08-15 18:41:53 +07:00
parent d78563c6eb
commit 7a91abb439
7 changed files with 103 additions and 55 deletions

@ -1338,6 +1338,7 @@ return array(
'OC\\Files\\AppData\\AppData' => $baseDir . '/lib/private/Files/AppData/AppData.php', 'OC\\Files\\AppData\\AppData' => $baseDir . '/lib/private/Files/AppData/AppData.php',
'OC\\Files\\AppData\\Factory' => $baseDir . '/lib/private/Files/AppData/Factory.php', 'OC\\Files\\AppData\\Factory' => $baseDir . '/lib/private/Files/AppData/Factory.php',
'OC\\Files\\Cache\\Cache' => $baseDir . '/lib/private/Files/Cache/Cache.php', 'OC\\Files\\Cache\\Cache' => $baseDir . '/lib/private/Files/Cache/Cache.php',
'OC\\Files\\Cache\\CacheDependencies' => $baseDir . '/lib/private/Files/Cache/CacheDependencies.php',
'OC\\Files\\Cache\\CacheEntry' => $baseDir . '/lib/private/Files/Cache/CacheEntry.php', 'OC\\Files\\Cache\\CacheEntry' => $baseDir . '/lib/private/Files/Cache/CacheEntry.php',
'OC\\Files\\Cache\\CacheQueryBuilder' => $baseDir . '/lib/private/Files/Cache/CacheQueryBuilder.php', 'OC\\Files\\Cache\\CacheQueryBuilder' => $baseDir . '/lib/private/Files/Cache/CacheQueryBuilder.php',
'OC\\Files\\Cache\\FailedCache' => $baseDir . '/lib/private/Files/Cache/FailedCache.php', 'OC\\Files\\Cache\\FailedCache' => $baseDir . '/lib/private/Files/Cache/FailedCache.php',

@ -1371,6 +1371,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Files\\AppData\\AppData' => __DIR__ . '/../../..' . '/lib/private/Files/AppData/AppData.php', 'OC\\Files\\AppData\\AppData' => __DIR__ . '/../../..' . '/lib/private/Files/AppData/AppData.php',
'OC\\Files\\AppData\\Factory' => __DIR__ . '/../../..' . '/lib/private/Files/AppData/Factory.php', 'OC\\Files\\AppData\\Factory' => __DIR__ . '/../../..' . '/lib/private/Files/AppData/Factory.php',
'OC\\Files\\Cache\\Cache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/Cache.php', 'OC\\Files\\Cache\\Cache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/Cache.php',
'OC\\Files\\Cache\\CacheDependencies' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheDependencies.php',
'OC\\Files\\Cache\\CacheEntry' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheEntry.php', 'OC\\Files\\Cache\\CacheEntry' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheEntry.php',
'OC\\Files\\Cache\\CacheQueryBuilder' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheQueryBuilder.php', 'OC\\Files\\Cache\\CacheQueryBuilder' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheQueryBuilder.php',
'OC\\Files\\Cache\\FailedCache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/FailedCache.php', 'OC\\Files\\Cache\\FailedCache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/FailedCache.php',

@ -44,6 +44,7 @@ use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use OC\Files\Search\SearchComparison; use OC\Files\Search\SearchComparison;
use OC\Files\Search\SearchQuery; use OC\Files\Search\SearchQuery;
use OC\Files\Storage\Wrapper\Encryption; use OC\Files\Storage\Wrapper\Encryption;
use OC\SystemConfig;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\EventDispatcher\IEventDispatcher; use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\Cache\CacheEntryInsertedEvent; use OCP\Files\Cache\CacheEntryInsertedEvent;
@ -82,62 +83,53 @@ class Cache implements ICache {
/** /**
* @var array partial data for the cache * @var array partial data for the cache
*/ */
protected $partial = []; protected array $partial = [];
protected string $storageId;
/** protected Storage $storageCache;
* @var string protected IMimeTypeLoader$mimetypeLoader;
*/ protected IDBConnection $connection;
protected $storageId; protected SystemConfig $systemConfig;
protected LoggerInterface $logger;
private $storage; protected QuerySearchHelper $querySearchHelper;
protected IEventDispatcher $eventDispatcher;
/** protected IFilesMetadataManager $metadataManager;
* @var Storage $storageCache
*/ public function __construct(
protected $storageCache; private IStorage $storage,
// this constructor is used in to many pleases to easily do proper di
/** @var IMimeTypeLoader */ // so instead we group it all together
protected $mimetypeLoader; CacheDependencies $dependencies = null,
) {
/**
* @var IDBConnection
*/
protected $connection;
/**
* @var IEventDispatcher
*/
protected $eventDispatcher;
/** @var QuerySearchHelper */
protected $querySearchHelper;
/**
* @param IStorage $storage
*/
public function __construct(IStorage $storage) {
$this->storageId = $storage->getId(); $this->storageId = $storage->getId();
$this->storage = $storage;
if (strlen($this->storageId) > 64) { if (strlen($this->storageId) > 64) {
$this->storageId = md5($this->storageId); $this->storageId = md5($this->storageId);
} }
if (!$dependencies) {
$this->storageCache = new Storage($storage); $dependencies = \OC::$server->get(CacheDependencies::class);
$this->mimetypeLoader = \OC::$server->getMimeTypeLoader(); }
$this->connection = \OC::$server->getDatabaseConnection(); $this->storageCache = new Storage($this->storage, true, $dependencies->getConnection());
$this->eventDispatcher = \OC::$server->get(IEventDispatcher::class); $this->mimetypeLoader = $dependencies->getMimeTypeLoader();
$this->querySearchHelper = \OCP\Server::get(QuerySearchHelper::class); $this->connection = $dependencies->getConnection();
$this->systemConfig = $dependencies->getSystemConfig();
$this->logger = $dependencies->getLogger();
$this->querySearchHelper = $dependencies->getQuerySearchHelper();
$this->eventDispatcher = $dependencies->getEventDispatcher();
$this->metadataManager = $dependencies->getMetadataManager();
} }
protected function getQueryBuilder() { protected function getQueryBuilder() {
return new CacheQueryBuilder( return new CacheQueryBuilder(
$this->connection, $this->connection,
\OC::$server->getSystemConfig(), $this->systemConfig,
\OC::$server->get(LoggerInterface::class), $this->logger,
\OC::$server->get(IFilesMetadataManager::class), $this->metadataManager,
); );
} }
public function getStorageCache(): Storage {
return $this->storageCache;
}
/** /**
* Get the numeric storage id for this cache's storage * Get the numeric storage id for this cache's storage
* *

@ -0,0 +1,51 @@
<?php
namespace OC\Files\Cache;
use OC\SystemConfig;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\IMimeTypeLoader;
use OCP\FilesMetadata\IFilesMetadataManager;
use OCP\IDBConnection;
use Psr\Log\LoggerInterface;
class CacheDependencies {
public function __construct(
private IMimeTypeLoader $mimeTypeLoader,
private IDBConnection $connection,
private IEventDispatcher $eventDispatcher,
private QuerySearchHelper $querySearchHelper,
private SystemConfig $systemConfig,
private LoggerInterface $logger,
private IFilesMetadataManager $metadataManager,
) {
}
public function getMimeTypeLoader(): IMimeTypeLoader {
return $this->mimeTypeLoader;
}
public function getConnection(): IDBConnection {
return $this->connection;
}
public function getEventDispatcher(): IEventDispatcher {
return $this->eventDispatcher;
}
public function getQuerySearchHelper(): QuerySearchHelper {
return $this->querySearchHelper;
}
public function getSystemConfig(): SystemConfig {
return $this->systemConfig;
}
public function getLogger(): LoggerInterface {
return $this->logger;
}
public function getMetadataManager(): IFilesMetadataManager {
return $this->metadataManager;
}
}

@ -31,6 +31,7 @@ namespace OC\Files\Cache;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\Storage\IStorage; use OCP\Files\Storage\IStorage;
use OCP\IDBConnection;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
/** /**
@ -65,7 +66,7 @@ class Storage {
* @param bool $isAvailable * @param bool $isAvailable
* @throws \RuntimeException * @throws \RuntimeException
*/ */
public function __construct($storage, $isAvailable = true) { public function __construct($storage, $isAvailable, IDBConnection $connection) {
if ($storage instanceof IStorage) { if ($storage instanceof IStorage) {
$this->storageId = $storage->getId(); $this->storageId = $storage->getId();
} else { } else {
@ -76,7 +77,6 @@ class Storage {
if ($row = self::getStorageById($this->storageId)) { if ($row = self::getStorageById($this->storageId)) {
$this->numericId = (int)$row['numeric_id']; $this->numericId = (int)$row['numeric_id'];
} else { } else {
$connection = \OC::$server->getDatabaseConnection();
$available = $isAvailable ? 1 : 0; $available = $isAvailable ? 1 : 0;
if ($connection->insertIfNotExist('*PREFIX*storages', ['id' => $this->storageId, 'available' => $available])) { if ($connection->insertIfNotExist('*PREFIX*storages', ['id' => $this->storageId, 'available' => $available])) {
$this->numericId = $connection->lastInsertId('*PREFIX*storages'); $this->numericId = $connection->lastInsertId('*PREFIX*storages');

@ -43,6 +43,7 @@
namespace OC\Files\Storage; namespace OC\Files\Storage;
use OC\Files\Cache\Cache; use OC\Files\Cache\Cache;
use OC\Files\Cache\CacheDependencies;
use OC\Files\Cache\Propagator; use OC\Files\Cache\Propagator;
use OC\Files\Cache\Scanner; use OC\Files\Cache\Scanner;
use OC\Files\Cache\Updater; use OC\Files\Cache\Updater;
@ -338,12 +339,20 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
return $this->filemtime($path) > $time; return $this->filemtime($path) > $time;
} }
protected function getCacheDependencies(): CacheDependencies {
static $dependencies = null;
if (!$dependencies) {
$dependencies = \OC::$server->get(CacheDependencies::class);
}
return $dependencies;
}
public function getCache($path = '', $storage = null) { public function getCache($path = '', $storage = null) {
if (!$storage) { if (!$storage) {
$storage = $this; $storage = $this;
} }
if (!isset($storage->cache)) { if (!isset($storage->cache)) {
$storage->cache = new Cache($storage); $storage->cache = new Cache($storage, $this->getCacheDependencies());
} }
return $storage->cache; return $storage->cache;
} }
@ -398,13 +407,7 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
} }
public function getStorageCache($storage = null) { public function getStorageCache($storage = null) {
if (!$storage) { return $this->getCache($storage)->getStorageCache();
$storage = $this;
}
if (!isset($this->storageCache)) {
$this->storageCache = new \OC\Files\Cache\Storage($storage);
}
return $this->storageCache;
} }
/** /**

@ -68,7 +68,7 @@ class Home extends Local implements \OCP\Files\IHomeStorage {
$storage = $this; $storage = $this;
} }
if (!isset($this->cache)) { if (!isset($this->cache)) {
$this->cache = new \OC\Files\Cache\HomeCache($storage); $this->cache = new \OC\Files\Cache\HomeCache($storage, $this->getCacheDependencies());
} }
return $this->cache; return $this->cache;
} }