diff options
author | Andrew Newdigate <andrew@gitlab.com> | 2017-09-19 10:52:02 +0100 |
---|---|---|
committer | Andrew Newdigate <andrew@gitlab.com> | 2017-09-19 10:52:02 +0100 |
commit | 3449dc28d0c671e9160e927951089bcf97f5f0f3 (patch) | |
tree | 510e9eafbc3600721d84a3ed3a300b0bdbd04d2f | |
parent | cd61d6e6904547c709a78b8404077bab2abfa92a (diff) | |
download | gitlab-ce-bridged_gitaly_exceptions.tar.gz |
Bridged gitaly exceptionsbridged_gitaly_exceptions
-rw-r--r-- | lib/gitlab/gitaly_client.rb | 8 | ||||
-rw-r--r-- | lib/gitlab/gitaly_client/util.rb | 26 |
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 |