@ -78,13 +78,11 @@ module GRPC
# @param requests the Enumerable of requests to send
# @return an Enumerator of requests to yield
def run_on_client ( requests , & blk )
enq_th = start_write_loop ( requests )
loop_th = start_read_loop
@ enq_th = start_write_loop ( requests )
@ loop_th = start_read_loop
replies = each_queued_msg
return replies if blk . nil?
replies . each { | r | blk . call ( r ) }
enq_th . join
loop_th . join
end
# Begins orchestration of the Bidi stream for a server generating replies.
@ -100,10 +98,8 @@ module GRPC
# @param gen_each_reply [Proc] generates the BiDi stream replies.
def run_on_server ( gen_each_reply )
replys = gen_each_reply . call ( each_queued_msg )
enq_th = start_write_loop ( replys , is_client : false )
loop_th = start_read_loop
loop_th . join
enq_th . join
@enq_th = start_write_loop ( replys , is_client : false )
@loop_th = start_read_loop
end
private
@ -122,10 +118,13 @@ module GRPC
logger . debug ( " each_queued_msg: msg # #{ count } " )
count += 1
req = @readq . pop
logger . debug ( " each_queued_msg: req = #{ req } " )
throw req if req . is_a? StandardError
break if req . equal? ( END_OF_READS )
yield req
end
@loop_th . join
@enq_th . join
end
# during bidi-streaming, read the requests to send from a separate thread
@ -136,20 +135,23 @@ module GRPC
begin
count = 0
requests . each do | req |
logger . debug ( " bidi-write_loop: #{ count } " )
count += 1
payload = @marshal . call ( req )
@call . run_batch ( @cq , write_tag , INFINITE_FUTURE ,
SEND_MESSAGE = > payload )
end
if is_client
logger . debug ( " bidi-client: sent #{ count } reqs, waiting to finish " )
@call . run_batch ( @cq , write_tag , INFINITE_FUTURE ,
SEND_CLOSE_FROM_CLIENT = > nil ,
RECV_STATUS_ON_CLIENT = > nil )
logger . debug ( " bidi-write-loop: sent #{ count } , waiting to finish " )
batch_result = @call . run_batch ( @cq , write_tag , INFINITE_FUTURE ,
SEND_CLOSE_FROM_CLIENT = > nil ,
RECV_STATUS_ON_CLIENT = > nil )
batch_result . check_status
end
rescue StandardError = > e
logger . warn ( 'bidi: write_loop failed' )
logger . warn ( 'bidi-write_loop: failed' )
logger . warn ( e )
raise e
end
end
end
@ -163,7 +165,7 @@ module GRPC
# queue the initial read before beginning the loop
loop do
logger . debug ( " waiting for read #{ count } " )
logger . debug ( " bidi-read_loop: #{ count } " )
count += 1
# TODO: ensure metadata is read if available, currently it's not
batch_result = @call . run_batch ( @cq , read_tag , INFINITE_FUTURE ,
@ -171,7 +173,7 @@ module GRPC
# handle the next message
if batch_result . message . nil?
@readq . push ( END_OF_READS )
logger . debug ( 'done reading!' )
logger . debug ( 'bidi-read-loop: done reading!' )
break
end