From: Daniel Stenberg Date: Sat, 27 Aug 2022 12:48:13 +0000 (+0200) Subject: multi: use larger dns hash table for multi interface X-Git-Tag: curl-7_85_0~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7632c0d25ad797a8f17ff071f3c4e9fe8a73a398;p=thirdparty%2Fcurl.git multi: use larger dns hash table for multi interface Have curl_multi_init() use a much larger DNS hash table than used for the easy interface to scale and perform better when used with _many_ host names. curl_share_init() sets an in-between size. Inspired-by: Ivan Tsybulin See #9340 Closes #9376 --- diff --git a/lib/easy.c b/lib/easy.c index e17a461e84..978ea5ac30 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -725,7 +725,7 @@ static CURLcode easy_perform(struct Curl_easy *data, bool events) else { /* this multi handle will only ever have a single easy handled attached to it, so make it use minimal hashes */ - multi = Curl_multi_handle(1, 3); + multi = Curl_multi_handle(1, 3, 7); if(!multi) return CURLE_OUT_OF_MEMORY; data->multi_easy = multi; diff --git a/lib/hostip.c b/lib/hostip.c index 99779044c5..bb94520acf 100644 --- a/lib/hostip.c +++ b/lib/hostip.c @@ -1005,9 +1005,9 @@ static void freednsentry(void *freethis) /* * Curl_init_dnscache() inits a new DNS cache. */ -void Curl_init_dnscache(struct Curl_hash *hash) +void Curl_init_dnscache(struct Curl_hash *hash, int size) { - Curl_hash_init(hash, 7, Curl_hash_str, Curl_str_key_compare, + Curl_hash_init(hash, size, Curl_hash_str, Curl_str_key_compare, freednsentry); } diff --git a/lib/hostip.h b/lib/hostip.h index 4b603378bd..9d3170737c 100644 --- a/lib/hostip.h +++ b/lib/hostip.h @@ -132,7 +132,7 @@ void Curl_resolv_unlock(struct Curl_easy *data, struct Curl_dns_entry *dns); /* init a new dns cache */ -void Curl_init_dnscache(struct Curl_hash *hash); +void Curl_init_dnscache(struct Curl_hash *hash, int hashsize); /* prune old entries from the DNS cache */ void Curl_hostcache_prune(struct Curl_easy *data); diff --git a/lib/multi.c b/lib/multi.c index ac753d2120..5340a0c8a5 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -84,6 +84,10 @@ #define CURL_CONNECTION_HASH_SIZE 97 #endif +#ifndef CURL_DNS_HASH_SIZE +#define CURL_DNS_HASH_SIZE 71 +#endif + #define CURL_MULTI_HANDLE 0x000bab1e #define GOOD_MULTI_HANDLE(x) \ @@ -388,7 +392,8 @@ static CURLMcode multi_addmsg(struct Curl_multi *multi, } struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */ - int chashsize) /* connection hash */ + int chashsize, /* connection hash */ + int dnssize) /* dns hash */ { struct Curl_multi *multi = calloc(1, sizeof(struct Curl_multi)); @@ -397,7 +402,7 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */ multi->magic = CURL_MULTI_HANDLE; - Curl_init_dnscache(&multi->hostcache); + Curl_init_dnscache(&multi->hostcache, dnssize); sh_init(&multi->sockhash, hashsize); @@ -451,7 +456,8 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */ struct Curl_multi *curl_multi_init(void) { return Curl_multi_handle(CURL_SOCKET_HASH_TABLE_SIZE, - CURL_CONNECTION_HASH_SIZE); + CURL_CONNECTION_HASH_SIZE, + CURL_DNS_HASH_SIZE); } CURLMcode curl_multi_add_handle(struct Curl_multi *multi, diff --git a/lib/multiif.h b/lib/multiif.h index e0aa00b05e..0cb9d4f7f2 100644 --- a/lib/multiif.h +++ b/lib/multiif.h @@ -42,8 +42,9 @@ bool Curl_is_in_callback(struct Curl_easy *easy); CURLcode Curl_preconnect(struct Curl_easy *data); /* Internal version of curl_multi_init() accepts size parameters for the - socket and connection hashes */ -struct Curl_multi *Curl_multi_handle(int hashsize, int chashsize); + socket, connection and dns hashes */ +struct Curl_multi *Curl_multi_handle(int hashsize, int chashsize, + int dnssize); /* the write bits start at bit 16 for the *getsock() bitmap */ #define GETSOCK_WRITEBITSTART 16 diff --git a/lib/share.c b/lib/share.c index 8b18360624..1a083e72a0 100644 --- a/lib/share.c +++ b/lib/share.c @@ -41,7 +41,7 @@ curl_share_init(void) if(share) { share->magic = CURL_GOOD_SHARE; share->specifier |= (1<hostcache); + Curl_init_dnscache(&share->hostcache, 23); } return share; diff --git a/tests/unit/unit1305.c b/tests/unit/unit1305.c index c35d448fe7..815d303884 100644 --- a/tests/unit/unit1305.c +++ b/tests/unit/unit1305.c @@ -54,7 +54,7 @@ static CURLcode unit_setup(void) return CURLE_OUT_OF_MEMORY; } - Curl_init_dnscache(&hp); + Curl_init_dnscache(&hp, 7); return CURLE_OK; }