Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Vosmaer <jacob@gitlab.com>2017-06-01 17:19:48 +0300
committerJacob Vosmaer <jacob@gitlab.com>2017-06-01 18:22:59 +0300
commit68c7e9b84350105719b31dd6e8c0303d4458923e (patch)
tree0115d6aa35fdb0690d630ee1552ce5f1672e8f39
parentcbe97c6bda1f7eb507fbe34c28d43f1a3aa5b43b (diff)
Scan PostUploadPack requests for 'deepen'
-rw-r--r--CHANGELOG.md2
-rw-r--r--internal/service/smarthttp/upload_pack.go18
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)
}