From f793dad78be67a155d7ce942e7947db39caebaaf Mon Sep 17 00:00:00 2001 From: Andrew Newdigate Date: Mon, 5 Nov 2018 15:34:38 +0000 Subject: Updated with Sean's feedback --- app/controllers/chaos_controller.rb | 24 +++++++++++++++++++----- doc/development/chaos_endpoints.md | 7 ++++--- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/app/controllers/chaos_controller.rb b/app/controllers/chaos_controller.rb index 392814b4275..b4f46cddbe9 100644 --- a/app/controllers/chaos_controller.rb +++ b/app/controllers/chaos_controller.rb @@ -4,24 +4,33 @@ class ChaosController < ActionController::Base before_action :validate_request def leakmem - memory_mb = params[:memory_mb] ? params[:memory_mb].to_i : 100 + memory_mb = (params[:memory_mb]&.to_i || 100) + duration_s = (params[:duration_s]&.to_i || 30).seconds + + start = Time.now retainer = [] + # Add `n` 1mb chunks of memory to the retainer array + memory_mb.times { retainer << "x" * 1.megabyte } + + duration_taken = (Time.now - start).seconds + Kernel.sleep duration_s - duration_taken if duration_s > duration_taken - memory_mb.times { retainer << "x" * (1024 * 1024) } render text: "OK", content_type: 'text/plain' end def cpuspin - duration_s = params[:duration_s] ? params[:duration_s].to_i : 30 + duration_s = (params[:duration_s]&.to_i || 30).seconds end_time = Time.now + duration_s.seconds - 10_000.times { } while Time.now < end_time + + rand while Time.now < end_time render text: "OK", content_type: 'text/plain' end def sleep - duration_s = params[:duration_s] ? params[:duration_s].to_i : 30 + duration_s = (params[:duration_s]&.to_i || 30).seconds Kernel.sleep duration_s + render text: "OK", content_type: 'text/plain' end @@ -33,6 +42,11 @@ class ChaosController < ActionController::Base def validate_request secret = ENV['GITLAB_CHAOS_SECRET'] + # GITLAB_CHAOS_SECRET is required unless you're running in Development mode + if !secret && !Rails.env.development? + render text: "chaos misconfigured: please configure GITLAB_CHAOS_SECRET when using GITLAB_ENABLE_CHAOS_ENDPOINTS outside of a development environment", content_type: 'text/plain', status: 500 + end + return unless secret unless request.headers["HTTP_X_CHAOS_SECRET"] == secret diff --git a/doc/development/chaos_endpoints.md b/doc/development/chaos_endpoints.md index 318a3270675..71de9bdce50 100644 --- a/doc/development/chaos_endpoints.md +++ b/doc/development/chaos_endpoints.md @@ -41,12 +41,13 @@ To simulate a memory leak in your application, use the `/-/chaos/leakmem` endpoi For example, if your GitLab instance is listening at `localhost:3000`, you could `curl` the endpoint as follows: ```shell -curl http://localhost:3000/-/chaos/leakmem?memory_mb=1024 --header 'X-Chaos-Secret: secret' +curl http://localhost:3000/-/chaos/leakmem?memory_mb=1024&duration_s=10 --header 'X-Chaos-Secret: secret' ``` -The `memory_mb` parameter tells the application how much memory it should leak. +The `memory_mb` parameter tells the application how much memory it should leak. The `duration_s` parameter will ensure the request retains +the memory for this duration at a minimum (default 30s). -Note: the memory is not retained after the request, so once its completed, the Ruby garbage collector will attempt to recover the memory. +Note: the memory is not retained after the request finishes. Once the request has completed, the Ruby garbage collector will attempt to recover the memory. ### CPU Spin -- cgit v1.2.1