Merge "[MCR] Don't require $title to be passed to Revision::newFromId"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 24 Dec 2017 23:42:56 +0000 (23:42 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 24 Dec 2017 23:42:56 +0000 (23:42 +0000)
includes/Revision.php

index af4fef5..8f36e88 100644 (file)
@@ -94,10 +94,52 @@ class Revision implements IDBAccessObject {
         *
         * @param int $id
         * @param int $flags (optional)
-        * @param Title $title (optional)
+        * @param Title $title (optional) If known you can pass the Title in here.
+        *  Passing no Title may result in another DB query if there are recent writes.
         * @return Revision|null
         */
        public static function newFromId( $id, $flags = 0, Title $title = null ) {
+               /**
+                * MCR RevisionStore Compat
+                *
+                * If the title is not passed in as a param (already known) then select it here.
+                *
+                * Do the selection with MASTER if $flags includes READ_LATEST or recent changes
+                * have happened on our load balancer.
+                *
+                * If we select the title here and pass it down it will results in fewer queries
+                * further down the stack.
+                */
+               if ( !$title ) {
+                       if (
+                               $flags & self::READ_LATEST ||
+                               wfGetLB()->hasOrMadeRecentMasterChanges()
+                       ) {
+                               $dbr = wfGetDB( DB_MASTER );
+                       } else {
+                               $dbr = wfGetDB( DB_REPLICA );
+                       }
+                       $row = $dbr->selectRow(
+                               [ 'revision', 'page' ],
+                               [
+                                       'page_namespace',
+                                       'page_title',
+                                       'page_id',
+                                       'page_latest',
+                                       'page_is_redirect',
+                                       'page_len',
+                               ],
+                               [ 'rev_id' => $id ],
+                               __METHOD__,
+                               [],
+                               [ 'page' => [ 'JOIN', 'page_id=rev_page' ] ]
+                       );
+                       if ( $row ) {
+                               $title = Title::newFromRow( $row );
+                       }
+                       wfGetLB()->reuseConnection( $dbr );
+               }
+
                $rec = self::getRevisionStore()->getRevisionById( $id, $flags, $title );
                return $rec === null ? null : new Revision( $rec, $flags, $title );
        }