From 02393ab1f3517436f1b8adee3c97e2b71a1f41f4 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 31 Oct 2008 16:40:45 -0700 Subject: [PATCH] sysrwloop: safely handle non-blocking sockets Non-blocking sockets can bail out with EAGAIN (and any socket also with EINTR), so retry if we get those calls. --- lib/mogilefs/util.rb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/mogilefs/util.rb b/lib/mogilefs/util.rb index eb3f74d..1a42ba5 100644 --- a/lib/mogilefs/util.rb +++ b/lib/mogilefs/util.rb @@ -13,7 +13,12 @@ module MogileFS::Util io_wr.sync = true loop do begin - b = io_rd.sysread(CHUNK_SIZE, buf) + b = begin + io_rd.sysread(CHUNK_SIZE, buf) + rescue Errno::EAGAIN, Errno::EINTR + select([io_rd], nil, nil, nil) + retry + end b = filter.call(b) if filter copied += syswrite_full(io_wr, b) rescue EOFError @@ -86,7 +91,12 @@ module MogileFS::Util def syswrite_full(io_wr, buf) written = 0 loop do - w = io_wr.syswrite(buf) + w = begin + io_wr.syswrite(buf) + rescue Errno::EAGAIN, Errno::EINTR + select(nil, [io_wr], nil, nil) + retry + end written += w break if w == buf.size buf = buf[w..-1] -- 2.11.4.GIT