Lines Matching refs:cache

31 #include <dns/cache.h>
46 #define VALID_CACHE(cache) ISC_MAGIC_VALID(cache, CACHE_MAGIC)
67 * cache cleaning.
88 * Accesses to a cache cleaner object are synchronized through
89 * task/event serialization, or locked from the cache object.
100 dns_cache_t *cache;
113 isc_boolean_t overmem; /*% The cache is in an overmem state. */
118 * The actual cache object.
126 isc_mem_t *mctx; /* Main cache memory */
141 /* Access to the on-disk cache file is also locked by 'filelock'. */
149 cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
165 cache_create_db(dns_cache_t *cache, dns_db_t **db) {
166 return (dns_db_create(cache->mctx, cache->db_type, dns_rootname,
167 dns_dbtype_cache, cache->rdclass,
168 cache->db_argc, cache->db_argv, db));
199 dns_cache_t *cache;
210 cache = isc_mem_get(cmctx, sizeof(*cache));
211 if (cache == NULL)
214 cache->mctx = cache->hmctx = NULL;
215 isc_mem_attach(cmctx, &cache->mctx);
216 isc_mem_attach(hmctx, &cache->hmctx);
218 result = isc_mutex_init(&cache->lock);
222 result = isc_mutex_init(&cache->filelock);
226 cache->references = 1;
227 cache->live_tasks = 0;
228 cache->rdclass = rdclass;
230 cache->db_type = isc_mem_strdup(cmctx, db_type);
231 if (cache->db_type == NULL) {
238 * via cache->db_argv, followed by the rest of the arguments in
241 if (strcmp(cache->db_type, "rbt") == 0)
244 cache->db_argc = db_argc + extra;
245 cache->db_argv = NULL;
247 if (cache->db_argc != 0) {
248 cache->db_argv = isc_mem_get(cmctx,
249 cache->db_argc * sizeof(char *));
250 if (cache->db_argv == NULL) {
255 for (i = 0; i < cache->db_argc; i++)
256 cache->db_argv[i] = NULL;
258 cache->db_argv[0] = (char *) hmctx;
259 for (i = extra; i < cache->db_argc; i++) {
260 cache->db_argv[i] = isc_mem_strdup(cmctx,
262 if (cache->db_argv[i] == NULL) {
272 cache->db = NULL;
273 result = cache_create_db(cache, &cache->db);
281 dns_db_settask(cache->db, dbtask);
285 cache->filename = NULL;
287 cache->magic = CACHE_MAGIC;
290 * RBT-type cache DB has its own mechanism of cache cleaning and doesn't
294 result = cache_cleaner_init(cache, NULL, NULL, &cache->cleaner);
296 result = cache_cleaner_init(cache, taskmgr, timermgr,
297 &cache->cleaner);
302 *cachep = cache;
306 dns_db_detach(&cache->db);
308 for (i = extra; i < cache->db_argc; i++)
309 if (cache->db_argv[i] != NULL)
310 isc_mem_free(cmctx, cache->db_argv[i]);
311 if (cache->db_argv != NULL)
312 isc_mem_put(cmctx, cache->db_argv,
313 cache->db_argc * sizeof(char *));
315 isc_mem_free(cmctx, cache->db_type);
317 DESTROYLOCK(&cache->filelock);
319 DESTROYLOCK(&cache->lock);
321 isc_mem_detach(&cache->hmctx);
322 isc_mem_putanddetach(&cache->mctx, cache, sizeof(*cache));
327 cache_free(dns_cache_t *cache) {
330 REQUIRE(VALID_CACHE(cache));
331 REQUIRE(cache->references == 0);
333 isc_mem_setwater(cache->mctx, NULL, NULL, 0, 0);
335 if (cache->cleaner.task != NULL)
336 isc_task_detach(&cache->cleaner.task);
338 if (cache->cleaner.overmem_event != NULL)
339 isc_event_free(&cache->cleaner.overmem_event);
341 if (cache->cleaner.resched_event != NULL)
342 isc_event_free(&cache->cleaner.resched_event);
344 if (cache->cleaner.iterator != NULL)
345 dns_dbiterator_destroy(&cache->cleaner.iterator);
347 DESTROYLOCK(&cache->cleaner.lock);
349 if (cache->filename) {
350 isc_mem_free(cache->mctx, cache->filename);
351 cache->filename = NULL;
354 if (cache->db != NULL)
355 dns_db_detach(&cache->db);
357 if (cache->db_argv != NULL) {
359 * We don't free db_argv[0] in "rbt" cache databases
363 if (strcmp(cache->db_type, "rbt") == 0)
365 for (i = extra; i < cache->db_argc; i++)
366 if (cache->db_argv[i] != NULL)
367 isc_mem_free(cache->mctx, cache->db_argv[i]);
368 isc_mem_put(cache->mctx, cache->db_argv,
369 cache->db_argc * sizeof(char *));
372 if (cache->db_type != NULL)
373 isc_mem_free(cache->mctx, cache->db_type);
375 DESTROYLOCK(&cache->lock);
376 DESTROYLOCK(&cache->filelock);
378 cache->magic = 0;
379 isc_mem_detach(&cache->hmctx);
380 isc_mem_putanddetach(&cache->mctx, cache, sizeof(*cache));
385 dns_cache_attach(dns_cache_t *cache, dns_cache_t **targetp) {
387 REQUIRE(VALID_CACHE(cache));
390 LOCK(&cache->lock);
391 cache->references++;
392 UNLOCK(&cache->lock);
394 *targetp = cache;
399 dns_cache_t *cache;
403 cache = *cachep;
404 REQUIRE(VALID_CACHE(cache));
406 LOCK(&cache->lock);
407 REQUIRE(cache->references > 0);
408 cache->references--;
409 if (cache->references == 0) {
410 cache->cleaner.overmem = ISC_FALSE;
418 * When the cache is shut down, dump it to a file if one is
421 isc_result_t result = dns_cache_dump(cache);
425 "error dumping cache: %s ",
429 * If the cleaner task exists, let it free the cache.
431 if (cache->live_tasks > 0) {
432 isc_task_shutdown(cache->cleaner.task);
437 UNLOCK(&cache->lock);
440 cache_free(cache);
444 dns_cache_attachdb(dns_cache_t *cache, dns_db_t **dbp) {
445 REQUIRE(VALID_CACHE(cache));
447 REQUIRE(cache->db != NULL);
449 LOCK(&cache->lock);
450 dns_db_attach(cache->db, dbp);
451 UNLOCK(&cache->lock);
456 dns_cache_setfilename(dns_cache_t *cache, const char *filename) {
459 REQUIRE(VALID_CACHE(cache));
462 newname = isc_mem_strdup(cache->mctx, filename);
466 LOCK(&cache->filelock);
467 if (cache->filename)
468 isc_mem_free(cache->mctx, cache->filename);
469 cache->filename = newname;
470 UNLOCK(&cache->filelock);
476 dns_cache_load(dns_cache_t *cache) {
479 REQUIRE(VALID_CACHE(cache));
481 if (cache->filename == NULL)
484 LOCK(&cache->filelock);
485 result = dns_db_load(cache->db, cache->filename);
486 UNLOCK(&cache->filelock);
492 dns_cache_dump(dns_cache_t *cache) {
495 REQUIRE(VALID_CACHE(cache));
497 if (cache->filename == NULL)
500 LOCK(&cache->filelock);
501 result = dns_master_dump(cache->mctx, cache->db, NULL,
502 &dns_master_style_cache, cache->filename);
503 UNLOCK(&cache->filelock);
509 dns_cache_setcleaninginterval(dns_cache_t *cache, unsigned int t) {
513 LOCK(&cache->lock);
516 * It may be the case that the cache has already shut down.
519 if (cache->cleaner.cleaning_timer == NULL)
522 cache->cleaner.cleaning_interval = t;
525 result = isc_timer_reset(cache->cleaner.cleaning_timer,
529 isc_interval_set(&interval, cache->cleaner.cleaning_interval,
531 result = isc_timer_reset(cache->cleaner.cleaning_timer,
538 "could not set cache cleaning interval: %s",
542 UNLOCK(&cache->lock);
546 * Initialize the cache cleaner object at *cleaner.
551 cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
562 cleaner->cache = cache;
572 result = dns_db_createiterator(cleaner->cache->db, ISC_FALSE,
586 cleaner->cache->live_tasks++;
590 cleaner_shutdown_action, cache);
593 "cache cleaner: "
613 isc_event_allocate(cache->mctx, cleaner,
623 isc_event_allocate(cache->mctx, cleaner,
659 * position it at the beginning of the cache.
662 result = dns_db_createiterator(cleaner->cache->db, ISC_FALSE,
667 "cache cleaner could not create "
680 "cache cleaner: "
697 "begin cache cleaning, mem inuse %lu",
698 (unsigned long)isc_mem_inuse(cleaner->cache->mctx));
717 dns_cache_setcleaninginterval(cleaner->cache,
721 ISC_LOG_DEBUG(1), "end cache cleaning, mem inuse %lu",
722 (unsigned long)isc_mem_inuse(cleaner->cache->mctx));
729 * This is run once for every cache-cleaning-interval as defined in named.conf.
741 ISC_LOG_DEBUG(1), "cache cleaning timer fired, "
751 * This is called when the cache either surpasses its upper limit
814 LOCK(&cleaner->cache->lock);
818 (void) dns_db_createiterator(cleaner->cache->db,
824 UNLOCK(&cleaner->cache->lock);
842 "cache cleaner: dns_dbiterator_current() "
853 dns_db_detachnode(cleaner->cache->db, &node);
863 * some error was signaled. If the cache is still
869 "cache cleaner: "
881 "cache cleaner: "
895 * not gone through the entire cache. Free the iterator locks
903 ISC_LOG_DEBUG(1), "cache cleaner: checked %u nodes, "
905 (unsigned long)isc_mem_inuse(cleaner->cache->mctx));
916 dns_cache_clean(dns_cache_t *cache, isc_stdtime_t now) {
920 REQUIRE(VALID_CACHE(cache));
922 result = dns_db_createiterator(cache->db, 0, &iterator);
938 result = dns_db_expirenode(cache->db, node, now);
941 "cache cleaner: dns_db_expirenode() "
952 dns_db_detachnode(cache->db, &node);
967 dns_cache_t *cache = arg;
970 REQUIRE(VALID_CACHE(cache));
972 LOCK(&cache->cleaner.lock);
974 if (overmem != cache->cleaner.overmem) {
975 dns_db_overmem(cache->db, overmem);
976 cache->cleaner.overmem = overmem;
977 isc_mem_waterack(cache->mctx, mark);
980 if (cache->cleaner.overmem_event != NULL)
981 isc_task_send(cache->cleaner.task,
982 &cache->cleaner.overmem_event);
984 UNLOCK(&cache->cleaner.lock);
988 dns_cache_setcachesize(dns_cache_t *cache, isc_uint32_t size) {
992 REQUIRE(VALID_CACHE(cache));
995 * Impose a minimum cache size; pathological things happen if there
1005 * If the cache was overmem and cleaning, but now with the new limits
1007 * isc_mem_put for cache memory will do the right thing and trigger
1013 * Disable cache memory limiting.
1015 isc_mem_setwater(cache->mctx, water, cache, 0, 0);
1018 * Establish new cache memory limits (either for the first
1021 isc_mem_setwater(cache->mctx, water, cache, hiwater, lowater);
1029 dns_cache_t *cache = event->ev_arg;
1034 INSIST(task == cache->cleaner.task);
1037 if (CLEANER_BUSY(&cache->cleaner))
1038 end_cleaning(&cache->cleaner, event);
1042 LOCK(&cache->lock);
1044 cache->live_tasks--;
1045 INSIST(cache->live_tasks == 0);
1047 if (cache->references == 0)
1055 if (cache->cleaner.cleaning_timer != NULL)
1056 isc_timer_detach(&cache->cleaner.cleaning_timer);
1061 UNLOCK(&cache->lock);
1064 cache_free(cache);
1068 dns_cache_flush(dns_cache_t *cache) {
1072 result = cache_create_db(cache, &db);
1076 LOCK(&cache->lock);
1077 LOCK(&cache->cleaner.lock);
1078 if (cache->cleaner.state == cleaner_s_idle) {
1079 if (cache->cleaner.iterator != NULL)
1080 dns_dbiterator_destroy(&cache->cleaner.iterator);
1082 &cache->cleaner.iterator);
1084 if (cache->cleaner.state == cleaner_s_busy)
1085 cache->cleaner.state = cleaner_s_done;
1086 cache->cleaner.replaceiterator = ISC_TRUE;
1088 dns_db_detach(&cache->db);
1089 cache->db = db;
1090 UNLOCK(&cache->cleaner.lock);
1091 UNLOCK(&cache->lock);
1097 dns_cache_flushname(dns_cache_t *cache, dns_name_t *name) {
1103 LOCK(&cache->lock);
1104 if (cache->db != NULL)
1105 dns_db_attach(cache->db, &db);
1106 UNLOCK(&cache->lock);
1109 result = dns_db_findnode(cache->db, name, ISC_FALSE, &node);
1117 result = dns_db_allrdatasets(cache->db, node, NULL,
1130 result = dns_db_deleterdataset(cache->db, node, NULL,
1142 dns_db_detachnode(cache->db, &node);