Commit f5079bb8 authored by Michał Kępień's avatar Michał Kępień
Browse files

Do not recheck DNS_ZONEFLG_LOADPENDING in zone_asyncload()

Remove a block of code which dates back to commit 8a2ab2b9, when
dns_zone_asyncload() did not yet check DNS_ZONEFLG_LOADPENDING.
Currently, no race in accessing DNS_ZONEFLG_LOADPENDING is possible any
more, because:

  - dns_zone_asyncload() is still the only function which may queue
    zone_asyncload(),

  - dns_zone_asyncload() accesses DNS_ZONEFLG_LOADPENDING under a lock
    (and potentially queues an event under the same lock),

  - DNS_ZONEFLG_LOADPENDING is not cleared until the load actually
    completes.

Thus, the rechecking code can be safely removed from zone_asyncload().

Note that this also brings zone_asyncload() to a state in which the
completion callback is always invoked.  This is required to prevent
leaking memory in case something goes wrong in zone_asyncload() and a
zone table the zone belongs to is indefinitely left with a positive
reference count.
parent b9e9361c
......@@ -2163,7 +2163,6 @@ zone_asyncload(isc_task_t *task, isc_event_t *event) {
dns_asyncload_t *asl = event->ev_arg;
dns_zone_t *zone = asl->zone;
isc_result_t result;
isc_boolean_t load_pending;
UNUSED(task);
......@@ -2171,17 +2170,8 @@ zone_asyncload(isc_task_t *task, isc_event_t *event) {
isc_event_free(&event);
/* Make sure load is still pending */
LOCK_ZONE(zone);
load_pending = ISC_TF(DNS_ZONE_FLAG(zone, DNS_ZONEFLG_LOADPENDING));
if (!load_pending) {
UNLOCK_ZONE(zone);
goto cleanup;
}
result = zone_load(zone, 0, ISC_TRUE);
if (result != DNS_R_CONTINUE) {
DNS_ZONE_CLRFLAG(zone, DNS_ZONEFLG_LOADPENDING);
}
......@@ -2191,7 +2181,6 @@ zone_asyncload(isc_task_t *task, isc_event_t *event) {
if (asl->loaded != NULL)
(asl->loaded)(asl->loaded_arg, zone, task);
cleanup:
isc_mem_put(zone->mctx, asl, sizeof (*asl));
dns_zone_idetach(&zone);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment