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:
Diffstat (limited to 'internal/gitaly/service/ssh/upload_pack.go')
-rw-r--r--internal/gitaly/service/ssh/upload_pack.go16
1 files changed, 14 insertions, 2 deletions
diff --git a/internal/gitaly/service/ssh/upload_pack.go b/internal/gitaly/service/ssh/upload_pack.go
index d17fafcf5..e468c834c 100644
--- a/internal/gitaly/service/ssh/upload_pack.go
+++ b/internal/gitaly/service/ssh/upload_pack.go
@@ -72,8 +72,8 @@ type sshUploadPackRequest interface {
GetGitProtocol() string
}
-func (s *server) sshUploadPack(ctx context.Context, req sshUploadPackRequest, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
- ctx, cancelCtx := context.WithCancel(ctx)
+func (s *server) sshUploadPack(rpcContext context.Context, req sshUploadPackRequest, stdin io.Reader, stdout, stderr io.Writer) (int, error) {
+ ctx, cancelCtx := context.WithCancel(rpcContext)
defer cancelCtx()
stdoutCounter := &helper.CountingWriter{W: stdout}
@@ -147,6 +147,18 @@ func (s *server) sshUploadPack(ctx context.Context, req sshUploadPackRequest, st
if err := cmd.Wait(); err != nil {
status, _ := command.ExitStatus(err)
+ // When waiting for the packfile negotiation to end times out we'll cancel the local
+ // context, but not cancel the overall RPC's context. Our cancelhandler middleware
+ // thus cannot observe the fact that we're cancelling the context, and neither do we
+ // provide any valuable information to the caller that we do indeed kill the command
+ // because of our own internal timeout.
+ //
+ // We thus need to special-case the situation where we cancel our own context in
+ // order to provide that information and return a proper gRPC error code.
+ if ctx.Err() != nil && rpcContext.Err() == nil {
+ return status, helper.ErrDeadlineExceededf("waiting for packfile negotiation: %w", ctx.Err())
+ }
+
// A common error case is that the client is terminating the request prematurely,
// e.g. by killing their git-fetch(1) process because it's taking too long. This is
// an expected failure, but we're not in a position to easily tell this error apart