make get conn state always safe to call

pull/11204/head
Alexander Polcyn 8 years ago
parent c24d53b0cf
commit d7455abfbd
  1. 7
      src/ruby/end2end/multiple_killed_watching_threads_driver.rb
  2. 12
      src/ruby/ext/grpc/rb_channel.c

@ -46,10 +46,17 @@ def watch_state(ch)
end end
def main def main
channels = []
10.times do 10.times do
ch = GRPC::Core::Channel.new('dummy_host', ch = GRPC::Core::Channel.new('dummy_host',
nil, :this_channel_is_insecure) nil, :this_channel_is_insecure)
watch_state(ch) watch_state(ch)
channels << ch
end
# checking state should still be safe to call
channels.each do |c|
fail unless c.connectivity_state(false) == FATAL_FAILURE
end end
end end

@ -273,7 +273,7 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) {
} }
typedef struct get_state_stack { typedef struct get_state_stack {
grpc_channel *channel; bg_watched_channel *bg;
int try_to_connect; int try_to_connect;
int out; int out;
} get_state_stack; } get_state_stack;
@ -283,14 +283,10 @@ static void *get_state_without_gil(void *arg) {
gpr_mu_lock(&global_connection_polling_mu); gpr_mu_lock(&global_connection_polling_mu);
GPR_ASSERT(abort_channel_polling || channel_polling_thread_started); GPR_ASSERT(abort_channel_polling || channel_polling_thread_started);
if (abort_channel_polling) { if (stack->bg->channel_destroyed) {
// Assume that this channel has been destroyed by the
// background thread.
// The case in which the channel polling thread
// failed to start just always shows shutdown state.
stack->out = GRPC_CHANNEL_SHUTDOWN; stack->out = GRPC_CHANNEL_SHUTDOWN;
} else { } else {
stack->out = grpc_channel_check_connectivity_state(stack->channel, stack->out = grpc_channel_check_connectivity_state(stack->bg->channel,
stack->try_to_connect); stack->try_to_connect);
} }
gpr_mu_unlock(&global_connection_polling_mu); gpr_mu_unlock(&global_connection_polling_mu);
@ -322,7 +318,7 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv,
return Qnil; return Qnil;
} }
stack.channel = wrapper->bg_wrapped->channel; stack.bg = wrapper->bg_wrapped;
stack.try_to_connect = RTEST(try_to_connect_param) ? 1 : 0; stack.try_to_connect = RTEST(try_to_connect_param) ? 1 : 0;
rb_thread_call_without_gvl(get_state_without_gil, &stack, NULL, NULL); rb_thread_call_without_gvl(get_state_without_gil, &stack, NULL, NULL);

Loading…
Cancel
Save