From c300d42d1b07d74a054be8bb561b3152c537376c Mon Sep 17 00:00:00 2001 From: Tom Clegg Date: Thu, 18 Jan 2024 14:04:26 -0500 Subject: [PATCH] 21023: Avoid overloading 503 status. When all volumes are full, return 507 (cf WebDAV) indicating the client should not auto-retry without additional user interaction. Arvados-DCO-1.1-Signed-off-by: Tom Clegg --- services/keepstore/handler_test.go | 4 ++-- services/keepstore/handlers.go | 2 +- services/keepstore/keepstore.go | 33 +++++++++++++++--------------- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/services/keepstore/handler_test.go b/services/keepstore/handler_test.go index 5bdafb77c2..4352d9a54a 100644 --- a/services/keepstore/handler_test.go +++ b/services/keepstore/handler_test.go @@ -198,7 +198,7 @@ func (s *HandlerSuite) TestGetHandler(c *check.C) { // should make the service return a 503 so that clients can retry. ExpectStatusCode(c, "Volume backend busy", - 503, response) + http.StatusServiceUnavailable, response) } // Test PutBlockHandler on the following situations: @@ -1270,7 +1270,7 @@ func (s *HandlerSuite) TestPutStorageClasses(c *check.C) { c.Logf("failure case %#v", trial) rt.storageClasses = trial.ask resp := IssueRequest(s.handler, &rt) - c.Check(resp.Code, check.Equals, http.StatusServiceUnavailable) + c.Check(resp.Code, check.Equals, http.StatusInsufficientStorage) } } diff --git a/services/keepstore/handlers.go b/services/keepstore/handlers.go index abeb20fe86..089ebb46da 100644 --- a/services/keepstore/handlers.go +++ b/services/keepstore/handlers.go @@ -853,7 +853,7 @@ func newPutProgress(classes []string) putProgress { // // The MD5 hash of the BLOCK does not match the argument HASH. // -// 503 Full +// 507 Full // // There was not enough space left in any Keep volume to store // the object. diff --git a/services/keepstore/keepstore.go b/services/keepstore/keepstore.go index 953aa047cb..46b00339b5 100644 --- a/services/keepstore/keepstore.go +++ b/services/keepstore/keepstore.go @@ -5,6 +5,7 @@ package keepstore import ( + "net/http" "time" ) @@ -23,22 +24,22 @@ type KeepError struct { } var ( - BadRequestError = &KeepError{400, "Bad Request"} - UnauthorizedError = &KeepError{401, "Unauthorized"} - CollisionError = &KeepError{500, "Collision"} - RequestHashError = &KeepError{422, "Hash mismatch in request"} - PermissionError = &KeepError{403, "Forbidden"} - DiskHashError = &KeepError{500, "Hash mismatch in stored data"} - ExpiredError = &KeepError{401, "Expired permission signature"} - NotFoundError = &KeepError{404, "Not Found"} - VolumeBusyError = &KeepError{503, "Volume backend busy"} - GenericError = &KeepError{500, "Fail"} - FullError = &KeepError{503, "Full"} - SizeRequiredError = &KeepError{411, "Missing Content-Length"} - TooLongError = &KeepError{413, "Block is too large"} - MethodDisabledError = &KeepError{405, "Method disabled"} - ErrNotImplemented = &KeepError{500, "Unsupported configuration"} - ErrClientDisconnect = &KeepError{503, "Client disconnected"} + BadRequestError = &KeepError{http.StatusBadRequest, "Bad Request"} + UnauthorizedError = &KeepError{http.StatusUnauthorized, "Unauthorized"} + CollisionError = &KeepError{http.StatusInternalServerError, "Collision"} + RequestHashError = &KeepError{http.StatusUnprocessableEntity, "Hash mismatch in request"} + PermissionError = &KeepError{http.StatusForbidden, "Forbidden"} + DiskHashError = &KeepError{http.StatusInternalServerError, "Hash mismatch in stored data"} + ExpiredError = &KeepError{http.StatusUnauthorized, "Expired permission signature"} + NotFoundError = &KeepError{http.StatusNotFound, "Not Found"} + VolumeBusyError = &KeepError{http.StatusServiceUnavailable, "Volume backend busy"} + GenericError = &KeepError{http.StatusInternalServerError, "Fail"} + FullError = &KeepError{http.StatusInsufficientStorage, "Full"} + SizeRequiredError = &KeepError{http.StatusLengthRequired, "Missing Content-Length"} + TooLongError = &KeepError{http.StatusRequestEntityTooLarge, "Block is too large"} + MethodDisabledError = &KeepError{http.StatusMethodNotAllowed, "Method disabled"} + ErrNotImplemented = &KeepError{http.StatusInternalServerError, "Unsupported configuration"} + ErrClientDisconnect = &KeepError{499, "Client disconnected"} // non-RFC Nginx status code ) func (e *KeepError) Error() string { -- 2.39.5