diff options
author | Robin McCorkell <rmccorkell@karoshi.org.uk> | 2015-07-15 15:21:07 +0100 |
---|---|---|
committer | Robin McCorkell <rmccorkell@karoshi.org.uk> | 2015-07-15 22:53:14 +0100 |
commit | 7830434d784ee85507a53499906cee8dbc232ae1 (patch) | |
tree | 469bb452f971fb577f2163271cbc763c13ec0a9e | |
parent | e46ec4a6b6fd48cf7684daa1e2d6b266162600c6 (diff) | |
download | nextcloud-server-7830434d784ee85507a53499906cee8dbc232ae1.tar.gz nextcloud-server-7830434d784ee85507a53499906cee8dbc232ae1.zip |
Missing memcache should not cause occ hard-fail
Warning is now printed to logs, but occ and cron will still work.
-rw-r--r-- | lib/private/memcache/factory.php | 49 | ||||
-rw-r--r-- | lib/private/server.php | 4 |
2 files changed, 41 insertions, 12 deletions
diff --git a/lib/private/memcache/factory.php b/lib/private/memcache/factory.php index 5bb7e42c808..a3fc8dfe62c 100644 --- a/lib/private/memcache/factory.php +++ b/lib/private/memcache/factory.php @@ -29,6 +29,7 @@ namespace OC\Memcache; use \OCP\ICacheFactory; +use \OCP\ILogger; class Factory implements ICacheFactory { const NULL_CACHE = '\\OC\\Memcache\\NullCache'; @@ -39,6 +40,11 @@ class Factory implements ICacheFactory { private $globalPrefix; /** + * @var ILogger $logger + */ + private $logger; + + /** * @var string $localCacheClass */ private $localCacheClass; @@ -55,13 +61,15 @@ class Factory implements ICacheFactory { /** * @param string $globalPrefix + * @param ILogger $logger * @param string|null $localCacheClass * @param string|null $distributedCacheClass * @param string|null $lockingCacheClass */ - public function __construct($globalPrefix, + public function __construct($globalPrefix, ILogger $logger, $localCacheClass = null, $distributedCacheClass = null, $lockingCacheClass = null) { + $this->logger = $logger; $this->globalPrefix = $globalPrefix; if (!$localCacheClass) { @@ -71,22 +79,43 @@ class Factory implements ICacheFactory { $distributedCacheClass = $localCacheClass; } + $missingCacheMessage = 'Memcache {class} not available for {use} cache'; + $missingCacheHint = 'Is the matching PHP module installed and enabled?'; if (!$localCacheClass::isAvailable()) { - throw new \OC\HintException( - 'Missing memcache class ' . $localCacheClass . ' for local cache', - 'Is the matching PHP module installed and enabled ?' - ); + if (\OC::$CLI) { + // CLI should not hard-fail on broken memcache + $this->logger->info($missingCacheMessage, [ + 'class' => $localCacheClass, + 'use' => 'local', + 'app' => 'cli' + ]); + $localCacheClass = self::NULL_CACHE; + } else { + throw new \OC\HintException(strtr($missingCacheMessage, [ + '{class}' => $localCacheClass, '{use}' => 'local' + ]), $missingCacheHint); + } } if (!$distributedCacheClass::isAvailable()) { - throw new \OC\HintException( - 'Missing memcache class ' . $distributedCacheClass . ' for distributed cache', - 'Is the matching PHP module installed and enabled ?' - ); + if (\OC::$CLI) { + // CLI should not hard-fail on broken memcache + $this->logger->info($missingCacheMessage, [ + 'class' => $distributedCacheClass, + 'use' => 'distributed', + 'app' => 'cli' + ]); + $distributedCacheClass = self::NULL_CACHE; + } else { + throw new \OC\HintException(strtr($missingCacheMessage, [ + '{class}' => $distributedCacheClass, '{use}' => 'distributed' + ]), $missingCacheHint); + } } if (!($lockingCacheClass && $lockingCacheClass::isAvailable())) { // dont fallback since the fallback might not be suitable for storing lock - $lockingCacheClass = '\OC\Memcache\NullCache'; + $lockingCacheClass = self::NULL_CACHE; } + $this->localCacheClass = $localCacheClass; $this->distributedCacheClass = $distributedCacheClass; $this->lockingCacheClass = $lockingCacheClass; diff --git a/lib/private/server.php b/lib/private/server.php index 84141fe28c1..a3043f943ca 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -234,14 +234,14 @@ class Server extends SimpleContainer implements IServerContainer { $instanceId = \OC_Util::getInstanceId(); $path = \OC::$SERVERROOT; $prefix = md5($instanceId.'-'.$version.'-'.$path); - return new \OC\Memcache\Factory($prefix, + return new \OC\Memcache\Factory($prefix, $c->getLogger(), $config->getSystemValue('memcache.local', null), $config->getSystemValue('memcache.distributed', null), $config->getSystemValue('memcache.locking', null) ); } - return new \OC\Memcache\Factory('', + return new \OC\Memcache\Factory('', $c->getLogger(), new ArrayCache(), new ArrayCache(), new ArrayCache() |