diff options
-rw-r--r-- | app/models/concerns/internal_id2.rb | 8 | ||||
-rw-r--r-- | app/services/ci/create_pipeline_service.rb | 3 | ||||
-rw-r--r-- | spec/lib/gitlab/import_export/safe_model_attributes.yml | 1 | ||||
-rw-r--r-- | spec/models/ci/pipeline_spec.rb | 2 | ||||
-rw-r--r-- | spec/services/ci/create_pipeline_service_spec.rb | 12 |
5 files changed, 22 insertions, 4 deletions
diff --git a/app/models/concerns/internal_id2.rb b/app/models/concerns/internal_id2.rb index 08f128b4042..b64c831adc0 100644 --- a/app/models/concerns/internal_id2.rb +++ b/app/models/concerns/internal_id2.rb @@ -1,6 +1,8 @@ module InternalId2 extend ActiveSupport::Concern + FailedToSaveInternalIdError = Class.new(StandardError) + included do after_commit :set_iid, on: :create end @@ -14,17 +16,17 @@ module InternalId2 retries ||= 0 max_iid = records.maximum(:iid) || -1 update_columns(iid: max_iid.to_i + 1) # Avoid infinite loop - rescue ActiveRecord::RecordNotUnique => e + rescue ActiveRecord::RecordNotUnique if (retries += 1) < 3 retry else - raise ActiveRecord::RecordInvalid + raise FailedToSaveInternalIdError end end end def table_name self.class.name.deconstantize.split("::").map(&:underscore).join('_') - + self.class.name.demodulize.tableize + + self.class.name.demodulize.tableize end end diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index 414c01b2546..851c57a778c 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -34,6 +34,9 @@ module Ci end rescue ActiveRecord::RecordInvalid => e return error("Failed to persist the pipeline: #{e}") + rescue InternalId2::FailedToSaveInternalIdError + # TODO: We need to roolback!!!!!! + return error("Failed to persist the pipeline: #{e}") end update_merge_requests_head_pipeline diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index 122b8ee0314..2f0723b658f 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -206,6 +206,7 @@ MergeRequestDiffFile: - binary Ci::Pipeline: - id +- iid - project_id - source - ref diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 8616d44fe44..2e517d05161 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -183,7 +183,7 @@ describe Ci::Pipeline, :mailer do it 'includes the defined keys' do keys = subject.map { |v| v[:key] } - expect(keys).to eq(['CI_PIPELINE_ID', 'CI_PIPELINE_IID', 'CI_CONFIG_PATH', 'CI_PIPELINE_SOURCE']) + expect(keys).to eq(%w[CI_PIPELINE_ID CI_PIPELINE_IID CI_CONFIG_PATH CI_PIPELINE_SOURCE]) end context 'when iid is nil' do diff --git a/spec/services/ci/create_pipeline_service_spec.rb b/spec/services/ci/create_pipeline_service_spec.rb index c74d2d1da84..c609f5029a8 100644 --- a/spec/services/ci/create_pipeline_service_spec.rb +++ b/spec/services/ci/create_pipeline_service_spec.rb @@ -481,6 +481,18 @@ describe Ci::CreatePipelineService do end end end + + context 'when failed to set_iid' do + before do + allow_any_instance_of(Ci::Pipeline).to receive(:set_iid).and_raise(InternalId2::FailedToSaveInternalIdError) + end + + let(:pipeline) { execute_service } + + it 'does not create a new pipeline' do + expect(pipeline).not_to be_persisted + end + end end describe '#allowed_to_create?' do |