Class: Gitlab::Seeder

Inherits:
Object
  • Object
show all
Extended by:
ActionView::Helpers::NumberHelper
Defined in:
lib/gitlab/seeder.rb

Defined Under Namespace

Modules: NamespaceSeed, ProjectSeed, UserSeed

Constant Summary collapse

MASS_INSERT_PREFIX =
'mass_insert'
MASS_INSERT_PROJECT_START =
"#{MASS_INSERT_PREFIX}_project_"
MASS_INSERT_GROUP_START =
"#{MASS_INSERT_PREFIX}_group_"
MASS_INSERT_USER_START =
"#{MASS_INSERT_PREFIX}_user_"
REPORTED_USER_START =
'reported_user_'
ESTIMATED_INSERT_PER_MINUTE =
250_000
MASS_INSERT_ENV =
'MASS_INSERT'

Class Method Summary collapse

Class Method Details

.estimated_time_message(size) ⇒ Object


69
70
71
72
73
74
75
76
77
78
# File 'lib/gitlab/seeder.rb', line 69

def self.estimated_time_message(size)
  estimated_minutes = (size.to_f / ESTIMATED_INSERT_PER_MINUTE).round
  humanized_minutes = 'minute'.pluralize(estimated_minutes)

  if estimated_minutes == 0
    "Rough estimated time: less than a minute ⏰"
  else
    "Rough estimated time: #{estimated_minutes} #{humanized_minutes}"
  end
end

.log_message(message) ⇒ Object


45
46
47
# File 'lib/gitlab/seeder.rb', line 45

def self.log_message(message)
  puts "#{Time.current}: #{message}"
end

.quietObject


80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/gitlab/seeder.rb', line 80

def self.quiet
  # Additional seed logic for models.
  Namespace.include(NamespaceSeed)
  Project.include(ProjectSeed)
  User.include(UserSeed)

  old_perform_deliveries = ActionMailer::Base.perform_deliveries
  ActionMailer::Base.perform_deliveries = false

  SeedFu.quiet = true

  without_database_logging do
    without_statement_timeout do
      without_new_note_notifications do
        yield
      end
    end
  end

  puts "\nOK".color(:green)
ensure
  SeedFu.quiet = false
  ActionMailer::Base.perform_deliveries = old_perform_deliveries
end

.with_mass_insert(size, model) ⇒ Object


49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/gitlab/seeder.rb', line 49

def self.with_mass_insert(size, model)
  humanized_model_name = model.is_a?(String) ? model : model.model_name.human.pluralize(size)

  if !ENV[MASS_INSERT_ENV] && !ENV['CI']
    puts "\nSkipping mass insertion for #{humanized_model_name}."
    puts "Consider running the seed with #{MASS_INSERT_ENV}=1"
    return
  end

  humanized_size = number_with_delimiter(size)
  estimative = estimated_time_message(size)

  puts "\nCreating #{humanized_size} #{humanized_model_name}."
  puts estimative

  yield

  puts "\n#{number_with_delimiter(size)} #{humanized_model_name} created!"
end

.without_database_loggingObject


139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/gitlab/seeder.rb', line 139

def self.without_database_logging
  old_loggers = Gitlab::Database.database_base_models.transform_values do |model|
    model.logger
  end

  Gitlab::Database.database_base_models.each do |_, model|
    model.logger = nil
  end

  yield
ensure
  Gitlab::Database.database_base_models.each do |connection_name, model|
    model.logger = old_loggers[connection_name]
  end
end

.without_gitaly_timeoutObject


105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/gitlab/seeder.rb', line 105

def self.without_gitaly_timeout
  # Remove Gitaly timeout
  old_timeout = Gitlab::CurrentSettings.current_application_settings.gitaly_timeout_default
  Gitlab::CurrentSettings.current_application_settings.update_columns(gitaly_timeout_default: 0)
  # Otherwise we still see the default value when running seed_fu
  ApplicationSetting.expire

  yield
ensure
  Gitlab::CurrentSettings.current_application_settings.update_columns(gitaly_timeout_default: old_timeout)
  ApplicationSetting.expire
end

.without_new_note_notificationsObject


118
119
120
121
122
123
124
125
126
# File 'lib/gitlab/seeder.rb', line 118

def self.without_new_note_notifications
  NotificationService.alias_method :original_new_note, :new_note
  NotificationService.define_method(:new_note) { |note| }

  yield
ensure
  NotificationService.alias_method :new_note, :original_new_note
  NotificationService.remove_method :original_new_note
end

.without_statement_timeoutObject


128
129
130
131
132
133
134
135
136
137
# File 'lib/gitlab/seeder.rb', line 128

def self.without_statement_timeout
  Gitlab::Database::EachDatabase.each_database_connection do |connection|
    connection.execute('SET statement_timeout=0')
  end
  yield
ensure
  Gitlab::Database::EachDatabase.each_database_connection do |connection|
    connection.execute('RESET statement_timeout')
  end
end