}
$dbw = wfGetDB( DB_MASTER );
-
// Use a named lock so that jobs for this page see each others' changes
- $fname = __METHOD__;
$lockKey = "CategoryMembershipUpdates:{$page->getId()}";
- if ( !$dbw->lock( $lockKey, $fname, 10 ) ) {
+ $scopedLock = $dbw->getScopedLockAndFlush( $lockKey, __METHOD__, 10 );
+ if ( !$scopedLock ) {
$this->setLastError( "Could not acquire lock '$lockKey'" );
return false;
}
- $unlocker = new ScopedCallback( function () use ( $dbw, $lockKey, $fname ) {
- $dbw->unlock( $lockKey, $fname );
- } );
-
- // Sanity: clear any DB transaction snapshot
- $dbw->commit( __METHOD__, 'flush' );
+ $dbr = wfGetDB( DB_SLAVE, array( 'recentchanges' ) );
+ // Wait till the slave is caught up so that jobs for this page see each others' changes
+ if ( !wfGetLB()->safeWaitForMasterPos( $dbr ) ) {
+ $this->setLastError( "Timed out while waiting for slave to catch up" );
+ return false;
+ }
+ // Clear any stale REPEATABLE-READ snapshot
+ $dbr->commit( __METHOD__, 'flush' );
$cutoffUnix = wfTimestamp( TS_UNIX, $this->params['revTimestamp'] );
// Using ENQUEUE_FUDGE_SEC handles jobs inserted out of revision order due to the delay
$cutoffUnix -= self::ENQUEUE_FUDGE_SEC;
// Get the newest revision that has a SRC_CATEGORIZE row...
- $row = $dbw->selectRow(
+ $row = $dbr->selectRow(
array( 'revision', 'recentchanges' ),
array( 'rev_timestamp', 'rev_id' ),
array(
'rev_page' => $page->getId(),
- 'rev_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $cutoffUnix ) )
+ 'rev_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( $cutoffUnix ) )
),
__METHOD__,
array( 'ORDER BY' => 'rev_timestamp DESC, rev_id DESC' ),
// Find revisions to this page made around and after this revision which lack category
// notifications in recent changes. This lets jobs pick up were the last one left off.
- $encCutoff = $dbw->addQuotes( $dbw->timestamp( $cutoffUnix ) );
- $res = $dbw->select(
+ $encCutoff = $dbr->addQuotes( $dbr->timestamp( $cutoffUnix ) );
+ $res = $dbr->select(
'revision',
Revision::selectFields(),
array(
$this->notifyUpdatesForRevision( $page, Revision::newFromRow( $row ) );
}
- ScopedCallback::consume( $unlocker );
-
return true;
}
$insertCount = 0;
foreach ( $categoryInserts as $categoryName ) {
- $categoryTitle = Title::newFromText( $categoryName, NS_CATEGORY );
+ $categoryTitle = Title::makeTitle( NS_CATEGORY, $categoryName );
$catMembChange->triggerCategoryAddedNotification( $categoryTitle );
if ( $insertCount++ && ( $insertCount % $batchSize ) == 0 ) {
$dbw->commit( __METHOD__, 'flush' );
- wfWaitForSlaves();
+ wfGetLBFactory()->waitForReplication();
}
}
foreach ( $categoryDeletes as $categoryName ) {
- $categoryTitle = Title::newFromText( $categoryName, NS_CATEGORY );
+ $categoryTitle = Title::makeTitle( NS_CATEGORY, $categoryName );
$catMembChange->triggerCategoryRemovedNotification( $categoryTitle );
if ( $insertCount++ && ( $insertCount++ % $batchSize ) == 0 ) {
$dbw->commit( __METHOD__, 'flush' );
- wfWaitForSlaves();
+ wfGetLBFactory()->waitForReplication();
}
}
}