|
|
@ -22,11 +22,15 @@ |
|
|
|
|
|
|
|
|
|
|
|
#include <grpc/support/alloc.h> |
|
|
|
#include <grpc/support/alloc.h> |
|
|
|
#include <grpc/support/log.h> |
|
|
|
#include <grpc/support/log.h> |
|
|
|
|
|
|
|
#include <grpc/support/string_util.h> |
|
|
|
|
|
|
|
|
|
|
|
#include "src/core/lib/channel/channel_args.h" |
|
|
|
#include "src/core/lib/channel/channel_args.h" |
|
|
|
#include "src/core/lib/channel/handshaker.h" |
|
|
|
#include "src/core/lib/channel/handshaker.h" |
|
|
|
|
|
|
|
#include "src/core/lib/debug/trace.h" |
|
|
|
#include "src/core/lib/iomgr/timer.h" |
|
|
|
#include "src/core/lib/iomgr/timer.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
grpc_core::TraceFlag grpc_handshaker_trace(false, "handshaker"); |
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// grpc_handshaker
|
|
|
|
// grpc_handshaker
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -52,6 +56,10 @@ void grpc_handshaker_do_handshake(grpc_handshaker* handshaker, |
|
|
|
args); |
|
|
|
args); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char* grpc_handshaker_name(grpc_handshaker* handshaker) { |
|
|
|
|
|
|
|
return handshaker->vtable->name; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// grpc_handshake_manager
|
|
|
|
// grpc_handshake_manager
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -127,6 +135,12 @@ static bool is_power_of_2(size_t n) { return (n & (n - 1)) == 0; } |
|
|
|
|
|
|
|
|
|
|
|
void grpc_handshake_manager_add(grpc_handshake_manager* mgr, |
|
|
|
void grpc_handshake_manager_add(grpc_handshake_manager* mgr, |
|
|
|
grpc_handshaker* handshaker) { |
|
|
|
grpc_handshaker* handshaker) { |
|
|
|
|
|
|
|
if (grpc_handshaker_trace.enabled()) { |
|
|
|
|
|
|
|
gpr_log( |
|
|
|
|
|
|
|
GPR_DEBUG, |
|
|
|
|
|
|
|
"handshake_manager %p: adding handshaker %s [%p] at index %" PRIuPTR, |
|
|
|
|
|
|
|
mgr, grpc_handshaker_name(handshaker), handshaker, mgr->count); |
|
|
|
|
|
|
|
} |
|
|
|
gpr_mu_lock(&mgr->mu); |
|
|
|
gpr_mu_lock(&mgr->mu); |
|
|
|
// To avoid allocating memory for each handshaker we add, we double
|
|
|
|
// To avoid allocating memory for each handshaker we add, we double
|
|
|
|
// the number of elements every time we need more.
|
|
|
|
// the number of elements every time we need more.
|
|
|
@ -172,23 +186,53 @@ void grpc_handshake_manager_shutdown(grpc_handshake_manager* mgr, |
|
|
|
GRPC_ERROR_UNREF(why); |
|
|
|
GRPC_ERROR_UNREF(why); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static char* handshaker_args_string(grpc_handshaker_args* args) { |
|
|
|
|
|
|
|
char* args_str = grpc_channel_args_string(args->args); |
|
|
|
|
|
|
|
char* str; |
|
|
|
|
|
|
|
gpr_asprintf(&str, |
|
|
|
|
|
|
|
"{endpoint=%p, args=%p {size=%" PRIuPTR |
|
|
|
|
|
|
|
": %s}, read_buffer=%p (length=%" PRIuPTR "), exit_early=%d}", |
|
|
|
|
|
|
|
args->endpoint, args->args, args->args->num_args, args_str, |
|
|
|
|
|
|
|
args->read_buffer, args->read_buffer->length, args->exit_early); |
|
|
|
|
|
|
|
gpr_free(args_str); |
|
|
|
|
|
|
|
return str; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Helper function to call either the next handshaker or the
|
|
|
|
// Helper function to call either the next handshaker or the
|
|
|
|
// on_handshake_done callback.
|
|
|
|
// on_handshake_done callback.
|
|
|
|
// Returns true if we've scheduled the on_handshake_done callback.
|
|
|
|
// Returns true if we've scheduled the on_handshake_done callback.
|
|
|
|
static bool call_next_handshaker_locked(grpc_handshake_manager* mgr, |
|
|
|
static bool call_next_handshaker_locked(grpc_handshake_manager* mgr, |
|
|
|
grpc_error* error) { |
|
|
|
grpc_error* error) { |
|
|
|
|
|
|
|
if (grpc_handshaker_trace.enabled()) { |
|
|
|
|
|
|
|
char* args_str = handshaker_args_string(&mgr->args); |
|
|
|
|
|
|
|
gpr_log(GPR_DEBUG, |
|
|
|
|
|
|
|
"handshake_manager %p: error=%s shutdown=%d index=%" PRIuPTR |
|
|
|
|
|
|
|
", args=%s", |
|
|
|
|
|
|
|
mgr, grpc_error_string(error), mgr->shutdown, mgr->index, args_str); |
|
|
|
|
|
|
|
gpr_free(args_str); |
|
|
|
|
|
|
|
} |
|
|
|
GPR_ASSERT(mgr->index <= mgr->count); |
|
|
|
GPR_ASSERT(mgr->index <= mgr->count); |
|
|
|
// If we got an error or we've been shut down or we're exiting early or
|
|
|
|
// If we got an error or we've been shut down or we're exiting early or
|
|
|
|
// we've finished the last handshaker, invoke the on_handshake_done
|
|
|
|
// we've finished the last handshaker, invoke the on_handshake_done
|
|
|
|
// callback. Otherwise, call the next handshaker.
|
|
|
|
// callback. Otherwise, call the next handshaker.
|
|
|
|
if (error != GRPC_ERROR_NONE || mgr->shutdown || mgr->args.exit_early || |
|
|
|
if (error != GRPC_ERROR_NONE || mgr->shutdown || mgr->args.exit_early || |
|
|
|
mgr->index == mgr->count) { |
|
|
|
mgr->index == mgr->count) { |
|
|
|
|
|
|
|
if (grpc_handshaker_trace.enabled()) { |
|
|
|
|
|
|
|
gpr_log(GPR_DEBUG, "handshake_manager %p: handshaking complete", mgr); |
|
|
|
|
|
|
|
} |
|
|
|
// Cancel deadline timer, since we're invoking the on_handshake_done
|
|
|
|
// Cancel deadline timer, since we're invoking the on_handshake_done
|
|
|
|
// callback now.
|
|
|
|
// callback now.
|
|
|
|
grpc_timer_cancel(&mgr->deadline_timer); |
|
|
|
grpc_timer_cancel(&mgr->deadline_timer); |
|
|
|
GRPC_CLOSURE_SCHED(&mgr->on_handshake_done, error); |
|
|
|
GRPC_CLOSURE_SCHED(&mgr->on_handshake_done, error); |
|
|
|
mgr->shutdown = true; |
|
|
|
mgr->shutdown = true; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
|
|
|
|
if (grpc_handshaker_trace.enabled()) { |
|
|
|
|
|
|
|
gpr_log( |
|
|
|
|
|
|
|
GPR_DEBUG, |
|
|
|
|
|
|
|
"handshake_manager %p: calling handshaker %s [%p] at index %" PRIuPTR, |
|
|
|
|
|
|
|
mgr, grpc_handshaker_name(mgr->handshakers[mgr->index]), |
|
|
|
|
|
|
|
mgr->handshakers[mgr->index], mgr->index); |
|
|
|
|
|
|
|
} |
|
|
|
grpc_handshaker_do_handshake(mgr->handshakers[mgr->index], mgr->acceptor, |
|
|
|
grpc_handshaker_do_handshake(mgr->handshakers[mgr->index], mgr->acceptor, |
|
|
|
&mgr->call_next_handshaker, &mgr->args); |
|
|
|
&mgr->call_next_handshaker, &mgr->args); |
|
|
|
} |
|
|
|
} |
|
|
|