rdbms: fix LBFactory::commitAll() round handling
authorAaron Schulz <aschulz@wikimedia.org>
Wed, 9 May 2018 21:44:34 +0000 (14:44 -0700)
committerAaron Schulz <aschulz@wikimedia.org>
Wed, 9 May 2018 21:51:18 +0000 (14:51 -0700)
This avoids "Transaction round stage must be approved (not cursory)".

Bug: T194308
Change-Id: I9dbfe9cede02b1b1904c1d5e5a9802306c2492a2

includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
tests/phpunit/includes/db/LBFactoryTest.php

index fe18536..38c7a5c 100644 (file)
@@ -216,7 +216,8 @@ abstract class LBFactory implements ILBFactory {
 
        final public function commitAll( $fname = __METHOD__, array $options = [] ) {
                $this->commitMasterChanges( $fname, $options );
-               $this->forEachLBCallMethod( 'commitAll', [ $fname ] );
+               $this->forEachLBCallMethod( 'flushMasterSnapshots', [ $fname ] );
+               $this->forEachLBCallMethod( 'flushReplicaSnapshots', [ $fname ] );
        }
 
        final public function beginMasterChanges( $fname = __METHOD__ ) {
index 5d217e2..850f9af 100644 (file)
@@ -439,12 +439,21 @@ interface ILoadBalancer {
        public function rollbackMasterChanges( $fname = __METHOD__ );
 
        /**
-        * Commit all replica DB transactions so as to flush any REPEATABLE-READ or SSI snapshot
+        * Commit all replica DB transactions so as to flush any REPEATABLE-READ or SSI snapshots
         *
         * @param string $fname Caller name
         */
        public function flushReplicaSnapshots( $fname = __METHOD__ );
 
+       /**
+        * Commit all master DB transactions so as to flush any REPEATABLE-READ or SSI snapshots
+        *
+        * An error will be thrown if a connection has pending writes or callbacks
+        *
+        * @param string $fname Caller name
+        */
+       public function flushMasterSnapshots( $fname = __METHOD__ );
+
        /**
         * @return bool Whether a master connection is already open
         */
index cb6e4f4..405ed14 100644 (file)
@@ -1565,7 +1565,7 @@ class LoadBalancer implements ILoadBalancer {
                } );
        }
 
-       private function flushMasterSnapshots( $fname = __METHOD__ ) {
+       public function flushMasterSnapshots( $fname = __METHOD__ ) {
                $this->forEachOpenMasterConnection( function ( IDatabase $conn ) use ( $fname ) {
                        $conn->flushSnapshot( $fname );
                } );
index b715b1f..a84cc04 100644 (file)
@@ -211,6 +211,14 @@ class LBFactoryTest extends MediaWikiTestCase {
                } );
                $this->assertEquals( 2, $count );
 
+               // DBTransactionError should not be thrown
+               $ran = 0;
+               $dbw->onTransactionPreCommitOrIdle( function () use ( &$ran ) {
+                       ++$ran;
+               } );
+               $factory->commitAll( __METHOD__ );
+               $this->assertEquals( 1, $ran );
+
                $factory->shutdown();
                $factory->closeAll();
        }