function ReplicaKillSwitch::checkReplicaServer

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Database/ReplicaKillSwitch.php \Drupal\Core\Database\ReplicaKillSwitch::checkReplicaServer()
  2. 10 core/lib/Drupal/Core/Database/ReplicaKillSwitch.php \Drupal\Core\Database\ReplicaKillSwitch::checkReplicaServer()
  3. 11.x core/lib/Drupal/Core/Database/ReplicaKillSwitch.php \Drupal\Core\Database\ReplicaKillSwitch::checkReplicaServer()

Checks and disables the replica database server if appropriate.

Parameters

\Symfony\Component\HttpKernel\Event\GetResponseEvent $event: The Event to process.

File

core/lib/Drupal/Core/Database/ReplicaKillSwitch.php, line 79

Class

ReplicaKillSwitch
Provides replica server kill switch to ignore it.

Namespace

Drupal\Core\Database

Code

public function checkReplicaServer(GetResponseEvent $event) {
    // Ignore replica database servers for this request.
    //
    // In Drupal's distributed database structure, new data is written to the
    // master and then propagated to the replica servers.  This means there is a
    // lag between when data is written to the master and when it is available
    // on the replica. At these times, we will want to avoid using a replica
    // server temporarily. For example, if a user posts a new node then we want
    // to disable the replica server for that user temporarily to allow the
    // replica server to catch up.
    // That way, that user will see their changes immediately while for other
    // users we still get the benefits of having a replica server, just with
    // slightly stale data. Code that wants to disable the replica server should
    // use the 'database.replica_kill_switch' service's trigger() method to set
    // 'ignore_replica_server' session flag to the timestamp after which the
    // replica can be re-enabled.
    if ($this->session
        ->has('ignore_replica_server')) {
        if ($this->session
            ->get('ignore_replica_server') >= $this->time
            ->getRequestTime()) {
            Database::ignoreTarget('default', 'replica');
        }
        else {
            $this->session
                ->remove('ignore_replica_server');
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.