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 <masa...@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" <commits@trafficserver.apache.org>'].