From be6b5db65aa74775510753364c74975ffe6ae8d5 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 8 Feb 2026 19:08:10 -0800 Subject: [PATCH] s3: fix health check endpoints returning 404 for HEAD requests #8243 (#8248) * Fix disk errors handling in vacuum compaction When a disk reports IO errors during vacuum compaction (e.g., 'read /mnt/d1/weed/oc_xyz.dat: input/output error'), the vacuum task should signal the error to the master so it can: 1. Drop the faulty volume replica 2. Rebuild the replica from healthy copies Changes: - Add checkReadWriteError() calls in vacuum read paths (ReadNeedleBlob, ReadData, ScanVolumeFile) to flag EIO errors in volume.lastIoError - Preserve error wrapping using %w format instead of %v so EIO propagates correctly - The existing heartbeat logic will detect lastIoError and remove the bad volume Fixes issue #8237 * error * s3: fix health check endpoints returning 404 for HEAD requests #8243 --- weed/s3api/s3api_server.go | 4 ++-- weed/storage/volume_read.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/weed/s3api/s3api_server.go b/weed/s3api/s3api_server.go index 31ec60a09..faa0fb8d5 100644 --- a/weed/s3api/s3api_server.go +++ b/weed/s3api/s3api_server.go @@ -434,8 +434,8 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) { s3a.registerS3TablesRoutes(apiRouter) // Readiness Probe - apiRouter.Methods(http.MethodGet).Path("/status").HandlerFunc(s3a.StatusHandler) - apiRouter.Methods(http.MethodGet).Path("/healthz").HandlerFunc(s3a.StatusHandler) + apiRouter.Methods(http.MethodGet, http.MethodHead).Path("/status").HandlerFunc(s3a.StatusHandler) + apiRouter.Methods(http.MethodGet, http.MethodHead).Path("/healthz").HandlerFunc(s3a.StatusHandler) // Object path pattern with (?s) flag to match newlines in object keys const objectPath = "/{object:(?s).+}" diff --git a/weed/storage/volume_read.go b/weed/storage/volume_read.go index 376dafb44..9e27fb4b2 100644 --- a/weed/storage/volume_read.go +++ b/weed/storage/volume_read.go @@ -265,7 +265,7 @@ func ScanVolumeFileFrom(version needle.Version, datBackend backend.BackendStorag if err == io.EOF { return nil } - return fmt.Errorf("cannot read needle header at offset %d: %v", offset, err) + return fmt.Errorf("cannot read needle header at offset %d: %w", offset, err) } glog.V(4).Infof("new entry needle size:%d rest:%d", n.Size, rest) }