mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-03 08:05:21 +00:00
2063. [bug] Change #1955 introduced a bug which caused the first
'rndc flush' call to not free memory. [RT #16244]
This commit is contained in:
3
CHANGES
3
CHANGES
@@ -1,3 +1,6 @@
|
|||||||
|
2063. [bug] Change #1955 introduced a bug which caused the first
|
||||||
|
'rndc flush' call to not free memory. [RT #16244]
|
||||||
|
|
||||||
2062. [bug] 'dig +nssearch' was reusing a buffer before it had
|
2062. [bug] 'dig +nssearch' was reusing a buffer before it had
|
||||||
been returned by the socket code. [RT #16307]
|
been returned by the socket code. [RT #16307]
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* PERFORMANCE OF THIS SOFTWARE.
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: cache.c,v 1.72 2006/07/19 00:24:17 marka Exp $ */
|
/* $Id: cache.c,v 1.73 2006/08/01 01:03:27 marka Exp $ */
|
||||||
|
|
||||||
/*! \file */
|
/*! \file */
|
||||||
|
|
||||||
@@ -108,6 +108,7 @@ struct cache_cleaner {
|
|||||||
clean in one increment */
|
clean in one increment */
|
||||||
cleaner_state_t state; /*% Idle/Busy. */
|
cleaner_state_t state; /*% Idle/Busy. */
|
||||||
isc_boolean_t overmem; /*% The cache is in an overmem state. */
|
isc_boolean_t overmem; /*% The cache is in an overmem state. */
|
||||||
|
isc_boolean_t replaceiterator;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*%
|
/*%
|
||||||
@@ -566,6 +567,7 @@ cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
|
|||||||
cleaner->cache = cache;
|
cleaner->cache = cache;
|
||||||
cleaner->iterator = NULL;
|
cleaner->iterator = NULL;
|
||||||
cleaner->overmem = ISC_FALSE;
|
cleaner->overmem = ISC_FALSE;
|
||||||
|
cleaner->replaceiterator = ISC_FALSE;
|
||||||
|
|
||||||
cleaner->task = NULL;
|
cleaner->task = NULL;
|
||||||
cleaner->cleaning_timer = NULL;
|
cleaner->cleaning_timer = NULL;
|
||||||
@@ -815,6 +817,17 @@ incremental_cleaning_action(isc_task_t *task, isc_event_t *event) {
|
|||||||
if (cleaner->state == cleaner_s_done) {
|
if (cleaner->state == cleaner_s_done) {
|
||||||
cleaner->state = cleaner_s_busy;
|
cleaner->state = cleaner_s_busy;
|
||||||
end_cleaning(cleaner, event);
|
end_cleaning(cleaner, event);
|
||||||
|
LOCK(&cleaner->cache->lock);
|
||||||
|
LOCK(&cleaner->lock);
|
||||||
|
if (cleaner->replaceiterator) {
|
||||||
|
dns_dbiterator_destroy(&cleaner->iterator);
|
||||||
|
(void) dns_db_createiterator(cleaner->cache->db,
|
||||||
|
ISC_FALSE,
|
||||||
|
&cleaner->iterator);
|
||||||
|
cleaner->replaceiterator = ISC_FALSE;
|
||||||
|
}
|
||||||
|
UNLOCK(&cleaner->lock);
|
||||||
|
UNLOCK(&cleaner->cache->lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1067,8 +1080,23 @@ dns_cache_flush(dns_cache_t *cache) {
|
|||||||
if (result != ISC_R_SUCCESS)
|
if (result != ISC_R_SUCCESS)
|
||||||
return (result);
|
return (result);
|
||||||
|
|
||||||
|
LOCK(&cache->lock);
|
||||||
|
LOCK(&cache->cleaner.lock);
|
||||||
|
if (cache->cleaner.state == cleaner_s_idle) {
|
||||||
|
if (cache->cleaner.iterator != NULL)
|
||||||
|
dns_dbiterator_destroy(&cache->cleaner.iterator);
|
||||||
|
(void) dns_db_createiterator(db, ISC_FALSE,
|
||||||
|
&cache->cleaner.iterator);
|
||||||
|
} else {
|
||||||
|
if (cache->cleaner.state == cleaner_s_busy)
|
||||||
|
cache->cleaner.state = cleaner_s_done;
|
||||||
|
cache->cleaner.replaceiterator = ISC_TRUE;
|
||||||
|
}
|
||||||
dns_db_detach(&cache->db);
|
dns_db_detach(&cache->db);
|
||||||
cache->db = db;
|
cache->db = db;
|
||||||
|
UNLOCK(&cache->cleaner.lock);
|
||||||
|
UNLOCK(&cache->lock);
|
||||||
|
|
||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user