diff options
author | Jacob Vosmaer <jacob@gitlab.com> | 2017-06-01 17:19:48 +0300 |
---|---|---|
committer | Jacob Vosmaer <jacob@gitlab.com> | 2017-06-01 18:22:59 +0300 |
commit | 68c7e9b84350105719b31dd6e8c0303d4458923e (patch) | |
tree | 0115d6aa35fdb0690d630ee1552ce5f1672e8f39 | |
parent | cbe97c6bda1f7eb507fbe34c28d43f1a3aa5b43b (diff) |
Scan PostUploadPack requests for 'deepen'
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | internal/service/smarthttp/upload_pack.go | 18 |
2 files changed, 19 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index f1ed936bb..3f92dadd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ UNRELEASED https://gitlab.com/gitlab-org/gitaly/merge_requests/168 - Set GL_PROTOCOL during SmartHTTP.PostReceivePack https://gitlab.com/gitlab-org/gitaly/merge_requests/169 +- Handle server side errors from shallow clone + https://gitlab.com/gitlab-org/gitaly/merge_requests/173 v0.10.0 diff --git a/internal/service/smarthttp/upload_pack.go b/internal/service/smarthttp/upload_pack.go index 2dc1e6b15..91c762982 100644 --- a/internal/service/smarthttp/upload_pack.go +++ b/internal/service/smarthttp/upload_pack.go @@ -1,6 +1,7 @@ package smarthttp import ( + "io" "os/exec" log "github.com/sirupsen/logrus" @@ -21,10 +22,18 @@ func (s *server) PostUploadPack(stream pb.SmartHTTP_PostUploadPackServer) error return err } - stdin := pbhelper.NewReceiveReader(func() ([]byte, error) { + stdinReader := pbhelper.NewReceiveReader(func() ([]byte, error) { resp, err := stream.Recv() return resp.GetData(), err }) + pr, pw := io.Pipe() + defer pw.Close() + stdin := io.TeeReader(stdinReader, pw) + deepenCh := make(chan bool, 1) + go func() { + deepenCh <- scanDeepen(pr) + }() + stdout := pbhelper.NewSendWriter(func(p []byte) error { return stream.Send(&pb.PostUploadPackResponse{Data: p}) }) @@ -46,6 +55,13 @@ func (s *server) PostUploadPack(stream pb.SmartHTTP_PostUploadPackServer) error defer cmd.Kill() if err := cmd.Wait(); err != nil { + pw.Close() // ensure scanDeepen returns + if _, ok := helper.ExitStatus(err); ok && <-deepenCh { + // We have seen a 'deepen' message in the request. It is expected that + // git-upload-pack has a non-zero exit status: don't treat this as an + // error. + return nil + } return grpc.Errorf(codes.Unavailable, "PostUploadPack: cmd wait for %v: %v", cmd.Args, err) } |