[#30995] [Bug #3523] win32 exception c0000029 on exit using fibers — B Kelly <redmine@...>

Bug #3523: win32 exception c0000029 on exit using fibers

19 messages 2010/07/02

[#31100] [rubysoc] Queue C-extension patch to come — Ricardo Panaggio <panaggio.ricardo@...>

Hello,

26 messages 2010/07/07
[#31148] Re: [rubysoc] Queue C-extension patch to come — Roger Pack <rogerdpack2@...> 2010/07/09

> As this it my first patch to Ruby, I don't know where to begin with.

[#31320] Re: [rubysoc] Queue C-extension patch to come — Ricardo Panaggio <panaggio.ricardo@...> 2010/07/16

Sorry for leaving this thread for so long. I've tried to finish the

[#31322] Re: [rubysoc] Queue C-extension patch to come — Aaron Patterson <aaron@...> 2010/07/16

On Sat, Jul 17, 2010 at 06:55:35AM +0900, Ricardo Panaggio wrote:

[#31324] Re: [rubysoc] Queue C-extension patch to come — Caleb Clausen <vikkous@...> 2010/07/17

NB: I am Ricardo's mentor for this project.

[#31331] Re: [rubysoc] Queue C-extension patch to come — Benoit Daloze <eregontp@...> 2010/07/17

On 17 July 2010 06:00, Caleb Clausen <vikkous@gmail.com> wrote:

[#31332] Re: [rubysoc] Queue C-extension patch to come — Caleb Clausen <vikkous@...> 2010/07/17

On 7/17/10, Benoit Daloze <eregontp@gmail.com> wrote:

[#31138] Why is there no standard way of creating a String from a char *? — Nikolai Weibull <now@...>

Hi!

14 messages 2010/07/08
[#31146] Re: Why is there no standard way of creating a String from a char *? — Urabe Shyouhei <shyouhei@...> 2010/07/09

(2010/07/09 7:04), Nikolai Weibull wrote:

[#31149] Re: Why is there no standard way of creating a String from a char *? — Nikolai Weibull <now@...> 2010/07/09

On Fri, Jul 9, 2010 at 06:20, Urabe Shyouhei <shyouhei@ruby-lang.org> wrote:

[#31150] Re: Why is there no standard way of creating a String from a char *? — Urabe Shyouhei <shyouhei@...> 2010/07/09

(2010/07/09 18:28), Nikolai Weibull wrote:

[#31217] [Bug #3562] regression in respond_to? — Aaron Patterson <redmine@...>

Bug #3562: regression in respond_to?

14 messages 2010/07/12

[#31269] [Bug #3566] memory leak when spawning+joining Threads in a loop — Eric Wong <redmine@...>

Bug #3566: memory leak when spawning+joining Threads in a loop

14 messages 2010/07/13

[#31399] [Backport #3595] Theres no encoding to differentiate a stream of Binary data from an 8-Bit ASCII string — Dreamcat Four <redmine@...>

Backport #3595: Theres no encoding to differentiate a stream of Binary data from an 8-Bit ASCII string

17 messages 2010/07/21

[#31459] [Bug #3607] [trunk/r28731] Gem.path has disappeared? — Ollivier Robert <redmine@...>

Bug #3607: [trunk/r28731] Gem.path has disappeared?

22 messages 2010/07/23

[#31519] [Bug #3622] Net::HTTP does not wait to send request body with Expect: 100-continue — Eric Hodel <redmine@...>

Bug #3622: Net::HTTP does not wait to send request body with Expect: 100-continue

9 messages 2010/07/28

[ruby-core:31067] Re: [Bug #3540] IO.copy_stream fails to detect client disconnect w/sendfile

From: Eric Wong <normalperson@...>
Date: 2010-07-06 05:33:45 UTC
List: ruby-core #31067
Tanaka Akira <akr@fsij.org> wrote:
> 2010/7/6 Eric Wong <redmine@ruby-lang.org>:
> >
> > sendfile() may return with a short write upon a client disconnect.  Instead of
> > retrying and getting an error, Ruby tries to force a select() on the descriptor
> > which fails to detect the disconnect.  This causes IO.copy_stream to hang,
> > (possibly until TCP keepalives kick in).  IO.copy_stream should raise
> > immediately.
> 
> Thank you for the reproducible script and fix.
> 
> I'll commit your fix.

Thank you for looking into this.

> However I think the Linux select behavior which doesn't notify writability on
> disconnected TCP socket is suspicious.

<snip>

> FreeBSD and Solaris notify writability.

<snip>

> I think select should notify writability when write would not block.
> Cleary write doesn't block on disconnected socket.
> 
> Linux also notify writability for UNIX domain socket pair.

<snip>

UNIX domain sockets are easy to do notification for since they're always
on the same host.  TCP might be harder to detect (and thus the Linux
folks choose not to bother at all) because the client is on a different
machine and it might lose a physical connection.

How does FreeBSD or Solaris behave if a client is on a different machine
and has the network cable pulled out?  In the case of physically
disconnected network cable, the client TCP stack has no way to notify
the server of a disconnect.  "kill -9" or even normal OS shutdown would
give the TCP stack a chance to properly shutdown the connection.

There are a few more instances of "errno = EAGAIN" assignments in io.c
that look suspicious to me.   My proposed fixes are below, but I'm
having trouble reproducing the badness I was seeing with IO.copy_stream
in these code paths:

diff --git a/io.c b/io.c
index 5129a14..108af7e 100644
--- a/io.c
+++ b/io.c
@@ -649,7 +649,7 @@ io_fflush(rb_io_t *fptr)
     if (0 <= r) {
         fptr->wbuf_off += (int)r;
         fptr->wbuf_len -= (int)r;
-        errno = EAGAIN;
+        goto retry;
     }
     if (rb_io_wait_writable(fptr->fd)) {
         rb_io_check_closed(fptr);
@@ -877,7 +877,8 @@ io_binwrite(VALUE str, rb_io_t *fptr, int nosync)
         if (0 <= r) {
             offset += r;
             n -= r;
-            errno = EAGAIN;
+            if (offset < RSTRING_LEN(str))
+                goto retry;
         }
         if (rb_io_wait_writable(fptr->fd)) {
             rb_io_check_closed(fptr);
-- 
Eric Wong

In This Thread