summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2019-06-25 14:47:17 -0700
committerStan Hu <stanhu@gmail.com>2019-06-25 15:49:28 -0700
commit919aea521936c088bff986a1428634e4688d7ed2 (patch)
tree62a1b1fb97cd9670a045c73a48efdcf1ce1cb205
parent1a9fd38a4cadf86397c033d91e38ca3cc6a388f6 (diff)
downloadgitlab-ce-919aea521936c088bff986a1428634e4688d7ed2.tar.gz
Disable Rails SQL query cache when applying service templates
When the SQL query cache is active, the SELECT query for finding projects to apply service templates returns the same values. This causes an infinite loop because even though bulk INSERT queries are made, the cached results never reflect that progress. To fix this, we call `Project.uncached` around the query to ensure new data is retrieved. Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/63595
-rw-r--r--app/services/projects/propagate_service_template.rb2
-rw-r--r--changelogs/unreleased/security-fix-issue-59379-12-0.yml5
-rw-r--r--spec/services/projects/propagate_service_template_spec.rb2
-rw-r--r--spec/spec_helper.rb6
4 files changed, 13 insertions, 2 deletions
diff --git a/app/services/projects/propagate_service_template.rb b/app/services/projects/propagate_service_template.rb
index a2f36d2bd1b..a25c985585b 100644
--- a/app/services/projects/propagate_service_template.rb
+++ b/app/services/projects/propagate_service_template.rb
@@ -24,7 +24,7 @@ module Projects
def propagate_projects_with_template
loop do
- batch = project_ids_batch
+ batch = Project.uncached { project_ids_batch }
bulk_create_from_template(batch) unless batch.empty?
diff --git a/changelogs/unreleased/security-fix-issue-59379-12-0.yml b/changelogs/unreleased/security-fix-issue-59379-12-0.yml
new file mode 100644
index 00000000000..a6c3ce14dce
--- /dev/null
+++ b/changelogs/unreleased/security-fix-issue-59379-12-0.yml
@@ -0,0 +1,5 @@
+---
+title: Disable Rails SQL query cache when applying service templates
+merge_request:
+author:
+type: security
diff --git a/spec/services/projects/propagate_service_template_spec.rb b/spec/services/projects/propagate_service_template_spec.rb
index f93e5aae82a..2c3effec617 100644
--- a/spec/services/projects/propagate_service_template_spec.rb
+++ b/spec/services/projects/propagate_service_template_spec.rb
@@ -72,7 +72,7 @@ describe Projects::PropagateServiceTemplate do
expect(project.pushover_service.properties).to eq(service_template.properties)
end
- describe 'bulk update' do
+ describe 'bulk update', :use_sql_query_cache do
let(:project_total) { 5 }
before do
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 390a869d93f..3bd2408dc72 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -218,6 +218,12 @@ RSpec.configure do |config|
ActionController::Base.cache_store = caching_store
end
+ config.around(:each, :use_sql_query_cache) do |example|
+ ActiveRecord::Base.cache do
+ example.run
+ end
+ end
+
# The :each scope runs "inside" the example, so this hook ensures the DB is in the
# correct state before any examples' before hooks are called. This prevents a
# problem where `ScheduleIssuesClosedAtTypeChange` (or any migration that depends