libmicrohttpd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [libmicrohttpd] shutdown of listen socket does not work on solaris 1


From: Christian Grothoff
Subject: Re: [libmicrohttpd] shutdown of listen socket does not work on solaris 10
Date: Tue, 20 Sep 2011 17:07:44 +0200
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20110818 Icedove/3.0.11

Dear Will,

This is great news, I'll try the patch ASAP.  Two remarks though:

1) the tests were never intended to really test the SO_REUSEADDR behavior -- if you change the port numbers to be disjoint between runs, this should help. You are right that on Linux the TIME_WAIT is avoided (for loopback!) whereas other systems are a bit more picky, so the tests should be changed to not rely on this behavior.

2) SIGPIPE is supposed to be managed by the application; MHD as a library should not install signal handlers IMO. So this is not a bug in the MHD library; however, clearly the testcases *should* install a signal handler here, again an easy fix.

So unless your patch breaks stuff on other platforms, this sounds simply great (and we can trivially fix the issues you mention).

Happy hacking,

Christian

On 09/20/2011 03:59 PM, Will Bryant wrote:
I attach my current work.  I have attempted to preserve and restore as much of 
the 'old' pipe shutdown code that was present in earlier versions of the 
library, but have removed the sections that aren't relevant now that there is a 
socket-by-socket client shutdown procedure.

On OS X, all the 'regular' tests pass.  The two perf test programs both fail on a random 
subset of the tests with "Failed to bind to port 1081: Address already in use" 
(or the other ports that the perf tests use).

I initially thought that this was a problem with this patch, but after I 
couldn't find any problem with it I tried backporting the perf test programs to 
the older 0.9.7 version of libmicrohttpd, which is before the listening socket 
shutdown code went in, and it turned out that the older versions failed in the 
same way.

On OpenIndiana (oi_151a - but should behave the same as other 
SunOS/Solaris/OpenSolaris/Illumos kernels), the same problem occurs.  (I 
haven't tried the backport there too.)

Linux is known to have slightly different behavior for the SOL_REUSEADDR option 
which might explain this, but it's quite possible that this is just a timing 
issue with the cleanup of the client threads in these perf test programs (if 
you wait for 1s between the tests then the problem goes away).

On OS X, using both debugging printfs and shelling out to lsof -itcp, I have 
confirmed that the listening socket has been closed successfully before the 
error occurs.   So I am starting to suspect that it is not possible to bind to 
an address that was used as a server socket until all the client sockets have 
also been cleaned up - but that's just a theory at this point.

Anyway, as far as this patch goes, OS X looks a lot healthier - as healthy as 
it was in 0.9.7 (0.9.8 and 0.9.9 both failed to build entirely).

There is one further test failure on openindiana, which I believe is not 
related to this patch - all the same 'regular' tests pass except 
daemontest_get_response_cleanup, which dies due to an unhandled SIGPIPE when 
trying to write to the socket after killing the curl process:

Program received signal SIGPIPE, Broken pipe.
[Switching to Thread 2 (LWP 2)]
0xfed634f7 in __so_send () from /lib/libc.so.1
(gdb) bt
#0  0xfed634f7 in __so_send () from /lib/libc.so.1
#1  0xfed511d7 in _so_send () from /lib/libc.so.1
#2  0xfe7dcb26 in send () from /lib/libsocket.so.1
#3  0xfef56d29 in send_param_adapter (connection=0x20, other=0xfe99080f, i=0) 
at daemon.c:764
#4  0xfef54a0b in do_write (connection=0x8073ad0) at connection.c:1495
#5  0xfef54f6f in MHD_connection_handle_write (connection=0x8073ad0) at 
connection.c:1909
#6  0xfef57b3c in MHD_select (daemon=0x80737a8, may_block=0) at daemon.c:1367
#7  0xfef57ff4 in MHD_select_thread (cls=0x80737a8) at daemon.c:1615
#8  0xfed5f0f3 in _thrp_setup () from /lib/libc.so.1
#9  0xfed5f3a0 in ?? () from /lib/libc.so.1
#10 0xfe9a0240 in ?? ()
#11 0x00000000 in ?? ()
(gdb) info threads
* 4 Thread 2 (LWP 2)  0xfed634f7 in __so_send () from /lib/libc.so.1
   3 LWP    2          0xfed634f7 in __so_send () from /lib/libc.so.1
   2 Thread 1 (LWP 1)  0xfed63e87 in __waitid () from /lib/libc.so.1
   1 LWP    1          0xfed63e87 in __waitid () from /lib/libc.so.1
(gdb) thread 2
[Switching to thread 2 (Thread 1 (LWP 1))]#0  0xfed63e87 in __waitid () from 
/lib/libc.so.1
(gdb) bt
#0  0xfed63e87 in __waitid () from /lib/libc.so.1
#1  0xfed515bd in waitid () from /lib/libc.so.1
#2  0xfed00035 in waitpid () from /lib/libc.so.1
#3  0x08051423 in kill_curl (pid=4479) at daemontest_get_response_cleanup.c:70
#4  0x0805157d in main (argc=1, argv=0x6b) at 
daemontest_get_response_cleanup.c:141







On 20/09/2011, at 00:08 , Christian Grothoff wrote:

Yes, we should have some meta-#define and set it via configure.

-Christian






reply via email to

[Prev in Thread] Current Thread [Next in Thread]