summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2019-01-15 10:39:48 +0000
committerRobert Speicher <rspeicher@gmail.com>2019-01-22 11:55:10 -0600
commit1556e3ab6610ebb6691fd28078ce5df020f15989 (patch)
tree5bb769d5fec347d58cf7e9c316455cba16480b56
parent237bddc6a52fdc8ccb51b024a3048a3233ee43a3 (diff)
downloadgitlab-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.rb20
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