Skip to content

Harden ci pipelines auto_devops & config_repository usage data

Harden ci pipelines auto_devops & config_repository usage data

1] pry(main)> time_period = {}
=> {}
[2] pry(main)> Gitlab::UsageData.distinct_count(::Ci::Pipeline.auto_devops_source.where(time_period), :user_id)
   (1.5ms)  SELECT MIN("ci_pipelines"."user_id") FROM "ci_pipelines" WHERE "ci_pipelines"."config_source" = 2
   (0.7ms)  SELECT MAX("ci_pipelines"."user_id") FROM "ci_pipelines" WHERE "ci_pipelines"."config_source" = 2
   (0.8ms)  SELECT COUNT(DISTINCT "ci_pipelines"."user_id") FROM "ci_pipelines" WHERE "ci_pipelines"."config_source" = 2 AND "ci_pipelines"."user_id" BETWEEN 0 AND 1250
=> 0
[3] pry(main)> Gitlab::UsageData.distinct_count(::Ci::Pipeline.repository_source.where(time_period), :user_id)
   (0.8ms)  SELECT MIN("ci_pipelines"."user_id") FROM "ci_pipelines" WHERE "ci_pipelines"."config_source" = 1
   (0.6ms)  SELECT MAX("ci_pipelines"."user_id") FROM "ci_pipelines" WHERE "ci_pipelines"."config_source" = 1
   (0.6ms)  SELECT COUNT(DISTINCT "ci_pipelines"."user_id") FROM "ci_pipelines" WHERE "ci_pipelines"."config_source" = 1 AND "ci_pipelines"."user_id" BETWEEN 0 AND 1250
SELECT COUNT(DISTINCT "ci_pipelines"."user_id") FROM "ci_pipelines" WHERE "ci_pipelines"."config_source" = 1 AND "ci_pipelines"."user_id" BETWEEN 0 AND 1250

before: https://explain.depesz.com/s/QfOI 12.5 seconds after: https://explain.depesz.com/s/tbGY 2 to 3.3 seconds

SELECT COUNT(DISTINCT "ci_pipelines"."user_id") FROM "ci_pipelines" WHERE "ci_pipelines"."config_source" = 2 AND "ci_pipelines"."user_id" BETWEEN 0 AND 1250

before: https://explain.depesz.com/s/TGz1 43.9 seconds after: https://explain.depesz.com/s/yJ4s 130 milliseconds

Index creation

exec CREATE INDEX index_ci_pipelines_on_user_id_and_created_at_and_config_source ON public.ci_pipelines USING btree (user_id, created_at, config_source)
The query has been executed. Duration: 10.744 min

index_ci_pipelines_on_user_id_and_created_at_and_config_source
\di+ index_ci_pipelines_on_user_id_and_created_at_and_config_source
List of relations
 Schema |                              Name                              | Type  | Owner  |    Table     |  Size   | Description 
--------+----------------------------------------------------------------+-------+--------+--------------+---------+-------------
 public | index_ci_pipelines_on_user_id_and_created_at_and_config_source | index | gitlab | ci_pipelines | 5871 MB | 
(1 row)

Migration output

$ rails db:migrate:up VERSION=20200704143633
== 20200704143633 AddIndexOnUserIdAndCreatedAtWhereSourceToCiPipelines: migrating 
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:ci_pipelines, [:user_id, :created_at, :config_source], {:algorithm=>:concurrently})
   -> 0.0060s
-- add_index(:ci_pipelines, [:user_id, :created_at, :config_source], {:algorithm=>:concurrently})
   -> 0.0137s
== 20200704143633 AddIndexOnUserIdAndCreatedAtWhereSourceToCiPipelines: migrated (0.0200s) 

$ rails db:migrate:down VERSION=20200704143633
== 20200704143633 AddIndexOnUserIdAndCreatedAtWhereSourceToCiPipelines: reverting 
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:ci_pipelines, [:user_id, :created_at, :config_source], {:algorithm=>:concurrently})
   -> 0.0067s
-- remove_index(:ci_pipelines, {:algorithm=>:concurrently, :column=>[:user_id, :created_at, :config_source]})
   -> 0.0194s
== 20200704143633 AddIndexOnUserIdAndCreatedAtWhereSourceToCiPipelines: reverted (0.0264s) 
Edited by Alper Akgun

Merge request reports