nghttpx: Call downstream_failure where it should be

Also, we say connection succeeded only when we got SETTINGS ACK from
peer, rather than when we just connected to the peer in TCP or TLS.
This commit is contained in:
Tatsuhiro Tsujikawa 2016-05-21 10:30:09 +09:00
parent 2a3b6c11eb
commit e99f3c58f7
1 changed files with 25 additions and 24 deletions

View File

@ -93,9 +93,7 @@ void settings_timeout_cb(struct ev_loop *loop, ev_timer *w, int revents) {
http2session->stop_settings_timer(); http2session->stop_settings_timer();
SSLOG(INFO, http2session) << "SETTINGS timeout"; SSLOG(INFO, http2session) << "SETTINGS timeout";
auto addr = http2session->get_addr(); downstream_failure(http2session->get_addr());
auto &connect_blocker = addr->connect_blocker;
connect_blocker->on_failure();
if (http2session->terminate_session(NGHTTP2_SETTINGS_TIMEOUT) != 0) { if (http2session->terminate_session(NGHTTP2_SETTINGS_TIMEOUT) != 0) {
delete http2session; delete http2session;
@ -295,8 +293,6 @@ int Http2Session::initiate_connection() {
} }
} }
auto &connect_blocker = addr_->connect_blocker;
const auto &proxy = get_config()->downstream_http_proxy; const auto &proxy = get_config()->downstream_http_proxy;
if (!proxy.host.empty() && state_ == DISCONNECTED) { if (!proxy.host.empty() && state_ == DISCONNECTED) {
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
@ -316,8 +312,6 @@ int Http2Session::initiate_connection() {
return -1; return -1;
} }
worker_blocker->on_success();
rv = connect(conn_.fd, &proxy.addr.su.sa, proxy.addr.len); rv = connect(conn_.fd, &proxy.addr.su.sa, proxy.addr.len);
if (rv != 0 && errno != EINPROGRESS) { if (rv != 0 && errno != EINPROGRESS) {
auto error = errno; auto error = errno;
@ -325,10 +319,13 @@ int Http2Session::initiate_connection() {
<< util::to_numeric_addr(&proxy.addr) << util::to_numeric_addr(&proxy.addr)
<< ", errno=" << error; << ", errno=" << error;
connect_blocker->on_failure(); worker_blocker->on_failure();
return -1; return -1;
} }
worker_blocker->on_success();
ev_io_set(&conn_.rev, conn_.fd, EV_READ); ev_io_set(&conn_.rev, conn_.fd, EV_READ);
ev_io_set(&conn_.wev, conn_.fd, EV_WRITE); ev_io_set(&conn_.wev, conn_.fd, EV_WRITE);
@ -410,7 +407,7 @@ int Http2Session::initiate_connection() {
<< util::to_numeric_addr(&addr_->addr) << util::to_numeric_addr(&addr_->addr)
<< ", errno=" << error; << ", errno=" << error;
connect_blocker->on_failure(); downstream_failure(addr_);
return -1; return -1;
} }
@ -447,7 +444,7 @@ int Http2Session::initiate_connection() {
<< util::to_numeric_addr(&addr_->addr) << util::to_numeric_addr(&addr_->addr)
<< ", errno=" << error; << ", errno=" << error;
connect_blocker->on_failure(); downstream_failure(addr_);
return -1; return -1;
} }
@ -759,6 +756,10 @@ int on_stream_close_callback(nghttp2_session *session, int32_t stream_id,
} // namespace } // namespace
void Http2Session::start_settings_timer() { void Http2Session::start_settings_timer() {
if (ev_is_active(&settings_timer_)) {
return;
}
ev_timer_again(conn_.loop, &settings_timer_); ev_timer_again(conn_.loop, &settings_timer_);
} }
@ -1157,12 +1158,20 @@ int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame,
} }
return 0; return 0;
} }
case NGHTTP2_SETTINGS: case NGHTTP2_SETTINGS: {
if ((frame->hd.flags & NGHTTP2_FLAG_ACK) == 0) { if ((frame->hd.flags & NGHTTP2_FLAG_ACK) == 0) {
return 0; return 0;
} }
http2session->stop_settings_timer(); http2session->stop_settings_timer();
auto addr = http2session->get_addr();
auto &connect_blocker = addr->connect_blocker;
connect_blocker->on_success();
return 0; return 0;
}
case NGHTTP2_PING: case NGHTTP2_PING:
if (frame->hd.flags & NGHTTP2_FLAG_ACK) { if (frame->hd.flags & NGHTTP2_FLAG_ACK) {
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
@ -1531,6 +1540,8 @@ int Http2Session::connection_made() {
auto must_terminate = auto must_terminate =
shared_addr->tls && !nghttp2::ssl::check_http2_requirement(conn_.tls.ssl); shared_addr->tls && !nghttp2::ssl::check_http2_requirement(conn_.tls.ssl);
reset_connection_check_timer(CONNCHK_TIMEOUT);
if (must_terminate) { if (must_terminate) {
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
LOG(INFO) << "TLSv1.2 was not negotiated. HTTP/2 must not be negotiated."; LOG(INFO) << "TLSv1.2 was not negotiated. HTTP/2 must not be negotiated.";
@ -1541,16 +1552,10 @@ int Http2Session::connection_made() {
if (rv != 0) { if (rv != 0) {
return -1; return -1;
} }
} else {
submit_pending_requests();
} }
if (must_terminate) {
return 0;
}
reset_connection_check_timer(CONNCHK_TIMEOUT);
submit_pending_requests();
signal_write(); signal_write();
return 0; return 0;
} }
@ -1569,7 +1574,7 @@ int Http2Session::downstream_read(const uint8_t *data, size_t datalen) {
rv = nghttp2_session_mem_recv(session_, data, datalen); rv = nghttp2_session_mem_recv(session_, data, datalen);
if (rv < 0) { if (rv < 0) {
SSLOG(ERROR, this) << "nghttp2_session_recv() returned error: " SSLOG(ERROR, this) << "nghttp2_session_mem_recv() returned error: "
<< nghttp2_strerror(rv); << nghttp2_strerror(rv);
return -1; return -1;
} }
@ -1768,8 +1773,6 @@ int Http2Session::read_noop(const uint8_t *data, size_t datalen) { return 0; }
int Http2Session::write_noop() { return 0; } int Http2Session::write_noop() { return 0; }
int Http2Session::connected() { int Http2Session::connected() {
auto &connect_blocker = addr_->connect_blocker;
if (!util::check_socket_connected(conn_.fd)) { if (!util::check_socket_connected(conn_.fd)) {
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
SSLOG(INFO, this) << "Backend connect failed; addr=" SSLOG(INFO, this) << "Backend connect failed; addr="
@ -1781,8 +1784,6 @@ int Http2Session::connected() {
return -1; return -1;
} }
connect_blocker->on_success();
if (LOG_ENABLED(INFO)) { if (LOG_ENABLED(INFO)) {
SSLOG(INFO, this) << "Connection established"; SSLOG(INFO, this) << "Connection established";
} }