summaryrefslogtreecommitdiff
path: root/db/post_migrate/20210311045139_set_traversal_ids_for_gitlab_org_group_com.rb
blob: 8cef1f1cc2b364d27562766e519eaf4099b1419c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# frozen_string_literal: true

class SetTraversalIdsForGitlabOrgGroupCom < ActiveRecord::Migration[6.0]
  include Gitlab::Database::MigrationHelpers

  DOWNTIME = false

  def up
    return unless Gitlab.com?

    # namespace ID 9970 is gitlab-org on .com
    with_lock_retries do
      execute(<<~SQL)
        UPDATE
          namespaces
        SET
          traversal_ids = cte.traversal_ids
        FROM
          (
            WITH RECURSIVE cte(id, traversal_ids, cycle) AS (
              VALUES
                (9970, ARRAY[9970], false)
              UNION ALL
              SELECT
                n.id,
                cte.traversal_ids || n.id,
                n.id = ANY(cte.traversal_ids)
              FROM
                namespaces n,
                cte
              WHERE
                n.parent_id = cte.id
                AND NOT cycle
            )
            SELECT
              id,
              traversal_ids
            FROM
              cte FOR
            UPDATE
              ) as cte
        WHERE
          namespaces.id = cte.id
          AND namespaces.traversal_ids <> cte.traversal_ids
      SQL
    end
  end

  def down
    return unless Gitlab.com?

    # namespace ID 9970 is gitlab-org on .com
    with_lock_retries do
      execute(<<~SQL)
        UPDATE
          namespaces
        SET
          traversal_ids = '{}'
        FROM
          (
            WITH RECURSIVE cte(id, traversal_ids, cycle) AS (
              VALUES
                (9970, ARRAY[9970], false)
              UNION ALL
              SELECT
                n.id,
                cte.traversal_ids || n.id,
                n.id = ANY(cte.traversal_ids)
              FROM
                namespaces n,
                cte
              WHERE
                n.parent_id = cte.id
                AND NOT cycle
            )
            SELECT
              id,
              traversal_ids
            FROM
              cte FOR
            UPDATE
              ) as cte
        WHERE
          namespaces.id = cte.id
      SQL
    end
  end
end