yandrey321 opened a new pull request, #11224:
URL: https://github.com/apache/ozone/pull/11224

   ## What changes were proposed in this pull request?
   
   Adds two unauthenticated HTTP health endpoints to the S3 Gateway, served on 
the
   web admin server (default port `19878`), separate from the S3 data listener
   (`9878`):
   
   - `GET /health/live` → `200 OK` while the gateway process is up and its web
     admin server can serve requests. It does **not** check OM reachability.
   - `GET /health/ready` → `200 READY` only when the gateway can reach OM, and
     `503 NOT READY` during startup or while OM is unreachable.
   
   Readiness is backed by `S3GatewayReadinessProbe`, a single background thread
   that periodically probes OM (`getServiceInfo`) and stores the result in a
   volatile flag. The servlet only reads that flag, so `/health/ready` always
   responds immediately — no OM RPC on the request path — and a load balancer
   polling it can never be blocked by a slow or unreachable OM. The probe runs 
its
   OM call on a separate single-thread executor with an enforced deadline, so a
   hung call flips the gateway to "not ready" rather than wedging the 
scheduler. It
   owns a dedicated `OzoneClient` (created via `OzoneClientCache.createClient`) 
so
   it exercises the same OM transport the gateway serves with, with S3 auth
   disabled and a bounded OM RPC timeout.
   
   The endpoints are registered with `addInternalServlet`, so no authentication
   filter is mapped to them and they remain reachable by a load balancer without
   Kerberos/SPNEGO, including in secure mode. Because they live on the admin 
port,
   they cannot collide with S3 bucket names or require SigV4 signing.
   
   Wiring updated to use the new endpoints:
   - Kubernetes S3G statefulsets: `livenessProbe` now points at `/health/live`
     (was `/`) and a `readinessProbe` on `/health/ready` is added.
   - HAProxy examples (`compose/common` and `compose/ozonesecure-ha`) 
health-check
     the readiness endpoint (`GET /health/ready`, expect `200`) with
     `inter 2s rise 1` so backends are routed to promptly once ready.
   - `compose/testlib.sh` gains `wait_for_s3g_ready()`, invoked from
     `start_docker_env`, so acceptance tests don't start issuing S3 requests 
while
     HAProxy still has all backends `DOWN` (which would return `503`). It only
     waits when the multi-instance HAProxy setup (`s3g1/s3g2/s3g3`) is present.
   
   ### Configuration
   
   New `ozone.s3g.health-check.*` config group (`S3GatewayHealthCheckConfig`):
   
   | Key | Default | Description |
   | --- | --- | --- |
   | `ozone.s3g.health-check.enabled` | `true` | Expose the `/health/live` and 
`/health/ready` endpoints. |
   | `ozone.s3g.health-check.probe.interval` | `10s` | How often the readiness 
endpoint refreshes its cached OM reachability. |
   | `ozone.s3g.health-check.probe.timeout` | `10s` | Upper bound on a single 
background readiness probe. |
   
   ### Why are the changes needed?
   
   When S3 Gateway is horizontally scaled behind a load balancer, the balancer
   needs an HTTP health check to route S3 traffic only to gateways that can
   actually serve it. The existing admin server had no dedicated 
liveness/readiness
   endpoints; the k8s liveness probe hit `/` and there was no readiness signal 
at
   all, so traffic could be sent to a gateway that is up but cannot reach OM.
   
   Generated-by: Claude Code (Claude Opus 4.8)
   
   ## What is the link to the Apache JIRA
   
   https://issues.apache.org/jira/browse/HDDS-16360
   
   ## How was this patch tested?
   
   - New unit tests:
     - `TestS3GatewayLivenessServlet` — liveness returns `200 OK`.
     - `TestS3GatewayHealthCheck` — readiness reflects the probe flag (`200 
READY`
       vs `503 NOT READY`) and endpoints are gated by `health-check.enabled`.
   - New acceptance test: `smoketest/s3/health.robot` exercises both endpoints;
     `compose/ozone/test.sh` runs it.
   - Verified the endpoints are served without authentication in secure mode
     (registered via `addInternalServlet`).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to