Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2022-04-08 17:23:15 +0300
committerRobin Appelman <robin@icewind.nl>2022-04-08 17:23:15 +0300
commitfc8396a72fbd330d103c1b860aa22d06218aa09d (patch)
tree672f72d54f5eabf2a552ce05ba8987d013db6ab6
parentc023a6efb3b526bc4bced14648ead5a818415451 (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.php8
-rw-r--r--lib/private/Files/Cache/StorageGlobal.php83
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();
}
}