improve di performance for cache

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2023-08-15 18:41:53 +02:00
parent d78563c6eb
commit 7a91abb439
7 changed files with 102 additions and 54 deletions

View File

@ -1338,6 +1338,7 @@ return array(
'OC\\Files\\AppData\\AppData' => $baseDir . '/lib/private/Files/AppData/AppData.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\\CacheDependencies' => $baseDir . '/lib/private/Files/Cache/CacheDependencies.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\\FailedCache' => $baseDir . '/lib/private/Files/Cache/FailedCache.php',

View File

@ -1371,6 +1371,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Files\\AppData\\AppData' => __DIR__ . '/../../..' . '/lib/private/Files/AppData/AppData.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\\CacheDependencies' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/CacheDependencies.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\\FailedCache' => __DIR__ . '/../../..' . '/lib/private/Files/Cache/FailedCache.php',

View File

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

View File

@ -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;
}
}

View File

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

View File

@ -43,6 +43,7 @@
namespace OC\Files\Storage;
use OC\Files\Cache\Cache;
use OC\Files\Cache\CacheDependencies;
use OC\Files\Cache\Propagator;
use OC\Files\Cache\Scanner;
use OC\Files\Cache\Updater;
@ -338,12 +339,20 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
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) {
if (!$storage) {
$storage = $this;
}
if (!isset($storage->cache)) {
$storage->cache = new Cache($storage);
$storage->cache = new Cache($storage, $this->getCacheDependencies());
}
return $storage->cache;
}
@ -398,13 +407,7 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
}
public function getStorageCache($storage = null) {
if (!$storage) {
$storage = $this;
}
if (!isset($this->storageCache)) {
$this->storageCache = new \OC\Files\Cache\Storage($storage);
}
return $this->storageCache;
return $this->getCache($storage)->getStorageCache();
}
/**

View File

@ -68,7 +68,7 @@ class Home extends Local implements \OCP\Files\IHomeStorage {
$storage = $this;
}
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;
}