From 1ccf679ca9eea14ea91413a532c96cba1993cbf1 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 20 Feb 2023 17:42:55 +0100 Subject: [PATCH] Switch to ruby-based retry Retry connection errors with backoff --- lib/mrsk/cli/healthcheck.rb | 27 +++++++++++++++++++++------ lib/mrsk/commands/healthcheck.rb | 4 ++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/mrsk/cli/healthcheck.rb b/lib/mrsk/cli/healthcheck.rb index a9fcf803..24e09ce6 100644 --- a/lib/mrsk/cli/healthcheck.rb +++ b/lib/mrsk/cli/healthcheck.rb @@ -1,4 +1,6 @@ class Mrsk::Cli::Healthcheck < Mrsk::Cli::Base + MAX_ATTEMPTS = 5 + default_command :perform desc "perform", "Health check current app version" @@ -8,18 +10,31 @@ class Mrsk::Cli::Healthcheck < Mrsk::Cli::Base execute *MRSK.healthcheck.run target = "Health check against #{MRSK.config.healthcheck["path"]}" + attempt = 1 - if capture_with_info(*MRSK.healthcheck.curl) == "200" - info "#{target} succeeded with 200 OK!" - else - # Catches 1xx, 2xx, 3xx - raise SSHKit::Command::Failed, "#{target} failed to return 200 OK!" + begin + status = capture_with_info(*MRSK.healthcheck.curl) + + if status == "200" + info "#{target} succeeded with 200 OK!" + else + raise "#{target} failed with status #{status}" + end + rescue SSHKit::Command::Failed + if attempt <= MAX_ATTEMPTS + info "#{target} not ready yet, retrying in #{attempt}s..." + sleep attempt + attempt += 1 + + retry + else + raise + end end rescue SSHKit::Command::Failed => e error capture_with_info(*MRSK.healthcheck.logs) if e.message =~ /curl/ - # Catches 4xx, 5xx raise SSHKit::Command::Failed, "#{target} failed to return 200 OK!" else raise diff --git a/lib/mrsk/commands/healthcheck.rb b/lib/mrsk/commands/healthcheck.rb index feb35543..47626156 100644 --- a/lib/mrsk/commands/healthcheck.rb +++ b/lib/mrsk/commands/healthcheck.rb @@ -16,11 +16,11 @@ class Mrsk::Commands::Healthcheck < Mrsk::Commands::Base end def curl - [ :curl, "--silent", "--output", "/dev/null", "--write-out", "'%{http_code}'", "--retry-max-time", 10, "--retry", 5, health_url ] + [ :curl, "--silent", "--output", "/dev/null", "--write-out", "'%{http_code}'", "--max-time", "2", health_url ] end def logs - pipe container_id, xargs(docker(:logs, "2>&1")) + pipe container_id, xargs(docker(:logs, "--tail", 50, "2>&1")) end def stop