diff options
author | Andrew Newdigate <andrew@gitlab.com> | 2019-07-16 23:10:44 +0300 |
---|---|---|
committer | Andrew Newdigate <andrew@gitlab.com> | 2019-07-18 20:04:12 +0300 |
commit | dc14c91d065d869b77b0ec0db47b8b36c96f15be (patch) | |
tree | ada79dc72cdb0badc101a6034c3100c8beb0dae9 /lib/gitlab/chaos.rb | |
parent | f97a73fa39b48b6c3c770d609fcd9584d17221da (diff) |
Adds chaos endpoints to Sidekiq
This allows the chaos endpoints to be invoked in Sidekiq so that this
environment can be tested for resilience.
Diffstat (limited to 'lib/gitlab/chaos.rb')
-rw-r--r-- | lib/gitlab/chaos.rb | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/gitlab/chaos.rb b/lib/gitlab/chaos.rb new file mode 100644 index 00000000000..4f47cdef971 --- /dev/null +++ b/lib/gitlab/chaos.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Gitlab + # Chaos methods for GitLab. + # See https://docs.gitlab.com/ee/development/chaos_endpoints.html for more details. + class Chaos + # leak_mem will retain the specified amount of memory and sleep. + # On return, the memory will be released. + 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 + + # cpu_spin will consume all CPU on a single core for the specified duration + def self.cpu_spin(duration_s) + expected_end_time = Time.now + duration_s + + rand while Time.now < expected_end_time + end + + # db_spin will query the database in a tight loop for the specified duration + 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 + + # sleep will sleep for the specified duration + def self.sleep(duration_s) + Kernel.sleep(duration_s) + end + + # Kill will send a SIGKILL signal to the current process + def self.kill + Process.kill("KILL", Process.pid) + end + end +end |