nghttpx: Refactor h1 backend retry code

This commit is contained in:
Tatsuhiro Tsujikawa 2016-12-25 22:18:25 +09:00
parent c4aeadd57d
commit bcfa333322
1 changed files with 32 additions and 50 deletions

View File

@ -118,16 +118,17 @@ void readcb(struct ev_loop *loop, ev_io *w, int revents) {
} // namespace } // namespace
namespace { namespace {
void writecb(struct ev_loop *loop, ev_io *w, int revents) { void backend_retry(Downstream *downstream) {
int rv;
auto conn = static_cast<Connection *>(w->data);
auto dconn = static_cast<HttpDownstreamConnection *>(conn->data);
auto downstream = dconn->get_downstream();
auto upstream = downstream->get_upstream(); auto upstream = downstream->get_upstream();
auto handler = upstream->get_client_handler(); auto handler = upstream->get_client_handler();
rv = upstream->downstream_write(dconn); downstream->add_retry();
if (rv == SHRPX_ERR_RETRY) {
if (downstream->no_more_retry()) {
delete handler;
return;
}
downstream->pop_downstream_connection(); downstream->pop_downstream_connection();
auto ndconn = handler->get_downstream_connection(downstream); auto ndconn = handler->get_downstream_connection(downstream);
@ -142,6 +143,21 @@ void writecb(struct ev_loop *loop, ev_io *w, int revents) {
if (upstream->on_downstream_abort_request(downstream, 503) != 0) { if (upstream->on_downstream_abort_request(downstream, 503) != 0) {
delete handler; delete handler;
} }
}
} // namespace
namespace {
void writecb(struct ev_loop *loop, ev_io *w, int revents) {
int rv;
auto conn = static_cast<Connection *>(w->data);
auto dconn = static_cast<HttpDownstreamConnection *>(conn->data);
auto downstream = dconn->get_downstream();
auto upstream = downstream->get_upstream();
auto handler = upstream->get_client_handler();
rv = upstream->downstream_write(dconn);
if (rv == SHRPX_ERR_RETRY) {
backend_retry(downstream);
return; return;
} }
@ -156,23 +172,8 @@ void connectcb(struct ev_loop *loop, ev_io *w, int revents) {
auto conn = static_cast<Connection *>(w->data); auto conn = static_cast<Connection *>(w->data);
auto dconn = static_cast<HttpDownstreamConnection *>(conn->data); auto dconn = static_cast<HttpDownstreamConnection *>(conn->data);
auto downstream = dconn->get_downstream(); auto downstream = dconn->get_downstream();
auto upstream = downstream->get_upstream();
auto handler = upstream->get_client_handler();
if (dconn->connected() != 0) { if (dconn->connected() != 0) {
downstream->pop_downstream_connection(); backend_retry(downstream);
auto ndconn = handler->get_downstream_connection(downstream);
if (ndconn) {
if (downstream->attach_downstream_connection(std::move(ndconn)) == 0) {
return;
}
}
downstream->set_request_state(Downstream::CONNECT_FAIL);
if (upstream->on_downstream_abort_request(downstream, 503) != 0) {
delete handler;
}
return; return;
} }
writecb(loop, w, revents); writecb(loop, w, revents);
@ -314,26 +315,7 @@ int HttpDownstreamConnection::initiate_connection() {
if (rv != 0) { if (rv != 0) {
// This callback destroys |this|. // This callback destroys |this|.
auto downstream = this->downstream_; auto downstream = this->downstream_;
auto upstream = downstream->get_upstream(); backend_retry(downstream);
auto handler = upstream->get_client_handler();
downstream->pop_downstream_connection();
auto ndconn = handler->get_downstream_connection(downstream);
if (ndconn) {
if (downstream->attach_downstream_connection(
std::move(ndconn)) == 0) {
return;
}
}
downstream->set_request_state(Downstream::CONNECT_FAIL);
if (upstream->on_downstream_abort_request(downstream, 503) !=
0) {
delete handler;
}
return;
} }
}); });