getConnectionProvider(); // 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->newSelectQueryBuilder() ->select( 'page_id' ) ->from( 'page' ) ->where( [ 'page_namespace' => $namespace ] ) ->andWhere( [ 'page_title' => $dbkeys ] ) ->andWhere( $dbw->expr( 'page_touched', '<', $now ) ) ->caller( $fname )->fetchFieldValues(); if ( !$ids ) { return; } $batchSize = $services->getMainConfig()->get( MainConfigNames::UpdateRowsPerQuery ); $ticket = $dbProvider->getEmptyTransactionTicket( $fname ); $idBatches = array_chunk( $ids, $batchSize ); foreach ( $idBatches as $idBatch ) { $dbw->newUpdateQueryBuilder() ->update( 'page' ) ->set( [ 'page_touched' => $now ] ) ->where( [ 'page_id' => $idBatch ] ) ->andWhere( $dbw->expr( 'page_touched', '<', $now ) ) // handle races ->caller( $fname )->execute(); if ( count( $idBatches ) > 1 ) { $dbProvider->commitAndWaitForReplication( $fname, $ticket ); } } } ) ); } }