From 6a6d618034fe01b00aa192f2fb44bc9f305f0519 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 22 Aug 2017 13:43:38 -0700 Subject: Prevent watching unsuppoted channels --- include/grpc/grpc.h | 3 +++ src/core/ext/filters/client_channel/channel_connectivity.c | 6 ++++++ src/cpp/client/channel_cc.cc | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 943d6e4891..5b1406b4ab 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -178,6 +178,9 @@ GRPCAPI void grpc_channel_watch_connectivity_state( grpc_channel *channel, grpc_connectivity_state last_observed_state, gpr_timespec deadline, grpc_completion_queue *cq, void *tag); +/** Check whether a grpc channel support connectivity watcher */ +GRPCAPI int grpc_channel_support_connectivity_watcher(grpc_channel *channel); + /** Create a call given a grpc_channel, in order to call 'method'. All completions are sent to 'completion_queue'. 'method' and 'host' need only live through the invocation of this function. diff --git a/src/core/ext/filters/client_channel/channel_connectivity.c b/src/core/ext/filters/client_channel/channel_connectivity.c index b83c95275f..0a9e90d12e 100644 --- a/src/core/ext/filters/client_channel/channel_connectivity.c +++ b/src/core/ext/filters/client_channel/channel_connectivity.c @@ -191,6 +191,12 @@ static void watcher_timer_init(grpc_exec_ctx *exec_ctx, void *arg, gpr_free(wa); } +int grpc_channel_support_connectivity_watcher(grpc_channel *channel) { + grpc_channel_element *client_channel_elem = + grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel)); + return client_channel_elem->filter != &grpc_client_channel_filter ? 0 : 1; +} + void grpc_channel_watch_connectivity_state( grpc_channel *channel, grpc_connectivity_state last_observed_state, gpr_timespec deadline, grpc_completion_queue *cq, void *tag) { diff --git a/src/cpp/client/channel_cc.cc b/src/cpp/client/channel_cc.cc index 78f5de0d04..7c52752bd9 100644 --- a/src/cpp/client/channel_cc.cc +++ b/src/cpp/client/channel_cc.cc @@ -101,7 +101,7 @@ Channel::Channel(const grpc::string& host, grpc_channel* channel) host_(host), c_channel_(channel) { g_gli_initializer.summon(); - if (host != "inproc") { + if (grpc_channel_support_connectivity_watcher(channel)) { connectivity_watcher_->StartWatching(); } } -- cgit v1.2.3