Over the past month, a number of engineers using our Phabricator installation have reported not being able to delete draft comments. They get a 500 error and in some of these cases, Phabricator hangs.
The logs from the most recent report show:
[2015-01-20 12:54:07] EXCEPTION: (AphrontCountQueryException) More than 1 result from loadOneWhere()! at [<phabricator>/src/infrastructure/storage/lisk/LiskDAO.php:476] #0 LiskDAO::loadOneWhere(string, string, string, string) called at [<phabricator>/src/applications/differential/storage/DifferentialDraft.php:46] #1 DifferentialDraft::deleteHasDraft(string, string, string) called at [<phabricator>/src/applications/differential/controller/DifferentialInlineCommentEditController.php:82] #2 DifferentialInlineCommentEditController::deleteComment(DifferentialInlineComment) called at [<phabricator>/src/infrastructure/diff/PhabricatorInlineCommentController.php:67] #3 PhabricatorInlineCommentController::processRequest() called at [<phabricator>/src/aphront/AphrontController.php:33] #4 AphrontController::handleRequest(AphrontRequest) called at [<phabricator>/src/aphront/configuration/AphrontApplicationConfiguration.php:196] #5 AphrontApplicationConfiguration::processRequest(AphrontRequest, PhutilDeferredLog, AphrontPHPHTTPSink) called at [<phabricator>/src/aphront/configuration/AphrontApplicationConfiguration.php:121] #6 AphrontApplicationConfiguration::runHTTPRequest(AphrontPHPHTTPSink) called at [<phabricator>/webroot/index.php:19] PHP Fatal error: Uncaught exception 'Exception' with message 'Process exited with an open transaction! The transaction will be implicitly rolled back. Calls to openTransaction() must always be paired with a call to saveTransaction() or killTransaction().' in /phab_path/libphutil/src/aphront/storage/connection/AphrontDatabaseTransactionState.php:69\nStack trace:\n#0 [internal function]: AphrontDatabaseTransactionState->__destruct()\n#1 {main}\n thrown in /phab_path/libphutil/src/aphront/storage/connection/AphrontDatabaseTransactionState.php on line 69
And the browser reports seeing a 200 followed by a 500:
The exception makes me believe that a duplicate comment was created, but I'm not sure why that would happen. Any idea what might be going on here?