Pre-cache the link list for external link filters

* This works via plugging into ApiStashEdit.
* The query is relatively slow per performance.wikimedia.org/xenon/svgs/daily/2016-02-15.index.svgz.

Change-Id: I0ad5289324b5482db7e2276f58fc1ac140250d47
This commit is contained in:
Aaron Schulz 2016-02-16 13:39:06 -08:00 committed by Timo Tijhof
parent 81727140ba
commit 2acfb30bfc
4 changed files with 37 additions and 10 deletions

View file

@ -407,4 +407,11 @@ abstract class BaseBlacklist {
public function getRegexEnd( $batchSize ) { public function getRegexEnd( $batchSize ) {
return ($batchSize > 0 ) ? '/Sim' : '/im'; return ($batchSize > 0 ) ? '/Sim' : '/im';
} }
/**
* @param $title Title
*/
public function warmCachesForFilter( Title $title ) {
// subclass this
}
} }

View file

@ -77,6 +77,11 @@ class SpamBlacklistHooks {
return true; return true;
} }
public static function onParserOutputStashForEdit( WikiPage $page ) {
$spamObj = BaseBlacklist::getInstance( 'spam' );
$spamObj->warmCachesForFilter( $page->getTitle() );
}
/** /**
* Hook function for APIEditBeforeSave. * Hook function for APIEditBeforeSave.
* This allows blacklist matches to be reported directly in the result structure * This allows blacklist matches to be reported directly in the result structure

View file

@ -123,16 +123,28 @@ class SpamBlacklist extends BaseBlacklist {
* @param $title Title * @param $title Title
* @return array * @return array
*/ */
function getCurrentLinks( $title ) { function getCurrentLinks( Title $title ) {
$cache = ObjectCache::getMainWANInstance();
return $cache->getWithSetCallback(
// Key is warmed via warmCachesForFilter() from ApiStashEdit
$cache->makeKey( 'external-link-list', $title->getLatestRevID() ),
$cache::TTL_MINUTE,
function ( $oldValue, &$ttl, array &$setOpts ) use ( $title ) {
$dbr = wfGetDB( DB_SLAVE ); $dbr = wfGetDB( DB_SLAVE );
$id = $title->getArticleID(); // should be zero queries $setOpts += Database::getCacheSetOptions( $dbr );
$res = $dbr->select( 'externallinks', array( 'el_to' ),
array( 'el_from' => $id ), __METHOD__ ); return $dbr->selectFieldValues(
$links = array(); 'externallinks',
foreach ( $res as $row ) { 'el_to',
$links[] = $row->el_to; array( 'el_from' => $title->getArticleID() ), // should be zero queries
__METHOD__
);
} }
return $links; );
}
public function warmCachesForFilter( Title $title ) {
$this->getCurrentLinks( $title );
} }
/** /**

View file

@ -64,6 +64,9 @@
], ],
"AbortNewAccount": [ "AbortNewAccount": [
"SpamBlacklistHooks::abortNewAccount" "SpamBlacklistHooks::abortNewAccount"
],
"ParserOutputStashForEdit": [
"SpamBlacklistHooks::onParserOutputStashForEdit"
] ]
}, },
"config": { "config": {