Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-04-25 06:10:06 +00:00
parent c8ee50588f
commit a8d2e14a13
5 changed files with 84 additions and 1 deletions

View File

@ -186,7 +186,7 @@ external_pull_requests:
merge_request_metrics:
- table: ci_pipelines
column: pipeline_id
on_delete: async_delete
on_delete: async_nullify
merge_requests:
- table: ci_pipelines
column: head_pipeline_id

View File

@ -0,0 +1,28 @@
# frozen_string_literal: true
class AddNullifyBuildDataTriggerOnMergeRequestMetrics < Gitlab::Database::Migration[1.0]
include Gitlab::Database::SchemaHelpers
TABLE_NAME = 'merge_request_metrics'
FUNCTION_NAME = 'nullify_merge_request_metrics_build_data'
TRIGGER_NAME = 'nullify_merge_request_metrics_build_data_on_update'
def up
create_trigger_function(FUNCTION_NAME) do
<<~SQL
IF (OLD.pipeline_id IS NOT NULL) AND (NEW.pipeline_id IS NULL) THEN
NEW.latest_build_started_at = NULL;
NEW.latest_build_finished_at = NULL;
END IF;
RETURN NEW;
SQL
end
create_trigger(TABLE_NAME, TRIGGER_NAME, FUNCTION_NAME, fires: 'BEFORE UPDATE')
end
def down
drop_trigger(TABLE_NAME, TRIGGER_NAME)
drop_function(FUNCTION_NAME)
end
end

View File

@ -0,0 +1 @@
504e7df63be512fb4f6d3abbf9ebe381752f2c24b63b2d6a4d11c64894c1555b

View File

@ -106,6 +106,19 @@ BEGIN
END;
$$;
CREATE FUNCTION nullify_merge_request_metrics_build_data() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF (OLD.pipeline_id IS NOT NULL) AND (NEW.pipeline_id IS NULL) THEN
NEW.latest_build_started_at = NULL;
NEW.latest_build_finished_at = NULL;
END IF;
RETURN NEW;
END
$$;
CREATE FUNCTION postgres_pg_stat_activity_autovacuum() RETURNS TABLE(query text, query_start timestamp with time zone)
LANGUAGE sql SECURITY DEFINER
SET search_path TO 'pg_catalog', 'pg_temp'
@ -31061,6 +31074,8 @@ CREATE TRIGGER merge_requests_loose_fk_trigger AFTER DELETE ON merge_requests RE
CREATE TRIGGER namespaces_loose_fk_trigger AFTER DELETE ON namespaces REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
CREATE TRIGGER nullify_merge_request_metrics_build_data_on_update BEFORE UPDATE ON merge_request_metrics FOR EACH ROW EXECUTE FUNCTION nullify_merge_request_metrics_build_data();
CREATE TRIGGER projects_loose_fk_trigger AFTER DELETE ON projects REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION insert_into_loose_foreign_keys_deleted_records();
CREATE TRIGGER trigger_delete_project_namespace_on_project_delete AFTER DELETE ON projects FOR EACH ROW WHEN ((old.project_namespace_id IS NOT NULL)) EXECUTE FUNCTION delete_associated_project_namespace();

View File

@ -54,4 +54,43 @@ RSpec.describe MergeRequest::Metrics do
let!(:parent) { create(:ci_pipeline, project: merge_request.target_project) }
let!(:model) { merge_request.metrics.tap { |metrics| metrics.update!(pipeline: parent) } }
end
describe 'update' do
let(:merge_request) { create(:merge_request) }
let(:metrics) { merge_request.metrics }
before do
metrics.update!(
pipeline_id: 1,
latest_build_started_at: Time.current,
latest_build_finished_at: Time.current
)
end
context 'when pipeline_id is nullified' do
before do
metrics.update!(pipeline_id: nil)
end
it 'nullifies build related columns via DB trigger' do
metrics.reload
expect(metrics.latest_build_started_at).to be_nil
expect(metrics.latest_build_finished_at).to be_nil
end
end
context 'when updated but pipeline_id is not nullified' do
before do
metrics.update!(latest_closed_at: Time.current)
end
it 'does not nullify build related columns' do
metrics.reload
expect(metrics.latest_build_started_at).not_to be_nil
expect(metrics.latest_build_finished_at).not_to be_nil
end
end
end
end