From: Jeremy Evans Date: 2015-07-20T16:26:02-07:00 Subject: [ruby-core:70055] Re: [Ruby trunk - Bug #11364] [Open] Use smaller buffer for sendmsg On 07/20 10:46, Eric Wong wrote: > merch-redmine@jeremyevans.net wrote: > > Bug #11364: Use smaller buffer for sendmsg > > https://bugs.ruby-lang.org/issues/11364 > > > > OpenBSD's limit is less than 128. > > Btw, this is pretty disappointing since I want to use SOCK_SEQPACKET > more for IPC in some projects. > > Does SO_RCVBUF/SO_SNDBUF help in OpenBSD with SOCK_SEQPACKET sockets? Looks like my initial analysis was partially wrong. OpenBSD's default buffer for SEQPACKET sockets is 4096. However, ancdata.c needs a patch to handle EMSGSIZE. Here's a diff that should fix things. Hopefully it works on other operating systems as well, but if not, I can wrap things in an ifdef. Thanks, Jeremy From ea53434c4fda387347228e29856537d24f4dc649 Mon Sep 17 00:00:00 2001 From: Jeremy Evans Date: Mon, 20 Jul 2015 17:20:58 -0600 Subject: [PATCH] Treat EMSGSIZE similar to EWOULDBLOCK for sendmsg_nonblock OpenBSD uses EMSGSIZE if you try to send data on a nonblocking socket that would cause it to block. Restore previous limits in tests. --- ext/socket/ancdata.c | 2 +- test/socket/test_nonblock.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c index da8b816..3440dd4 100644 --- ext/socket/ancdata.c +++ ext/socket/ancdata.c @@ -1284,7 +1284,7 @@ bsock_sendmsg_internal(int argc, VALUE *argv, VALUE sock, int nonblock) rb_io_check_closed(fptr); goto retry; } - if (nonblock && (errno == EWOULDBLOCK || errno == EAGAIN)) { + if (nonblock && (errno == EWOULDBLOCK || errno == EMSGSIZE || errno == EAGAIN)) { if (rsock_opt_false_p(opts, sym_exception)) { return sym_wait_writable; } diff --git a/test/socket/test_nonblock.rb b/test/socket/test_nonblock.rb index 39999ca..4edcbc0 100644 --- test/socket/test_nonblock.rb +++ test/socket/test_nonblock.rb @@ -299,7 +299,7 @@ class TestSocketNonblock < Test::Unit::TestCase if defined?(UNIXSocket) && defined?(Socket::SOCK_SEQPACKET) def test_sendmsg_nonblock_seqpacket - buf = '*' * 63 + buf = '*' * 4096 UNIXSocket.pair(:SEQPACKET) do |s1, s2| assert_raise(IO::WaitWritable) do loop { s1.sendmsg_nonblock(buf) } @@ -310,7 +310,7 @@ class TestSocketNonblock < Test::Unit::TestCase end def test_sendmsg_nonblock_no_exception - buf = '*' * 63 + buf = '*' * 128 UNIXSocket.pair(:SEQPACKET) do |s1, s2| n = 0 Timeout.timeout(60) do -- 2.4.5