summaryrefslogtreecommitdiff
path: root/internal/handler
diff options
context:
space:
mode:
Diffstat (limited to 'internal/handler')
-rw-r--r--internal/handler/exec.go8
-rw-r--r--internal/handler/exec_test.go14
2 files changed, 22 insertions, 0 deletions
diff --git a/internal/handler/exec.go b/internal/handler/exec.go
index eb5211e..172736d 100644
--- a/internal/handler/exec.go
+++ b/internal/handler/exec.go
@@ -9,7 +9,9 @@ import (
grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
"google.golang.org/grpc"
+ grpccodes "google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
+ grpcstatus "google.golang.org/grpc/status"
"gitlab.com/gitlab-org/gitlab-shell/internal/config"
"gitlab.com/gitlab-org/gitlab-shell/internal/gitlabnet/accessverifier"
@@ -50,6 +52,12 @@ func (gc *GitalyCommand) RunGitalyCommand(ctx context.Context, handler GitalyHan
childCtx := withOutgoingMetadata(ctx, gc.Features)
_, err = handler(childCtx, conn)
+ if err != nil && grpcstatus.Convert(err).Code() == grpccodes.Unavailable {
+ log.WithError(err).Error("Gitaly is unavailable")
+
+ return fmt.Errorf("Git service is temporarily unavailable")
+ }
+
return err
}
diff --git a/internal/handler/exec_test.go b/internal/handler/exec_test.go
index 5ad0675..1d714ef 100644
--- a/internal/handler/exec_test.go
+++ b/internal/handler/exec_test.go
@@ -7,7 +7,9 @@ import (
"github.com/stretchr/testify/require"
"google.golang.org/grpc"
+ grpccodes "google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
+ grpcstatus "google.golang.org/grpc/status"
pb "gitlab.com/gitlab-org/gitaly/v14/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab-shell/internal/config"
@@ -45,6 +47,18 @@ func TestMissingGitalyAddress(t *testing.T) {
require.EqualError(t, err, "no gitaly_address given")
}
+func TestUnavailableGitalyErr(t *testing.T) {
+ cmd := GitalyCommand{
+ Config: &config.Config{},
+ Address: "tcp://localhost:9999",
+ }
+
+ expectedErr := grpcstatus.Error(grpccodes.Unavailable, "error")
+ err := cmd.RunGitalyCommand(context.Background(), makeHandler(t, expectedErr))
+
+ require.EqualError(t, err, "Git service is temporarily unavailable")
+}
+
func TestRunGitalyCommandMetadata(t *testing.T) {
tests := []struct {
name string