X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/maintenance/cleanupRemovedModules.php diff --git a/maintenance/cleanupRemovedModules.php b/maintenance/cleanupRemovedModules.php index fb8afd2d..dbaf6438 100644 --- a/maintenance/cleanupRemovedModules.php +++ b/maintenance/cleanupRemovedModules.php @@ -1,7 +1,6 @@ mDescription = 'Remove cache entries for removed ResourceLoader modules from the database'; - $this->addOption( 'batchsize', 'Delete rows in batches of this size. Default: 500', false, true ); - $this->addOption( 'max-slave-lag', 'If the slave lag exceeds this many seconds, wait until it drops below this value. Default: 5', false, true ); + $this->addDescription( + 'Remove cache entries for removed ResourceLoader modules from the database' ); + $this->setBatchSize( 500 ); } public function execute() { - $dbw = wfGetDB( DB_MASTER ); - $rl = new ResourceLoader(); + $this->output( "Cleaning up module_deps table...\n" ); + + $dbw = $this->getDB( DB_MASTER ); + $rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() ); $moduleNames = $rl->getModuleNames(); - $moduleList = implode( ', ', array_map( array( $dbw, 'addQuotes' ), $moduleNames ) ); - $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) ); - $maxlag = intval( $this->getOption( 'max-slave-lag', 5 ) ); + $res = $dbw->select( 'module_deps', + [ 'md_module', 'md_skin' ], + $moduleNames ? 'md_module NOT IN (' . $dbw->makeList( $moduleNames ) . ')' : '1=1', + __METHOD__ + ); + $rows = iterator_to_array( $res, false ); - $this->output( "Cleaning up module_deps table...\n" ); - $i = 1; $modDeps = $dbw->tableName( 'module_deps' ); - do { - // $dbw->delete() doesn't support LIMIT :( - $where = $moduleList ? "md_module NOT IN ($moduleList)" : '1=1'; - $dbw->query( "DELETE FROM $modDeps WHERE $where LIMIT $limit", __METHOD__ ); - $numRows = $dbw->affectedRows(); - $this->output( "Batch $i: $numRows rows\n" ); - $i++; - wfWaitForSlaves( $maxlag ); - } while( $numRows > 0 ); - $this->output( "done\n" ); - - $this->output( "Cleaning up msg_resource table...\n" ); $i = 1; + foreach ( array_chunk( $rows, $this->mBatchSize ) as $chunk ) { + // WHERE ( mod=A AND skin=A ) OR ( mod=A AND skin=B) .. + $conds = array_map( function ( stdClass $row ) use ( $dbw ) { + return $dbw->makeList( (array)$row, IDatabase::LIST_AND ); + }, $chunk ); + $conds = $dbw->makeList( $conds, IDatabase::LIST_OR ); - $mrRes = $dbw->tableName( 'msg_resource' ); - do { - $where = $moduleList ? "mr_resource NOT IN ($moduleList)" : '1=1'; - $dbw->query( "DELETE FROM $mrRes WHERE $where LIMIT $limit", __METHOD__ ); + $this->beginTransaction( $dbw, __METHOD__ ); + $dbw->query( "DELETE FROM $modDeps WHERE $conds", __METHOD__ ); $numRows = $dbw->affectedRows(); $this->output( "Batch $i: $numRows rows\n" ); - $i++; - wfWaitForSlaves( $maxlag ); - } while( $numRows > 0 ); - $this->output( "done\n" ); + $this->commitTransaction( $dbw, __METHOD__ ); - $this->output( "Cleaning up msg_resource_links table...\n" ); - $i = 1; - $msgResLinks = $dbw->tableName( 'msg_resource_links' ); - do { - $where = $moduleList ? "mrl_resource NOT IN ($moduleList)" : '1=1'; - $dbw->query( "DELETE FROM $msgResLinks WHERE $where LIMIT $limit", __METHOD__ ); - $numRows = $dbw->affectedRows(); - $this->output( "Batch $i: $numRows rows\n" ); $i++; - wfWaitForSlaves( $maxlag ); - } while( $numRows > 0 ); - $this->output( "done\n" ); + } + + $this->output( "Done\n" ); } } -$maintClass = "CleanupRemovedModules"; -require_once( RUN_MAINTENANCE_IF_MAIN ); +$maintClass = 'CleanupRemovedModules'; +require_once RUN_MAINTENANCE_IF_MAIN;