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 ) {
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;
}
public static function onParserOutputStashForEdit( WikiPage $page ) {
$spamObj = BaseBlacklist::getInstance( 'spam' );
$spamObj->warmCachesForFilter( $page->getTitle() );
}
/**
* Hook function for APIEditBeforeSave.
* 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
* @return array
*/
function getCurrentLinks( $title ) {
$dbr = wfGetDB( DB_SLAVE );
$id = $title->getArticleID(); // should be zero queries
$res = $dbr->select( 'externallinks', array( 'el_to' ),
array( 'el_from' => $id ), __METHOD__ );
$links = array();
foreach ( $res as $row ) {
$links[] = $row->el_to;
}
return $links;
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 );
$setOpts += Database::getCacheSetOptions( $dbr );
return $dbr->selectFieldValues(
'externallinks',
'el_to',
array( 'el_from' => $title->getArticleID() ), // should be zero queries
__METHOD__
);
}
);
}
public function warmCachesForFilter( Title $title ) {
$this->getCurrentLinks( $title );
}
/**

View file

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