Re: Socket callbacks during curl_multi_cleanup()

Dimitry Andric via curl-library <[email protected]>
Newsgroups gmane.comp.web.curl.library
Message-ID <[email protected]>
On 23 Feb 2025, at 09:51, Stefan Eissing <[email protected]> wrote:
> 
>> Am 22.02.2025 um 17:50 schrieb Dimitry Andric via curl-library <[email protected]>:
>> 
>> You can see that handle_socket() is now being called _during_ the
>> curl_multi_cleanup() call, whereas that did not happen before.
>> 
>> As far as we can determine, these callbacks occur because a58b50fca
>> introduces an extra internal handle in conncache.c, which gets triggered
>> with a CURL_POLL_IN event, followed by a CURL_POLL_REMOVE.
>> 
>> The question is whether that was intentional or not?
> 
> This has, unfortunately, come as a surprise to other libcurl applications as well.
> 
> The reason why this happens is that libcurl is shutting down all connections
> in its cache at `curl_multi_cleanup()` in a "best effort" way. For connections
> involving SSL, this will send the "close notify" message to the remote server.
> For HTTP/2 connections, this also sends the GOAWAY frame.
> 
> If the application has registered a socket callback, this may involve invoking
> that callback. As you notice. If this is important to an application or not, 
> depends on how the application uses this information.
> 
> Let's say the application uses libuv. If the application calls `uv_stop(loop)`
> right after `curl_multi_cleanup()` then the accounting of socket event via the
> socket callback does not matter. The `uv_stop()` will throw that all away.
> 
> If the application wants to keep on using the uv loop, it is necessary to forward
> callback invocation to the loop during `curl_multi_cleanup()` or uv will continue
> monitoring sockets that have been gone. (This may lead to immediate failures, if
> the socket number is then BAD or it may not as many operating system reassign
> a just closed socket number to the next opened one.)

Thanks for your explanation. This is all perfectly fine, and at least I
now know that it is by design.

I had wanted to put in a pull request to add documentation about it, but
re-reading https://curl.se/libcurl/c/curl_multi_cleanup.html I saw that
it is already mentioned:

> When this function is called, remaining entries in the connection
> pool held by the multi handle are shut down, which might trigger calls
> to the CURLMOPT_SOCKETFUNCTION callback.

So I should probably have read the documentation more carefully. :)

-Dimitry

-- 
Unsubscribe: https://lists.haxx.se/mailman/listinfo/curl-library
Etiquette:   https://curl.se/mail/etiquette.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.