2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-04 08:35:31 +00:00

3025. [bug] Fixed a possible deadlock due to zone resigning.

[RT #22964]
This commit is contained in:
Evan Hunt
2011-02-18 23:26:44 +00:00
parent ec519db9f2
commit b32e391602
3 changed files with 15 additions and 8 deletions

View File

@@ -1,3 +1,6 @@
3025. [bug] Fixed a possible deadlock due to zone resigning.
[RT #22964]
3024. [func] RTT Banding removed due to minor security increase 3024. [func] RTT Banding removed due to minor security increase
but major impact on resolver latency. [RT #23310] but major impact on resolver latency. [RT #23310]

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: rbtdb.c,v 1.310 2011/01/13 09:53:04 marka Exp $ */ /* $Id: rbtdb.c,v 1.311 2011/02/18 23:26:44 each Exp $ */
/*! \file */ /*! \file */
@@ -392,12 +392,15 @@ typedef ISC_LIST(rbtdb_version_t) rbtdb_versionlist_t;
typedef struct { typedef struct {
/* Unlocked. */ /* Unlocked. */
dns_db_t common; dns_db_t common;
/* Locks the data in this struct */
#if DNS_RBTDB_USERWLOCK #if DNS_RBTDB_USERWLOCK
isc_rwlock_t lock; isc_rwlock_t lock;
#else #else
isc_mutex_t lock; isc_mutex_t lock;
#endif #endif
/* Locks the tree structure (prevents nodes appearing/disappearing) */
isc_rwlock_t tree_lock; isc_rwlock_t tree_lock;
/* Locks for individual tree nodes */
unsigned int node_lock_count; unsigned int node_lock_count;
rbtdb_nodelock_t * node_locks; rbtdb_nodelock_t * node_locks;
dns_rbtnode_t * origin_node; dns_rbtnode_t * origin_node;
@@ -7264,7 +7267,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
REQUIRE(VALID_RBTDB(rbtdb)); REQUIRE(VALID_RBTDB(rbtdb));
RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_read); RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
for (i = 0; i < rbtdb->node_lock_count; i++) { for (i = 0; i < rbtdb->node_lock_count; i++) {
NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_read); NODE_LOCK(&rbtdb->node_locks[i].lock, isc_rwlocktype_read);
@@ -7300,7 +7303,7 @@ getsigningtime(dns_db_t *db, dns_rdataset_t *rdataset,
result = ISC_R_SUCCESS; result = ISC_R_SUCCESS;
unlock: unlock:
RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_read); RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_read);
return (result); return (result);
} }
@@ -7322,7 +7325,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
header = rdataset->private3; header = rdataset->private3;
header--; header--;
RBTDB_LOCK(&rbtdb->lock, isc_rwlocktype_write); RWLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
NODE_LOCK(&rbtdb->node_locks[node->locknum].lock, NODE_LOCK(&rbtdb->node_locks[node->locknum].lock,
isc_rwlocktype_write); isc_rwlocktype_write);
/* /*
@@ -7336,7 +7339,7 @@ resigned(dns_db_t *db, dns_rdataset_t *rdataset, dns_dbversion_t *version)
NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock, NODE_UNLOCK(&rbtdb->node_locks[node->locknum].lock,
isc_rwlocktype_write); isc_rwlocktype_write);
RBTDB_UNLOCK(&rbtdb->lock, isc_rwlocktype_write); RWUNLOCK(&rbtdb->tree_lock, isc_rwlocktype_write);
} }
static dns_stats_t * static dns_stats_t *

View File

@@ -15,7 +15,7 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: zone.c,v 1.588 2011/02/17 23:47:24 tbox Exp $ */ /* $Id: zone.c,v 1.589 2011/02/18 23:26:44 each Exp $ */
/*! \file */ /*! \file */
@@ -7916,6 +7916,7 @@ void
dns_zone_markdirty(dns_zone_t *zone) { dns_zone_markdirty(dns_zone_t *zone) {
LOCK_ZONE(zone); LOCK_ZONE(zone);
if (zone->type == dns_zone_master)
set_resigntime(zone); /* XXXMPA make separate call back */ set_resigntime(zone); /* XXXMPA make separate call back */
zone_needdump(zone, DNS_DUMP_DELAY); zone_needdump(zone, DNS_DUMP_DELAY);
UNLOCK_ZONE(zone); UNLOCK_ZONE(zone);