Skip to content
Snippets Groups Projects
Commit cd22f119 authored by Alexander Polcyn's avatar Alexander Polcyn
Browse files

properly finish bidi calls when there is an initial error

parent 9511aefa
No related branches found
No related tags found
No related merge requests found
...@@ -480,7 +480,20 @@ module GRPC ...@@ -480,7 +480,20 @@ module GRPC
def bidi_streamer(requests, metadata: {}, &blk) def bidi_streamer(requests, metadata: {}, &blk)
raise_error_if_already_executed raise_error_if_already_executed
# Metadata might have already been sent if this is an operation view # Metadata might have already been sent if this is an operation view
merge_metadata_and_send_if_not_already_sent(metadata) begin
merge_metadata_and_send_if_not_already_sent(metadata)
rescue GRPC::Core::CallError => e
batch_result = @call.run_batch(RECV_STATUS_ON_CLIENT => nil)
set_input_stream_done
set_output_stream_done
attach_status_results_and_complete_call(batch_result)
raise e
rescue => e
set_input_stream_done
set_output_stream_done
raise e
end
bd = BidiCall.new(@call, bd = BidiCall.new(@call,
@marshal, @marshal,
@unmarshal, @unmarshal,
......
...@@ -590,8 +590,22 @@ describe 'ClientStub' do ...@@ -590,8 +590,22 @@ describe 'ClientStub' do
th.join th.join
end end
# TODO: add test for metadata-related ArgumentError in a bidi call once it 'should raise ArgumentError if metadata contains invalid values' do
# issue mentioned in https://github.com/grpc/grpc/issues/10526 is fixed @metadata.merge!(k3: 3)
stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure)
expect do
get_responses(stub).collect { |r| r }
end.to raise_error(ArgumentError,
/Header values must be of type string or array/)
end
it 'terminates if the call fails to start' do
# don't start the server
stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure)
expect do
get_responses(stub, deadline: from_relative_time(0)).collect { |r| r }
end.to raise_error(GRPC::BadStatus)
end
it 'should send metadata to the server ok' do it 'should send metadata to the server ok' do
th = run_bidi_streamer_echo_ping_pong(@sent_msgs, @pass, true, th = run_bidi_streamer_echo_ping_pong(@sent_msgs, @pass, true,
...@@ -604,9 +618,9 @@ describe 'ClientStub' do ...@@ -604,9 +618,9 @@ describe 'ClientStub' do
end end
describe 'without a call operation' do describe 'without a call operation' do
def get_responses(stub) def get_responses(stub, deadline: nil)
e = stub.bidi_streamer(@method, @sent_msgs, noop, noop, e = stub.bidi_streamer(@method, @sent_msgs, noop, noop,
metadata: @metadata) metadata: @metadata, deadline: deadline)
expect(e).to be_a(Enumerator) expect(e).to be_a(Enumerator)
e e
end end
...@@ -618,10 +632,10 @@ describe 'ClientStub' do ...@@ -618,10 +632,10 @@ describe 'ClientStub' do
after(:each) do after(:each) do
@op.wait # make sure wait doesn't hang @op.wait # make sure wait doesn't hang
end end
def get_responses(stub, run_start_call_first: false) def get_responses(stub, run_start_call_first: false, deadline: nil)
@op = stub.bidi_streamer(@method, @sent_msgs, noop, noop, @op = stub.bidi_streamer(@method, @sent_msgs, noop, noop,
return_op: true, return_op: true,
metadata: @metadata) metadata: @metadata, deadline: deadline)
expect(@op).to be_a(GRPC::ActiveCall::Operation) expect(@op).to be_a(GRPC::ActiveCall::Operation)
@op.start_call if run_start_call_first @op.start_call if run_start_call_first
e = @op.execute e = @op.execute
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment