Skip to content

User mapping - Reassignment process

Sam Word requested to merge 443556-user-mapping-reassignment-process into master

What does this MR do and why?

This MR fetches records stored in the newly added import_source_user_placeholder_references table (!156241 (merged)) and updates the actual model's records with a source user's reassigned user.

Query plans

Query plans were generated locally because there are no rows in import_source_user_placeholder_references on production.

model_relation.update_all({ user_reference_column => import_source_user.reassign_to_user_id })

I can't generate a query plan for all tables in this dynamic query, but the query itself is built off of stored primary keys. Since we're finding only by pkey and updating in batches, this should be efficient. Here's an example of updating MergeRequest author_ids:

Raw SQL:

UPDATE "merge_requests" SET "author_id" = 1186 WHERE "merge_requests"."id" IN (SELECT "import_source_user_placeholder_references"."numeric_key" FROM "import_source_user_placeholder_references" WHERE "import_source_user_placeholder_references"."source_user_id" = 29 AND "import_source_user_placeholder_references"."model" = 'MergeRequest' AND "import_source_user_placeholder_references"."user_reference_column" = 'author_id' AND "import_source_user_placeholder_references"."id" >= 8667 AND "import_source_user_placeholder_references"."id" < 9175)

Explanation:

Update on merge_requests  (cost=0.38..4.43 rows=0 width=0)
  ->  Nested Loop Semi Join  (cost=0.38..4.43 rows=1 width=16)
        Join Filter: (merge_requests.id = import_source_user_placeholder_references.numeric_key)
        ->  Index Scan using merge_requests_pkey on merge_requests  (cost=0.25..2.26 rows=1 width=10)
        ->  Index Scan using index_import_source_user_placeholder_references_on_source_user_ on import_source_user_placeholder_references  (cost=0.12..2.15 rows=1 width=14)
              Index Cond: (source_user_id = 29)
              Filter: ((id >= 8667) AND (id < 9175) AND (model = 'MergeRequest'::text) AND (user_reference_column = 'author_id'::text))

placeholder_references.delete_all

Raw SQL:

DELETE FROM "import_source_user_placeholder_references" WHERE "import_source_user_placeholder_references"."source_user_id" = 13 AND "import_source_user_placeholder_references"."model" = 'Approval' AND "import_source_user_placeholder_references"."user_reference_column" = 'user_id' AND "import_source_user_placeholder_references"."id" >= 6071 AND "import_source_user_placeholder_references"."id" < 7577

Explanation:

Delete on import_source_user_placeholder_references  (cost=0.25..2.28 rows=0 width=0)
  ->  Index Scan using index_import_source_user_placeholder_references_on_source_user_ on import_source_user_placeholder_references  (cost=0.25..2.28 rows=1 width=6)
        Index Cond: (source_user_id = 13)
        Filter: ((id >= 6071) AND (id < 7577) AND (model = 'Approval'::text) AND (user_reference_column = 'user_id'::text))

How to set up and validate locally

  1. Fetch the branch in Integrate improved user mapping with Direct Tra... (!160650 - closed) if it hasn't been merged yet and follow its instructions to import a group to your local instance.
  2. Switch back to this branch
  3. Assign a real user to a placeholder user.
source_user = Import::SourceUser.last # Keep track of the name to verify it's been reassigned, or specify your own source user
assignee_user = User.find(source_user.source_user_identifier) # This only works for groups migrated to the same instance, otherwise pick a user
current_user = User.first # Your group owner
::Import::SourceUsers::ReassignService.new(source_user, assignee_user, current_user: current_user).execute
  1. Reassign contributions for a placeholder user.
::Import::SourceUsers::AcceptReassignmentService.new(source_user, current_user: assignee_user).execute
  1. Verify the contributions for your placeholder user have been reassigned.

Related to #443556 (closed)

Edited by Sam Word

Merge request reports

Loading