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=-2.9 required=3.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: yahns-public@yhbt.net Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id AA3AF20579; Tue, 1 Mar 2016 01:30:24 +0000 (UTC) Date: Tue, 1 Mar 2016 01:30:24 +0000 From: Eric Wong To: yahns-public@yhbt.net Subject: [PATCH] ssl: disable copying for writes Message-ID: <20160301013024.GA5920@dcvr.yhbt.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline List-Id: This is a partial revert of 551e670281bea77e727a732ba94275265ccae5f6 "fix output buffering with SSL_write". With the patch to enable SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER in , we can avoid the hacky workaround we do. We still implement our own trysendfile to avoid overhead of string allocation kgio_trywrite and we still fill in the missing kgio_trywritev addition. --- Consider this patch on hold. Of course we cannot expect users to manually patch or run ruby-trunk in production. Pushed to the "ruby-accept_moving_write_buffer" branch in git://yhbt.net/yahns I will rebase this branch as necessary. lib/yahns/openssl_client.rb | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/lib/yahns/openssl_client.rb b/lib/yahns/openssl_client.rb index cd7d210..30ac0e0 100644 --- a/lib/yahns/openssl_client.rb +++ b/lib/yahns/openssl_client.rb @@ -36,18 +36,15 @@ def sync def yahns_init_ssl(ssl_ctx) @need_accept = true @ssl = OpenSSL::SSL::SSLSocket.new(self, ssl_ctx) - @ssl_blocked = nil end def kgio_trywrite(buf) - buf = @ssl_blocked = buf.dup case rv = @ssl.write_nonblock(buf, exception: false) when :wait_readable, :wait_writable - return rv # do not clear ssl_blocked + return rv when Integer rv = buf.bytesize == rv ? nil : buf.byteslice(rv, buf.bytesize - rv) end - @ssl_blocked = nil rv end @@ -75,22 +72,14 @@ def kgio_tryread(len, buf) def trysendfile(io, offset, count) return 0 if count == 0 - unless buf = @ssl_blocked - count = 0x4000 if count > 0x4000 - buf = Thread.current[:yahns_sfbuf] ||= ''.dup - io.pos = offset - buf = io.read(count, buf) or return # nil for EOF - buf = @ssl_blocked = buf.dup - end + count = 0x4000 if count > 0x4000 + buf = Thread.current[:yahns_sfbuf] ||= ''.dup + io.pos = offset + buf = io.read(count, buf) or return # nil for EOF # call write_nonblock directly since kgio_trywrite allocates # an unnecessary string - case rv = @ssl.write_nonblock(buf, exception: false) - when :wait_readable, :wait_writable - return rv # do not clear ssl_blocked - end - @ssl_blocked = nil - rv + @ssl.write_nonblock(buf, exception: false) end def close -- EW