X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fapi%2FApiStashEdit.php;h=23163c2489d998b86be8e112c859f9e6be07d65c;hb=0ded00ab4c6dc1ad4e961412d357080a0a5a056d;hp=8a9de064fd66c9b03f8bd660c54e91f441ba340e;hpb=8a463e8ea5c73b7ac8ee70e6ca07ba89cce2c0a9;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/api/ApiStashEdit.php b/includes/api/ApiStashEdit.php index 8a9de064fd..23163c2489 100644 --- a/includes/api/ApiStashEdit.php +++ b/includes/api/ApiStashEdit.php @@ -181,9 +181,14 @@ class ApiStashEdit extends ApiBase { $title = $page->getTitle(); $key = self::getStashKey( $title, self::getContentHash( $content ), $user ); - // Use the master DB for fast blocking locks + // Use the master DB to allow for fast blocking locks on the "save path" where this + // value might actually be used to complete a page edit. If the edit submission request + // happens before this edit stash requests finishes, then the submission will block until + // the stash request finishes parsing. For the lock acquisition below, there is not much + // need to duplicate parsing of the same content/user/summary bundle, so try to avoid + // blocking at all here. $dbw = wfGetDB( DB_MASTER ); - if ( !$dbw->lock( $key, __METHOD__, 1 ) ) { + if ( !$dbw->lock( $key, __METHOD__, 0 ) ) { // De-duplicate requests on the same key return self::ERROR_BUSY; } @@ -209,8 +214,10 @@ class ApiStashEdit extends ApiBase { Hooks::run( 'ParserOutputStashForEdit', [ $page, $content, $editInfo->output, $summary, $user ] ); + $titleStr = (string)$title; if ( $alreadyCached ) { - $logger->debug( "Already cached parser output for key '$key' ('$title')." ); + $logger->debug( "Already cached parser output for key '{cachekey}' ('{title}').", + [ 'cachekey' => $key, 'title' => $titleStr ] ); return self::ERROR_NONE; } @@ -224,14 +231,17 @@ class ApiStashEdit extends ApiBase { if ( $stashInfo ) { $ok = $cache->set( $key, $stashInfo, $ttl ); if ( $ok ) { - $logger->debug( "Cached parser output for key '$key' ('$title')." ); + $logger->debug( "Cached parser output for key '{cachekey}' ('{title}').", + [ 'cachekey' => $key, 'title' => $titleStr ] ); return self::ERROR_NONE; } else { - $logger->error( "Failed to cache parser output for key '$key' ('$title')." ); + $logger->error( "Failed to cache parser output for key '{cachekey}' ('{title}').", + [ 'cachekey' => $key, 'title' => $titleStr ] ); return self::ERROR_CACHE; } } else { - $logger->info( "Uncacheable parser output for key '$key' ('$title') [$code]." ); + $logger->info( "Uncacheable parser output for key '{cachekey}' ('{title}') [{code}].", + [ 'cachekey' => $key, 'title' => $titleStr, 'code' => $code ] ); return self::ERROR_UNCACHEABLE; } } @@ -330,11 +340,15 @@ class ApiStashEdit extends ApiBase { * @return string|null TS_MW timestamp or null */ private static function lastEditTime( User $user ) { - $time = wfGetDB( DB_REPLICA )->selectField( - 'recentchanges', + $db = wfGetDB( DB_REPLICA ); + $actorQuery = ActorMigration::newMigration()->getWhere( $db, 'rc_user', $user, false ); + $time = $db->selectField( + [ 'recentchanges' ] + $actorQuery['tables'], 'MAX(rc_timestamp)', - [ 'rc_user_text' => $user->getName() ], - __METHOD__ + [ $actorQuery['conds'] ], + __METHOD__, + [], + $actorQuery['joins'] ); return wfTimestampOrNull( TS_MW, $time );