You are here

protected function CacheCollector::updateCache in Drupal 9

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Cache/CacheCollector.php \Drupal\Core\Cache\CacheCollector::updateCache()
  2. 10 core/lib/Drupal/Core/Cache/CacheCollector.php \Drupal\Core\Cache\CacheCollector::updateCache()

Writes a value to the persistent cache immediately.

Parameters

bool $lock: (optional) Whether to acquire a lock before writing to cache. Defaults to TRUE.

1 call to CacheCollector::updateCache()
CacheCollector::destruct in core/lib/Drupal/Core/Cache/CacheCollector.php
Performs destruct operations.
1 method overrides CacheCollector::updateCache()
ThemeRegistry::updateCache in core/lib/Drupal/Core/Utility/ThemeRegistry.php
Writes a value to the persistent cache immediately.

File

core/lib/Drupal/Core/Cache/CacheCollector.php, line 219

Class

CacheCollector
Default implementation for CacheCollectorInterface.

Namespace

Drupal\Core\Cache

Code

protected function updateCache($lock = TRUE) {
  $data = [];
  foreach ($this->keysToPersist as $offset => $persist) {
    if ($persist) {
      $data[$offset] = $this->storage[$offset];
    }
  }
  if (empty($data) && empty($this->keysToRemove)) {
    return;
  }

  // Lock cache writes to help avoid stampedes.
  $cid = $this
    ->getCid();
  $lock_name = $this
    ->normalizeLockName($cid . ':' . __CLASS__);
  if (!$lock || $this->lock
    ->acquire($lock_name)) {

    // Set and delete operations invalidate the cache item. Try to also load
    // an eventually invalidated cache entry, only update an invalidated cache
    // entry if the creation date did not change as this could result in an
    // inconsistent cache.
    if ($cache = $this->cache
      ->get($cid, $this->cacheInvalidated)) {
      if ($this->cacheInvalidated && $cache->created != $this->cacheCreated) {

        // We have invalidated the cache in this request and got a different
        // cache entry. Do not attempt to overwrite data that might have been
        // changed in a different request. We'll let the cache rebuild in
        // later requests.
        $this->cache
          ->delete($cid);
        $this->lock
          ->release($lock_name);
        return;
      }
      $data = array_merge($cache->data, $data);
    }
    elseif ($this->cacheCreated) {

      // Getting here indicates that there was a cache entry at the
      // beginning of the request, but now it's gone (some other process
      // must have cleared it). We back out to prevent corrupting the cache
      // with incomplete data, since we won't be able to properly merge
      // the existing cache data from earlier with the new data.
      // A future request will properly hydrate the cache from scratch.
      if ($lock) {
        $this->lock
          ->release($lock_name);
      }
      return;
    }

    // Remove keys marked for deletion.
    foreach ($this->keysToRemove as $delete_key) {
      unset($data[$delete_key]);
    }
    $this->cache
      ->set($cid, $data, Cache::PERMANENT, $this->tags);
    if ($lock) {
      $this->lock
        ->release($lock_name);
    }
  }
  $this->keysToPersist = [];
  $this->keysToRemove = [];
}