X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FRevision.php;h=3ba6157c79fba3946972d67628f03e5d46e9ad31;hb=67a20b6e434b0cd3e2d3b3555f14ae096e4e4132;hp=d535028a929fe72821071642653352c30e034300;hpb=96a8ab6928b3e0be884c33eed8a1febf6fc4c31e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Revision.php b/includes/Revision.php index d535028a92..3ba6157c79 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -121,8 +121,6 @@ class Revision implements IDBAccessObject { if ( $id ) { // Use the specified ID $conds['rev_id'] = $id; - // This uses slave->master fallback with READ_NORMAL. Assuming revdelete, - // moves, and merges are rare, callers can use this to reduce master queries. return self::newFromConds( $conds, $flags ); } else { // Use a join to get the latest revision @@ -150,8 +148,6 @@ class Revision implements IDBAccessObject { $conds = array( 'page_id' => $pageId ); if ( $revId ) { $conds['rev_id'] = $revId; - // This uses slave->master fallback with READ_NORMAL. Assuming revdelete - // and merges are rare, callers can use this to reduce master queries. return self::newFromConds( $conds, $flags ); } else { // Use a join to get the latest revision @@ -301,7 +297,10 @@ class Revision implements IDBAccessObject { } /** - * Given a set of conditions, fetch a revision. + * Given a set of conditions, fetch a revision + * + * This method is used then a revision ID is qualified and + * will incorporate some basic slave/master fallback logic * * @param array $conditions * @param int $flags (optional) @@ -309,16 +308,24 @@ class Revision implements IDBAccessObject { */ 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 ) { - if ( !( $flags & self::READ_LATEST ) ) { - $dbw = wfGetDB( DB_MASTER ); - $rev = self::loadFromConds( $dbw, $conditions, $flags ); - } + // Make sure new pending/committed revision are visibile later on + // within web requests to certain avoid bugs like T93866 and T94407. + if ( !$rev + && !( $flags & self::READ_LATEST ) + && wfGetLB()->getServerCount() > 1 + && wfGetLB()->hasOrMadeRecentMasterChanges() + ) { + $flags = self::READ_LATEST; + $db = wfGetDB( DB_MASTER ); + $rev = self::loadFromConds( $db, $conditions, $flags ); } + if ( $rev ) { $rev->mQueryFlags = $flags; } + return $rev; } @@ -1421,6 +1428,14 @@ class Revision implements IDBAccessObject { $this->mId = $rev_id !== null ? $rev_id : $dbw->insertId(); + // Assertion to try to catch T92046 + if ( (int)$this->mId === 0 ) { + throw new UnexpectedValueException( + 'After insert, Revision mId is ' . var_export( $this->mId, 1 ) . ': ' . + var_export( $row, 1 ) + ); + } + Hooks::run( 'RevisionInsertComplete', array( &$this, $data, $flags ) ); return $this->mId; @@ -1491,9 +1506,9 @@ class Revision implements IDBAccessObject { * @return string|bool The revision's text, or false on failure */ protected function loadText() { - // Caching may be beneficial for massive use of external storage global $wgRevisionCacheExpiry, $wgMemc; + $textId = $this->getTextId(); $key = wfMemcKey( 'revisiontext', 'textid', $textId ); if ( $wgRevisionCacheExpiry ) { @@ -1566,7 +1581,7 @@ class Revision implements IDBAccessObject { * @return Revision|null Revision or null on error */ public static function newNullRevision( $dbw, $pageId, $summary, $minor, $user = null ) { - global $wgContentHandlerUseDB; + global $wgContentHandlerUseDB, $wgContLang; $fields = array( 'page_latest', 'page_namespace', 'page_title', 'rev_text_id', 'rev_len', 'rev_sha1' ); @@ -1591,6 +1606,9 @@ class Revision implements IDBAccessObject { $user = $wgUser; } + // Truncate for whole multibyte characters + $summary = $wgContLang->truncate( $summary, 255 ); + $row = array( 'page' => $pageId, 'user_text' => $user->getName(), @@ -1684,23 +1702,21 @@ class Revision implements IDBAccessObject { * * @param Title $title * @param int $id - * @return string + * @return string|bool False if not found */ - static function getTimestampFromId( $title, $id ) { - $dbr = wfGetDB( DB_SLAVE ); + static function getTimestampFromId( $title, $id, $flags = 0 ) { + $db = ( $flags & self::READ_LATEST ) + ? wfGetDB( DB_MASTER ) + : wfGetDB( DB_SLAVE ); // Casting fix for databases that can't take '' for rev_id if ( $id == '' ) { $id = 0; } $conds = array( 'rev_id' => $id ); $conds['rev_page'] = $title->getArticleID(); - $timestamp = $dbr->selectField( 'revision', 'rev_timestamp', $conds, __METHOD__ ); - if ( $timestamp === false && wfGetLB()->getServerCount() > 1 ) { - # Not in slave, try master - $dbw = wfGetDB( DB_MASTER ); - $timestamp = $dbw->selectField( 'revision', 'rev_timestamp', $conds, __METHOD__ ); - } - return wfTimestamp( TS_MW, $timestamp ); + $timestamp = $db->selectField( 'revision', 'rev_timestamp', $conds, __METHOD__ ); + + return ( $timestamp !== false ) ? wfTimestamp( TS_MW, $timestamp ) : false; } /**