From: jenkins-bot Date: Tue, 2 Jul 2019 21:57:10 +0000 (+0000) Subject: Merge "Make UserEditCountUpdate::doUpdate avoid comparing IDatabase instances" X-Git-Tag: 1.34.0-rc.0~1196 X-Git-Url: http://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/exercices/modifier.php?a=commitdiff_plain;h=87193d29e9236a9853072f3a43ced3641b956fa8;hp=c5aa26678928a54cde92c23f5a563677614a29cf;p=lhc%2Fweb%2Fwiklou.git Merge "Make UserEditCountUpdate::doUpdate avoid comparing IDatabase instances" --- diff --git a/includes/deferred/UserEditCountUpdate.php b/includes/deferred/UserEditCountUpdate.php index 3ccb4a8cc1..ed7e00cfba 100644 --- a/includes/deferred/UserEditCountUpdate.php +++ b/includes/deferred/UserEditCountUpdate.php @@ -82,16 +82,15 @@ class UserEditCountUpdate implements DeferrableUpdate, MergeableUpdate { $affectedInstances = $info['instances']; // Lazy initialization check... if ( $dbw->affectedRows() == 0 ) { - // No rows will be "affected" if user_editcount is NULL. - // Check if the generic "replica" connection is not the master. + // The user_editcount is probably NULL (e.g. not initialized). + // Since this update runs after the new revisions were committed, + // wait for the replica DB to catch up so they will be counted. $dbr = $lb->getConnection( DB_REPLICA ); - if ( $dbr !== $dbw ) { - // This method runs after the new revisions were committed. - // Wait for the replica to catch up so they will all be counted. - $dbr->flushSnapshot( $fname ); - $lb->waitForMasterPos( $dbr ); - } - $affectedInstances[0]->initEditCountInternal(); + // If $dbr is actually the master DB, then clearing the snapshot is + // is harmless and waitForMasterPos() will just no-op. + $dbr->flushSnapshot( $fname ); + $lb->waitForMasterPos( $dbr ); + $affectedInstances[0]->initEditCountInternal( $dbr ); } $newCount = (int)$dbw->selectField( 'user', diff --git a/includes/user/User.php b/includes/user/User.php index f7dcb938c6..d0d83517b4 100644 --- a/includes/user/User.php +++ b/includes/user/User.php @@ -3463,7 +3463,7 @@ class User implements IDBAccessObject, UserIdentity { if ( $count === null ) { // it has not been initialized. do so. - $count = $this->initEditCountInternal(); + $count = $this->initEditCountInternal( $dbr ); } $this->mEditCount = $count; } @@ -5023,14 +5023,13 @@ class User implements IDBAccessObject, UserIdentity { /** * Initialize user_editcount from data out of the revision table * - * This method should not be called outside User/UserEditCountUpdate - * + * @internal This method should not be called outside User/UserEditCountUpdate + * @param IDatabase $dbr Replica database * @return int Number of edits */ - public function initEditCountInternal() { + public function initEditCountInternal( IDatabase $dbr ) { // Pull from a replica DB to be less cruel to servers // Accuracy isn't the point anyway here - $dbr = wfGetDB( DB_REPLICA ); $actorWhere = ActorMigration::newMigration()->getWhere( $dbr, 'rev_user', $this ); $count = (int)$dbr->selectField( [ 'revision' ] + $actorWhere['tables'],