diff options
author | John Cai <jcai@gitlab.com> | 2022-09-28 20:16:39 +0300 |
---|---|---|
committer | John Cai <jcai@gitlab.com> | 2022-10-05 21:34:58 +0300 |
commit | 80d62284b148521cd0377b40aaae4aee81f0db62 (patch) | |
tree | 01503bb3ed9a10c27f4de7fb7a176ea930e1c399 | |
parent | f955266a86bb86637389583c591ae79ed7ad460e (diff) |
ref: Return structured error when update error is not ErrAlreadyLocked
We have a bug wherein we still return a successful response with an
error embedded in the response if the Prepare() step fails with an error
but the error is not an ErrAlreadyLocked. Fix the code such that we
return an error instead of a response when there is a non
ErrAlreadyLocked error during the Prepare() call.
Changelog: fixed
-rw-r--r-- | internal/gitaly/service/ref/delete_refs.go | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/internal/gitaly/service/ref/delete_refs.go b/internal/gitaly/service/ref/delete_refs.go index f8d7a7f03..0e92ffc84 100644 --- a/internal/gitaly/service/ref/delete_refs.go +++ b/internal/gitaly/service/ref/delete_refs.go @@ -83,24 +83,27 @@ func (s *server) DeleteRefs(ctx context.Context, in *gitalypb.DeleteRefsRequest) } if err := updater.Prepare(); err != nil { - var errAlreadyLocked *updateref.ErrAlreadyLocked - if featureflag.DeleteRefsStructuredErrors.IsEnabled(ctx) && - errors.As(err, &errAlreadyLocked) { - detailedErr, err := helper.ErrWithDetails( - helper.ErrFailedPreconditionf("cannot lock references"), - &gitalypb.DeleteRefsError{ - Error: &gitalypb.DeleteRefsError_ReferencesLocked{ - ReferencesLocked: &gitalypb.ReferencesLockedError{ - Refs: [][]byte{[]byte(errAlreadyLocked.Ref)}, + if featureflag.DeleteRefsStructuredErrors.IsEnabled(ctx) { + var errAlreadyLocked *updateref.ErrAlreadyLocked + if errors.As(err, &errAlreadyLocked) { + detailedErr, err := helper.ErrWithDetails( + helper.ErrFailedPreconditionf("cannot lock references"), + &gitalypb.DeleteRefsError{ + Error: &gitalypb.DeleteRefsError_ReferencesLocked{ + ReferencesLocked: &gitalypb.ReferencesLockedError{ + Refs: [][]byte{[]byte(errAlreadyLocked.Ref)}, + }, }, }, - }, - ) - if err != nil { - return nil, helper.ErrInternalf("error details: %w", err) + ) + if err != nil { + return nil, helper.ErrInternalf("error details: %w", err) + } + + return nil, detailedErr } - return nil, detailedErr + return nil, helper.ErrInternalf("unable to prepare: %w", err) } return &gitalypb.DeleteRefsResponse{ |