diff options
author | Stan Hu <stanhu@gmail.com> | 2019-06-25 14:47:17 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-06-25 22:26:41 -0700 |
commit | 103f2243c897d3ad46b137a153e909e76fde4573 (patch) | |
tree | 4832b6a1a966d12fadd7faecf77fc1600e345a30 | |
parent | e3eeb779d72006b9fbbaecf9f1d8fbd52a7d6383 (diff) | |
download | gitlab-ce-103f2243c897d3ad46b137a153e909e76fde4573.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.rb | 2 | ||||
-rw-r--r-- | changelogs/unreleased/sh-service-template-bug.yml | 5 | ||||
-rw-r--r-- | spec/services/projects/propagate_service_template_spec.rb | 2 | ||||
-rw-r--r-- | spec/spec_helper.rb | 6 |
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/sh-service-template-bug.yml b/changelogs/unreleased/sh-service-template-bug.yml new file mode 100644 index 00000000000..be5d719c6b2 --- /dev/null +++ b/changelogs/unreleased/sh-service-template-bug.yml @@ -0,0 +1,5 @@ +--- +title: Disable Rails SQL query cache when applying service templates +merge_request: 30060 +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 9266bee34d6..ec17bee640d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -215,6 +215,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 |