nghttpx: Refactor h1 backend retry code
This commit is contained in:
parent
c4aeadd57d
commit
bcfa333322
|
@ -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;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue