diff --git a/cluster/cluster.go b/cluster/cluster.go index bfa650f6..ff05e38d 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -186,6 +186,7 @@ type cluster struct { } var ErrDegraded = errors.New("cluster is currently degraded") +var ErrUnknownNode = errors.New("unknown node id") func New(config Config) (Cluster, error) { c := &cluster{ @@ -717,6 +718,14 @@ func (c *cluster) Leave(origin, id string) error { id = c.nodeID } + c.nodesLock.RLock() + _, hasNode := c.nodes[id] + c.nodesLock.RUnlock() + + if !hasNode { + return ErrUnknownNode + } + c.logger.Debug().WithFields(log.Fields{ "nodeid": id, }).Log("Received leave request for server") diff --git a/http/handler/api/cluster.go b/http/handler/api/cluster.go index 2bfae27a..d1d12289 100644 --- a/http/handler/api/cluster.go +++ b/http/handler/api/cluster.go @@ -1,6 +1,7 @@ package api import ( + "errors" "fmt" "io" "net/http" @@ -196,7 +197,14 @@ func (h *ClusterHandler) Leave(c echo.Context) error { } } - h.cluster.Leave("", nodeid.ID) + err = h.cluster.Leave("", nodeid.ID) + if err != nil { + if errors.Is(err, cluster.ErrUnknownNode) { + return api.Err(http.StatusNotFound, "", "node not found") + } + + return api.Err(http.StatusInternalServerError, "", "%s", err.Error()) + } return c.JSON(http.StatusOK, "OK") }