DELETE /v1/sort
(w http.ResponseWriter, r *http.Request)
| 263 | |
| 264 | // DELETE /v1/sort |
| 265 | func ProxyRemoveSortHandler(w http.ResponseWriter, r *http.Request) { |
| 266 | if !checkHTTPMethod(w, r, http.MethodDelete) { |
| 267 | return |
| 268 | } |
| 269 | _, err := checkRESTItems(w, r, 0, apc.URLPathdSort.L) |
| 270 | if err != nil { |
| 271 | return |
| 272 | } |
| 273 | |
| 274 | var ( |
| 275 | smap = ctx.smapOwner.Get() |
| 276 | query = r.URL.Query() |
| 277 | managerUUID = query.Get(apc.QparamUUID) |
| 278 | path = apc.URLPathdSortMetrics.Join(managerUUID) |
| 279 | responses = broadcastTargets(http.MethodGet, path, nil, nil, smap) |
| 280 | ) |
| 281 | |
| 282 | // First, broadcast to see if process is cleaned up first |
| 283 | seenOne := false |
| 284 | for _, resp := range responses { |
| 285 | if resp.statusCode == http.StatusNotFound { |
| 286 | // Probably new target which does not know anything about this dsort op. |
| 287 | continue |
| 288 | } |
| 289 | if resp.err != nil { |
| 290 | cmn.WriteErr(w, r, resp.err, resp.statusCode) |
| 291 | return |
| 292 | } |
| 293 | metrics := &Metrics{} |
| 294 | if err := js.Unmarshal(resp.res, &metrics); err != nil { |
| 295 | cmn.WriteErr(w, r, err, http.StatusInternalServerError) |
| 296 | return |
| 297 | } |
| 298 | if !metrics.Archived.Load() { |
| 299 | cmn.WriteErrMsg(w, r, fmt.Sprintf("%s process %s still in progress and cannot be removed", |
| 300 | DSortName, managerUUID)) |
| 301 | return |
| 302 | } |
| 303 | seenOne = true |
| 304 | } |
| 305 | if !seenOne { |
| 306 | s := fmt.Sprintf("invalid request: job %q does not exist", managerUUID) |
| 307 | cmn.WriteErrMsg(w, r, s, http.StatusNotFound) |
| 308 | return |
| 309 | } |
| 310 | |
| 311 | // Next, broadcast the remove once we've checked that all targets have run cleanup |
| 312 | path = apc.URLPathdSortRemove.Join(managerUUID) |
| 313 | responses = broadcastTargets(http.MethodDelete, path, nil, nil, smap) |
| 314 | var failed []string // nolint:prealloc // will remain not allocated when no errors |
| 315 | for _, r := range responses { |
| 316 | if r.statusCode == http.StatusOK { |
| 317 | continue |
| 318 | } |
| 319 | failed = append(failed, fmt.Sprintf("%v: (%v) %v", r.si.ID(), r.statusCode, string(r.res))) |
| 320 | } |
| 321 | if len(failed) != 0 { |
| 322 | err := fmt.Errorf("got errors while broadcasting remove: %v", failed) |
no test coverage detected