diff --git a/server/grpc.go b/server/grpc.go index b93b37fe8..6ed428772 100644 --- a/server/grpc.go +++ b/server/grpc.go @@ -66,14 +66,62 @@ func errToStatusError(err error) error { // Check error string. switch errors.Cause(err) { - case pilosa.ErrIndexNotFound, pilosa.ErrFieldNotFound: - return status.Error(codes.NotFound, err.Error()) - } - // Check error type. - switch errors.Cause(err).(type) { - case pilosa.NotFoundError: + case pilosa.ErrIndexNotFound, + pilosa.ErrFieldNotFound, + pilosa.ErrForeignIndexNotFound, + pilosa.ErrBSIGroupNotFound: return status.Error(codes.NotFound, err.Error()) + + case pilosa.ErrIndexExists, + pilosa.ErrFieldExists, + pilosa.ErrBSIGroupExists: + return status.Error(codes.AlreadyExists, err.Error()) + + case pilosa.ErrIndexRequired, + pilosa.ErrFieldRequired, + pilosa.ErrColumnRequired, + pilosa.ErrBSIGroupNameRequired, + pilosa.ErrName, + pilosa.ErrQueryRequired, + pilosa.ErrFieldsArgumentRequired, + pilosa.ErrIntFieldWithKeys, + pilosa.ErrDecimalFieldWithKeys: + return status.Error(codes.FailedPrecondition, err.Error()) + + case pilosa.ErrInvalidView, + pilosa.ErrInvalidBSIGroupType, + pilosa.ErrInvalidBSIGroupValueType, + pilosa.ErrInvalidCacheType: + return status.Error(codes.InvalidArgument, err.Error()) + + case pilosa.ErrDecimalOutOfRange, + pilosa.ErrBSIGroupValueTooLow, + pilosa.ErrBSIGroupValueTooHigh, + pilosa.ErrInvalidRangeOperation, + pilosa.ErrInvalidBetweenValue: + return status.Error(codes.OutOfRange, err.Error()) + + case pilosa.ErrQueryTimeout: + return status.Error(codes.DeadlineExceeded, err.Error()) + + case pilosa.ErrQueryCancelled: + return status.Error(codes.Canceled, err.Error()) + + case pilosa.ErrNotImplemented: + return status.Error(codes.Unimplemented, err.Error()) + + case pilosa.ErrAborted: + return status.Error(codes.Aborted, err.Error()) + + case pilosa.ErrClusterDoesNotOwnShard, + pilosa.ErrResizeNoReplicas, + pilosa.ErrResizeNotRunning, + pilosa.ErrNodeNotCoordinator, + pilosa.ErrTooManyWrites, + pilosa.ErrNodeIDNotExists: + return status.Error(codes.Internal, err.Error()) } + return status.Error(codes.Unknown, err.Error()) } @@ -105,7 +153,7 @@ func (h *GRPCHandler) PostVDS(ctx context.Context, req *pb.PostVDSRequest) (*pb. opts := pilosa.IndexOptions{Keys: req.Keys, TrackExistence: req.TrackExistence} _, err := h.api.CreateIndex(ctx, req.Name, opts) if err != nil { - return nil, err + return nil, errToStatusError(err) } return &pb.PostVDSResponse{}, nil } @@ -114,7 +162,7 @@ func (h *GRPCHandler) PostVDS(ctx context.Context, req *pb.PostVDSRequest) (*pb. func (h *GRPCHandler) DeleteVDS(ctx context.Context, req *pb.DeleteVDSRequest) (*pb.DeleteVDSResponse, error) { err := h.api.DeleteIndex(ctx, req.Name) if err != nil { - return nil, err + return nil, errToStatusError(err) } return &pb.DeleteVDSResponse{}, nil } diff --git a/sql/reduce.go b/sql/reduce.go index be0e98695..b349f8ceb 100644 --- a/sql/reduce.go +++ b/sql/reduce.go @@ -282,20 +282,20 @@ func (v *ValCountFuncReducer) Reduce(c pproto.StreamClient, s pproto.StreamServe if len(cols) == 0 { return s.Send(pproto.ErrorCode( errors.New("empty column set"), - codes.Unknown, + codes.NotFound, )) } if idxVal == -1 { return s.Send(pproto.ErrorCode( errors.New("result set has no column: value"), - codes.Unknown, + codes.NotFound, )) } if idxCnt == -1 { return s.Send(pproto.ErrorCode( errors.New("result set has no column: count"), - codes.Unknown, + codes.NotFound, )) } @@ -415,7 +415,7 @@ func (r *AssignHeadersReducer) Reduce(c pproto.StreamClient, s pproto.StreamServ if len(placement) > len(rr.Columns) { return s.Send(pproto.ErrorCode( errors.New("mismatched header placement and column count"), - codes.Unknown, + codes.InvalidArgument, )) }