Socket handle leak and active handle warning with Vibe-D

Steven Schveighoffer schveiguy at gmail.com
Sat Jan 2 00:28:43 UTC 2021


On 1/1/21 5:07 PM, Selim Ozel wrote:
> I created the simplest possible example as explained by the Vibe-D 
> community in [1]. The exact source code of what I run is in [2].
> 
> On Windows I get a socket handle leak warning on shutdown with crtl+c 
> from terminal after running the executable.
> 
>> [main(----) INF] Listening for requests on http://[::1]:8080/
>> [main(----) INF] Listening for requests on http://127.0.0.1:8080/
>> [main(----) INF] Please open http://127.0.0.1:8080/ in your browser.
>> [00000000(----) INF] Received signal 2. Shutting down.
>> Warning: 2 socket handles leaked at driver^ Cshutdown
> 
> On Ubuntu 20.04 I get leaking drivers warning with the same process.
>> [main(----) INF] Listening for requests on http://[::1]:8080/
>> [main(----) INF] Listening for requests on http://127.0.0.1:8080/
>> [main(----) INF] Please open http://127.0.0.1:8080/ in your browser.
>> ^C[main(----) INF] Received signal 2. Shutting down.
>> Warning (thread: main): leaking eventcore driver because there are 
>> still active handles
>>    FD 6 (streamListen)
>>    FD 7 (streamListen)
>>
>> Warning (thread: main): leaking eventcore driver because there are 
>> still active handles
>>    FD 6 (streamListen)
>>    FD 7 (streamListen)
> 
> I really don't know what this is all about but it is at the core of my 
> Vibe-D development. So any pointers you might have would be very helpful 
> to me.
> 
> Thanks in advance.
>

1. the sockets are leaked for a reason that is pretty obscure -- namely, 
the GC might need to access those sockets as the process is shut down. 
Prior to this, the end result of vibe.d server was frequently a segfault.
2. The reason they are leaking is most likely because you still have a 
listening socket somewhere. I wish it would tell you how that socket was 
allocated, but it doesn't.

To fix, make sure all your listening sockets are closed. In my vibe.d 
app, I have the following:

auto listener = listenHTTP(settings, router);
scope(exit) listener.stopListening();

I also clean up my session store connection (something I had to add 
support for in vibe.d), which was a different source of leaking handles.

I also clean up database connections, which might be cached.

And finally, even with all this, I still get leaking driver messages if 
an HTTP keepalive socket is open.

I really feel like vibe.d should give you the option of not printing 
this message, as most of the time, it's something you can ignore.

-Steve


More information about the Digitalmars-d-learn mailing list