moonchen commented on code in PR #11890:
URL: https://github.com/apache/trafficserver/pull/11890#discussion_r1925533339


##########
src/iocore/eventsystem/P_IOBuffer.h:
##########
@@ -656,6 +656,15 @@ new_MIOBuffer_internal(const char *location, int64_t 
size_index)
 TS_INLINE void
 free_MIOBuffer(MIOBuffer *mio)
 {
+#if TS_USE_LINUX_SPLICE
+  // check if mio is PipeIOBuffer using dynamic_cast
+  PipeIOBuffer *pipe_mio = dynamic_cast<PipeIOBuffer *>(mio);

Review Comment:
   Relying on a runtime type check with dynamic_cast to select the proper 
deallocation mechanism is generally considered an anti-pattern.  Instead, 
ClassAllocator has a `Destruct_on_free_` parameter that allows you to use a 
virtual destructor to clean up properly depending on the underlying type.



##########
src/proxy/http/HttpSM.cc:
##########
@@ -7274,6 +7274,32 @@ HttpSM::setup_blind_tunnel(bool send_response_hdr, 
IOBufferReader *initial)
   //  header buffer into new buffer
   client_request_body_bytes += 
from_ua_buf->write(_ua.get_txn()->get_remote_reader());
 
+#if TS_USE_LINUX_SPLICE
+  MIOBuffer *from_ua_pipe_buf = new_PipeIOBuffer(BUFFER_SIZE_INDEX_32K);

Review Comment:
   `BUFFER_SIZE_INDEX_32K` is equal to 8.  Is this the capacity of the pipe 
that we're requesting from the kernel?



##########
src/iocore/net/UnixNetVConnection.cc:
##########
@@ -508,6 +508,81 @@ UnixNetVConnection::net_read_io(NetHandler *nh)
     read_disable(nh, this);
     return;
   }
+#if TS_USE_LINUX_SPLICE
+  // Check if the buffer is a PipeIOBuffer
+  PipeIOBuffer *pipe_buffer = dynamic_cast<PipeIOBuffer *>(buf.writer());
+  if (pipe_buffer) {
+    // Use splice_to to transfer data from socket directly to pipe with 
SPLICE_F_MORE hint
+    int64_t to_splice = std::min(ntodo, pipe_buffer->write_avail());
+    if (to_splice > 0) {
+      r = con.sock.splice_to(pipe_buffer->fd[1], to_splice, SPLICE_F_MOVE | 
SPLICE_F_NONBLOCK);
+
+      if (r <= 0) {
+        // Temporary Unavailable, Non-Blocking I/O
+        if (r == -EAGAIN || r == -ENOTCONN) {

Review Comment:
   Is it possible that we get EAGAIN here because the pipe is at capacity?  How 
do we handle that case?



##########
include/iocore/eventsystem/IOBuffer.h:
##########
@@ -1508,3 +1512,116 @@ IOBufferChain::iterator::operator->() const
 {
   return _b;
 }
+
+#if TS_USE_LINUX_SPLICE
+
+class PipeIOBufferReader : public IOBufferReader

Review Comment:
   Managing header dependency in ATS (specifically iocore) has been an ongoing 
challenge.  One of the reasons is that we often combine multiple classes into a 
single header file.  Please move the new classes to their own header and source 
files.



##########
src/iocore/net/UnixNetVConnection.cc:
##########
@@ -508,6 +508,81 @@ UnixNetVConnection::net_read_io(NetHandler *nh)
     read_disable(nh, this);
     return;
   }
+#if TS_USE_LINUX_SPLICE

Review Comment:
   This function is getting quite long, with two independent code paths to read 
from socket to buffer.  I would prefer using polymorphism to handle the 
different socket-to-buffer copies, but at least we should split this function 
up so that it's more readable. 



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to