Merge pull request #8980 from markdroth/handshaker_early_exit

Provide a way to exit handshaking early without an error.
pull/9019/head
Mark D. Roth 8 years ago committed by GitHub
commit aa6f24b81b
  1. 22
      src/core/ext/transport/chttp2/server/chttp2_server.c
  2. 9
      src/core/lib/channel/handshaker.c
  3. 3
      src/core/lib/channel/handshaker.h

@ -139,7 +139,7 @@ static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
const char *error_str = grpc_error_string(error); const char *error_str = grpc_error_string(error);
gpr_log(GPR_ERROR, "Handshaking failed: %s", error_str); gpr_log(GPR_ERROR, "Handshaking failed: %s", error_str);
grpc_error_free_string(error_str); grpc_error_free_string(error_str);
if (error == GRPC_ERROR_NONE) { if (error == GRPC_ERROR_NONE && args->endpoint != NULL) {
// We were shut down after handshaking completed successfully, so // We were shut down after handshaking completed successfully, so
// destroy the endpoint here. // destroy the endpoint here.
// TODO(ctiller): It is currently necessary to shutdown endpoints // TODO(ctiller): It is currently necessary to shutdown endpoints
@ -153,13 +153,19 @@ static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
gpr_free(args->read_buffer); gpr_free(args->read_buffer);
} }
} else { } else {
grpc_transport *transport = // If the handshaking succeeded but there is no endpoint, then the
grpc_create_chttp2_transport(exec_ctx, args->args, args->endpoint, 0); // handshaker may have handed off the connection to some external
grpc_server_setup_transport( // code, so we can just clean up here without creating a transport.
exec_ctx, connection_state->server_state->server, transport, if (args->endpoint != NULL) {
connection_state->accepting_pollset, args->args); grpc_transport *transport =
grpc_chttp2_transport_start_reading(exec_ctx, transport, args->read_buffer); grpc_create_chttp2_transport(exec_ctx, args->args, args->endpoint, 0);
grpc_channel_args_destroy(args->args); grpc_server_setup_transport(
exec_ctx, connection_state->server_state->server, transport,
connection_state->accepting_pollset, args->args);
grpc_chttp2_transport_start_reading(exec_ctx, transport,
args->read_buffer);
grpc_channel_args_destroy(args->args);
}
} }
pending_handshake_manager_remove_locked(connection_state->server_state, pending_handshake_manager_remove_locked(connection_state->server_state,
connection_state->handshake_mgr); connection_state->handshake_mgr);

@ -157,10 +157,11 @@ static bool call_next_handshaker_locked(grpc_exec_ctx* exec_ctx,
grpc_handshake_manager* mgr, grpc_handshake_manager* mgr,
grpc_error* error) { grpc_error* error) {
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've finished the last // If we got an error or we've been shut down or we're exiting early or
// handshaker, invoke the on_handshake_done callback. Otherwise, call the // we've finished the last handshaker, invoke the on_handshake_done
// next handshaker. // callback. Otherwise, call the next handshaker.
if (error != GRPC_ERROR_NONE || mgr->shutdown || mgr->index == mgr->count) { if (error != GRPC_ERROR_NONE || mgr->shutdown || mgr->args.exit_early ||
mgr->index == mgr->count) {
// 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(exec_ctx, &mgr->deadline_timer); grpc_timer_cancel(exec_ctx, &mgr->deadline_timer);

@ -72,6 +72,9 @@ typedef struct {
grpc_endpoint* endpoint; grpc_endpoint* endpoint;
grpc_channel_args* args; grpc_channel_args* args;
grpc_slice_buffer* read_buffer; grpc_slice_buffer* read_buffer;
// A handshaker may set this to true before invoking on_handshake_done
// to indicate that subsequent handshakers should be skipped.
bool exit_early;
// User data passed through the handshake manager. Not used by // User data passed through the handshake manager. Not used by
// individual handshakers. // individual handshakers.
void* user_data; void* user_data;

Loading…
Cancel
Save