|
|
|
@ -33,6 +33,7 @@ |
|
|
|
|
#include "src/core/lib/gpr/string.h" |
|
|
|
|
#include "src/core/lib/iomgr/iomgr_internal.h" |
|
|
|
|
#include "src/core/lib/iomgr/sockaddr_utils.h" |
|
|
|
|
#include "src/core/lib/iomgr/timer.h" |
|
|
|
|
|
|
|
|
|
typedef struct fd_node { |
|
|
|
|
/** the owner of this fd node */ |
|
|
|
@ -76,6 +77,12 @@ struct grpc_ares_ev_driver { |
|
|
|
|
grpc_ares_request* request; |
|
|
|
|
/** Owned by the ev_driver. Creates new GrpcPolledFd's */ |
|
|
|
|
grpc_core::UniquePtr<grpc_core::GrpcPolledFdFactory> polled_fd_factory; |
|
|
|
|
/** query timeout in milliseconds */ |
|
|
|
|
int query_timeout_ms; |
|
|
|
|
/** alarm to cancel active queries */ |
|
|
|
|
grpc_timer query_timeout; |
|
|
|
|
/** cancels queries on a timeout */ |
|
|
|
|
grpc_closure on_timeout_locked; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void grpc_ares_notify_on_event_locked(grpc_ares_ev_driver* ev_driver); |
|
|
|
@ -116,8 +123,11 @@ static void fd_node_shutdown_locked(fd_node* fdn, const char* reason) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void on_timeout_locked(void* arg, grpc_error* error); |
|
|
|
|
|
|
|
|
|
grpc_error* grpc_ares_ev_driver_create_locked(grpc_ares_ev_driver** ev_driver, |
|
|
|
|
grpc_pollset_set* pollset_set, |
|
|
|
|
int query_timeout_ms, |
|
|
|
|
grpc_combiner* combiner, |
|
|
|
|
grpc_ares_request* request) { |
|
|
|
|
*ev_driver = grpc_core::New<grpc_ares_ev_driver>(); |
|
|
|
@ -146,6 +156,9 @@ grpc_error* grpc_ares_ev_driver_create_locked(grpc_ares_ev_driver** ev_driver, |
|
|
|
|
grpc_core::NewGrpcPolledFdFactory((*ev_driver)->combiner); |
|
|
|
|
(*ev_driver) |
|
|
|
|
->polled_fd_factory->ConfigureAresChannelLocked((*ev_driver)->channel); |
|
|
|
|
GRPC_CLOSURE_INIT(&(*ev_driver)->on_timeout_locked, on_timeout_locked, |
|
|
|
|
*ev_driver, grpc_combiner_scheduler(combiner)); |
|
|
|
|
(*ev_driver)->query_timeout_ms = query_timeout_ms; |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -155,6 +168,7 @@ void grpc_ares_ev_driver_on_queries_complete_locked( |
|
|
|
|
// is working, grpc_ares_notify_on_event_locked will shut down the
|
|
|
|
|
// fds; if it's not working, there are no fds to shut down.
|
|
|
|
|
ev_driver->shutting_down = true; |
|
|
|
|
grpc_timer_cancel(&ev_driver->query_timeout); |
|
|
|
|
grpc_ares_ev_driver_unref(ev_driver); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -185,6 +199,17 @@ static fd_node* pop_fd_node_locked(fd_node** head, ares_socket_t as) { |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void on_timeout_locked(void* arg, grpc_error* error) { |
|
|
|
|
grpc_ares_ev_driver* driver = static_cast<grpc_ares_ev_driver*>(arg); |
|
|
|
|
GRPC_CARES_TRACE_LOG( |
|
|
|
|
"ev_driver=%p on_timeout_locked. driver->shutting_down=%d. err=%s", |
|
|
|
|
driver, driver->shutting_down, grpc_error_string(error)); |
|
|
|
|
if (!driver->shutting_down && error == GRPC_ERROR_NONE) { |
|
|
|
|
grpc_ares_ev_driver_shutdown_locked(driver); |
|
|
|
|
} |
|
|
|
|
grpc_ares_ev_driver_unref(driver); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void on_readable_locked(void* arg, grpc_error* error) { |
|
|
|
|
fd_node* fdn = static_cast<fd_node*>(arg); |
|
|
|
|
grpc_ares_ev_driver* ev_driver = fdn->ev_driver; |
|
|
|
@ -314,6 +339,17 @@ void grpc_ares_ev_driver_start_locked(grpc_ares_ev_driver* ev_driver) { |
|
|
|
|
if (!ev_driver->working) { |
|
|
|
|
ev_driver->working = true; |
|
|
|
|
grpc_ares_notify_on_event_locked(ev_driver); |
|
|
|
|
grpc_millis timeout = |
|
|
|
|
ev_driver->query_timeout_ms == 0 |
|
|
|
|
? GRPC_MILLIS_INF_FUTURE |
|
|
|
|
: ev_driver->query_timeout_ms + grpc_core::ExecCtx::Get()->Now(); |
|
|
|
|
GRPC_CARES_TRACE_LOG( |
|
|
|
|
"ev_driver=%p grpc_ares_ev_driver_start_locked. timeout in %" PRId64 |
|
|
|
|
" ms", |
|
|
|
|
ev_driver, timeout); |
|
|
|
|
grpc_ares_ev_driver_ref(ev_driver); |
|
|
|
|
grpc_timer_init(&ev_driver->query_timeout, timeout, |
|
|
|
|
&ev_driver->on_timeout_locked); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|