Hoo man has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/199609

Change subject: Introduce Revision::READ_WITH_FALLBACK, fix rollback diff view
......................................................................

Introduce Revision::READ_WITH_FALLBACK, fix rollback diff view

In DifferenceEngine we need to show a diff immediately after
an edit happened if someone did a rollback. To prevent this from
breaking in case we have multiple database servers and also to
not put to much load on the master databases again, I introduced
a Revision::READ_WITH_FALLBACK constant which can be used to
allow Revision::newFromConds to fallback on master if the revision
couldn't be found on a slave.

This follows up on 3c2bc32ae1775f5e875958b62d7181b4b5cfe24e

Change-Id: I08a16faa9e637c614c6d2fc9a10536c7b41685a8
Follows: 3c2bc32ae1775f5e875958b62d7181b4b5cfe24e
Bug: T93866
---
M includes/Revision.php
M includes/diff/DifferenceEngine.php
2 files changed, 17 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/09/199609/1

diff --git a/includes/Revision.php b/includes/Revision.php
index 356cd32..901e81d 100644
--- a/includes/Revision.php
+++ b/includes/Revision.php
@@ -84,10 +84,16 @@
        const RAW = 3;
 
        /**
+        * Try reading from slave, but fallback to master if the revision 
couldn't be found
+        */
+       const READ_WITH_FALLBACK = 8;
+
+       /**
         * Load a page revision from a given revision ID number.
         * Returns null if no such revision can be found.
         *
         * $flags include:
+        *      Revision::READ_WITH_FALLBACK  : Try selecting data from slave, 
use master if it couldn't be found
         *      Revision::READ_LATEST  : Select the data from the master
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
@@ -105,6 +111,7 @@
         * to that title, will return null.
         *
         * $flags include:
+        *      Revision::READ_WITH_FALLBACK  : Try selecting data from slave, 
use master if it couldn't be found
         *      Revision::READ_LATEST  : Select the data from the master
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
@@ -125,6 +132,7 @@
                } else {
                        // Use a join to get the latest revision
                        $conds[] = 'rev_id=page_latest';
+                       // XXX: This doesn't take Revision::READ_WITH_FALLBACK 
into account
                        $db = wfGetDB( ( $flags & self::READ_LATEST ) ? 
DB_MASTER : DB_SLAVE );
                        return self::loadFromConds( $db, $conds, $flags );
                }
@@ -136,6 +144,7 @@
         * Returns null if no such revision can be found.
         *
         * $flags include:
+        *      Revision::READ_WITH_FALLBACK  : Try selecting data from slave, 
use master if it couldn't be found
         *      Revision::READ_LATEST  : Select the data from the master (since 
1.20)
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
@@ -152,6 +161,7 @@
                } else {
                        // Use a join to get the latest revision
                        $conds[] = 'rev_id = page_latest';
+                       // XXX: This doesn't take Revision::READ_WITH_FALLBACK 
into account
                        $db = wfGetDB( ( $flags & self::READ_LATEST ) ? 
DB_MASTER : DB_SLAVE );
                        return self::loadFromConds( $db, $conds, $flags );
                }
@@ -306,6 +316,12 @@
        private static function newFromConds( $conditions, $flags = 0 ) {
                $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : 
DB_SLAVE );
                $rev = self::loadFromConds( $db, $conditions, $flags );
+
+               if ( $rev === null && wfGetLB()->getServerCount() > 1 && !( 
$flags & self::READ_WITH_FALLBACK ) ) {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $rev = self::loadFromConds( $dbw, $conditions, $flags );
+               }
+
                if ( $rev ) {
                        $rev->mQueryFlags = $flags;
                }
diff --git a/includes/diff/DifferenceEngine.php 
b/includes/diff/DifferenceEngine.php
index 77bbd36..0a44df3 100644
--- a/includes/diff/DifferenceEngine.php
+++ b/includes/diff/DifferenceEngine.php
@@ -1232,7 +1232,7 @@
 
                // Load the new revision object
                if ( $this->mNewid ) {
-                       $this->mNewRev = Revision::newFromId( $this->mNewid );
+                       $this->mNewRev = Revision::newFromId( $this->mNewid, 
Revision::READ_WITH_FALLBACK );
                } else {
                        $this->mNewRev = Revision::newFromTitle(
                                $this->getTitle(),

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I08a16faa9e637c614c6d2fc9a10536c7b41685a8
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Hoo man <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to