Matthias Mullie has submitted this change and it was merged.

Change subject: Keep reading from DB_MASTER if data has been written
......................................................................


Keep reading from DB_MASTER if data has been written

Change-Id: I7fd0bf2cee74c6cc49c607a5665bc8e68b1632bf
---
M ArticleFeedbackv5.backend.LBFactory.php
M data/DataModelBackend.LBFactory.php
2 files changed, 56 insertions(+), 16 deletions(-)

Approvals:
  Matthias Mullie: Verified; Looks good to me, approved



diff --git a/ArticleFeedbackv5.backend.LBFactory.php 
b/ArticleFeedbackv5.backend.LBFactory.php
index 8333cd7..55c6e4b 100644
--- a/ArticleFeedbackv5.backend.LBFactory.php
+++ b/ArticleFeedbackv5.backend.LBFactory.php
@@ -11,26 +11,23 @@
  */
 class ArticleFeedbackv5BackendLBFactory extends DataModelBackendLBFactory {
        /**
-        * Override getDB so that AFT's data can be on a separate cluster.
+        * Override getLB so that AFT's data can be on a separate cluster.
         *
-        * @param $db Integer: index of the connection to get. May be DB_MASTER 
for the
-        *            master (for write queries), DB_SLAVE for potentially 
lagged read
-        *            queries, or an integer >= 0 for a particular server.
-        * @param $groups Mixed: query groups. An array of group names that 
this query
-        *                belongs to. May contain a single string if the query 
is only
-        *                in one group.
-        * @param $wiki String: the wiki ID, or false for the current wiki
+        * @return LoadBalancer
         */
-       public function getDB( $db, $groups = array(), $wiki = false ) {
-               global $wgArticleFeedbackv5Cluster;
+       public function getLB( $wiki ) {
+               if ( $this->lb === null ) {
+                       global $wgArticleFeedbackv5Cluster;
 
-               // connect to external, aft-specific, cluster
-               if ( $wgArticleFeedbackv5Cluster ) {
-                       return wfGetLBFactory()->getExternalLB( 
$wgArticleFeedbackv5Cluster )->getConnection( $db, $groups, $wiki );
+                       // connect to external, aft-specific, cluster
+                       if ( $wgArticleFeedbackv5Cluster ) {
+                               $this->lb = wfGetLBFactory()->getExternalLB( 
$wgArticleFeedbackv5Cluster );
+                       } else {
+                               $this->lb = parent::getLB( $wiki );
+                       }
                }
 
-               // plain old wfGetDB
-               return parent::getDB( $db, $groups, $wiki );
+               return $this->lb;
        }
 
        /**
diff --git a/data/DataModelBackend.LBFactory.php 
b/data/DataModelBackend.LBFactory.php
index f8b7679..5bc3124 100644
--- a/data/DataModelBackend.LBFactory.php
+++ b/data/DataModelBackend.LBFactory.php
@@ -10,6 +10,27 @@
  */
 class DataModelBackendLBFactory extends DataModelBackend {
        /**
+        * @var LoadBalancer
+        */
+       protected $lb;
+
+       /**
+        * @var bool
+        */
+       protected $written = false;
+
+       /**
+        * @return LoadBalancer
+        */
+       public function getLB( $wiki ) {
+               if ( $this->lb === null ) {
+                       $this->lb = wfGetLB( $wiki );
+               }
+
+               return $this->lb;
+       }
+
+       /**
         * Wrapper function for wfGetDB.
         *
         * @param $db Integer: index of the connection to get. May be DB_MASTER 
for the
@@ -21,7 +42,29 @@
         * @param $wiki String: the wiki ID, or false for the current wiki
         */
        public function getDB( $db, $groups = array(), $wiki = false ) {
-               return wfGetDB( $db, $groups, $wiki );
+               $lb = $this->getLB( $wiki );
+
+               if ( $db === DB_MASTER ) {
+                       // mark that we're writing data
+                       $this->written = true;
+               } elseif ( $this->written ) {
+                       if ( $db === DB_SLAVE ) {
+                               /*
+                                * Let's keep querying master to make sure we 
have up-to-date
+                                * data (waiting for slaves to sync up might 
take some time)
+                                */
+                               $db = DB_MASTER;
+                       } else {
+                               /*
+                                * If another db is requested and we already 
requested master,
+                                * make sure this slave has caught up!
+                                */
+                               $lb->waitFor( $lb->getMasterPos() );
+                               $this->written = false;
+                       }
+               }
+
+               return $lb->getConnection( $db, $groups, $wiki );
        }
 
        /**

-- 
To view, visit https://gerrit.wikimedia.org/r/53982
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I7fd0bf2cee74c6cc49c607a5665bc8e68b1632bf
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/extensions/ArticleFeedbackv5
Gerrit-Branch: master
Gerrit-Owner: Matthias Mullie <mmul...@wikimedia.org>
Gerrit-Reviewer: Matthias Mullie <mmul...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to