Page MenuHomePhabricator

UserMerge throws exception when delete user is checked
Open, Needs TriagePublicBUG REPORT

Description

Steps to replicate the issue (include links if applicable):

  • Create/edit User A's page under User:A
  • Visit Special:UserMerge to merge User A into User B and check to delete User

What happens?:
Exception is thrown

[DBQuery] startAtomic: entering level 0 (MovePage::moveUnsafe)
[RevisionStore] Failed to load latest revision ID 385501 of page ID 182002.
#0 /var/www/wiki/includes/MovePage.php(931): MediaWiki\Revision\RevisionStore->newNullRevision()
#1 /var/www/wiki/includes/MovePage.php(673): MovePage->moveToInternal()
#2 /var/www/wiki/includes/MovePage.php(486): MovePage->moveUnsafe()
#3 /var/www/wiki/extensions/UserMerge/includes/MergeUser.php(591): MovePage->move()
#4 /var/www/wiki/extensions/UserMerge/includes/MergeUser.php(66): MergeUser->movePages()
#5 /var/www/wiki/extensions/UserMerge/includes/SpecialUserMerge.php(152): MergeUser->delete()
#6 /var/www/wiki/includes/htmlform/HTMLForm.php(725): SpecialUserMerge->onSubmit()
#7 /var/www/wiki/includes/htmlform/HTMLForm.php(615): HTMLForm->trySubmit()
#8 /var/www/wiki/includes/htmlform/HTMLForm.php(631): HTMLForm->tryAuthorizedSubmit()
#9 /var/www/wiki/includes/specialpage/FormSpecialPage.php(209): HTMLForm->show()
#10 /var/www/wiki/includes/specialpage/SpecialPage.php(701): FormSpecialPage->execute()
#11 /var/www/wiki/includes/specialpage/SpecialPageFactory.php(1428): SpecialPage->run()
#12 /var/www/wiki/includes/MediaWiki.php(316): MediaWiki\SpecialPage\SpecialPageFactory->executePath()
#13 /var/www/wiki/includes/MediaWiki.php(904): MediaWiki->performRequest()
#14 /var/www/wiki/includes/MediaWiki.php(562): MediaWiki->main()
#15 /var/www/wiki/index.php(50): MediaWiki->run()
#16 /var/www/wiki/index.php(46): wfIndexMain()
#17 {main}
[exception] [972d264293d6fb22d4fa0dee] /wiki/Special:UserMerge   MWException: Failed to create null revision while moving page ID 182002 to User:B (page ID 182002)
#0 /var/www/wiki/includes/MovePage.php(673): MovePage->moveToInternal()
#1 /var/www/wiki/includes/MovePage.php(486): MovePage->moveUnsafe()
#2 /var/www/wiki/extensions/UserMerge/includes/MergeUser.php(591): MovePage->move()
#3 /var/www/wiki/extensions/UserMerge/includes/MergeUser.php(66): MergeUser->movePages()
#4 /var/www/wiki/extensions/UserMerge/includes/SpecialUserMerge.php(152): MergeUser->delete()
#5 /var/www/wiki/includes/htmlform/HTMLForm.php(725): SpecialUserMerge->onSubmit()
#6 /var/www/wiki/includes/htmlform/HTMLForm.php(615): HTMLForm->trySubmit()
#7 /var/www/wiki/includes/htmlform/HTMLForm.php(631): HTMLForm->tryAuthorizedSubmit()
#8 /var/www/wiki/includes/specialpage/FormSpecialPage.php(209): HTMLForm->show()
#9 /var/www/wiki/includes/specialpage/SpecialPage.php(701): FormSpecialPage->execute()
#10 /var/www/wiki/includes/specialpage/SpecialPageFactory.php(1428): SpecialPage->run()
#11 /var/www/wiki/includes/MediaWiki.php(316): MediaWiki\SpecialPage\SpecialPageFactory->executePath()
#12 /var/www/wiki/includes/MediaWiki.php(904): MediaWiki->performRequest()
#13 /var/www/wiki/includes/MediaWiki.php(562): MediaWiki->main()
#14 /var/www/wiki/index.php(50): MediaWiki->run()
#15 /var/www/wiki/index.php(46): wfIndexMain()
#16 {main}

What should have happened instead?:
Showing user merge success message

Software version (skip for WMF-hosted wikis like Wikipedia):
REL1_39 on mediawiki core & UserMerge extension

Analysis
Tracing the code, it appears
includes/MovePage.php

		$dbw->update( 'page',
			/* SET */ [
				'page_namespace' => $nt->getNamespace(),
				'page_title' => $nt->getDBkey(),
			],
			/* WHERE */ [ 'page_id' => $oldid ],
			__METHOD__
		);

The page_title remains unchanged for some unknown reason in DB even after update.
So when $this->revisionStore->newNullRevision is called, it return null and resulting in exception

Additionally, checking tables defined in $updateFields that were suppose to be updated.
None of the field were updates, so it looks like the transaction was still on going and the results are not yet committed/readable.