wiki.techinc.nl/includes/jobqueue/utils/PurgeJobUtils.php

87 lines
2.6 KiB
PHP
Raw Normal View History

<?php
/**
* Base code for update jobs that put some secondary data extracted
* from article content into the database.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
*/
use MediaWiki\MediaWikiServices;
use Wikimedia\Rdbms\IDatabase;
class PurgeJobUtils {
/**
* Invalidate the cache of a list of pages from a single namespace.
* This is intended for use by subclasses.
*
* @param IDatabase $dbw
* @param int $namespace Namespace number
Handle database error with LinksUpdate and numeric category names Until I70473280, integer literals were always quoted as strings, because the databases we support all have no problem with casting string-literals for comparisons and such. PHP associative arrays don't preserve the types of keys, it converts integer-like strings into actual integers, which can result in errors: WikiPage::updateCategoryCounts localhost 1292 Truncated incorrect DOUBLE value: 'A String Category' (localhost) UPDATE `category` SET cat_pages = cat_pages - 1 WHERE cat_title IN (143434343434,'14343434string') #0 includes\libs\rdbms\database\Database.php(1587): Wikimedia\Rdbms\Database->getQueryExceptionAndLog(string, integer, string, string) #1 includes\libs\rdbms\database\Database.php(1166): Wikimedia\Rdbms\Database->reportQueryError(string, integer, string, string, boolean) #2 includes\libs\rdbms\database\Database.php(2217): Wikimedia\Rdbms\Database->query(string, string) #3 includes\libs\rdbms\database\DBConnRef.php(68): Wikimedia\Rdbms\Database->update(string, array, array, string) #4 includes\libs\rdbms\database\DBConnRef.php(380): Wikimedia\Rdbms\DBConnRef->__call(string, array) #5 includes\page\WikiPage.php(3689): Wikimedia\Rdbms\DBConnRef->update(string, array, array, string) #6 includes\deferred\LinksUpdate.php(420): WikiPage->updateCategoryCounts(array, array, integer) #7 includes\deferred\LinksUpdate.php(315): LinksUpdate->updateCategoryCounts(array, array) #8 includes\deferred\LinksUpdate.php(193): LinksUpdate->doIncrementalUpdate() #9 includes\deferred\DeferredUpdates.php(416): LinksUpdate->doUpdate() Also update some param docs Change-Id: If77cf924af01a215977bfdc8f085c4e1f4c96cad
2019-12-06 18:15:59 +00:00
* @param string[] $dbkeys
*/
public static function invalidatePages( IDatabase $dbw, $namespace, array $dbkeys ) {
if ( $dbkeys === [] ) {
return;
}
$fname = __METHOD__;
DeferredUpdates::addUpdate( new AutoCommitUpdate(
$dbw,
__METHOD__,
function () use ( $dbw, $namespace, $dbkeys, $fname ) {
$services = MediaWikiServices::getInstance();
$lbFactory = $services->getDBLoadBalancerFactory();
// Determine which pages need to be updated.
// This is necessary to prevent the job queue from smashing the DB with
// large numbers of concurrent invalidations of the same page.
$now = $dbw->timestamp();
$ids = $dbw->selectFieldValues(
'page',
'page_id',
[
'page_namespace' => $namespace,
'page_title' => $dbkeys,
'page_touched < ' . $dbw->addQuotes( $now )
],
$fname
);
if ( !$ids ) {
return;
}
$batchSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
$ticket = $lbFactory->getEmptyTransactionTicket( $fname );
$idBatches = array_chunk( $ids, $batchSize );
foreach ( $idBatches as $idBatch ) {
$dbw->update(
'page',
[ 'page_touched' => $now ],
[
'page_id' => $idBatch,
'page_touched < ' . $dbw->addQuotes( $now ) // handle races
],
$fname
);
if ( count( $idBatches ) > 1 ) {
$lbFactory->commitAndWaitForReplication( $fname, $ticket );
}
}
}
) );
}
}