Welcome to mirror list, hosted at ThFree Co, Russian Federation.

bump_sequences_spec.rb « database « gitlab « lib « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: db4201233501171d79ac2935adbf293cf822f964 (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
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Gitlab::Database::BumpSequences, feature_category: :cell, query_analyzers: false do
  let!(:gitlab_schema) { :gitlab_main_cell }
  let!(:increment_by) { 1000 }

  let!(:main_cell_sequence_name) { 'namespaces_id_seq' }
  let!(:main_sequence_name) { 'vulnerabilities_id_seq' }
  let!(:main_clusterwide_sequence_name) { 'users_id_seq' }
  let!(:ci_sequence_name) { 'ci_build_needs_id_seq' }

  # This is just to make sure that all of the sequences start with `is_called=True`
  # which means that the next call to nextval() is going to increment the sequence.
  # To give predictable test results.
  before do
    ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_cell_sequence_name])
    ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_sequence_name])
    ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_clusterwide_sequence_name])
    ApplicationRecord.connection.select_value("select nextval($1)", nil, [ci_sequence_name])
  end

  describe '#execute' do
    subject { described_class.new(gitlab_schema, increment_by).execute }

    context 'when bumping the sequences' do
      it 'changes sequences by the passed argument `increase_by` value on the main database' do
        expect do
          subject
        end.to change {
          last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name)
        }.by(1001) # the +1 is because the sequence has is_called = true
      end

      it 'will still increase the value of sequences that have is_called = False' do
        # see `is_called`: https://www.postgresql.org/docs/12/functions-sequence.html
        # choosing a new arbitrary value for the sequence
        new_value = last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name) + 1000
        ApplicationRecord.connection.select_value(
          "select setval($1, $2, false)", nil, [main_cell_sequence_name, new_value]
        )
        expect do
          subject
        end.to change {
          last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name)
        }.by(1000)
      end

      it 'resets the INCREMENT value of the sequences back to 1 for the following calls to nextval()' do
        subject
        value_1 = ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_cell_sequence_name])
        value_2 = ApplicationRecord.connection.select_value("select nextval($1)", nil, [main_cell_sequence_name])
        expect(value_2 - value_1).to eq(1)
      end

      it 'increments the sequence of the tables in the given schema, but not in other schemas' do
        expect do
          subject
        end.to change {
          last_value_of_sequence(ApplicationRecord.connection, main_cell_sequence_name)
        }.by(1001)
        .and change {
          last_value_of_sequence(ApplicationRecord.connection, main_sequence_name)
        }.by(0)
        .and change {
          last_value_of_sequence(ApplicationRecord.connection, main_clusterwide_sequence_name)
        }.by(0)
        .and change {
          last_value_of_sequence(ApplicationRecord.connection, ci_sequence_name)
        }.by(0)
      end
    end
  end

  private

  def last_value_of_sequence(connection, sequence_name)
    allow_cross_joins_across_databases(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/408220') do
      connection.select_value("select last_value from #{sequence_name}")
    end
  end
end