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