Fix windows issue with multiple workers

Sergey Brester serg.brester at sebres.de
Thu Jun 18 09:23:37 UTC 2015


So, in VM it work for me also.

I'm assuming that something on my windows work-pc has prevented to 
inherit listener in this way (driver, LSPs installed (Layered Service 
Providers), antivirus or something else)...


But, why don't you want to use a suggested solution of me?

If I will realize the way with "easy" inheritance (with "bInheritHandle" 
through CreateProcess), it will be not really easier, because:

- we have several listener to share, so we should tell all this handles 
to child process;

- bInheritHandle=True in CreateProcess can be a potential risk by not 
closed handles, if process crashed, and that are not only sockets - thus 
will arise so-called zombi-handles as half-open (dropped) or 
half-closed. But for sockets are listening it is extrem. Here is an 
example when this situation is encountered (* - listener, which process 
does not exist):

netstat /ano | grep 0.0:80
  * TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       
3824
    TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       
4378

taskkill /F /PID 3824
ERROR: The process "3824" not found.

Unfortunately, it is not guaranteed that new process 4378 accepts 
connections (because "zombi" listener of 3824 can block it).
But also not so good are another zombies, like not closed temp-files, 
lock-files, pipes etc.

You can talk long about "that would be windows bugs", but that are 
facts. And thus it is instable. Apart from, does not work at all on some 
mashines (like my work-pc).
And the way with WSADuplicateSocket self Microsoft recommends in various 
articles.

If you still want to use the solution with "bInheritHandle", I suggest a 
compromise:
I will make it with selectable option (resp. defines like 
NGX_WIN32_DUPLICATE_LISTEN and NGX_WIN32_INHERIT_LISTEN).

Please tell me your decision.

Regards,
sebres.



Am 17.06.2015 16:52, schrieb Maxim Dounin:

> Hello!
> 
> On Wed, Jun 17, 2015 at 04:01:17PM +0200, Sergey Brester wrote:
> 
>> Hmm, strange - almost same code, but it does not work... only first 
>> child can accept connections.
> 
> Have you tried exactly the code I provided? "Almost the same"
> is a usual difference between working and non-working code.
> 
>> Which version of windows are you using for test?
> 
> Works fine at least in Windows 7 and Windows 8.1 VMs here, both
> 32-bit. I have no 64-bit Windows on hand to test, but if it
> doesn't work for you specifically on 64-bit Windows, this may be
> some minor bug in the test code related to type casting.



More information about the nginx-devel mailing list