From 719ca8d5cb00ee86df101dcade4f93f5278b9f3c Mon Sep 17 00:00:00 2001 From: itsnothuy Date: Tue, 24 Feb 2026 11:51:59 +0700 Subject: [PATCH 1/2] Check runtime backend readiness in IsReady() for strict mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under strict_readiness_=true, IsReady() only checked lifecycle state (ModelStates()) but not runtime backend readiness. This meant that /v2/health/ready returned 200 even when a model's backend had crashed (e.g., Python backend stub process died), because the lifecycle still showed READY. Add a runtime readiness check via ModelIsReady() for models in READY lifecycle state. ModelIsReady() calls model->IsReady() which invokes TRITONBACKEND_ModelInstanceReady — in the Python backend this calls StubActive() -> waitpid(WNOHANG), a non-blocking microsecond-level check. This ensures /v2/health/ready correctly reflects backend health, enabling orchestrators (K8s, etc.) to detect and restart unhealthy pods. Fixes: triton-inference-server/server#8604 --- src/server.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/server.cc b/src/server.cc index b1cc4eafe..d8f634b62 100644 --- a/src/server.cc +++ b/src/server.cc @@ -445,6 +445,26 @@ InferenceServer::IsReady(bool* ready) *ready = false; goto strict_done; } + + // For models in READY lifecycle state, also check runtime + // backend instance readiness. This catches cases where the + // model was loaded successfully (lifecycle = READY) but the + // backend has become unhealthy at runtime (e.g., Python backend + // stub process died). + if (vs.second.first == ModelReadyState::READY) { + bool model_ready = false; + Status status = + ModelIsReady(mv.first.name_, vs.first, &model_ready); + if (!status.IsOk() || !model_ready) { + LOG_VERBOSE(1) << "Model '" << mv.first.name_ << "' version " + << vs.first + << " is in READY lifecycle state but failed " + "runtime readiness check during server " + "readiness evaluation"; + *ready = false; + goto strict_done; + } + } } } strict_done:; From 1fd66859e48e4c30de991d0d6853e01b4b1f01fd Mon Sep 17 00:00:00 2001 From: Huy Tran <158990013+itsnothuy@users.noreply.github.com> Date: Wed, 25 Feb 2026 09:44:53 +0700 Subject: [PATCH 2/2] Update src/server.cc Co-authored-by: J Wyman --- src/server.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server.cc b/src/server.cc index d8f634b62..b9ed47212 100644 --- a/src/server.cc +++ b/src/server.cc @@ -453,8 +453,7 @@ InferenceServer::IsReady(bool* ready) // stub process died). if (vs.second.first == ModelReadyState::READY) { bool model_ready = false; - Status status = - ModelIsReady(mv.first.name_, vs.first, &model_ready); + Status status = ModelIsReady(mv.first.name_, vs.first, &model_ready); if (!status.IsOk() || !model_ready) { LOG_VERBOSE(1) << "Model '" << mv.first.name_ << "' version " << vs.first