Legoktm has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/222496

Change subject: Added USE_MULTI_COMMIT flag to enable query batching
......................................................................

Added USE_MULTI_COMMIT flag to enable query batching

* Previously, the batching logic was hard to actually use since
  jobs and web requests use DBO_TRX. This adds a flag for jobs
  to make use of.

Change-Id: I7ea8e983686da6da67a80511603ffe34fd1693b4
(cherry picked from commit 255e8ae6c618fda5a8407a2bce02113deec37a3f)
---
M MergeUser.php
1 file changed, 50 insertions(+), 18 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/UserMerge 
refs/changes/96/222496/1

diff --git a/MergeUser.php b/MergeUser.php
old mode 100644
new mode 100755
index 4a6141a..48a41ac
--- a/MergeUser.php
+++ b/MergeUser.php
@@ -5,7 +5,6 @@
  *
  */
 class MergeUser {
-
        /**
         * @var User
         */
@@ -16,16 +15,32 @@
         */
        private $logger;
 
+       /** @var integer */
+       private $flags;
+
+       const USE_MULTI_COMMIT = 1; // allow begin/commit; useful for jobs
+
+       /**
+        * @param User $oldUser
+        * @param User $newUser
+        * @param IUserMergeLogger $logger
+        * @param int $flags Bitfield (Supports MergeUser::USE_*)
+        */
        public function __construct(
                User $oldUser,
                User $newUser,
-               IUserMergeLogger $logger
+               IUserMergeLogger $logger,
+               $flags = 0
        ) {
                $this->newUser = $newUser;
                $this->oldUser = $oldUser;
                $this->logger = $logger;
+               $this->flags = $flags;
        }
 
+       /**
+        * @param User $performer
+        */
        public function merge( User $performer ) {
                $this->mergeEditcount();
                $this->mergeDatabaseTables();
@@ -51,6 +66,7 @@
         */
        private function mergeEditcount() {
                $dbw = wfGetDB( DB_MASTER );
+               $this->begin( $dbw );
 
                $totalEdits = $dbw->selectField(
                        'user',
@@ -77,9 +93,13 @@
                                __METHOD__
                        );
                }
+
+               $this->commit( $dbw );
        }
 
        private function mergeBlocks( DatabaseBase $dbw ) {
+               $this->begin( $dbw );
+
                // Pull blocks directly from master
                $rows = $dbw->select(
                        'ipblocks',
@@ -133,6 +153,8 @@
                                __METHOD__
                        );
                }
+
+               $this->commit( $dbw );
        }
 
        /**
@@ -199,8 +221,13 @@
 
                $dbw = wfGetDB( DB_MASTER );
 
-               $this->deduplicateWatchlistEntries();
+               $this->deduplicateWatchlistEntries( $dbw );
                $this->mergeBlocks( $dbw );
+
+               // For readability, flush any trx (though mergeBlocks will 
manage this)
+               if ( $this->flags & self::USE_MULTI_COMMIT ) {
+                       $dbw->commit( __METHOD__, 'flush' );
+               }
 
                foreach ( $updateFields as $fieldInfo ) {
                        $options = isset( $fieldInfo['options'] ) ? 
$fieldInfo['options'] : array();
@@ -266,10 +293,8 @@
         * Deduplicate watchlist entries
         * which old (merge-from) and new (merge-to) users are watching
         */
-       private function deduplicateWatchlistEntries() {
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
+       private function deduplicateWatchlistEntries( $dbw ) {
+               $this->begin( $dbw );
 
                $res = $dbw->select(
                        array(
@@ -312,19 +337,16 @@
                        );
                }
 
-               if ( empty( $conds ) ) {
-                       $dbw->commit( __METHOD__ );
-                       return;
+               if ( count( $conds ) ) {
+                       # Perform a multi-row delete
+                       $dbw->delete(
+                               'watchlist',
+                               $dbw->makeList( $conds, LIST_OR ),
+                               __METHOD__
+                       );
                }
 
-               # Perform a multi-row delete
-               $dbw->delete(
-                       'watchlist',
-                       $dbw->makeList( $conds, LIST_OR ),
-                       __METHOD__
-               );
-
-               $dbw->commit( __METHOD__ );
+               $this->commit( $dbw );
        }
 
        /**
@@ -471,5 +493,15 @@
                DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 
'users' => -1 ) ) );
        }
 
+       private function begin( $dbw ) {
+               if ( $this->flags & self::USE_MULTI_COMMIT ) {
+                       $dbw->begin( __METHOD__ );
+               }
+       }
 
+       private function commit( $dbw ) {
+               if ( $this->flags & self::USE_MULTI_COMMIT ) {
+                       $dbw->commit( __METHOD__ );
+               }
+       }
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7ea8e983686da6da67a80511603ffe34fd1693b4
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/UserMerge
Gerrit-Branch: wmf/1.26wmf12
Gerrit-Owner: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: Aaron Schulz <asch...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to