Merge branch '1411-threadsanitizer-data-race-resolver-c-2153-in-fctx_query-v9_14' into 'v9_14'

Resolve "ThreadSanitizer: data race resolver.c:2153 in fctx_query"

See merge request isc-projects/bind9!2748
This commit is contained in:
Mark Andrews 2019-12-11 00:35:59 +00:00
commit 872462fe7b

View file

@ -319,7 +319,7 @@ struct fetchctx {
/*%
* The number of events we're waiting for.
*/
unsigned int pending;
unsigned int pending; /* Bucket lock. */
/*%
* The number of times we've "restarted" the current
@ -348,7 +348,7 @@ struct fetchctx {
/*%
* Number of queries that reference this context.
*/
unsigned int nqueries;
unsigned int nqueries; /* Bucket lock. */
/*%
* The reason to print when logging a successful
@ -393,7 +393,7 @@ struct fetchctx {
#define FCTX_ATTR_HAVEANSWER 0x0001
#define FCTX_ATTR_GLUING 0x0002
#define FCTX_ATTR_ADDRWAIT 0x0004
#define FCTX_ATTR_SHUTTINGDOWN 0x0008
#define FCTX_ATTR_SHUTTINGDOWN 0x0008 /* Bucket lock */
#define FCTX_ATTR_WANTCACHE 0x0010
#define FCTX_ATTR_WANTNCACHE 0x0020
#define FCTX_ATTR_NEEDEDNS0 0x0040
@ -1136,9 +1136,8 @@ resquery_destroy(resquery_t **queryp) {
res = fctx->res;
bucket = fctx->bucketnum;
fctx->nqueries--;
LOCK(&res->buckets[bucket].lock);
fctx->nqueries--;
empty = fctx_decreference(query->fctx);
UNLOCK(&res->buckets[bucket].lock);
@ -1937,6 +1936,7 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
bool have_addr = false;
unsigned int srtt;
isc_dscp_t dscp = -1;
unsigned int bucketnum;
FCTXTRACE("query");
@ -2162,7 +2162,10 @@ fctx_query(fetchctx_t *fctx, dns_adbaddrinfo_t *addrinfo,
fctx->querysent++;
ISC_LIST_APPEND(fctx->queries, query, link);
query->fctx->nqueries++;
bucketnum = fctx->bucketnum;
LOCK(&res->buckets[bucketnum].lock);
fctx->nqueries++;
UNLOCK(&res->buckets[bucketnum].lock);
if (isc_sockaddr_pf(&addrinfo->sockaddr) == PF_INET)
inc_stats(res, dns_resstatscounter_queryv4);
else
@ -5350,11 +5353,12 @@ maybe_destroy(fetchctx_t *fctx, bool locked) {
dns_validator_t *validator, *next_validator;
bool dodestroy = false;
REQUIRE(SHUTTINGDOWN(fctx));
bucketnum = fctx->bucketnum;
if (!locked)
LOCK(&res->buckets[bucketnum].lock);
REQUIRE(SHUTTINGDOWN(fctx));
if (fctx->pending != 0 || fctx->nqueries != 0)
goto unlock;
@ -7061,6 +7065,9 @@ fctx_increference(fetchctx_t *fctx) {
UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock);
}
/*
* Requires bucket lock to be held.
*/
static bool
fctx_decreference(fetchctx_t *fctx) {
bool bucket_empty = false;