Class: Gitlab::Chaos

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/chaos.rb

Overview

Chaos methods for GitLab. See docs.gitlab.com/ee/development/chaos_endpoints.html for more details.

Class Method Summary collapse

Class Method Details

.cpu_spin(duration_s) ⇒ Object

cpu_spin will consume all CPU on a single core for the specified duration


21
22
23
24
25
26
27
# File 'lib/gitlab/chaos.rb', line 21

def self.cpu_spin(duration_s)
  return unless Gitlab::Metrics::System.thread_cpu_time

  expected_end_time = Gitlab::Metrics::System.thread_cpu_time + duration_s

  rand while Gitlab::Metrics::System.thread_cpu_time < expected_end_time
end

.db_spin(duration_s, interval_s) ⇒ Object

db_spin will query the database in a tight loop for the specified duration


30
31
32
33
34
35
36
37
38
39
# File 'lib/gitlab/chaos.rb', line 30

def self.db_spin(duration_s, interval_s)
  expected_end_time = Time.now + duration_s

  while Time.now < expected_end_time
    ActiveRecord::Base.connection.execute("SELECT 1")

    end_interval_time = Time.now + [duration_s, interval_s].min
    rand while Time.now < end_interval_time
  end
end

.killObject

Kill will send a SIGKILL signal to the current process


47
48
49
# File 'lib/gitlab/chaos.rb', line 47

def self.kill
  Process.kill("KILL", Process.pid)
end

.leak_mem(memory_mb, duration_s) ⇒ Object

leak_mem will retain the specified amount of memory and sleep. On return, the memory will be released.


9
10
11
12
13
14
15
16
17
18
# File 'lib/gitlab/chaos.rb', line 9

def self.leak_mem(memory_mb, duration_s)
  start_time = Time.now

  retainer = []
  # Add `n` 1mb chunks of memory to the retainer array
  memory_mb.times { retainer << "x" * 1.megabyte }

  duration_left = [start_time + duration_s - Time.now, 0].max
  Kernel.sleep(duration_left)
end

.sleep(duration_s) ⇒ Object

sleep will sleep for the specified duration


42
43
44
# File 'lib/gitlab/chaos.rb', line 42

def self.sleep(duration_s)
  Kernel.sleep(duration_s)
end