This avoids "Transaction round stage must be approved (not cursory)".
Bug: T194308
Change-Id: I9dbfe9cede02b1b1904c1d5e5a9802306c2492a2
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__ ) {
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
*/
} );
}
- private function flushMasterSnapshots( $fname = __METHOD__ ) {
+ public function flushMasterSnapshots( $fname = __METHOD__ ) {
$this->forEachOpenMasterConnection( function ( IDatabase $conn ) use ( $fname ) {
$conn->flushSnapshot( $fname );
} );
} );
$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();
}