summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/concerns/internal_id2.rb8
-rw-r--r--app/services/ci/create_pipeline_service.rb3
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml1
-rw-r--r--spec/models/ci/pipeline_spec.rb2
-rw-r--r--spec/services/ci/create_pipeline_service_spec.rb12
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