Use slave for selects in CategoryMembershipJob
authoraddshore <addshorewiki@gmail.com>
Fri, 29 Jan 2016 10:10:52 +0000 (11:10 +0100)
committeraddshore <addshorewiki@gmail.com>
Sat, 30 Jan 2016 17:22:05 +0000 (18:22 +0100)
This patch switches to using a slave but imediatly
waits for the slave to catch up with master
(so as not to miss things).

This may result in more delay between an edit and
category changes being inserted.

It may be possible to instead wait for the timestamp
that is passed in $this->params['revTimestamp']
which could result in slightly less delay.

I can't see any uses of waitForReplication in quite
this way but see no imediate reason this would not work.

Bug: T125147
Change-Id: Ia0aa722c97f41a3959bcd3cb4210b39db0c3bc45

includes/jobqueue/jobs/CategoryMembershipChangeJob.php

index a6869c1..d34ea41 100644 (file)
@@ -63,13 +63,21 @@ class CategoryMembershipChangeJob extends Job {
                // between COMMIT and actual enqueueing of the CategoryMembershipChangeJob job.
                $cutoffUnix -= self::ENQUEUE_FUDGE_SEC;
 
+               $dbr = wfGetDB( DB_SLAVE, array( 'recentchanges' ) );
+               if ( !wfGetLB()->safeWaitForPos( $dbr ) ) {
+                       $this->setLastError( "Timed out while waiting for slave to catch up" );
+                       return false;
+               }
+
+               $dbr->commit( __METHOD__, 'flush' );
+
                // 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' ),
@@ -96,8 +104,8 @@ class CategoryMembershipChangeJob extends Job {
 
                // 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(