diff options
author | Rémy Coutable <remy@rymai.me> | 2019-01-15 10:39:48 +0000 |
---|---|---|
committer | Robert Speicher <rspeicher@gmail.com> | 2019-01-22 11:55:10 -0600 |
commit | 1556e3ab6610ebb6691fd28078ce5df020f15989 (patch) | |
tree | 5bb769d5fec347d58cf7e9c316455cba16480b56 | |
parent | 237bddc6a52fdc8ccb51b024a3048a3233ee43a3 (diff) | |
download | gitlab-ce-1556e3ab6610ebb6691fd28078ce5df020f15989.tar.gz |
Merge branch 'sh-fix-issue-55161' into 'master'
Fix failing MySQL spec due to deadlock condition
Closes #55161
See merge request gitlab-org/gitlab-ce!24378
-rw-r--r-- | app/uploaders/records_uploads.rb | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/app/uploaders/records_uploads.rb b/app/uploaders/records_uploads.rb index 0efca895a50..9a243e07936 100644 --- a/app/uploaders/records_uploads.rb +++ b/app/uploaders/records_uploads.rb @@ -23,13 +23,23 @@ module RecordsUploads return unless model return unless file && file.exists? - Upload.transaction do - uploads.where(path: upload_path).delete_all - upload.delete if upload - - self.upload = build_upload.tap(&:save!) + # MySQL InnoDB may encounter a deadlock if a deletion and an + # insert is in the same transaction due to its next-key locking + # algorithm, so we need to skip the transaction. + # https://gitlab.com/gitlab-org/gitlab-ce/issues/55161#note_131556351 + if Gitlab::Database.mysql? + readd_upload + else + Upload.transaction { readd_upload } end end + + def readd_upload + uploads.where(path: upload_path).delete_all + upload.delete if upload + + self.upload = build_upload.tap(&:save!) + end # rubocop: enable CodeReuse/ActiveRecord def upload_path |