Page MenuHomePhabricator

LiquidThreads deletion fails due to unindexed DELETE query
Open, HighPublic

Description

As reported by @Krinkle on T207530, it is not possible to delete https://www.mediawiki.org/w/index.php?title=Thread:Project:Support_desk/no_respond_to_any_clicks/actions.&action=history . I reproduced this with X-Wikimedia-Debug: log enabled. The issue occurs in Thread::delete(), which uses an unindexed query to attempt to delete rows from user_message_state:

		$dbw->delete( 'user_message_state', [ 'ums_thread' => $this->id() ],
			__METHOD__ );

Table definition:

CREATE TABLE `user_message_state` (
  `ums_user` int(10) unsigned NOT NULL DEFAULT '0',
  `ums_thread` int(8) unsigned NOT NULL DEFAULT '0',
  `ums_read_timestamp` varbinary(14) DEFAULT NULL,
  `ums_conversation` int(8) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`ums_user`,`ums_thread`),
  KEY `ums_user_conversation` (`ums_user`,`ums_conversation`)
) ENGINE=InnoDB DEFAULT CHARSET=binary

You can see that there is no index on ums_thread.

The table has 8M rows on mediawikiwiki.

Log snippet:

2018-12-14 05:02:27 [XBM5WwpAIHsAAAQ486oAAAAS] mwdebug1001 mediawikiwiki 1.33.0-wmf.8 DBPerformance WARNING: Expectation (writeQueryTime <= 1) by MediaWiki::main not met (actual: 5.3960931301117):
query-m: DELETE FROM `user_message_state` WHERE ums_thread = 'X' [TRX#64d9be]
#0 /srv/mediawiki/php-1.33.0-wmf.8/includes/libs/rdbms/TransactionProfiler.php(231): Wikimedia\Rdbms\TransactionProfiler->reportExpectationViolated()
#1 /srv/mediawiki/php-1.33.0-wmf.8/includes/libs/rdbms/database/Database.php(1296): Wikimedia\Rdbms\TransactionProfiler->recordQueryCompletion()
#2 /srv/mediawiki/php-1.33.0-wmf.8/includes/libs/rdbms/database/Database.php(1193): Wikimedia\Rdbms\Database->doProfiledQuery()
#3 /srv/mediawiki/php-1.33.0-wmf.8/includes/libs/rdbms/database/Database.php(2954): Wikimedia\Rdbms\Database->query()
#4 /srv/mediawiki/php-1.33.0-wmf.8/extensions/LiquidThreads/classes/Thread.php(364): Wikimedia\Rdbms\Database->delete()
#5 /srv/mediawiki/php-1.33.0-wmf.8/extensions/LiquidThreads/classes/DeletionController.php(22): Thread->delete()
#6 /srv/mediawiki/php-1.33.0-wmf.8/includes/Hooks.php(174): LqtDeletionController::onArticleDeleteComplete()
#7 /srv/mediawiki/php-1.33.0-wmf.8/includes/Hooks.php(202): Hooks::callHook()
#8 /srv/mediawiki/php-1.33.0-wmf.8/includes/page/WikiPage.php(2794): Hooks::run()
#9 /srv/mediawiki/php-1.33.0-wmf.8/includes/page/WikiPage.php(2639): WikiPage->doDeleteArticleBatched()
#10 /srv/mediawiki/php-1.33.0-wmf.8/includes/page/Article.php(2071): WikiPage->doDeleteArticleReal()
#11 /srv/mediawiki/php-1.33.0-wmf.8/includes/page/Article.php(1826): Article->doDelete()
#12 /srv/mediawiki/php-1.33.0-wmf.8/includes/actions/DeleteAction.php(46): Article->delete()
#13 /srv/mediawiki/php-1.33.0-wmf.8/includes/MediaWiki.php(501): DeleteAction->show()
#14 /srv/mediawiki/php-1.33.0-wmf.8/includes/MediaWiki.php(294): MediaWiki->performAction()
#15 /srv/mediawiki/php-1.33.0-wmf.8/includes/MediaWiki.php(862): MediaWiki->performRequest()
#16 /srv/mediawiki/php-1.33.0-wmf.8/includes/MediaWiki.php(517): MediaWiki->main()
#17 /srv/mediawiki/php-1.33.0-wmf.8/index.php(42): MediaWiki->run()
#18 /srv/mediawiki/w/index.php(3): include()
#19 {main} {"measure":"writeQueryTime","max":1,"by":"MediaWiki::main","actual":5.3960931301117,"query":"query-m: DELETE FROM `user_message_state` WHERE ums_thread = 'X' [TRX#64d9be]"} 
2018-12-14 05:02:27 [XBM5WwpAIHsAAAQ486oAAAAS] mwdebug1001 mediawikiwiki 1.33.0-wmf.8 DBQuery DEBUG: DELETE FROM `user_message_state` WHERE ums_thread = '27694' {"method":"Thread::delete","master":true,"runtime":5.3912460803986}

Event Timeline

tstarling added a subscriber: BPirkle.

Still seen in logs. Still reproducible. In Logstash, on the mediawiki dashboard: channnel:DBPerformance AND exception.trace:"LqtDeletionController". Note that this is rare because relatively few people have the ability to delete pages, and fewer still on wikis with LQT enabled, and fewer still regularly attempt something they known to be broken so long. Unfortunately, there also aren't any obvious workarounds (afaik).