mirror of
https://github.com/curl/curl.git
synced 2025-01-30 14:22:33 +08:00
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
This commit is contained in:
parent
c5c6e86783
commit
7632c0d25a
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
12
lib/multi.c
12
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,
|
||||
|
@ -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
|
||||
|
@ -41,7 +41,7 @@ curl_share_init(void)
|
||||
if(share) {
|
||||
share->magic = CURL_GOOD_SHARE;
|
||||
share->specifier |= (1<<CURL_LOCK_DATA_SHARE);
|
||||
Curl_init_dnscache(&share->hostcache);
|
||||
Curl_init_dnscache(&share->hostcache, 23);
|
||||
}
|
||||
|
||||
return share;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user