MDL-67020 Cache: Make locking work for local file caches
* Add new requirelockingbeforewrite flag for cache definitions * Implement native locking in cachestore_file (leveraging file_lock_factory).
This commit is contained in:
Vendored
+24
-1
@@ -208,6 +208,12 @@ class cache_definition {
|
||||
*/
|
||||
protected $requirelockingwrite = false;
|
||||
|
||||
/**
|
||||
* Gets set to true if this definition requires a lock to be acquired before a write is attempted.
|
||||
* @var bool
|
||||
*/
|
||||
protected $requirelockingbeforewrite = false;
|
||||
|
||||
/**
|
||||
* Gets set to true if this definition requires searchable stores.
|
||||
* @since Moodle 2.4.4
|
||||
@@ -357,6 +363,7 @@ class cache_definition {
|
||||
$requiremultipleidentifiers = false;
|
||||
$requirelockingread = false;
|
||||
$requirelockingwrite = false;
|
||||
$requirelockingbeforewrite = false;
|
||||
$requiresearchable = ($mode === cache_store::MODE_SESSION) ? true : false;
|
||||
$maxsize = null;
|
||||
$overrideclass = null;
|
||||
@@ -395,7 +402,14 @@ class cache_definition {
|
||||
if (array_key_exists('requirelockingwrite', $definition)) {
|
||||
$requirelockingwrite = (bool)$definition['requirelockingwrite'];
|
||||
}
|
||||
$requirelocking = $requirelockingwrite || $requirelockingread;
|
||||
if (array_key_exists('requirelockingbeforewrite', $definition)) {
|
||||
$requirelockingbeforewrite = (bool)$definition['requirelockingbeforewrite'];
|
||||
}
|
||||
if ($requirelockingbeforewrite && ($requirelockingwrite || $requirelockingread)) {
|
||||
throw new coding_exception('requirelockingbeforewrite cannot be set with requirelockingread or requirelockingwrite
|
||||
in a cache definition, as this will result in conflicting locks.');
|
||||
}
|
||||
$requirelocking = $requirelockingwrite || $requirelockingbeforewrite || $requirelockingread;
|
||||
|
||||
if (array_key_exists('requiresearchable', $definition)) {
|
||||
$requiresearchable = (bool)$definition['requiresearchable'];
|
||||
@@ -523,6 +537,7 @@ class cache_definition {
|
||||
$cachedefinition->requirelocking = $requirelocking;
|
||||
$cachedefinition->requirelockingread = $requirelockingread;
|
||||
$cachedefinition->requirelockingwrite = $requirelockingwrite;
|
||||
$cachedefinition->requirelockingbeforewrite = $requirelockingbeforewrite;
|
||||
$cachedefinition->requiresearchable = $requiresearchable;
|
||||
$cachedefinition->maxsize = $maxsize;
|
||||
$cachedefinition->overrideclass = $overrideclass;
|
||||
@@ -741,6 +756,14 @@ class cache_definition {
|
||||
return $this->requirelockingwrite;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this definition requires a lock to be aquired before a write is attempted.
|
||||
* @return bool
|
||||
*/
|
||||
public function require_locking_before_write() {
|
||||
return $this->requirelockingbeforewrite;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this definition allows local storage to be used for caching.
|
||||
* @since Moodle 3.1.0
|
||||
|
||||
Reference in New Issue
Block a user