From 36b30cf18e7cf24fbb444eeecca70b719ed3208d Mon Sep 17 00:00:00 2001
From: Shinya Maeda <shinya@gitlab.com>
Date: Tue, 18 Jun 2019 18:45:37 +0700
Subject: [PATCH] Revert concurrent pipeline schedule creation

This commit reverts the previously introduced concurrent pipeline
schedule creation which was a viable solution for mitigating
inconsistent pipeline schedule by Sidekiq Memory Killer.
---
 app/services/ci/pipeline_schedule_service.rb  | 13 +++++++-
 ...-concurrent-pipeline-schedule-creation.yml |  5 +++
 .../ci/pipeline_schedule_service_spec.rb      | 32 +++++++++++++++++++
 3 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 changelogs/unreleased/revert-concurrent-pipeline-schedule-creation.yml

diff --git a/app/services/ci/pipeline_schedule_service.rb b/app/services/ci/pipeline_schedule_service.rb
index 5b5e9a26520..ef90d91c936 100644
--- a/app/services/ci/pipeline_schedule_service.rb
+++ b/app/services/ci/pipeline_schedule_service.rb
@@ -7,7 +7,18 @@ module Ci
       # Otherwise, multiple pipelines could be created in a short interval.
       schedule.schedule_next_run!
 
-      RunPipelineScheduleWorker.perform_async(schedule.id, schedule.owner&.id)
+      if Feature.enabled?(:ci_pipeline_schedule_async)
+        RunPipelineScheduleWorker.perform_async(schedule.id, schedule.owner&.id)
+      else
+        begin
+          RunPipelineScheduleWorker.new.perform(schedule.id, schedule.owner&.id)
+        ensure
+          ##
+          # This is the temporary solution for avoiding the memory bloat.
+          # See more https://gitlab.com/gitlab-org/gitlab-ce/issues/61955
+          GC.start if Feature.enabled?(:ci_pipeline_schedule_force_gc, default_enabled: true)
+        end
+      end
     end
   end
 end
diff --git a/changelogs/unreleased/revert-concurrent-pipeline-schedule-creation.yml b/changelogs/unreleased/revert-concurrent-pipeline-schedule-creation.yml
new file mode 100644
index 00000000000..77423463d22
--- /dev/null
+++ b/changelogs/unreleased/revert-concurrent-pipeline-schedule-creation.yml
@@ -0,0 +1,5 @@
+---
+title: Revert concurrent pipeline creation for pipeline schedules
+merge_request: 29794
+author:
+type: fixed
diff --git a/spec/services/ci/pipeline_schedule_service_spec.rb b/spec/services/ci/pipeline_schedule_service_spec.rb
index 867ed0acc0d..f7590720f66 100644
--- a/spec/services/ci/pipeline_schedule_service_spec.rb
+++ b/spec/services/ci/pipeline_schedule_service_spec.rb
@@ -25,6 +25,38 @@ describe Ci::PipelineScheduleService do
       subject
     end
 
+    context 'when ci_pipeline_schedule_async feature flag is disabled' do
+      before do
+        stub_feature_flags(ci_pipeline_schedule_async: false)
+      end
+
+      it 'runs RunPipelineScheduleWorker synchronously' do
+        expect_next_instance_of(RunPipelineScheduleWorker) do |worker|
+          expect(worker).to receive(:perform).with(schedule.id, schedule.owner.id)
+        end
+
+        subject
+      end
+
+      it 'calls Garbage Collection manually' do
+        expect(GC).to receive(:start)
+
+        subject
+      end
+
+      context 'when ci_pipeline_schedule_force_gc feature flag is disabled' do
+        before do
+          stub_feature_flags(ci_pipeline_schedule_force_gc: false)
+        end
+
+        it 'does not call Garbage Collection manually' do
+          expect(GC).not_to receive(:start)
+
+          subject
+        end
+      end
+    end
+
     context 'when owner is nil' do
       let(:schedule) { create(:ci_pipeline_schedule, project: project, owner: nil) }
 
-- 
2.30.9