diff options
author | Robin Appelman <robin@icewind.nl> | 2022-04-08 17:23:15 +0300 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2022-04-08 17:23:15 +0300 |
commit | fc8396a72fbd330d103c1b860aa22d06218aa09d (patch) | |
tree | 672f72d54f5eabf2a552ce05ba8987d013db6ab6 | |
parent | c023a6efb3b526bc4bced14648ead5a818415451 (diff) |
cache storage id mapping in memcachestorage-id-cache-memcache
Signed-off-by: Robin Appelman <robin@icewind.nl>
-rw-r--r-- | lib/private/Files/Cache/Storage.php | 8 | ||||
-rw-r--r-- | lib/private/Files/Cache/StorageGlobal.php | 83 |
2 files changed, 63 insertions, 28 deletions
diff --git a/lib/private/Files/Cache/Storage.php b/lib/private/Files/Cache/Storage.php index fb9e5500658..561a42a28e2 100644 --- a/lib/private/Files/Cache/Storage.php +++ b/lib/private/Files/Cache/Storage.php @@ -31,6 +31,7 @@ namespace OC\Files\Cache; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Files\Storage\IStorage; +use OCP\ICacheFactory; use Psr\Log\LoggerInterface; /** @@ -55,7 +56,10 @@ class Storage { */ public static function getGlobalCache() { if (is_null(self::$globalCache)) { - self::$globalCache = new StorageGlobal(\OC::$server->getDatabaseConnection()); + self::$globalCache = new StorageGlobal( + \OC::$server->getDatabaseConnection(), + \OC::$server->get(ICacheFactory::class), + ); } return self::$globalCache; } @@ -180,6 +184,7 @@ class Storage { ->set('last_checked', $query->createNamedParameter(time() + $delay)) ->where($query->expr()->eq('id', $query->createNamedParameter($this->storageId))); $query->execute(); + self::getGlobalCache()->removeFromMemcache($this->numericId, $this->storageId); } /** @@ -200,6 +205,7 @@ class Storage { public static function remove($storageId) { $storageId = self::adjustStorageId($storageId); $numericId = self::getNumericStorageId($storageId); + self::getGlobalCache()->removeFromMemcache($numericId, $storageId); $query = \OC::$server->getDatabaseConnection()->getQueryBuilder(); $query->delete('storages') diff --git a/lib/private/Files/Cache/StorageGlobal.php b/lib/private/Files/Cache/StorageGlobal.php index a898c435415..76eaff5b904 100644 --- a/lib/private/Files/Cache/StorageGlobal.php +++ b/lib/private/Files/Cache/StorageGlobal.php @@ -24,6 +24,8 @@ namespace OC\Files\Cache; use OCP\DB\QueryBuilder\IQueryBuilder; +use OCP\ICache; +use OCP\ICacheFactory; use OCP\IDBConnection; /** @@ -38,16 +40,17 @@ use OCP\IDBConnection; * @package OC\Files\Cache */ class StorageGlobal { - /** @var IDBConnection */ - private $connection; + private IDBConnection $connection; + private ICache $memCache; /** @var array<string, array> */ private $cache = []; /** @var array<int, array> */ private $numericIdCache = []; - public function __construct(IDBConnection $connection) { + public function __construct(IDBConnection $connection, ICacheFactory $cacheFactory) { $this->connection = $connection; + $this->memCache = $cacheFactory->createLocal("storage_id::"); } /** @@ -72,19 +75,13 @@ class StorageGlobal { */ public function getStorageInfo(string $storageId): ?array { if (!isset($this->cache[$storageId])) { - $builder = $this->connection->getQueryBuilder(); - $query = $builder->select(['id', 'numeric_id', 'available', 'last_checked']) - ->from('storages') - ->where($builder->expr()->eq('id', $builder->createNamedParameter($storageId))); - - $result = $query->execute(); - $row = $result->fetch(); - $result->closeCursor(); - - if ($row) { - $this->cache[$storageId] = $row; - $this->numericIdCache[(int)$row['numeric_id']] = $row; + $data = $this->memCache->get("id::$storageId"); + if (!$data) { + $data = $this->getByIdFromDb($storageId); + $this->memCache->set("id::$storageId", $data); } + $this->cache[$storageId] = $data; + $this->numericIdCache[(int)$data['numeric_id']] = $data; } return $this->cache[$storageId] ?? null; } @@ -95,24 +92,56 @@ class StorageGlobal { */ public function getStorageInfoByNumericId(int $numericId): ?array { if (!isset($this->numericIdCache[$numericId])) { - $builder = $this->connection->getQueryBuilder(); - $query = $builder->select(['id', 'numeric_id', 'available', 'last_checked']) - ->from('storages') - ->where($builder->expr()->eq('numeric_id', $builder->createNamedParameter($numericId))); - - $result = $query->execute(); - $row = $result->fetch(); - $result->closeCursor(); - - if ($row) { - $this->numericIdCache[$numericId] = $row; - $this->cache[$row['id']] = $row; + $data = $this->memCache->get("numeric::$numericId"); + if (!$data) { + $data = $this->getByNumericFromDb($numericId); + $this->memCache->set("numeric::$numericId", $data); } + $this->numericIdCache[$numericId] = $data; + $this->cache[$data['id']] = $data; } return $this->numericIdCache[$numericId] ?? null; } + private function getByIdFromDb(string $storageId): ?array { + $builder = $this->connection->getQueryBuilder(); + $query = $builder->select(['id', 'numeric_id', 'available', 'last_checked']) + ->from('storages') + ->where($builder->expr()->eq('id', $builder->createNamedParameter($storageId))); + + $result = $query->execute(); + $row = $result->fetch(); + $result->closeCursor(); + if ($row) { + return $row; + } else { + return null; + } + } + + private function getByNumericFromDb(int $numericId): ?array { + $builder = $this->connection->getQueryBuilder(); + $query = $builder->select(['id', 'numeric_id', 'available', 'last_checked']) + ->from('storages') + ->where($builder->expr()->eq('numeric_id', $builder->createNamedParameter($numericId))); + + $result = $query->execute(); + $row = $result->fetch(); + $result->closeCursor(); + if ($row) { + return $row; + } else { + return null; + } + } + + public function removeFromMemcache(int $numericId, string $id) { + $this->memCache->remove("id::$id"); + $this->memCache->remove("numeric::$numericId"); + } + public function clearCache() { $this->cache = []; + $this->memCache->clear(); } } |