nghttpx: Fix busy loop when HTTP/2 backend reset after connection established
We have now Downstream retry count to be limited to 5 times. At 6th failure, we send 503 message to client.
This commit is contained in:
parent
d37fc8f3a6
commit
b707cfe986
|
@ -112,8 +112,8 @@ Downstream::Downstream(Upstream *upstream, int32_t stream_id, int32_t priority)
|
|||
request_bodylen_(0), response_bodylen_(0), response_sent_bodylen_(0),
|
||||
request_content_length_(-1), response_content_length_(-1),
|
||||
upstream_(upstream), request_headers_sum_(0), response_headers_sum_(0),
|
||||
request_datalen_(0), response_datalen_(0), stream_id_(stream_id),
|
||||
priority_(priority), downstream_stream_id_(-1),
|
||||
request_datalen_(0), response_datalen_(0), num_retry_(0),
|
||||
stream_id_(stream_id), priority_(priority), downstream_stream_id_(-1),
|
||||
response_rst_stream_error_code_(NGHTTP2_NO_ERROR),
|
||||
request_state_(INITIAL), request_major_(1), request_minor_(1),
|
||||
response_state_(INITIAL), response_http_status_(0), response_major_(1),
|
||||
|
@ -1020,4 +1020,8 @@ void Downstream::disable_downstream_wtimer() {
|
|||
|
||||
bool Downstream::accesslog_ready() const { return response_http_status_ > 0; }
|
||||
|
||||
void Downstream::add_retry() { ++num_retry_; }
|
||||
|
||||
bool Downstream::no_more_retry() const { return num_retry_ > 5; }
|
||||
|
||||
} // namespace shrpx
|
||||
|
|
|
@ -289,6 +289,11 @@ public:
|
|||
// Returns true if accesslog can be written for this downstream.
|
||||
bool accesslog_ready() const;
|
||||
|
||||
// Increment retry count
|
||||
void add_retry();
|
||||
// true if retry attempt should not be done.
|
||||
bool no_more_retry() const;
|
||||
|
||||
enum {
|
||||
EVENT_ERROR = 0x1,
|
||||
EVENT_TIMEOUT = 0x2,
|
||||
|
@ -338,6 +343,8 @@ private:
|
|||
size_t request_datalen_;
|
||||
size_t response_datalen_;
|
||||
|
||||
size_t num_retry_;
|
||||
|
||||
int32_t stream_id_;
|
||||
int32_t priority_;
|
||||
// stream ID in backend connection
|
||||
|
|
|
@ -1420,7 +1420,9 @@ int Http2Upstream::on_downstream_reset(bool no_retry) {
|
|||
|
||||
downstream->pop_downstream_connection();
|
||||
|
||||
if (no_retry) {
|
||||
downstream->add_retry();
|
||||
|
||||
if (no_retry || downstream->no_more_retry()) {
|
||||
if (on_downstream_abort_request(downstream, 503) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -836,15 +836,17 @@ int HttpsUpstream::on_downstream_reset(bool no_retry) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (no_retry) {
|
||||
downstream_->pop_downstream_connection();
|
||||
|
||||
downstream_->add_retry();
|
||||
|
||||
if (no_retry || downstream_->no_more_retry()) {
|
||||
if (on_downstream_abort_request(downstream_.get(), 503) != 0) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
downstream_->pop_downstream_connection();
|
||||
|
||||
rv = downstream_->attach_downstream_connection(
|
||||
handler_->get_downstream_connection());
|
||||
if (rv != 0) {
|
||||
|
|
|
@ -1051,7 +1051,9 @@ int SpdyUpstream::on_downstream_reset(bool no_retry) {
|
|||
|
||||
downstream->pop_downstream_connection();
|
||||
|
||||
if (no_retry) {
|
||||
downstream->add_retry();
|
||||
|
||||
if (no_retry || downstream->no_more_retry()) {
|
||||
if (on_downstream_abort_request(downstream, 503) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue