From 56b7ba03a286c0997752fb61b14662347ea0e9de Mon Sep 17 00:00:00 2001 From: addshore Date: Fri, 22 Dec 2017 17:32:54 +0000 Subject: [PATCH] [MCR] Don't require $title to be passed to Revision::newFromId If the title is not passed in as a param (already known) then select it in Revision::newFromId instead of waiting for it to be selected further down the tree. This means that we can use the same Title object to pass into the RevisionRecord as well as our legacy Revision object. The selection chooses either a slave or master depending on recent writes. This logic used to be in Revision::getTitle and also in Revision::newFromConds which was called by newFromId Bug: T183505 Change-Id: I9cf4ce2c3c86d6bf979a3c88eb423b942b9a1ba4 --- includes/Revision.php | 44 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/includes/Revision.php b/includes/Revision.php index ed0646afd1..0b5832497a 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -90,10 +90,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 ); } -- 2.20.1