mirror of
https://github.com/clearlinux/systemd-stable.git
synced 2026-09-04 12:41:39 +00:00
sd-resolve: scale number of threads by queries currently being processed, rather than number of queries currently referenced
This way a query that blocks for a longer time, and whose reference has been dropped won't block subsequent lookups from finishing.
This commit is contained in:
@@ -87,7 +87,7 @@ struct sd_resolve {
|
||||
|
||||
unsigned current_id;
|
||||
sd_resolve_query* query_array[QUERIES_MAX];
|
||||
unsigned n_queries, n_done;
|
||||
unsigned n_queries, n_done, n_outstanding;
|
||||
|
||||
sd_event_source *event_source;
|
||||
sd_event *event;
|
||||
@@ -526,7 +526,7 @@ static int start_threads(sd_resolve *resolve, unsigned extra) {
|
||||
unsigned n;
|
||||
int r;
|
||||
|
||||
n = resolve->n_queries + extra - resolve->n_done;
|
||||
n = resolve->n_outstanding + extra;
|
||||
n = CLAMP(n, WORKERS_MIN, WORKERS_MAX);
|
||||
|
||||
while (resolve->n_valid_workers < n) {
|
||||
@@ -854,6 +854,9 @@ static int handle_response(sd_resolve *resolve, const Packet *packet, size_t len
|
||||
return 0;
|
||||
}
|
||||
|
||||
assert(resolve->n_outstanding > 0);
|
||||
resolve->n_outstanding--;
|
||||
|
||||
q = lookup_query(resolve, resp->id);
|
||||
if (!q)
|
||||
return 0;
|
||||
@@ -1099,6 +1102,8 @@ _public_ int sd_resolve_getaddrinfo(
|
||||
return -errno;
|
||||
}
|
||||
|
||||
resolve->n_outstanding++;
|
||||
|
||||
if (_q)
|
||||
*_q = q;
|
||||
|
||||
@@ -1167,6 +1172,8 @@ _public_ int sd_resolve_getnameinfo(
|
||||
return -errno;
|
||||
}
|
||||
|
||||
resolve->n_outstanding++;
|
||||
|
||||
if (_q)
|
||||
*_q = q;
|
||||
|
||||
@@ -1231,6 +1238,8 @@ static int resolve_res(
|
||||
return -errno;
|
||||
}
|
||||
|
||||
resolve->n_outstanding++;
|
||||
|
||||
if (_q)
|
||||
*_q = q;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user