From: Aaron Schulz Date: Fri, 2 Aug 2019 20:09:44 +0000 (-0400) Subject: deferred: make DeferredUpdates::attemptUpdate() use callback owners for $fnameTrxOwner X-Git-Tag: 1.34.0-rc.0~640^2 X-Git-Url: http://git.cyclocoop.org/%7B%24admin_url%7Dmembres/load.php?a=commitdiff_plain;h=182256c57293fc1ee5ff35e93632641aa1472066;p=lhc%2Fweb%2Fwiklou.git deferred: make DeferredUpdates::attemptUpdate() use callback owners for $fnameTrxOwner This only applies for instances of DeferrableCallback Bug: T229694 Change-Id: I57fe351041c87342bd5774e333fcde4ae15059df --- diff --git a/includes/deferred/DeferrableCallback.php b/includes/deferred/DeferrableCallback.php index 2eb0d5dfa0..33961ed7bf 100644 --- a/includes/deferred/DeferrableCallback.php +++ b/includes/deferred/DeferrableCallback.php @@ -9,5 +9,5 @@ interface DeferrableCallback { /** * @return string Originating method name */ - function getOrigin(); + public function getOrigin(); } diff --git a/includes/deferred/DeferredUpdates.php b/includes/deferred/DeferredUpdates.php index d43ffbc975..3380364b6d 100644 --- a/includes/deferred/DeferredUpdates.php +++ b/includes/deferred/DeferredUpdates.php @@ -362,11 +362,16 @@ class DeferredUpdates { $update->setTransactionTicket( $ticket ); } - $fnameTrxOwner = get_class( $update ) . '::doUpdate'; + // Designate $update::doUpdate() as the write round owner + $fnameTrxOwner = ( $update instanceof DeferrableCallback ) + ? $update->getOrigin() + : get_class( $update ) . '::doUpdate'; + // Determine whether the write round will be explicit or implicit $useExplicitTrxRound = !( $update instanceof TransactionRoundAwareUpdate && $update->getTransactionRoundRequirement() == $update::TRX_ROUND_ABSENT ); + // Flush any pending changes left over from an implicit transaction round if ( $useExplicitTrxRound ) { $lbFactory->beginMasterChanges( $fnameTrxOwner ); // new explicit round diff --git a/tests/phpunit/includes/deferred/DeferredUpdatesTest.php b/tests/phpunit/includes/deferred/DeferredUpdatesTest.php index b377c639f9..7e5ff84621 100644 --- a/tests/phpunit/includes/deferred/DeferredUpdatesTest.php +++ b/tests/phpunit/includes/deferred/DeferredUpdatesTest.php @@ -373,4 +373,27 @@ class DeferredUpdatesTest extends MediaWikiTestCase { DeferredUpdates::tryOpportunisticExecute( 'run' ); $this->assertEquals( [ 'oti', 1, 2 ], $calls ); } + + /** + * @covers DeferredUpdates::attemptUpdate + */ + public function testCallbackUpdateRounds() { + $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); + + $fname = __METHOD__; + $called = false; + DeferredUpdates::attemptUpdate( + new MWCallableUpdate( + function () use ( $lbFactory, $fname, &$called ) { + $lbFactory->flushReplicaSnapshots( $fname ); + $lbFactory->commitMasterChanges( $fname ); + $called = true; + }, + $fname + ), + $lbFactory + ); + + $this->assertTrue( $called, "Callback ran" ); + } }