diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2020-12-07 18:41:06 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-12-08 16:26:31 +0000 |
commit | f6824598636d5a5323f58baf97513c7b8c37ebd0 (patch) | |
tree | 6534e2822fd27d9be3de29593435fc68ff6c97c3 /src/mongo | |
parent | 9c2c85fd6508e42ba3c277935e79b16cbe0237a5 (diff) | |
download | mongo-f6824598636d5a5323f58baf97513c7b8c37ebd0.tar.gz |
SERVER-51858 Fix curl locking
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/util/net/http_client_curl.cpp | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/src/mongo/util/net/http_client_curl.cpp b/src/mongo/util/net/http_client_curl.cpp index 9542be41b7b..008161f6d0c 100644 --- a/src/mongo/util/net/http_client_curl.cpp +++ b/src/mongo/util/net/http_client_curl.cpp @@ -123,25 +123,63 @@ private: curl_share_setopt(_share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); curl_share_setopt(_share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT); curl_share_setopt(_share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); - curl_share_setopt(_share, CURLSHOPT_USERDATA, &this->_shareMutex); + curl_share_setopt(_share, CURLSHOPT_USERDATA, this); curl_share_setopt(_share, CURLSHOPT_LOCKFUNC, _lockShare); curl_share_setopt(_share, CURLSHOPT_UNLOCKFUNC, _unlockShare); return Status::OK(); } - static void _lockShare(CURL*, curl_lock_data, curl_lock_access, void* ctx) { - reinterpret_cast<Mutex*>(ctx)->lock(); + + static void _lockShare(CURL*, curl_lock_data lock_data, curl_lock_access, void* ctx) { + // curl_lock_access maps to shared and single access, i.e. a read and exclusive lock + // except the unlock method does not have curl_lock_access as a parameter so we map + // all lock requests to regular mutexes + switch (lock_data) { + case CURL_LOCK_DATA_SHARE: + reinterpret_cast<CurlLibraryManager*>(ctx)->_mutexShare.lock(); + break; + case CURL_LOCK_DATA_DNS: + reinterpret_cast<CurlLibraryManager*>(ctx)->_mutexDns.lock(); + break; + case CURL_LOCK_DATA_SSL_SESSION: + reinterpret_cast<CurlLibraryManager*>(ctx)->_mutexSSLSession.lock(); + break; + case CURL_LOCK_DATA_CONNECT: + reinterpret_cast<CurlLibraryManager*>(ctx)->_mutexConnect.lock(); + break; + default: + fassert(5185801, "Unsupported curl lock type"); + } } - static void _unlockShare(CURL*, curl_lock_data, void* ctx) { - reinterpret_cast<Mutex*>(ctx)->unlock(); + static void _unlockShare(CURL*, curl_lock_data lock_data, void* ctx) { + switch (lock_data) { + case CURL_LOCK_DATA_SHARE: + reinterpret_cast<CurlLibraryManager*>(ctx)->_mutexShare.unlock(); + break; + case CURL_LOCK_DATA_DNS: + reinterpret_cast<CurlLibraryManager*>(ctx)->_mutexDns.unlock(); + break; + case CURL_LOCK_DATA_SSL_SESSION: + reinterpret_cast<CurlLibraryManager*>(ctx)->_mutexSSLSession.unlock(); + break; + case CURL_LOCK_DATA_CONNECT: + reinterpret_cast<CurlLibraryManager*>(ctx)->_mutexConnect.unlock(); + break; + default: + fassert(5185802, "Unsupported curl unlock type"); + } } private: bool _initialized = false; CURLSH* _share = nullptr; - Mutex _shareMutex = MONGO_MAKE_LATCH("CurlLibraryManager::_shareMutex"); + + Mutex _mutexDns = MONGO_MAKE_LATCH("CurlLibraryManager::ShareDns"); + Mutex _mutexConnect = MONGO_MAKE_LATCH("CurlLibraryManager::ShareConnect"); + Mutex _mutexSSLSession = MONGO_MAKE_LATCH("CurlLibraryManager::ShareSSLSession"); + Mutex _mutexShare = MONGO_MAKE_LATCH("CurlLibraryManager::ShareLock"); } curlLibraryManager; /** |