@@ -1039,6 +1039,12 @@ $CONFIG = array( | |||
*/ | |||
'filelocking.enabled' => false, | |||
/** | |||
* Memory caching backend for file locking | |||
* Because most memcache backends can clean values without warning using redis is recommended | |||
*/ | |||
'memcache.locking' => '\OC\Memcache\Redis', | |||
/** | |||
* This entry is just here to show a warning in case somebody copied the sample | |||
* configuration. DO NOT ADD THIS SWITCH TO YOUR CONFIGURATION! |
@@ -46,13 +46,19 @@ class Factory implements ICacheFactory { | |||
*/ | |||
private $distributedCacheClass; | |||
/** | |||
* @var string $lockingCacheClass | |||
*/ | |||
private $lockingCacheClass; | |||
/** | |||
* @param string $globalPrefix | |||
* @param string|null $localCacheClass | |||
* @param string|null $distributedCacheClass | |||
* @param string|null $lockingCacheClass | |||
*/ | |||
public function __construct($globalPrefix, | |||
$localCacheClass = null, $distributedCacheClass = null) | |||
$localCacheClass = null, $distributedCacheClass = null, $lockingCacheClass = null) | |||
{ | |||
$this->globalPrefix = $globalPrefix; | |||
@@ -62,8 +68,23 @@ class Factory implements ICacheFactory { | |||
if (!($distributedCacheClass && $distributedCacheClass::isAvailable())) { | |||
$distributedCacheClass = $localCacheClass; | |||
} | |||
if (!($lockingCacheClass && $lockingCacheClass::isAvailable())) { | |||
// dont fallback since the fallback might not be suitable for storing lock | |||
$lockingCacheClass = '\OC\Memcache\Null'; | |||
} | |||
$this->localCacheClass = $localCacheClass; | |||
$this->distributedCacheClass = $distributedCacheClass; | |||
$this->lockingCacheClass = $lockingCacheClass; | |||
} | |||
/** | |||
* create a cache instance for storing locks | |||
* | |||
* @param string $prefix | |||
* @return \OCP\IMemcache | |||
*/ | |||
public function createLocking($prefix = '') { | |||
return new $this->lockingCacheClass($this->globalPrefix . '/' . $prefix); | |||
} | |||
/** |
@@ -234,7 +234,8 @@ class Server extends SimpleContainer implements IServerContainer { | |||
$prefix = md5($instanceId.'-'.$version.'-'.$path); | |||
return new \OC\Memcache\Factory($prefix, | |||
$config->getSystemValue('memcache.local', null), | |||
$config->getSystemValue('memcache.distributed', null) | |||
$config->getSystemValue('memcache.distributed', null), | |||
$config->getSystemValue('memcache.locking', null) | |||
); | |||
} | |||
@@ -426,7 +427,7 @@ class Server extends SimpleContainer implements IServerContainer { | |||
if ($c->getConfig()->getSystemValue('filelocking.enabled', false) or (defined('PHPUNIT_RUN') && PHPUNIT_RUN)) { | |||
/** @var \OC\Memcache\Factory $memcacheFactory */ | |||
$memcacheFactory = $c->getMemCacheFactory(); | |||
$memcache = $memcacheFactory->createDistributed('lock'); | |||
$memcache = $memcacheFactory->createLocking('lock'); | |||
if (!($memcache instanceof \OC\Memcache\Null)) { | |||
return new MemcacheLockingProvider($memcache); | |||
} |