From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-3.6 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, RP_MATCHES_RCVD shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: mogilefs-client-public@bogomips.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 02C7A1F5D7; Wed, 24 Jun 2015 01:57:01 +0000 (UTC) From: Eric Wong To: mogilefs-client-public@bogomips.org Cc: Eric Wong Subject: [PATCH] mogilefs/socket/pure_ruby: use IO#wait_*able Date: Wed, 24 Jun 2015 01:56:59 +0000 Message-Id: <1435111019-25068-1-git-send-email-normalperson@yhbt.net> List-Id: IO#wait_*able methods may use the more efficient ppoll syscall under Linux to avoid performance penalties with high-numbered FDs. Use them if available. IO#wait_readable has been around since the 1.8 days at least, and IO#wait_writable was added in Ruby 2.0.0 --- lib/mogilefs/socket/pure_ruby.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/mogilefs/socket/pure_ruby.rb b/lib/mogilefs/socket/pure_ruby.rb index 8833d22..7530a40 100644 --- a/lib/mogilefs/socket/pure_ruby.rb +++ b/lib/mogilefs/socket/pure_ruby.rb @@ -1,5 +1,6 @@ # -*- encoding: binary -*- # internal implementation details here, do not rely on them in your code +require 'io/wait' class MogileFS::Socket < Socket include MogileFS::SocketCommon @@ -15,16 +16,20 @@ class MogileFS::Socket < Socket def self.tcp(host, port, timeout = 5) sock = start(host, port) - unless IO.select(nil, [ sock ], nil, timeout) + unless sock.wait_writable(timeout) sock.close raise MogileFS::Timeout, 'socket connect timeout' end sock end + def wait_writable(timeout) + IO.select(nil, [ self ], nil, timeout) + end unless self.instance_methods.include?(:wait_writable) # Ruby <2.0.0 + def timed_read(len, dst = "", timeout = 5) begin - IO.select([self], nil, nil, timeout) or unreadable_socket!(timeout) + wait_readable(timeout) or unreadable_socket!(timeout) return read_nonblock(len, dst) rescue Errno::EAGAIN rescue EOFError @@ -34,7 +39,7 @@ class MogileFS::Socket < Socket def timed_peek(len, dst, timeout = 5) begin - IO.select([self], nil, nil, timeout) or unreadable_socket!(timeout) + wait_readable(timeout) or unreadable_socket!(timeout) rc = recv_nonblock(len, Socket::MSG_PEEK) return rc.empty? ? nil : dst.replace(rc) rescue Errno::EAGAIN @@ -61,8 +66,7 @@ class MogileFS::Socket < Socket buf = buf.slice(rc, buf.bytesize) end rescue Errno::EAGAIN - IO.select(nil, [self], nil, timeout) or - request_truncated!(written, expect, timeout) + wait_writable(timeout) or request_truncated!(written, expect, timeout) end while true end end -- EW