Use a shared queue for URLSessions to prevent crash during _MultiHandle.deinit #5016
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
We've seen various crashes in
libcrypto
that occur followingURLSession._MultiHandle.deinit
. The crash was particularly frequent on Amazon Linux 2 (see swiftlang/swift-package-manager#7624), and generally follows a similar pattern to this backtrace:curl
can be configured with various TLS libraries, and OpenSSL is a common choice. Previously, eachURLSession
had its own work queue, but given that "OpenSSL is not completely thread-safe, and unfortunately not all global resources have the necessary locks" (source), andURLSession
does not account for this, this sometimes led to the above crash in multi-threaded contexts.It appears that certain versions of OpenSSL might be more or less susceptible to this crash, but given that
curl
can be built with a wide array of versions, or even different TLS libraries, the only effective fix we found was to makeURLSession
single-threaded by sharing a target queue for all sessions. This is similar to the loader queuing behavior on Darwin.Thanks to @guoye-zhang, @AnkshitJain, and @bnbarham for help debugging/discovering this fix!