Instrument Enterprise Users adoption
What does this MR do and why?
Related to #383140 (closed)
DB Migrations
bin/rails db:migrate
bogdanvlviv@lenovo:~/gitlab-development-kit/gitlab$ bin/rails db:migrate
main: == 20230228212427 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithoutDate: migrating
main: -- transaction_open?()
main: -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main: -> 0.0330s
main: -- index_exists?(:user_details, :user_id, {:where=>"provisioned_by_group_id IS NOT NULL AND provisioned_by_group_at IS NULL", :name=>"index_user_details_on_user_id_for_enterprise_users_without_date", :algorithm=>:concurrently})
main: -> 0.0072s
main: -- execute("SET statement_timeout TO 0")
main: -> 0.0003s
main: -- add_index(:user_details, :user_id, {:where=>"provisioned_by_group_id IS NOT NULL AND provisioned_by_group_at IS NULL", :name=>"index_user_details_on_user_id_for_enterprise_users_without_date", :algorithm=>:concurrently})
main: -> 0.0115s
main: -- execute("RESET statement_timeout")
main: -> 0.0009s
main: == 20230228212427 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithoutDate: migrated (0.0717s)
main: == 20230228212905 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithDate: migrating
main: -- transaction_open?()
main: -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main: -> 0.0012s
main: -- index_exists?(:user_details, :user_id, {:where=>"provisioned_by_group_id IS NOT NULL AND provisioned_by_group_at IS NOT NULL", :name=>"index_user_details_on_user_id_for_enterprise_users_with_date", :algorithm=>:concurrently})
main: -> 0.0035s
main: -- add_index(:user_details, :user_id, {:where=>"provisioned_by_group_id IS NOT NULL AND provisioned_by_group_at IS NOT NULL", :name=>"index_user_details_on_user_id_for_enterprise_users_with_date", :algorithm=>:concurrently})
main: -> 0.0011s
main: == 20230228212905 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithDate: migrated (0.0173s)
ci: == 20230228212427 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithoutDate: migrating
ci: -- transaction_open?()
ci: -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci: -> 0.0012s
ci: -- index_exists?(:user_details, :user_id, {:where=>"provisioned_by_group_id IS NOT NULL AND provisioned_by_group_at IS NULL", :name=>"index_user_details_on_user_id_for_enterprise_users_without_date", :algorithm=>:concurrently})
ci: -> 0.0069s
ci: -- execute("SET statement_timeout TO 0")
ci: -> 0.0005s
ci: -- add_index(:user_details, :user_id, {:where=>"provisioned_by_group_id IS NOT NULL AND provisioned_by_group_at IS NULL", :name=>"index_user_details_on_user_id_for_enterprise_users_without_date", :algorithm=>:concurrently})
ci: -> 0.0034s
ci: -- execute("RESET statement_timeout")
ci: -> 0.0007s
ci: == 20230228212427 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithoutDate: migrated (0.0311s)
ci: == 20230228212905 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithDate: migrating
ci: -- transaction_open?()
ci: -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci: -> 0.0012s
ci: -- index_exists?(:user_details, :user_id, {:where=>"provisioned_by_group_id IS NOT NULL AND provisioned_by_group_at IS NOT NULL", :name=>"index_user_details_on_user_id_for_enterprise_users_with_date", :algorithm=>:concurrently})
ci: -> 0.0036s
ci: -- add_index(:user_details, :user_id, {:where=>"provisioned_by_group_id IS NOT NULL AND provisioned_by_group_at IS NOT NULL", :name=>"index_user_details_on_user_id_for_enterprise_users_with_date", :algorithm=>:concurrently})
ci: -> 0.0012s
ci: == 20230228212905 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithDate: migrated (0.0216s)
Rolback
bogdanvlviv@lenovo:~/gitlab-development-kit/gitlab$ bin/rails db:rollback
rails aborted!
You\'re using a multiple database application. To use `db:rollback` you must run the namespaced task with a VERSION. Available tasks are db:rollback:main and db:rollback:ci.
Tasks: TOP => db:rollback
(See full trace by running task with --trace)
bogdanvlviv@lenovo:~/gitlab-development-kit/gitlab$ bin/rails db:rollback:ci
ci: == 20230228212905 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithDate: reverting
ci: -- transaction_open?()
ci: -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci: -> 0.0291s
ci: -- indexes(:user_details)
ci: -> 0.0052s
ci: -- execute("SET statement_timeout TO 0")
ci: -> 0.0004s
ci: -- remove_index(:user_details, {:algorithm=>:concurrently, :name=>"index_user_details_on_user_id_for_enterprise_users_with_date"})
ci: -> 0.0017s
ci: -- execute("RESET statement_timeout")
ci: -> 0.0006s
ci: == 20230228212905 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithDate: reverted (0.0596s)
bogdanvlviv@lenovo:~/gitlab-development-kit/gitlab$ bin/rails db:rollback:main
main: == 20230228212905 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithDate: reverting
main: -- transaction_open?()
main: -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main: -> 0.0504s
main: -- indexes(:user_details)
main: -> 0.0101s
main: -- execute("SET statement_timeout TO 0")
main: -> 0.0007s
main: -- remove_index(:user_details, {:algorithm=>:concurrently, :name=>"index_user_details_on_user_id_for_enterprise_users_with_date"})
main: -> 0.0112s
main: -- execute("RESET statement_timeout")
main: -> 0.0012s
main: == 20230228212905 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithDate: reverted (0.1012s)
bogdanvlviv@lenovo:~/gitlab-development-kit/gitlab$ bin/rails db:rollback:ci
ci: == 20230228212427 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithoutDate: reverting
ci: -- transaction_open?()
ci: -> 0.0000s
ci: -- view_exists?(:postgres_partitions)
ci: -> 0.0371s
ci: -- indexes(:user_details)
ci: -> 0.0084s
ci: -- execute("SET statement_timeout TO 0")
ci: -> 0.0006s
ci: -- remove_index(:user_details, {:algorithm=>:concurrently, :name=>"index_user_details_on_user_id_for_enterprise_users_without_date"})
ci: -> 0.0024s
ci: -- execute("RESET statement_timeout")
ci: -> 0.0007s
ci: == 20230228212427 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithoutDate: reverted (0.0785s)
bogdanvlviv@lenovo:~/gitlab-development-kit/gitlab$ bin/rails db:rollback:main
main: == 20230228212427 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithoutDate: reverting
main: -- transaction_open?()
main: -> 0.0000s
main: -- view_exists?(:postgres_partitions)
main: -> 0.1065s
main: -- indexes(:user_details)
main: -> 0.0170s
main: -- execute("SET statement_timeout TO 0")
main: -> 0.0016s
main: -- remove_index(:user_details, {:algorithm=>:concurrently, :name=>"index_user_details_on_user_id_for_enterprise_users_without_date"})
main: -> 0.0050s
main: -- execute("RESET statement_timeout")
main: -> 0.0017s
main: == 20230228212427 AddIndexUserDetailsOnUserIdForEnterpriseUsersWithoutDate: reverted (0.1820s)
DB Query Plans
CREATE INDEX index_user_details_on_user_id_for_enterprise_users_with_date ON user_details USING btree (user_id) WHERE ((provisioned_by_group_id IS NOT NULL) AND (provisioned_by_group_at IS NOT NULL));
CREATE INDEX index_user_details_on_user_id_for_enterprise_users_without_date ON user_details USING btree (user_id) WHERE ((provisioned_by_group_id IS NOT NULL) AND (provisioned_by_group_at IS NULL));
UserDetail.enterprise_created_via_saml_or_scim
SELECT COUNT("user_details"."user_id") FROM "user_details" WHERE "user_details"."provisioned_by_group_id" IS NOT NULL AND "user_details"."provisioned_by_group_at" IS NULL
https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/15850/commands/54886
UserDetail.enterprise_based_on_domain_verification
SELECT COUNT("user_details"."user_id") FROM "user_details" WHERE "user_details"."provisioned_by_group_id" IS NOT NULL AND "user_details"."provisioned_by_group_at" IS NOT NULL
https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/15850/commands/54888
MR acceptance checklist
This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.
-
I have evaluated the MR acceptance checklist for this MR.
Edited by Bogdan Denkovych