summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Newdigate <andrew@gitlab.com>2019-06-17 22:20:49 +0200
committerAndrew Newdigate <andrew@gitlab.com>2019-06-20 23:08:36 +0200
commit8f010583751fd354784b5ff9b4d6695e5b825197 (patch)
treee3cd42530d9b8283026a37dafc9e5f04153b7c9e
parent5a036d481f4d8ee131f2b858162e5937150b6569 (diff)
downloadgitlab-ce-an-disable-transactions-over-gitaly-calls.tar.gz
Disallow Gitaly calls when an active transaction is pendingan-disable-transactions-over-gitaly-calls
-rw-r--r--app/models/merge_request.rb6
-rw-r--r--changelogs/unreleased/an-disable-transactions-over-gitaly-calls.yml5
-rw-r--r--lib/gitlab/gitaly_client.rb4
-rw-r--r--lib/gitlab/shell.rb6
4 files changed, 15 insertions, 6 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index f07636e8f77..7f59d45aae8 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -667,7 +667,7 @@ class MergeRequest < ApplicationRecord
fetch_ref!
# n+1: https://gitlab.com/gitlab-org/gitlab-ce/issues/37435
- Gitlab::GitalyClient.allow_n_plus_1_calls do
+ Gitlab::GitalyClient.allow_n_plus_1_calls(override_transaction_safety: true) do
merge_request_diffs.create!
reload_merge_request_diff
end
@@ -880,10 +880,12 @@ class MergeRequest < ApplicationRecord
return unless project.issues_enabled?
return if closed? || merged?
+ issues_to_be_closed = closes_issues(current_user)
+
transaction do
self.merge_requests_closing_issues.delete_all
- closes_issues(current_user).each do |issue|
+ issues_to_be_closed.each do |issue|
next if issue.is_a?(ExternalIssue)
self.merge_requests_closing_issues.create!(issue: issue)
diff --git a/changelogs/unreleased/an-disable-transactions-over-gitaly-calls.yml b/changelogs/unreleased/an-disable-transactions-over-gitaly-calls.yml
new file mode 100644
index 00000000000..89a38316683
--- /dev/null
+++ b/changelogs/unreleased/an-disable-transactions-over-gitaly-calls.yml
@@ -0,0 +1,5 @@
+---
+title: Disallow Gitaly calls when an active transaction is pending
+merge_request: 29774
+author:
+type: other
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index 47976389af6..5893739c1e1 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -285,7 +285,9 @@ module Gitlab
end
private_class_method :enforce_gitaly_request_limits?
- def self.allow_n_plus_1_calls
+ def self.allow_n_plus_1_calls(override_transaction_safety: false)
+ raise "Allowing Gitaly n+1 calls from within an active transaction is not allowed." if !override_transaction_safety && Gitlab::Database.inside_transaction?
+
return yield unless Gitlab::SafeRequestStore.active?
begin
diff --git a/lib/gitlab/shell.rb b/lib/gitlab/shell.rb
index 93182607616..69fb8805e08 100644
--- a/lib/gitlab/shell.rb
+++ b/lib/gitlab/shell.rb
@@ -261,10 +261,10 @@ module Gitlab
# add_namespace("default", "gitlab")
#
def add_namespace(storage, name)
- # https://gitlab.com/gitlab-org/gitlab-ce/issues/58012
- Gitlab::GitalyClient.allow_n_plus_1_calls do
+ # # https://gitlab.com/gitlab-org/gitlab-ce/issues/58012
+ # Gitlab::GitalyClient.allow_n_plus_1_calls do
Gitlab::GitalyClient::NamespaceService.new(storage).add(name)
- end
+ # end
rescue GRPC::InvalidArgument => e
raise ArgumentError, e.message
end