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
This commit is contained in:
Chris Lu
2026-02-08 19:08:10 -08:00
committed by GitHub
parent 403592bb9f
commit be6b5db65a
2 changed files with 3 additions and 3 deletions

View File

@@ -434,8 +434,8 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) {
s3a.registerS3TablesRoutes(apiRouter) s3a.registerS3TablesRoutes(apiRouter)
// Readiness Probe // Readiness Probe
apiRouter.Methods(http.MethodGet).Path("/status").HandlerFunc(s3a.StatusHandler) apiRouter.Methods(http.MethodGet, http.MethodHead).Path("/status").HandlerFunc(s3a.StatusHandler)
apiRouter.Methods(http.MethodGet).Path("/healthz").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 // Object path pattern with (?s) flag to match newlines in object keys
const objectPath = "/{object:(?s).+}" const objectPath = "/{object:(?s).+}"

View File

@@ -265,7 +265,7 @@ func ScanVolumeFileFrom(version needle.Version, datBackend backend.BackendStorag
if err == io.EOF { if err == io.EOF {
return nil 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) glog.V(4).Infof("new entry needle size:%d rest:%d", n.Size, rest)
} }