summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Newdigate <andrew@gitlab.com>2017-09-19 10:52:02 +0100
committerAndrew Newdigate <andrew@gitlab.com>2017-09-19 10:52:02 +0100
commit3449dc28d0c671e9160e927951089bcf97f5f0f3 (patch)
tree510e9eafbc3600721d84a3ed3a300b0bdbd04d2f
parentcd61d6e6904547c709a78b8404077bab2abfa92a (diff)
downloadgitlab-ce-bridged_gitaly_exceptions.tar.gz
Bridged gitaly exceptionsbridged_gitaly_exceptions
-rw-r--r--lib/gitlab/gitaly_client.rb8
-rw-r--r--lib/gitlab/gitaly_client/util.rb26
2 files changed, 33 insertions, 1 deletions
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index a3dc2cd0b60..d381bcbfe7f 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -55,7 +55,13 @@ module Gitlab
def self.call(storage, service, rpc, request)
metadata = request_metadata(storage)
metadata = yield(metadata) if block_given?
- stub(service, storage).__send__(rpc, request, metadata) # rubocop:disable GitlabSecurity/PublicSend
+ result = stub(service, storage).__send__(rpc, request, metadata) # rubocop:disable GitlabSecurity/PublicSend
+
+ return Gitlab::GitalyClient::Util.wrap_enumerator(result) if result.is_a?(Enumerator)
+
+ result
+ rescue GRPC::BadStatus => e
+ raise Gitlab::GitalyClient::Util.unwrap_exception(e)
end
def self.request_metadata(storage)
diff --git a/lib/gitlab/gitaly_client/util.rb b/lib/gitlab/gitaly_client/util.rb
index 8fc937496af..18663af541e 100644
--- a/lib/gitlab/gitaly_client/util.rb
+++ b/lib/gitlab/gitaly_client/util.rb
@@ -1,6 +1,8 @@
module Gitlab
module GitalyClient
module Util
+ BRIDGED_EXCEPTION_WHITELIST = Set.new ['RuntimeError'].freeze
+
class << self
def repository(repository_storage, relative_path)
Gitaly::Repository.new(
@@ -10,6 +12,30 @@ module Gitlab
git_alternate_object_directories: Array.wrap(Gitlab::Git::Env['GIT_ALTERNATE_OBJECT_DIRECTORIES'])
)
end
+
+ def unwrap_exception(exception)
+ return exception unless exception.is_a?(GRPC::BadStatus) && exception.metadata
+
+ original_exception_class = exception.metadata["gitaly-ruby.exception.class"]
+
+ return exception unless BRIDGED_EXCEPTION_WHITELIST.include?(original_exception_class)
+
+ original_exception = Object.const_get(original_exception_class).new exception.message
+ raise original_exception
+ end
+
+ def wrap_enumerator(enumerator)
+ return Enumerator.new do |y|
+ loop do
+ begin
+ y << enumerator.next
+ rescue GRPC::BadStatus => e
+ raise unwrap_exception(e)
+ end
+ end
+ end
+ end
+
end
end
end