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/

Reply via email to