X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/8934b505b0cdd6af699d910148046ede7c44b7da..e1999050ade633163524cd9d87d0b77f8b5bdfdc:/services/keepstore/handlers.go diff --git a/services/keepstore/handlers.go b/services/keepstore/handlers.go index 289b0c8c74..c7559a1bee 100644 --- a/services/keepstore/handlers.go +++ b/services/keepstore/handlers.go @@ -62,12 +62,13 @@ func MakeRESTRouter() *mux.Router { // The PullHandler and TrashHandler process "PUT /pull" and "PUT // /trash" requests from Data Manager. These requests instruct // Keep to replicate or delete blocks; see - // https://arvados.org/projects/orvos-private/wiki/Keep_Design_Doc + // https://arvados.org/projects/arvados/wiki/Keep_Design_Doc // for more details. // // Each handler parses the JSON list of block management requests - // in the message body, and delivers them to the pull queue or - // trash queue, respectively. + // in the message body, and replaces any existing pull queue or + // trash queue with their contentes. + // rest.HandleFunc(`/pull`, PullHandler).Methods("PUT") rest.HandleFunc(`/trash`, TrashHandler).Methods("PUT") @@ -117,8 +118,6 @@ func FindKeepVolumes() []string { func GetBlockHandler(resp http.ResponseWriter, req *http.Request) { hash := mux.Vars(req)["hash"] - log.Printf("%s %s", req.Method, hash) - hints := mux.Vars(req)["hints"] // Parse the locator string and hints from the request. @@ -172,19 +171,13 @@ func GetBlockHandler(resp http.ResponseWriter, req *http.Request) { if err != nil { // This type assertion is safe because the only errors // GetBlock can return are DiskHashError or NotFoundError. - if err == NotFoundError { - log.Printf("%s: not found, giving up\n", hash) - } http.Error(resp, err.Error(), err.(*KeepError).HTTPCode) return } - resp.Header().Set("X-Block-Size", fmt.Sprintf("%d", len(block))) + resp.Header().Set("Content-Length", fmt.Sprintf("%d", len(block))) _, err = resp.Write(block) - if err != nil { - log.Printf("GetBlockHandler: writing response: %s", err) - } return } @@ -196,8 +189,6 @@ func PutBlockHandler(resp http.ResponseWriter, req *http.Request) { hash := mux.Vars(req)["hash"] - log.Printf("%s %s", req.Method, hash) - // Read the block data to be stored. // If the request exceeds BLOCKSIZE bytes, issue a HTTP 500 error. // @@ -235,18 +226,14 @@ func PutBlockHandler(resp http.ResponseWriter, req *http.Request) { // A HandleFunc to address /index and /index/{prefix} requests. // func IndexHandler(resp http.ResponseWriter, req *http.Request) { - prefix := mux.Vars(req)["prefix"] - - // Only the data manager may issue /index requests, - // and only if enforce_permissions is enabled. - // All other requests return 403 Forbidden. - api_token := GetApiToken(req) - if !enforce_permissions || - api_token == "" || - data_manager_token != api_token { - http.Error(resp, PermissionError.Error(), PermissionError.HTTPCode) + // Reject unauthorized requests. + if !IsDataManagerToken(GetApiToken(req)) { + http.Error(resp, UnauthorizedError.Error(), UnauthorizedError.HTTPCode) return } + + prefix := mux.Vars(req)["prefix"] + var index string for _, vol := range KeepVM.Volumes() { index = index + vol.Index(prefix) @@ -358,7 +345,6 @@ func GetVolumeStatus(volume string) *VolumeStatus { // func DeleteHandler(resp http.ResponseWriter, req *http.Request) { hash := mux.Vars(req)["hash"] - log.Printf("%s %s", req.Method, hash) // Confirm that this user is an admin and has a token with unlimited scope. var tok = GetApiToken(req) @@ -450,10 +436,8 @@ type PullRequest struct { func PullHandler(resp http.ResponseWriter, req *http.Request) { // Reject unauthorized requests. - api_token := GetApiToken(req) - if !IsDataManagerToken(api_token) { + if !IsDataManagerToken(GetApiToken(req)) { http.Error(resp, UnauthorizedError.Error(), UnauthorizedError.HTTPCode) - log.Printf("%s %s: %s\n", req.Method, req.URL, UnauthorizedError.Error()) return } @@ -462,14 +446,12 @@ func PullHandler(resp http.ResponseWriter, req *http.Request) { r := json.NewDecoder(req.Body) if err := r.Decode(&pr); err != nil { http.Error(resp, BadRequestError.Error(), BadRequestError.HTTPCode) - log.Printf("%s %s: %s\n", req.Method, req.URL, err.Error()) return } // We have a properly formatted pull list sent from the data // manager. Report success and send the list to the pull list // manager for further handling. - log.Printf("%s %s: received %v\n", req.Method, req.URL, pr) resp.WriteHeader(http.StatusOK) resp.Write([]byte( fmt.Sprintf("Received %d pull requests\n", len(pr)))) @@ -492,10 +474,8 @@ type TrashRequest struct { func TrashHandler(resp http.ResponseWriter, req *http.Request) { // Reject unauthorized requests. - api_token := GetApiToken(req) - if !IsDataManagerToken(api_token) { + if !IsDataManagerToken(GetApiToken(req)) { http.Error(resp, UnauthorizedError.Error(), UnauthorizedError.HTTPCode) - log.Printf("%s %s: %s\n", req.Method, req.URL, UnauthorizedError.Error()) return } @@ -504,14 +484,12 @@ func TrashHandler(resp http.ResponseWriter, req *http.Request) { r := json.NewDecoder(req.Body) if err := r.Decode(&trash); err != nil { http.Error(resp, BadRequestError.Error(), BadRequestError.HTTPCode) - log.Printf("%s %s: %s\n", req.Method, req.URL, err.Error()) return } // We have a properly formatted trash list sent from the data // manager. Report success and send the list to the trash work // queue for further handling. - log.Printf("%s %s: received %v\n", req.Method, req.URL, trash) resp.WriteHeader(http.StatusOK) resp.Write([]byte( fmt.Sprintf("Received %d trash requests\n", len(trash))))