Skip to content

Exclude Project Bots from Deactivation in DeactivateDormantUsersWorker

Jason Goodman requested to merge exclude-project-bot-from-deactivation into master

What does this MR do and why?

According to #340346 (closed), project_bot users should not be deactivated automatically by the DeactivateDormantUsersWorker.

This MR excludes project_bot users from deactivation.

Issue: #340346 (closed)

Database Migrations

Up

$ bin/rails db:migrate
== 20211027203921 RemoveIndexForDormantUsers: migrating =======================
-- transaction_open?()
   -> 0.0000s
-- indexes(:users)
   -> 0.0112s
-- execute("SET statement_timeout TO 0")
   -> 0.0005s
-- remove_index(:users, {:algorithm=>:concurrently, :name=>"index_users_on_id_and_last_activity_on_for_non_internal_active"})
   -> 0.0087s
-- execute("RESET statement_timeout")
   -> 0.0006s
== 20211027203921 RemoveIndexForDormantUsers: migrated (0.0286s) ==============

== 20211027203950 AddUpdatedIndexForDormantUsers: migrating ===================
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:users, [:id, :last_activity_on], {:where=>"state = 'active' AND (users.user_type IS NULL OR users.user_type = 4)", :name=>"index_users_on_id_and_last_activity_on_for_active_human_service", :algorithm=>:concurrently})
   -> 0.0085s
-- add_index(:users, [:id, :last_activity_on], {:where=>"state = 'active' AND (users.user_type IS NULL OR users.user_type = 4)", :name=>"index_users_on_id_and_last_activity_on_for_active_human_service", :algorithm=>:concurrently})
   -> 0.0084s
== 20211027203950 AddUpdatedIndexForDormantUsers: migrated (0.0186s) ==========

$ 

Index after migration:

"index_users_on_id_and_last_activity_on_for_active_human_service" btree (id, last_activity_on) WHERE state::text = 'active'::text AND (user_type IS NULL OR user_type = 4)

Down

$ STEP=2 bin/rails db:rollback   
== 20211027203950 AddUpdatedIndexForDormantUsers: reverting ===================
-- transaction_open?()
   -> 0.0000s
-- indexes(:users)
   -> 0.0107s
-- execute("SET statement_timeout TO 0")
   -> 0.0005s
-- remove_index(:users, {:algorithm=>:concurrently, :name=>"index_users_on_id_and_last_activity_on_for_active_human_service"})
   -> 0.0036s
-- execute("RESET statement_timeout")
   -> 0.0006s
== 20211027203950 AddUpdatedIndexForDormantUsers: reverted (0.0173s) ==========

== 20211027203921 RemoveIndexForDormantUsers: reverting =======================
-- transaction_open?()
   -> 0.0000s
-- index_exists?(:users, [:id, :last_activity_on], {:where=>"state = 'active' AND (users.user_type IS NULL OR users.user_type IN (NULL, 6, 4))", :name=>"index_users_on_id_and_last_activity_on_for_non_internal_active", :algorithm=>:concurrently})
   -> 0.0074s
-- add_index(:users, [:id, :last_activity_on], {:where=>"state = 'active' AND (users.user_type IS NULL OR users.user_type IN (NULL, 6, 4))", :name=>"index_users_on_id_and_last_activity_on_for_non_internal_active", :algorithm=>:concurrently})
   -> 0.0034s
== 20211027203921 RemoveIndexForDormantUsers: reverted (0.0122s) ==============

$ 

Index after rollback:

"index_users_on_id_and_last_activity_on_for_non_internal_active" btree (id, last_activity_on) WHERE state::text = 'active'::text AND (user_type IS NULL OR (user_type = ANY (ARRAY[NULL::integer, 6, 4])))

Index creation

Index creation took about 37 seconds in database lab: https://gitlab.slack.com/archives/CLJMDRD8C/p1635370971298600

Database Performance

SQL before change:

UPDATE "users"
SET "state" = 'deactivated'
WHERE "users"."id" IN (
  (SELECT "users"."id" FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4)) AND (last_activity_on <= '2021-07-27') LIMIT 200)
  UNION
  (SELECT "users"."id" FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" IN (6, 4)) AND "users"."last_activity_on" IS NULL LIMIT 200)
  LIMIT 200
)

Query plan: https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/7036/commands/24892

In database lab: https://gitlab.slack.com/archives/CLJMDRD8C/p1635196319180100

Summary:

Time: 2.853 s
  - planning: 7.126 ms
  - execution: 2.845 s
    - I/O read: 2.705 s
    - I/O write: 0.000 ms

Shared buffers:
  - hits: 14628 (~114.30 MiB) from the buffer pool
  - reads: 4278 (~33.40 MiB) from the OS file cache, including disk I/O
  - dirtied: 2747 (~21.50 MiB)
  - writes: 21 (~168.00 KiB)

SQL after change:

UPDATE "users"
SET "state" = 'deactivated'
WHERE "users"."id" IN (
  (SELECT "users"."id" FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" = 4) AND (last_activity_on <= '2021-07-29') LIMIT 200)
  UNION
  (SELECT "users"."id" FROM "users" WHERE ("users"."state" IN ('active')) AND ("users"."user_type" IS NULL OR "users"."user_type" = 4) AND "users"."last_activity_on" IS NULL LIMIT 200)
  LIMIT 200
)

Query plan: https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/7081/commands/25047

Database lab link: https://gitlab.slack.com/archives/CLJMDRD8C/p1635371033299400

Summary:

Time: 1.157 s
  - planning: 7.567 ms
  - execution: 1.149 s
    - I/O read: 1.063 s
    - I/O write: 0.000 ms

Shared buffers:
  - hits: 14317 (~111.90 MiB) from the buffer pool
  - reads: 4324 (~33.80 MiB) from the OS file cache, including disk I/O
  - dirtied: 2834 (~22.10 MiB)
  - writes: 23 (~184.00 KiB)

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Jason Goodman

Merge request reports

Loading