Merge pull request #1422 from unihorn/187

etcdserver: parse context error for better message
This commit is contained in:
Yicheng Qin 2014-10-27 11:00:01 -07:00
commit ee27846d5b
2 changed files with 29 additions and 4 deletions

View File

@ -64,6 +64,8 @@ var (
ErrIDRemoved = errors.New("etcdserver: ID removed")
ErrIDExists = errors.New("etcdserver: ID exists")
ErrIDNotFound = errors.New("etcdserver: ID not found")
ErrCanceled = errors.New("etcdserver: request cancelled")
ErrTimeout = errors.New("etcdserver: request timed out")
storeMembersPrefix = path.Join(StoreAdminPrefix, "members")
storeRemovedMembersPrefix = path.Join(StoreAdminPrefix, "removed_members")
@ -383,7 +385,7 @@ func (s *EtcdServer) Do(ctx context.Context, r pb.Request) (Response, error) {
return resp, resp.err
case <-ctx.Done():
s.w.Trigger(r.ID, nil) // GC wait
return Response{}, ctx.Err()
return Response{}, parseCtxErr(ctx.Err())
case <-s.done:
return Response{}, ErrStopped
}
@ -477,7 +479,7 @@ func (s *EtcdServer) configure(ctx context.Context, cc raftpb.ConfChange) error
return nil
case <-ctx.Done():
s.w.Trigger(cc.ID, nil) // GC wait
return ctx.Err()
return parseCtxErr(ctx.Err())
case <-s.done:
return ErrStopped
}
@ -752,6 +754,17 @@ func GenID() (n uint64) {
return
}
func parseCtxErr(err error) error {
switch err {
case context.Canceled:
return ErrCanceled
case context.DeadlineExceeded:
return ErrTimeout
default:
return err
}
}
func getBool(v *bool) (vv bool, set bool) {
if v == nil {
return false, false

View File

@ -614,8 +614,8 @@ func TestDoProposalCancelled(t *testing.T) {
if len(gaction) != 0 {
t.Errorf("len(action) = %v, want 0", len(gaction))
}
if err != context.Canceled {
t.Fatalf("err = %v, want %v", err, context.Canceled)
if err != ErrCanceled {
t.Fatalf("err = %v, want %v", err, ErrCanceled)
}
w := []action{action{name: "Register1"}, action{name: "Trigger1"}}
if !reflect.DeepEqual(wait.action, w) {
@ -623,6 +623,18 @@ func TestDoProposalCancelled(t *testing.T) {
}
}
func TestDoProposalTimeout(t *testing.T) {
ctx, _ := context.WithTimeout(context.Background(), 0)
srv := &EtcdServer{
node: &nodeRecorder{},
w: &waitRecorder{},
}
_, err := srv.Do(ctx, pb.Request{Method: "PUT", ID: 1})
if err != ErrTimeout {
t.Fatalf("err = %v, want %v", err, ErrTimeout)
}
}
func TestDoProposalStopped(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()