dépôts
/
lhc
/
web
/
wiklou.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge "Create Special:NewSection special page"
[lhc/web/wiklou.git]
/
includes
/
deferred
/
DeferredUpdates.php
diff --git
a/includes/deferred/DeferredUpdates.php
b/includes/deferred/DeferredUpdates.php
index
c754cff
..
d43ffbc
100644
(file)
--- a/
includes/deferred/DeferredUpdates.php
+++ b/
includes/deferred/DeferredUpdates.php
@@
-28,6
+28,7
@@
use MediaWiki\MediaWikiServices;
use Wikimedia\Rdbms\LBFactory;
use Wikimedia\Rdbms\ILBFactory;
use Wikimedia\Rdbms\LoadBalancer;
use Wikimedia\Rdbms\LBFactory;
use Wikimedia\Rdbms\ILBFactory;
use Wikimedia\Rdbms\LoadBalancer;
+use Wikimedia\Rdbms\DBTransactionError;
/**
* Class for managing the deferred updates
/**
* Class for managing the deferred updates
@@
-352,28
+353,30
@@
class DeferredUpdates {
* @since 1.34
*/
public static function attemptUpdate( DeferrableUpdate $update, ILBFactory $lbFactory ) {
* @since 1.34
*/
public static function attemptUpdate( DeferrableUpdate $update, ILBFactory $lbFactory ) {
+ $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
+ if ( !$ticket || $lbFactory->hasTransactionRound() ) {
+ throw new DBTransactionError( null, "A database transaction round is pending." );
+ }
+
if ( $update instanceof DataUpdate ) {
if ( $update instanceof DataUpdate ) {
- $update->setTransactionTicket( $
lbFactory->getEmptyTransactionTicket( __METHOD__ )
);
+ $update->setTransactionTicket( $
ticket
);
}
}
- if (
+ $fnameTrxOwner = get_class( $update ) . '::doUpdate';
+ $useExplicitTrxRound = !(
$update instanceof TransactionRoundAwareUpdate &&
$update->getTransactionRoundRequirement() == $update::TRX_ROUND_ABSENT
$update instanceof TransactionRoundAwareUpdate &&
$update->getTransactionRoundRequirement() == $update::TRX_ROUND_ABSENT
- ) {
- $fnameTrxOwner = null;
+ );
+ // Flush any pending changes left over from an implicit transaction round
+ if ( $useExplicitTrxRound ) {
+ $lbFactory->beginMasterChanges( $fnameTrxOwner ); // new explicit round
} else {
} else {
- $
fnameTrxOwner = get_class( $update ) . '::doUpdate';
+ $
lbFactory->commitMasterChanges( $fnameTrxOwner ); // new implicit round
}
}
-
- if ( $fnameTrxOwner !== null ) {
- $lbFactory->beginMasterChanges( $fnameTrxOwner );
- }
-
+ // Run the update after any stale master view snapshots have been flushed
$update->doUpdate();
$update->doUpdate();
-
- if ( $fnameTrxOwner !== null ) {
- $lbFactory->commitMasterChanges( $fnameTrxOwner );
- }
+ // Commit any pending changes from the explicit or implicit transaction round
+ $lbFactory->commitMasterChanges( $fnameTrxOwner );
}
/**
}
/**