Version 1
[yaffs-website] / web / core / lib / Drupal / Core / EventSubscriber / ReplicaDatabaseIgnoreSubscriber.php
diff --git a/web/core/lib/Drupal/Core/EventSubscriber/ReplicaDatabaseIgnoreSubscriber.php b/web/core/lib/Drupal/Core/EventSubscriber/ReplicaDatabaseIgnoreSubscriber.php
new file mode 100644 (file)
index 0000000..fc123d3
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+namespace Drupal\Core\EventSubscriber;
+
+use Drupal\Core\Database\Database;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * System subscriber for controller requests.
+ */
+class ReplicaDatabaseIgnoreSubscriber implements EventSubscriberInterface {
+
+  /**
+   * Checks and disables the replica database server if appropriate.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
+   *   The Event to process.
+   */
+  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 db_set_ignore_replica() function to set
+    // $_SESSION['ignore_replica_server'] to the timestamp after which the replica
+    // can be re-enabled.
+    if (isset($_SESSION['ignore_replica_server'])) {
+      if ($_SESSION['ignore_replica_server'] >= REQUEST_TIME) {
+        Database::ignoreTarget('default', 'replica');
+      }
+      else {
+        unset($_SESSION['ignore_replica_server']);
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[KernelEvents::REQUEST][] = ['checkReplicaServer'];
+    return $events;
+  }
+
+}