]> source.dussan.org Git - nextcloud-server.git/commitdiff
improve di performance for cache
authorRobin Appelman <robin@icewind.nl>
Tue, 15 Aug 2023 16:41:53 +0000 (18:41 +0200)
committerRobin Appelman <robin@icewind.nl>
Fri, 9 Feb 2024 12:28:30 +0000 (13:28 +0100)
Signed-off-by: Robin Appelman <robin@icewind.nl>
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/Files/Cache/Cache.php
lib/private/Files/Cache/CacheDependencies.php [new file with mode: 0644]
lib/private/Files/Cache/Storage.php
lib/private/Files/Storage/Common.php
lib/private/Files/Storage/Home.php

index 04511af269e07d120752c83acfd899eb8cbb00cc..291d3d22dc2c95d7b05b3408994e5f58f0fe08b9 100644 (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',
index 4754e82106deb997b86eb48c52c970b2fd6697cf..72c586d4a9276ee76c27a9e94a60ac98fee2f701 100644 (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',
index 052b3c75ce806519dfb4713cb5456836d6bdee62..a512bf76ace33b7560fc49a32e8c74af80870495 100644 (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 = [];
-
-       /**
-        * @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) {
+       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;
+
+       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
         *
diff --git a/lib/private/Files/Cache/CacheDependencies.php b/lib/private/Files/Cache/CacheDependencies.php
new file mode 100644 (file)
index 0000000..bd4d96a
--- /dev/null
@@ -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;
+       }
+}
index 01fc638cef85e9d72a5a035317827ff643d0250d..ba0f98f42f49215477f40f4662b31ddc44867793 100644 (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');
index 3d5a2f098b2ac42bdf69ed7b4453693ad6041342..6802ef6601755a32a20f4f4784641e6d3dd00c4f 100644 (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();
        }
 
        /**
index 5100b15215b9ade6217c6bf2e9a1601aec9ef2b1..051652b75622a79235cdab6f2bdc8d59a6e4a1be 100644 (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;
        }