nghttpx: Minor tweak to buffer size
Simplified when to send WINDOW_UPDATE to the backend, that is we send WINDOW_UPDATE when input buffer is empty.
This commit is contained in:
parent
ec30af9117
commit
3f80472e0a
|
@ -47,6 +47,7 @@ namespace shrpx {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const size_t OUTBUF_MAX_THRES = 64*1024;
|
const size_t OUTBUF_MAX_THRES = 64*1024;
|
||||||
|
const size_t INBUF_MAX_THRES = 64*1024;
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -610,8 +611,8 @@ int Http2Upstream::send()
|
||||||
auto output = bufferevent_get_output(bev);
|
auto output = bufferevent_get_output(bev);
|
||||||
util::EvbufferBuffer evbbuf(output, buf, sizeof(buf));
|
util::EvbufferBuffer evbbuf(output, buf, sizeof(buf));
|
||||||
for(;;) {
|
for(;;) {
|
||||||
// Check buffer length and return WOULDBLOCK if it is large enough.
|
// Check buffer length and break if it is large enough.
|
||||||
if(handler_->get_outbuf_length() + evbbuf.get_buflen() >
|
if(handler_->get_outbuf_length() + evbbuf.get_buflen() >=
|
||||||
OUTBUF_MAX_THRES) {
|
OUTBUF_MAX_THRES) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -903,7 +904,6 @@ ssize_t downstream_data_read_callback(nghttp2_session *session,
|
||||||
{
|
{
|
||||||
auto downstream = static_cast<Downstream*>(source->ptr);
|
auto downstream = static_cast<Downstream*>(source->ptr);
|
||||||
auto upstream = static_cast<Http2Upstream*>(downstream->get_upstream());
|
auto upstream = static_cast<Http2Upstream*>(downstream->get_upstream());
|
||||||
auto handler = upstream->get_client_handler();
|
|
||||||
auto body = downstream->get_response_body_buf();
|
auto body = downstream->get_response_body_buf();
|
||||||
assert(body);
|
assert(body);
|
||||||
|
|
||||||
|
@ -927,16 +927,12 @@ ssize_t downstream_data_read_callback(nghttp2_session *session,
|
||||||
(downstream->get_response_rst_stream_error_code()));
|
(downstream->get_response_rst_stream_error_code()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Send WINDOW_UPDATE before buffer is empty to avoid delay because
|
|
||||||
// of RTT.
|
if(nread == 0 && ((*data_flags) & NGHTTP2_DATA_FLAG_EOF) == 0) {
|
||||||
if(((*data_flags) & NGHTTP2_DATA_FLAG_EOF) == 0 &&
|
|
||||||
handler->get_outbuf_length() + evbuffer_get_length(body) <
|
|
||||||
OUTBUF_MAX_THRES) {
|
|
||||||
if(downstream->resume_read(SHRPX_NO_BUFFER) != 0) {
|
if(downstream->resume_read(SHRPX_NO_BUFFER) != 0) {
|
||||||
return NGHTTP2_ERR_CALLBACK_FAILURE;
|
return NGHTTP2_ERR_CALLBACK_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if(nread == 0 && ((*data_flags) & NGHTTP2_DATA_FLAG_EOF) == 0) {
|
|
||||||
return NGHTTP2_ERR_DEFERRED;
|
return NGHTTP2_ERR_DEFERRED;
|
||||||
}
|
}
|
||||||
return nread;
|
return nread;
|
||||||
|
@ -1105,8 +1101,6 @@ int Http2Upstream::on_downstream_body(Downstream *downstream,
|
||||||
const uint8_t *data, size_t len,
|
const uint8_t *data, size_t len,
|
||||||
bool flush)
|
bool flush)
|
||||||
{
|
{
|
||||||
auto upstream = downstream->get_upstream();
|
|
||||||
auto handler = upstream->get_client_handler();
|
|
||||||
auto body = downstream->get_response_body_buf();
|
auto body = downstream->get_response_body_buf();
|
||||||
int rv = evbuffer_add(body, data, len);
|
int rv = evbuffer_add(body, data, len);
|
||||||
if(rv != 0) {
|
if(rv != 0) {
|
||||||
|
@ -1118,9 +1112,7 @@ int Http2Upstream::on_downstream_body(Downstream *downstream,
|
||||||
nghttp2_session_resume_data(session_, downstream->get_stream_id());
|
nghttp2_session_resume_data(session_, downstream->get_stream_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto outbuflen = handler->get_outbuf_length() +
|
if(evbuffer_get_length(body) >= INBUF_MAX_THRES) {
|
||||||
evbuffer_get_length(body);
|
|
||||||
if(outbuflen > OUTBUF_MAX_THRES) {
|
|
||||||
if(!flush) {
|
if(!flush) {
|
||||||
nghttp2_session_resume_data(session_, downstream->get_stream_id());
|
nghttp2_session_resume_data(session_, downstream->get_stream_id());
|
||||||
}
|
}
|
||||||
|
|
|
@ -405,6 +405,8 @@ void https_downstream_readcb(bufferevent *bev, void *ptr)
|
||||||
if(downstream->get_response_state() == Downstream::MSG_RESET) {
|
if(downstream->get_response_state() == Downstream::MSG_RESET) {
|
||||||
delete upstream->get_client_handler();
|
delete upstream->get_client_handler();
|
||||||
} else if(rv == 0) {
|
} else if(rv == 0) {
|
||||||
|
auto handler = upstream->get_client_handler();
|
||||||
|
|
||||||
if(downstream->get_response_state() == Downstream::MSG_COMPLETE) {
|
if(downstream->get_response_state() == Downstream::MSG_COMPLETE) {
|
||||||
if(downstream->get_response_connection_close()) {
|
if(downstream->get_response_connection_close()) {
|
||||||
// Connection close
|
// Connection close
|
||||||
|
@ -415,7 +417,6 @@ void https_downstream_readcb(bufferevent *bev, void *ptr)
|
||||||
// Keep-alive
|
// Keep-alive
|
||||||
dconn->detach_downstream(downstream);
|
dconn->detach_downstream(downstream);
|
||||||
}
|
}
|
||||||
auto handler = upstream->get_client_handler();
|
|
||||||
if(downstream->get_request_state() == Downstream::MSG_COMPLETE) {
|
if(downstream->get_request_state() == Downstream::MSG_COMPLETE) {
|
||||||
if(handler->get_should_close_after_write() &&
|
if(handler->get_should_close_after_write() &&
|
||||||
handler->get_outbuf_length() == 0) {
|
handler->get_outbuf_length() == 0) {
|
||||||
|
@ -450,8 +451,7 @@ void https_downstream_readcb(bufferevent *bev, void *ptr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(upstream->get_client_handler()->get_outbuf_length() >
|
if(handler->get_outbuf_length() >= OUTBUF_MAX_THRES) {
|
||||||
OUTBUF_MAX_THRES) {
|
|
||||||
downstream->pause_read(SHRPX_NO_BUFFER);
|
downstream->pause_read(SHRPX_NO_BUFFER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@ namespace shrpx {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const size_t OUTBUF_MAX_THRES = 64*1024;
|
const size_t OUTBUF_MAX_THRES = 64*1024;
|
||||||
|
const size_t INBUF_MAX_THRES = 64*1024;
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -58,7 +59,7 @@ ssize_t send_callback(spdylay_session *session,
|
||||||
auto handler = upstream->get_client_handler();
|
auto handler = upstream->get_client_handler();
|
||||||
|
|
||||||
// Check buffer length and return WOULDBLOCK if it is large enough.
|
// Check buffer length and return WOULDBLOCK if it is large enough.
|
||||||
if(handler->get_outbuf_length() + upstream->sendbuf.get_buflen() >
|
if(handler->get_outbuf_length() + upstream->sendbuf.get_buflen() >=
|
||||||
OUTBUF_MAX_THRES) {
|
OUTBUF_MAX_THRES) {
|
||||||
return SPDYLAY_ERR_WOULDBLOCK;
|
return SPDYLAY_ERR_WOULDBLOCK;
|
||||||
}
|
}
|
||||||
|
@ -725,7 +726,6 @@ ssize_t spdy_data_read_callback(spdylay_session *session,
|
||||||
{
|
{
|
||||||
auto downstream = static_cast<Downstream*>(source->ptr);
|
auto downstream = static_cast<Downstream*>(source->ptr);
|
||||||
auto upstream = static_cast<SpdyUpstream*>(downstream->get_upstream());
|
auto upstream = static_cast<SpdyUpstream*>(downstream->get_upstream());
|
||||||
auto handler = upstream->get_client_handler();
|
|
||||||
auto body = downstream->get_response_body_buf();
|
auto body = downstream->get_response_body_buf();
|
||||||
assert(body);
|
assert(body);
|
||||||
int nread = evbuffer_remove(body, buf, length);
|
int nread = evbuffer_remove(body, buf, length);
|
||||||
|
@ -747,18 +747,15 @@ ssize_t spdy_data_read_callback(spdylay_session *session,
|
||||||
(downstream->get_response_rst_stream_error_code()));
|
(downstream->get_response_rst_stream_error_code()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Send WINDOW_UPDATE before buffer is empty to avoid delay because
|
|
||||||
// of RTT.
|
if(nread == 0 && *eof != 1) {
|
||||||
if(*eof != 1 &&
|
|
||||||
handler->get_outbuf_length() + evbuffer_get_length(body) <
|
|
||||||
OUTBUF_MAX_THRES) {
|
|
||||||
if(downstream->resume_read(SHRPX_NO_BUFFER) != 0) {
|
if(downstream->resume_read(SHRPX_NO_BUFFER) != 0) {
|
||||||
return SPDYLAY_ERR_CALLBACK_FAILURE;
|
return SPDYLAY_ERR_CALLBACK_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if(nread == 0 && *eof != 1) {
|
|
||||||
return SPDYLAY_ERR_DEFERRED;
|
return SPDYLAY_ERR_DEFERRED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nread;
|
return nread;
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -930,7 +927,6 @@ int SpdyUpstream::on_downstream_body(Downstream *downstream,
|
||||||
const uint8_t *data, size_t len,
|
const uint8_t *data, size_t len,
|
||||||
bool flush)
|
bool flush)
|
||||||
{
|
{
|
||||||
auto upstream = downstream->get_upstream();
|
|
||||||
auto body = downstream->get_response_body_buf();
|
auto body = downstream->get_response_body_buf();
|
||||||
int rv = evbuffer_add(body, data, len);
|
int rv = evbuffer_add(body, data, len);
|
||||||
if(rv != 0) {
|
if(rv != 0) {
|
||||||
|
@ -942,9 +938,7 @@ int SpdyUpstream::on_downstream_body(Downstream *downstream,
|
||||||
spdylay_session_resume_data(session_, downstream->get_stream_id());
|
spdylay_session_resume_data(session_, downstream->get_stream_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto outbuflen = upstream->get_client_handler()->get_outbuf_length() +
|
if(evbuffer_get_length(body) >= INBUF_MAX_THRES) {
|
||||||
evbuffer_get_length(body);
|
|
||||||
if(outbuflen > OUTBUF_MAX_THRES) {
|
|
||||||
if(!flush) {
|
if(!flush) {
|
||||||
spdylay_session_resume_data(session_, downstream->get_stream_id());
|
spdylay_session_resume_data(session_, downstream->get_stream_id());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue