Aaron Schulz has submitted this change and it was merged.

Change subject: Avoid deadlocks in User::incEditCount
......................................................................


Avoid deadlocks in User::incEditCount

* This makes concurrent editing less problematic

Change-Id: I930222d5e831bb3729194abbdcb3cab194c70494
---
M includes/User.php
1 file changed, 39 insertions(+), 26 deletions(-)

Approvals:
  Chad: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/includes/User.php b/includes/User.php
index f526fe0..9168c33 100644
--- a/includes/User.php
+++ b/includes/User.php
@@ -4738,37 +4738,50 @@
        }
 
        /**
-        * Increment the user's edit-count field.
-        * Will have no effect for anonymous users.
+        * Deferred version of incEditCountImmediate()
         */
        public function incEditCount() {
-               if ( !$this->isAnon() ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update(
-                               'user',
-                               array( 'user_editcount=user_editcount+1' ),
-                               array( 'user_id' => $this->getId() ),
-                               __METHOD__
-                       );
+               $that = $this;
+               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() 
use ( $that ) {
+                       $that->incEditCountImmediate();
+               } );
+       }
 
-                       // Lazy initialization check...
-                       if ( $dbw->affectedRows() == 0 ) {
-                               // Now here's a goddamn hack...
-                               $dbr = wfGetDB( DB_SLAVE );
-                               if ( $dbr !== $dbw ) {
-                                       // If we actually have a slave server, 
the count is
-                                       // at least one behind because the 
current transaction
-                                       // has not been committed and 
replicated.
-                                       $this->initEditCount( 1 );
-                               } else {
-                                       // But if DB_SLAVE is selecting the 
master, then the
-                                       // count we just read includes the 
revision that was
-                                       // just added in the working 
transaction.
-                                       $this->initEditCount();
-                               }
+       /**
+        * Increment the user's edit-count field.
+        * Will have no effect for anonymous users.
+        * @since 1.26
+        */
+       public function incEditCountImmediate() {
+               if ( $this->isAnon() ) {
+                       return;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               // No rows will be "affected" if user_editcount is NULL
+               $dbw->update(
+                       'user',
+                       array( 'user_editcount=user_editcount+1' ),
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+               // Lazy initialization check...
+               if ( $dbw->affectedRows() == 0 ) {
+                       // Now here's a goddamn hack...
+                       $dbr = wfGetDB( DB_SLAVE );
+                       if ( $dbr !== $dbw ) {
+                               // If we actually have a slave server, the 
count is
+                               // at least one behind because the current 
transaction
+                               // has not been committed and replicated.
+                               $this->initEditCount( 1 );
+                       } else {
+                               // But if DB_SLAVE is selecting the master, 
then the
+                               // count we just read includes the revision 
that was
+                               // just added in the working transaction.
+                               $this->initEditCount();
                        }
                }
-               // edit count in user cache too
+               // Edit count in user cache too
                $this->invalidateCache();
        }
 

-- 
To view, visit https://gerrit.wikimedia.org/r/203987
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I930222d5e831bb3729194abbdcb3cab194c70494
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Aaron Schulz <[email protected]>
Gerrit-Reviewer: Aaron Schulz <[email protected]>
Gerrit-Reviewer: Chad <[email protected]>
Gerrit-Reviewer: Hoo man <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to