X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FRevision.php;h=6acc528f76bcde938da16cabfb024d5df1cab6cc;hb=33cb9b0d30aff88300d2708e0b820f9db9d2a4dc;hp=ef0f03df8f357d4aa51bd9923998e8998298673d;hpb=5316e7d70061457420dc27434d9e7230bc7f031d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Revision.php b/includes/Revision.php index ef0f03df8f..6acc528f76 100644 --- a/includes/Revision.php +++ b/includes/Revision.php @@ -1577,19 +1577,20 @@ class Revision implements IDBAccessObject { * @return string|bool The revision's text, or false on failure */ private function loadText() { - // Caching may be beneficial for massive use of external storage global $wgRevisionCacheExpiry; - if ( !$wgRevisionCacheExpiry ) { - return $this->fetchText(); - } - $cache = ObjectCache::getMainWANInstance(); + if ( $cache->getQoS( $cache::ATTR_EMULATION ) <= $cache::QOS_EMULATION_SQL ) { + // Do not cache RDBMs blobs in...the RDBMs store + $ttl = $cache::TTL_UNCACHEABLE; + } else { + $ttl = $wgRevisionCacheExpiry ?: $cache::TTL_UNCACHEABLE; + } // No negative caching; negative hits on text rows may be due to corrupted replica DBs return $cache->getWithSetCallback( - $key = $cache->makeKey( 'revisiontext', 'textid', $this->getTextId() ), - $wgRevisionCacheExpiry, + $cache->makeKey( 'revisiontext', 'textid', $this->getTextId() ), + $ttl, function () { return $this->fetchText(); }, @@ -1608,25 +1609,38 @@ class Revision implements IDBAccessObject { $row = null; } + // Callers doing updates will pass in READ_LATEST as usual. Since the text/blob tables + // do not normally get rows changed around, set READ_LATEST_IMMUTABLE in those cases. + $flags = $this->mQueryFlags; + $flags |= DBAccessObjectUtils::hasFlags( $flags, self::READ_LATEST ) + ? self::READ_LATEST_IMMUTABLE + : 0; + + list( $index, $options, $fallbackIndex, $fallbackOptions ) = + DBAccessObjectUtils::getDBOptions( $flags ); + if ( !$row ) { // Text data is immutable; check replica DBs first. - $dbr = wfGetDB( DB_REPLICA ); - $row = $dbr->selectRow( 'text', + $row = wfGetDB( $index )->selectRow( + 'text', [ 'old_text', 'old_flags' ], [ 'old_id' => $textId ], - __METHOD__ ); + __METHOD__, + $options + ); } - // Fallback to the master in case of replica DB lag. Also use FOR UPDATE if it was - // used to fetch this revision to avoid missing the row due to REPEATABLE-READ. - $forUpdate = ( $this->mQueryFlags & self::READ_LOCKING == self::READ_LOCKING ); - if ( !$row && ( $forUpdate || wfGetLB()->getServerCount() > 1 ) ) { - $dbw = wfGetDB( DB_MASTER ); - $row = $dbw->selectRow( 'text', + // Fallback to DB_MASTER in some cases if the row was not found + if ( !$row && $fallbackIndex !== null ) { + // Use FOR UPDATE if it was used to fetch this revision. This avoids missing the row + // due to REPEATABLE-READ. Also fallback to the master if READ_LATEST is provided. + $row = wfGetDB( $fallbackIndex )->selectRow( + 'text', [ 'old_text', 'old_flags' ], [ 'old_id' => $textId ], __METHOD__, - $forUpdate ? [ 'FOR UPDATE' ] : [] ); + $fallbackOptions + ); } if ( !$row ) {