Linux 4.2 gained the ability to do true zero-copy sendfile support for Unix sockets; so buffer space is accounted differently. Previously Linux only avoided copies in userspace when doing sendfile for Unix sockets, not internally within the kernel.
This kernel change has no bearing on normal code which would need to account for concurrent draining by the client; only test code designed to create a failure condition. --- test/test_wbuf.rb | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/test_wbuf.rb b/test/test_wbuf.rb index 0eacb08..0d7959c 100644 --- a/test/test_wbuf.rb +++ b/test/test_wbuf.rb @@ -71,8 +71,17 @@ class TestWbuf < Testcase end while true end wbuf = Yahns::Wbuf.new([], true, Dir.tmpdir, :wait_writable) - assert_equal :wait_writable, wbuf.wbuf_write(a, buf) - assert_equal :wait_writable, wbuf.wbuf_flush(a) + + rv1 = wbuf.wbuf_write(a, buf) + rv2 = wbuf.wbuf_flush(a) + case rv1 + when nil + assert_equal true, rv2, 'some kernels succeed with real sendfile' + when :wait_writable + assert_equal :wait_writable, rv2, 'some block on sendfile' + else + flunk "unexpected from wbuf_write/flush: #{rv1.inspect} / #{rv2.inspect}" + end # drain the buffer Timeout.timeout(10) { b.read(b.nread) until b.nread == 0 } -- EW -- unsubscribe: yahns-public+unsubscr...@yhbt.net archive: http://yhbt.net/yahns-public/