From 94fd867a362c29ef027994d35ad4d42f0070812e Mon Sep 17 00:00:00 2001 From: Riddhesh Sanghvi Date: Wed, 7 Jan 2026 14:15:11 +0530 Subject: [PATCH 1/4] feat(runner): add retry logic for Docker availability check Added to handle transient failures for when system is under load or docker has stalled. --- php/EE/Runner.php | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/php/EE/Runner.php b/php/EE/Runner.php index 1f22ac9cf..654673767 100644 --- a/php/EE/Runner.php +++ b/php/EE/Runner.php @@ -92,11 +92,25 @@ public function check_requirements( $show_error = true ) { $status = true; $error = []; - $docker_running_cmd = 'docker ps > /dev/null'; - if ( ! EE::exec( $docker_running_cmd ) ) { - $status = false; - $docker_running = false; - $error[] = 'Docker not installed or not running.'; + // Retry logic for Docker availability check to handle transient failures under system load. + $docker_running_cmd = 'docker ps > /dev/null 2>&1'; + $max_retries = 3; + + for ( $attempt = 1; $attempt <= $max_retries; $attempt++ ) { + if ( EE::exec( $docker_running_cmd ) ) { + break; // Docker is available, exit retry loop. + } + + if ( $attempt < $max_retries ) { + $retry_delay = pow( 2, $attempt - 1 ); // Exponential backoff: 1s, 2s, 4s + EE::debug( "Docker check failed (attempt {$attempt}/{$max_retries}), retrying in {$retry_delay}s...", 'bootstrap' ); + sleep( $retry_delay ); + } else { + // All retries exhausted. + $status = false; + $docker_running = false; + $error[] = 'Docker not installed or not running (checked ' . $max_retries . ' times).'; + } } $docker_compose_installed = 'command -v docker-compose > /dev/null'; From 6909a917dda49e64ff3ac1775f4cf6906c06c135 Mon Sep 17 00:00:00 2001 From: Riddhesh Sanghvi Date: Wed, 7 Jan 2026 14:30:05 +0530 Subject: [PATCH 2/4] feat(runner): move debug logging before requirement checks --- php/EE/Runner.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/php/EE/Runner.php b/php/EE/Runner.php index 654673767..37aadf262 100644 --- a/php/EE/Runner.php +++ b/php/EE/Runner.php @@ -763,6 +763,10 @@ private function set_alias( $alias ) { public function start() { + EE::debug( $this->_global_config_path_debug, 'bootstrap' ); + EE::debug( $this->_project_config_path_debug, 'bootstrap' ); + EE::debug( 'argv: ' . implode( ' ', $GLOBALS['argv'] ), 'bootstrap' ); + $this->init_ee(); // Enable PHP error reporting to stderr if testing. @@ -770,10 +774,6 @@ public function start() { $this->enable_error_reporting(); } - EE::debug( $this->_global_config_path_debug, 'bootstrap' ); - EE::debug( $this->_project_config_path_debug, 'bootstrap' ); - EE::debug( 'argv: ' . implode( ' ', $GLOBALS['argv'] ), 'bootstrap' ); - if ( $this->alias ) { if ( '@all' === $this->alias && ! isset( $this->aliases['@all'] ) ) { EE::error( "Cannot use '@all' when no aliases are registered." ); From 1d72881102ee5f905f9fbc4c170ba176fa355b34 Mon Sep 17 00:00:00 2001 From: Riddhesh Sanghvi Date: Wed, 7 Jan 2026 15:27:22 +0530 Subject: [PATCH 3/4] Update php/EE/Runner.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- php/EE/Runner.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php/EE/Runner.php b/php/EE/Runner.php index 37aadf262..5ecb5e1a3 100644 --- a/php/EE/Runner.php +++ b/php/EE/Runner.php @@ -109,7 +109,7 @@ public function check_requirements( $show_error = true ) { // All retries exhausted. $status = false; $docker_running = false; - $error[] = 'Docker not installed or not running (checked ' . $max_retries . ' times).'; + $error[] = "Docker not installed or not running (checked {$max_retries} times)."; } } From 5b618a19354bba733921d131b17bbc7a525e4d3e Mon Sep 17 00:00:00 2001 From: Riddhesh Sanghvi Date: Wed, 7 Jan 2026 15:29:42 +0530 Subject: [PATCH 4/4] feat(runner): increase max retries for Docker check --- php/EE/Runner.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php/EE/Runner.php b/php/EE/Runner.php index 37aadf262..32ae9d10b 100644 --- a/php/EE/Runner.php +++ b/php/EE/Runner.php @@ -94,7 +94,7 @@ public function check_requirements( $show_error = true ) { // Retry logic for Docker availability check to handle transient failures under system load. $docker_running_cmd = 'docker ps > /dev/null 2>&1'; - $max_retries = 3; + $max_retries = 4; for ( $attempt = 1; $attempt <= $max_retries; $attempt++ ) { if ( EE::exec( $docker_running_cmd ) ) {