You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ma...@apache.org on 2018/01/17 00:14:19 UTC
[trafficserver] branch master updated: Avoid copying over data in
the write_vio into response_buffer
This is an automated email from the ASF dual-hosted git repository.
masaori pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new 6dda3e5 Avoid copying over data in the write_vio into response_buffer
6dda3e5 is described below
commit 6dda3e553f9a035156a172c72499ff8988742eab
Author: Masaori Koshiba <ma...@apache.org>
AuthorDate: Thu Nov 30 12:00:16 2017 +0900
Avoid copying over data in the write_vio into response_buffer
---
proxy/http2/Http2ConnectionState.cc | 6 ++--
proxy/http2/Http2Stream.cc | 62 ++++++++++++++++++-------------------
proxy/http2/Http2Stream.h | 2 +-
3 files changed, 34 insertions(+), 36 deletions(-)
diff --git a/proxy/http2/Http2ConnectionState.cc b/proxy/http2/Http2ConnectionState.cc
index 0004c07..54b2fb2 100644
--- a/proxy/http2/Http2ConnectionState.cc
+++ b/proxy/http2/Http2ConnectionState.cc
@@ -716,7 +716,7 @@ rcv_window_update_frame(Http2ConnectionState &cstate, const Http2Frame &frame)
ssize_t wnd = std::min(cstate.client_rwnd, stream->client_rwnd);
if (!stream->is_closed() && stream->get_state() == Http2StreamState::HTTP2_STREAM_STATE_HALF_CLOSED_REMOTE && wnd > 0) {
- stream->send_response_body();
+ stream->restart_sending();
}
}
@@ -1085,14 +1085,14 @@ Http2ConnectionState::restart_streams()
Http2Stream *next = static_cast<Http2Stream *>(s->link.next ? s->link.next : stream_list.head);
if (!s->is_closed() && s->get_state() == Http2StreamState::HTTP2_STREAM_STATE_HALF_CLOSED_REMOTE &&
std::min(this->client_rwnd, s->client_rwnd) > 0) {
- s->send_response_body();
+ s->restart_sending();
}
ink_assert(s != next);
s = next;
}
if (!s->is_closed() && s->get_state() == Http2StreamState::HTTP2_STREAM_STATE_HALF_CLOSED_REMOTE &&
std::min(this->client_rwnd, s->client_rwnd) > 0) {
- s->send_response_body();
+ s->restart_sending();
}
++starting_point;
diff --git a/proxy/http2/Http2Stream.cc b/proxy/http2/Http2Stream.cc
index 411b2c5..81cf6b6 100644
--- a/proxy/http2/Http2Stream.cc
+++ b/proxy/http2/Http2Stream.cc
@@ -308,7 +308,7 @@ Http2Stream::do_io_write(Continuation *c, int64_t nbytes, IOBufferReader *abuffe
write_vio.ndone = 0;
write_vio.vc_server = this;
write_vio.op = VIO::WRITE;
- response_reader = response_buffer.alloc_reader();
+ response_reader = abuffer;
return update_write_request(abuffer, nbytes, false) ? &write_vio : nullptr;
}
@@ -515,6 +515,15 @@ Http2Stream::update_read_request(int64_t read_len, bool call_update)
}
}
+void
+Http2Stream::restart_sending()
+{
+ send_response_body();
+ if (this->write_vio.ntodo() > 0 && this->write_vio.get_writer()->write_avail() > 0) {
+ write_vio._cont->handleEvent(VC_EVENT_WRITE_READY, &write_vio);
+ }
+}
+
bool
Http2Stream::update_write_request(IOBufferReader *buf_reader, int64_t write_len, bool call_update)
{
@@ -532,46 +541,38 @@ Http2Stream::update_write_request(IOBufferReader *buf_reader, int64_t write_len,
}
ink_release_assert(this->get_thread() == this_ethread());
Http2ClientSession *parent = static_cast<Http2ClientSession *>(this->get_parent());
- // Copy over data in the abuffer into resp_buffer. Then schedule a WRITE_READY or
- // WRITE_COMPLETE event
+
SCOPED_MUTEX_LOCK(lock, write_vio.mutex, this_ethread());
- int64_t total_added = 0;
+
+ // if response is chunked, limit the dechunked_buffer size.
+ bool is_done = false;
+ if (this->chunked) {
+ if (chunked_handler.dechunked_buffer && chunked_handler.dechunked_buffer->max_read_avail() > HTTP2_MAX_BUFFER_USAGE) {
+ if (buffer_full_write_event == nullptr) {
+ buffer_full_write_event = get_thread()->schedule_imm(this, VC_EVENT_WRITE_READY);
+ }
+ } else {
+ this->response_process_data(is_done);
+ }
+ }
+
+ int64_t bytes_avail = this->response_get_data_reader()->read_avail();
if (write_vio.nbytes > 0 && write_vio.ntodo() > 0) {
int64_t num_to_write = write_vio.ntodo();
if (num_to_write > write_len) {
num_to_write = write_len;
}
- int64_t bytes_avail = buf_reader->read_avail();
if (bytes_avail > num_to_write) {
bytes_avail = num_to_write;
}
-
- if (static_cast<Http2ClientSession *>(parent)->write_buffer_size() > HTTP2_MAX_BUFFER_USAGE ||
- response_buffer.max_read_avail() > HTTP2_MAX_BUFFER_USAGE ||
- (chunked_handler.dechunked_buffer && chunked_handler.dechunked_buffer->max_read_avail() > HTTP2_MAX_BUFFER_USAGE)) {
- if (buffer_full_write_event == nullptr) {
- buffer_full_write_event = get_thread()->schedule_imm(this, VC_EVENT_WRITE_READY);
- }
- return true;
- }
-
- while (total_added < bytes_avail) {
- int64_t bytes_added = response_buffer.write(buf_reader, bytes_avail);
- buf_reader->consume(bytes_added);
- total_added += bytes_added;
- }
}
- IOBufferReader *response_reader = this->response_get_data_reader();
- int64_t response_buffer_size = response_reader->read_avail();
- Http2StreamDebug("write_vio.nbytes=%" PRId64 ", write_vio.ndone=%" PRId64 ", buf_reader.read_avail=%" PRId64
- ", total_added=%" PRId64 ", response_buffer=%" PRId64,
- write_vio.nbytes, write_vio.ndone, buf_reader->read_avail(), total_added, response_buffer_size);
+ Http2StreamDebug("write_vio.nbytes=%" PRId64 ", write_vio.ndone=%" PRId64 ", write_vio.write_avail=%" PRId64
+ ", reader.read_avail=%" PRId64,
+ write_vio.nbytes, write_vio.ndone, write_vio.get_writer()->write_avail(), bytes_avail);
- bool is_done = false;
- this->response_process_data(is_done);
- if (total_added > 0 || is_done) {
- int send_event = (write_vio.ntodo() == response_buffer_size || is_done) ? VC_EVENT_WRITE_COMPLETE : VC_EVENT_WRITE_READY;
+ if (bytes_avail > 0 || is_done) {
+ int send_event = (write_vio.ntodo() == bytes_avail || is_done) ? VC_EVENT_WRITE_COMPLETE : VC_EVENT_WRITE_READY;
// Process the new data
if (!this->response_header_done) {
@@ -624,7 +625,6 @@ Http2Stream::update_write_request(IOBufferReader *buf_reader, int64_t write_len,
}
} else {
this->mark_body_done();
- // Send the data frame
send_response_body();
}
}
@@ -654,7 +654,6 @@ Http2Stream::update_write_request(IOBufferReader *buf_reader, int64_t write_len,
}
}
}
-
Http2StreamDebug("write update (event=%d)", send_event);
}
@@ -727,7 +726,6 @@ Http2Stream::destroy()
// Drop references to all buffer data
request_buffer.clear();
- response_buffer.clear();
// Free the mutexes in the VIO
read_vio.mutex.clear();
diff --git a/proxy/http2/Http2Stream.h b/proxy/http2/Http2Stream.h
index fd5f185..b6f9cf9 100644
--- a/proxy/http2/Http2Stream.h
+++ b/proxy/http2/Http2Stream.h
@@ -162,6 +162,7 @@ public:
return false;
}
+ void restart_sending();
void send_response_body();
void push_promise(URL &url, const MIMEField *accept_encoding);
@@ -248,7 +249,6 @@ private:
Http2StreamId _id;
Http2StreamState _state = Http2StreamState::HTTP2_STREAM_STATE_IDLE;
- MIOBuffer response_buffer;
HTTPHdr _req_header;
VIO read_vio;
VIO write_vio;
--
To stop receiving notification emails like this one, please contact
['"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>'].