Skip to content
This repository has been archived by the owner on Feb 6, 2024. It is now read-only.

refactor: error message in http api #180

Merged
merged 2 commits into from
May 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 53 additions & 52 deletions server/service/http/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ type response struct {
func (a *API) respondForward(w http.ResponseWriter, response *http.Response) {
b, err := io.ReadAll(response.Body)
if err != nil {
log.Error("read resp failed", zap.Error(err))
log.Error("read response failed", zap.Error(err))
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
Expand All @@ -98,7 +98,7 @@ func (a *API) respondForward(w http.ResponseWriter, response *http.Response) {
}
w.WriteHeader(response.StatusCode)
if n, err := w.Write(b); err != nil {
log.Error("error writing response", zap.Int("msg", n), zap.Error(err))
log.Error("write response failed", zap.Int("msg", n), zap.Error(err))
}
}

Expand All @@ -109,15 +109,15 @@ func (a *API) respond(w http.ResponseWriter, data interface{}) {
Data: data,
})
if err != nil {
log.Error("error marshaling json response", zap.Error(err))
log.Error("marshal json response failed", zap.Error(err))
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
if n, err := w.Write(b); err != nil {
log.Error("error writing response", zap.Int("msg", n), zap.Error(err))
log.Error("write response failed", zap.Int("msg", n), zap.Error(err))
}
}

Expand All @@ -128,15 +128,15 @@ func (a *API) respondError(w http.ResponseWriter, apiErr coderr.CodeError, msg s
Msg: msg,
})
if err != nil {
log.Error("error marshaling json response", zap.Error(err))
log.Error("marshal json response failed", zap.Error(err))
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(apiErr.Code().ToHTTPCode())
if n, err := w.Write(b); err != nil {
log.Error("error writing response", zap.Int("msg", n), zap.Error(err))
log.Error("write response failed", zap.Int("msg", n), zap.Error(err))
}
}

Expand All @@ -150,15 +150,16 @@ func (a *API) getShardTables(writer http.ResponseWriter, req *http.Request) {
var getShardTables GetShardTables
err := json.NewDecoder(req.Body).Decode(&getShardTables)
if err != nil {
a.respondError(writer, ErrParseRequest, "decode request body failed")
log.Error("decode request body failed", zap.Error(err))
a.respondError(writer, ErrParseRequest, fmt.Sprintf("decode request body failed, cause: %s", err.Error()))
return
}
log.Info("get shard tables request", zap.String("request", fmt.Sprintf("%+v", getShardTables)))

c, err := a.clusterManager.GetCluster(req.Context(), getShardTables.ClusterName)
if err != nil {
log.Error("get cluster failed", zap.String("clusterName", getShardTables.ClusterName), zap.Error(err))
a.respondError(writer, ErrGetCluster, fmt.Sprintf("get cluster failed, clusterName:%s", getShardTables.ClusterName))
a.respondError(writer, ErrGetCluster, fmt.Sprintf("get cluster failed, clusterName: %s, cause: %s", getShardTables.ClusterName, err.Error()))
baojinri marked this conversation as resolved.
Show resolved Hide resolved
return
}

Expand All @@ -183,15 +184,15 @@ func (a *API) transferLeader(writer http.ResponseWriter, req *http.Request) {
err := json.NewDecoder(req.Body).Decode(&transferLeaderRequest)
if err != nil {
log.Error("decode request body failed", zap.Error(err))
a.respondError(writer, ErrParseRequest, "decode request body failed")
a.respondError(writer, ErrParseRequest, fmt.Sprintf("decode request body failed, cause: %s", err.Error()))
return
}
log.Info("transfer leader request", zap.String("request", fmt.Sprintf("%+v", transferLeaderRequest)))

c, err := a.clusterManager.GetCluster(req.Context(), transferLeaderRequest.ClusterName)
if err != nil {
log.Error("get cluster failed", zap.String("clusterName", transferLeaderRequest.ClusterName), zap.Error(err))
a.respondError(writer, ErrGetCluster, fmt.Sprintf("get cluster failed, clusterName:%s", transferLeaderRequest.ClusterName))
a.respondError(writer, ErrGetCluster, fmt.Sprintf("get cluster failed, clusterName: %s, cause: %s", transferLeaderRequest.ClusterName, err.Error()))
return
}

Expand All @@ -202,14 +203,14 @@ func (a *API) transferLeader(writer http.ResponseWriter, req *http.Request) {
NewLeaderNodeName: transferLeaderRequest.NewLeaderNodeName,
})
if err != nil {
log.Error("create transfer leader procedure", zap.Error(err))
a.respondError(writer, ErrCreateProcedure, "create transfer leader procedure")
log.Error("create transfer leader procedure failed", zap.Error(err))
a.respondError(writer, ErrCreateProcedure, fmt.Sprintf("create transfer leader procedure failed, cause: %s", err.Error()))
return
}
err = c.GetProcedureManager().Submit(req.Context(), transferLeaderProcedure)
if err != nil {
log.Error("submit transfer leader procedure", zap.Error(err))
a.respondError(writer, ErrSubmitProcedure, "submit transfer leader procedure")
log.Error("submit transfer leader procedure failed", zap.Error(err))
a.respondError(writer, ErrSubmitProcedure, fmt.Sprintf("submit transfer leader procedure failed, cause: %s", err.Error()))
return
}

Expand All @@ -226,7 +227,7 @@ func (a *API) route(writer http.ResponseWriter, req *http.Request) {
resp, isLeader, err := a.forwardClient.forwardToLeader(req)
if err != nil {
log.Error("forward to leader failed", zap.Error(err))
a.respondError(writer, ErrForwardToLeader, "forward to leader failed")
a.respondError(writer, ErrForwardToLeader, fmt.Sprintf("forward to leader failed, cause: %s", err.Error()))
return
}

Expand All @@ -239,15 +240,15 @@ func (a *API) route(writer http.ResponseWriter, req *http.Request) {
err = json.NewDecoder(req.Body).Decode(&routeRequest)
if err != nil {
log.Error("decode request body failed", zap.Error(err))
a.respondError(writer, ErrParseRequest, "decode request body failed")
a.respondError(writer, ErrParseRequest, fmt.Sprintf("decode request body failed, cause: %s", err.Error()))
return
}
log.Info("route request", zap.String("request", fmt.Sprintf("%+v", routeRequest)))

result, err := a.clusterManager.RouteTables(context.Background(), routeRequest.ClusterName, routeRequest.SchemaName, routeRequest.Tables)
if err != nil {
log.Error("route tables failed", zap.Error(err))
a.respondError(writer, ErrRouteTable, "route tables failed")
a.respondError(writer, ErrRouteTable, fmt.Sprintf("route tables failed, cause: %s", err.Error()))
return
}

Expand All @@ -262,7 +263,7 @@ func (a *API) getNodeShards(writer http.ResponseWriter, req *http.Request) {
resp, isLeader, err := a.forwardClient.forwardToLeader(req)
if err != nil {
log.Error("forward to leader failed", zap.Error(err))
a.respondError(writer, ErrForwardToLeader, "forward to leader failed")
a.respondError(writer, ErrForwardToLeader, fmt.Sprintf("forward to leader failed, cause: %s", err.Error()))
return
}

Expand All @@ -274,14 +275,14 @@ func (a *API) getNodeShards(writer http.ResponseWriter, req *http.Request) {
err = json.NewDecoder(req.Body).Decode(&nodeShardsRequest)
if err != nil {
log.Error("decode request body failed", zap.Error(err))
a.respondError(writer, ErrParseRequest, "decode request body failed")
a.respondError(writer, ErrParseRequest, fmt.Sprintf("decode request body failed, cause: %s", err.Error()))
return
}

result, err := a.clusterManager.GetNodeShards(context.Background(), nodeShardsRequest.ClusterName)
if err != nil {
log.Error("get node shards failed", zap.Error(err))
a.respondError(writer, ErrGetNodeShards, "get node shards failed")
a.respondError(writer, ErrGetNodeShards, fmt.Sprintf("get node shards failed, cause: %s", err.Error()))
return
}

Expand All @@ -298,7 +299,7 @@ func (a *API) dropTable(writer http.ResponseWriter, req *http.Request) {
resp, isLeader, err := a.forwardClient.forwardToLeader(req)
if err != nil {
log.Error("forward to leader failed", zap.Error(err))
a.respondError(writer, ErrForwardToLeader, "forward to leader failed")
a.respondError(writer, ErrForwardToLeader, fmt.Sprintf("forward to leader failed, cause: %s", err.Error()))
return
}

Expand All @@ -311,14 +312,14 @@ func (a *API) dropTable(writer http.ResponseWriter, req *http.Request) {
err = json.NewDecoder(req.Body).Decode(&dropTableRequest)
if err != nil {
log.Error("decode request body failed", zap.Error(err))
a.respondError(writer, ErrParseRequest, "decode request body failed")
a.respondError(writer, ErrParseRequest, fmt.Sprintf("decode request body failed, cause: %s", err.Error()))
return
}
log.Info("drop table reqeust", zap.String("request", fmt.Sprintf("%+v", dropTableRequest)))

if err := a.clusterManager.DropTable(context.Background(), dropTableRequest.ClusterName, dropTableRequest.SchemaName, dropTableRequest.Table); err != nil {
log.Error("cluster drop table failed", zap.Error(err))
a.respondError(writer, ErrDropTable, "drop table failed")
log.Error("drop table failed", zap.Error(err))
a.respondError(writer, ErrDropTable, fmt.Sprintf("drop table failed, cause: %s", err.Error()))
return
}

Expand All @@ -337,7 +338,7 @@ func (a *API) split(writer http.ResponseWriter, req *http.Request) {
resp, isLeader, err := a.forwardClient.forwardToLeader(req)
if err != nil {
log.Error("forward to leader failed", zap.Error(err))
a.respondError(writer, ErrForwardToLeader, "forward to leader failed")
a.respondError(writer, ErrForwardToLeader, fmt.Sprintf("forward to leader failed, cause: %s", err.Error()))
return
}

Expand All @@ -350,22 +351,22 @@ func (a *API) split(writer http.ResponseWriter, req *http.Request) {
err = json.NewDecoder(req.Body).Decode(&splitRequest)
if err != nil {
log.Error("decode request body failed", zap.Error(err))
a.respondError(writer, ErrParseRequest, "")
a.respondError(writer, ErrParseRequest, fmt.Sprintf("decode request body failed, cause: %s", err.Error()))
return
}
ctx := context.Background()

c, err := a.clusterManager.GetCluster(ctx, splitRequest.ClusterName)
if err != nil {
log.Error("cluster not found", zap.String("clusterName", splitRequest.ClusterName), zap.Error(err))
a.respondError(writer, metadata.ErrClusterNotFound, "cluster not found")
log.Error("get cluster failed", zap.String("clusterName", splitRequest.ClusterName), zap.Error(err))
a.respondError(writer, ErrGetCluster, fmt.Sprintf("get cluster failed, clusterName: %s, cause: %s", splitRequest.ClusterName, err.Error()))
return
}

newShardID, err := c.GetMetadata().AllocShardID(ctx)
if err != nil {
log.Error("alloc shard id failed")
a.respondError(writer, ErrAllocShardID, "alloc shard id failed")
log.Error("alloc shard id failed", zap.Error(err))
a.respondError(writer, ErrAllocShardID, fmt.Sprintf("alloc shard id failed, cause: %s", err.Error()))
return
}

Expand All @@ -379,14 +380,14 @@ func (a *API) split(writer http.ResponseWriter, req *http.Request) {
TargetNodeName: splitRequest.NodeName,
})
if err != nil {
log.Error("create split procedure", zap.Error(err))
a.respondError(writer, ErrCreateProcedure, "create split procedure")
log.Error("create split procedure failed", zap.Error(err))
a.respondError(writer, ErrCreateProcedure, fmt.Sprintf("create split procedure failed, cause: %s", err.Error()))
return
}

if err := c.GetProcedureManager().Submit(ctx, splitProcedure); err != nil {
log.Error("submit split procedure", zap.Error(err))
a.respondError(writer, ErrSubmitProcedure, "submit split procedure")
log.Error("submit split procedure failed", zap.Error(err))
a.respondError(writer, ErrSubmitProcedure, fmt.Sprintf("submit split procedure failed, cause: %s", err.Error()))
return
}

Expand All @@ -397,7 +398,7 @@ func (a *API) listClusters(writer http.ResponseWriter, req *http.Request) {
resp, isLeader, err := a.forwardClient.forwardToLeader(req)
if err != nil {
log.Error("forward to leader failed", zap.Error(err))
a.respondError(writer, ErrForwardToLeader, "forward to leader failed")
a.respondError(writer, ErrForwardToLeader, fmt.Sprintf("forward to leader failed, cause: %s", err.Error()))
return
}

Expand All @@ -408,8 +409,8 @@ func (a *API) listClusters(writer http.ResponseWriter, req *http.Request) {

clusters, err := a.clusterManager.ListClusters(req.Context())
if err != nil {
log.Error("list clusters")
a.respondError(writer, ErrGetCluster, "list clusters failed")
log.Error("list clusters failed", zap.Error(err))
a.respondError(writer, ErrGetCluster, fmt.Sprintf("list clusters failed, cause: %s", err.Error()))
return
}

Expand All @@ -433,7 +434,7 @@ func (a *API) createCluster(writer http.ResponseWriter, req *http.Request) {
resp, isLeader, err := a.forwardClient.forwardToLeader(req)
if err != nil {
log.Error("forward to leader failed", zap.Error(err))
a.respondError(writer, ErrForwardToLeader, "forward to leader failed")
a.respondError(writer, ErrForwardToLeader, fmt.Sprintf("forward to leader failed, cause: %s", err.Error()))
return
}

Expand All @@ -446,20 +447,20 @@ func (a *API) createCluster(writer http.ResponseWriter, req *http.Request) {
err = json.NewDecoder(req.Body).Decode(&createClusterRequest)
if err != nil {
log.Error("decode request body failed", zap.Error(err))
a.respondError(writer, ErrParseRequest, err.Error())
a.respondError(writer, ErrParseRequest, fmt.Sprintf("decode request body failed, cause: %s", err.Error()))
return
}

if _, err := a.clusterManager.GetCluster(req.Context(), createClusterRequest.ClusterName); err == nil {
log.Error("get cluster when create cluster", zap.Error(err))
a.respondError(writer, metadata.ErrClusterAlreadyExists, fmt.Sprintf("cluster:%s already exists", createClusterRequest.ClusterName))
log.Error("cluster already exists", zap.String("clusterName", createClusterRequest.ClusterName))
a.respondError(writer, ErrGetCluster, fmt.Sprintf("cluster: %s already exists", createClusterRequest.ClusterName))
return
}

topologyType, err := metadata.ParseTopologyType(createClusterRequest.TopologyType)
if err != nil {
log.Error("parse topology type", zap.Error(err))
a.respondError(writer, metadata.ErrCreateCluster, "parse topology type failed")
log.Error("parse topology type failed", zap.Error(err))
a.respondError(writer, ErrParseTopology, fmt.Sprintf("parse topology type failed, cause: %s", err.Error()))
return
}
c, err := a.clusterManager.CreateCluster(req.Context(), createClusterRequest.ClusterName, metadata.CreateClusterOpts{
Expand All @@ -470,8 +471,8 @@ func (a *API) createCluster(writer http.ResponseWriter, req *http.Request) {
TopologyType: topologyType,
})
if err != nil {
log.Error("create cluster", zap.Error(err))
a.respondError(writer, metadata.ErrCreateCluster, err.Error())
log.Error("create cluster failed", zap.Error(err))
a.respondError(writer, metadata.ErrCreateCluster, fmt.Sprintf("create cluster failed, cause: %s", err.Error()))
return
}

Expand All @@ -490,7 +491,7 @@ func (a *API) updateCluster(writer http.ResponseWriter, req *http.Request) {
resp, isLeader, err := a.forwardClient.forwardToLeader(req)
if err != nil {
log.Error("forward to leader failed", zap.Error(err))
a.respondError(writer, ErrForwardToLeader, "forward to leader failed")
a.respondError(writer, ErrForwardToLeader, fmt.Sprintf("forward to leader failed, cause: %s", err.Error()))
return
}

Expand All @@ -503,22 +504,22 @@ func (a *API) updateCluster(writer http.ResponseWriter, req *http.Request) {
err = json.NewDecoder(req.Body).Decode(&updateClusterRequest)
if err != nil {
log.Error("decode request body failed", zap.Error(err))
a.respondError(writer, ErrParseRequest, err.Error())
a.respondError(writer, ErrParseRequest, fmt.Sprintf("decode request body failed, cause: %s", err.Error()))
return
}

c, err := a.clusterManager.GetCluster(req.Context(), updateClusterRequest.ClusterName)
if err != nil {
log.Error("get cluster when update cluster", zap.Error(err))
a.respondError(writer, metadata.ErrClusterNotFound, fmt.Sprintf("clusterName:%s not found", updateClusterRequest.ClusterName))
log.Error("get cluster failed", zap.Error(err))
a.respondError(writer, ErrGetCluster, fmt.Sprintf("get cluster failed, clusterName: %s, cause: %s", updateClusterRequest.ClusterName, err.Error()))
return
}

if err := a.clusterManager.UpdateCluster(req.Context(), updateClusterRequest.ClusterName, metadata.UpdateClusterOpts{
EnableSchedule: updateClusterRequest.EnableSchedule,
}); err != nil {
log.Error("update cluster", zap.Error(err))
a.respondError(writer, metadata.ErrUpdateCluster, "update cluster failed")
log.Error("update cluster failed", zap.Error(err))
a.respondError(writer, metadata.ErrUpdateCluster, fmt.Sprintf("update cluster failed, cause: %s", err.Error()))
return
}

Expand All @@ -531,6 +532,6 @@ func (a *API) healthCheck(writer http.ResponseWriter, _ *http.Request) {
a.respond(writer, nil)
} else {
a.respondError(writer, ErrHealthCheck,
fmt.Sprintf("server heath check fail, status is %v", a.serverStatus.Get()))
fmt.Sprintf("server heath check failed, status is %v", a.serverStatus.Get()))
}
}
3 changes: 2 additions & 1 deletion server/service/http/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ var (
ErrAllocShardID = coderr.NewCodeError(coderr.Internal, "alloc shard id")
ErrForwardToLeader = coderr.NewCodeError(coderr.Internal, "forward to leader")
ErrParseLeaderAddr = coderr.NewCodeError(coderr.Internal, "parse leader addr")
ErrHealthCheck = coderr.NewCodeError(coderr.Internal, "server health check fail")
ErrHealthCheck = coderr.NewCodeError(coderr.Internal, "server health check")
ErrParseTopology = coderr.NewCodeError(coderr.Internal, "parse topology type")
)