// Update recentchanges
if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
// Mark as patrolled if the user can do so
- $patrolled = $wgUseRCPatrol && !count(
+ $autopatrolled = $wgUseRCPatrol && !count(
$this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
// Add RC row to the DB
RecentChange::notifyEdit(
$oldContent ? $oldContent->getSize() : 0,
$newsize,
$revisionId,
- $patrolled,
+ $autopatrolled ? RecentChange::PRC_AUTOPATROLLED :
+ RecentChange::PRC_UNPATROLLED,
$tags
);
}
: DB_REPLICA; // T154554
$edit->popts->setSpeculativeRevIdCallback( function () use ( $dbIndex ) {
- return 1 + (int)wfGetDB( $dbIndex )->selectField(
+ $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
+ // Use a fresh connection in order to see the latest data, by avoiding
+ // stale data from REPEATABLE-READ snapshots.
+ $db = $lb->getConnectionRef( $dbIndex, [], false, $lb::CONN_TRX_AUTO );
+
+ return 1 + (int)$db->selectField(
'revision',
'MAX(rev_id)',
[],
// In the future, we may keep revisions and mark them with
// the rev_deleted field, which is reserved for this purpose.
+ // Lock rows in `revision` and its temp tables, but not any others.
+ // Note array_intersect() preserves keys from the first arg, and we're
+ // assuming $revQuery has `revision` primary and isn't using subtables
+ // for anything we care about.
+ $res = $dbw->select(
+ array_intersect(
+ $revQuery['tables'],
+ [ 'revision', 'revision_comment_temp', 'revision_actor_temp' ]
+ ),
+ '1',
+ [ 'rev_page' => $id ],
+ __METHOD__,
+ 'FOR UPDATE',
+ $revQuery['joins']
+ );
+ foreach ( $res as $row ) {
+ // Fetch all rows in case the DB needs that to properly lock them.
+ }
+
// Get all of the page revisions
$res = $dbw->select(
$revQuery['tables'],
$revQuery['fields'],
[ 'rev_page' => $id ],
__METHOD__,
- 'FOR UPDATE',
+ [],
$revQuery['joins']
);
if ( $wgUseRCPatrol ) {
// Mark all reverted edits as patrolled
- $set['rc_patrolled'] = 1;
+ $set['rc_patrolled'] = RecentChange::PRC_PATROLLED;
}
if ( count( $set ) ) {
Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] );
}
- // Refresh counts on categories that should be empty now, to
- // trigger possible deletion. Check master for the most
- // up-to-date cat_pages.
+ // Refresh counts on categories that should be empty now
if ( count( $deleted ) ) {
$rows = $dbw->select(
'category',
[ 'cat_id', 'cat_title', 'cat_pages', 'cat_subcats', 'cat_files' ],
- [ 'cat_title' => $deleted, 'cat_pages <= 0' ],
+ [ 'cat_title' => $deleted, 'cat_pages <= 100' ],
__METHOD__
);
foreach ( $rows as $row ) {