Lines Matching refs:cache
56 #define VALID_CACHE(cache) ISC_MAGIC_VALID(cache, CACHE_MAGIC) argument
110 dns_cache_t *cache; member
162 cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr,
175 cache_create_db(dns_cache_t *cache, dns_db_t **db) { in cache_create_db() argument
177 result = dns_db_create(cache->mctx, cache->db_type, dns_rootname, in cache_create_db()
178 dns_dbtype_cache, cache->rdclass, cache->db_argc, in cache_create_db()
179 cache->db_argv, db); in cache_create_db()
181 dns_db_setservestalettl(*db, cache->serve_stale_ttl); in cache_create_db()
192 dns_cache_t *cache; in dns_cache_create() local
202 cache = isc_mem_get(cmctx, sizeof(*cache)); in dns_cache_create()
204 cache->mctx = cache->hmctx = NULL; in dns_cache_create()
205 isc_mem_attach(cmctx, &cache->mctx); in dns_cache_create()
206 isc_mem_attach(hmctx, &cache->hmctx); in dns_cache_create()
208 cache->name = NULL; in dns_cache_create()
210 cache->name = isc_mem_strdup(cmctx, cachename); in dns_cache_create()
213 isc_mutex_init(&cache->lock); in dns_cache_create()
214 isc_mutex_init(&cache->filelock); in dns_cache_create()
216 isc_refcount_init(&cache->references, 1); in dns_cache_create()
217 isc_refcount_init(&cache->live_tasks, 1); in dns_cache_create()
218 cache->rdclass = rdclass; in dns_cache_create()
219 cache->serve_stale_ttl = 0; in dns_cache_create()
221 cache->stats = NULL; in dns_cache_create()
222 result = isc_stats_create(cmctx, &cache->stats, in dns_cache_create()
228 cache->db_type = isc_mem_strdup(cmctx, db_type); in dns_cache_create()
235 if (strcmp(cache->db_type, "rbt") == 0) { in dns_cache_create()
239 cache->db_argc = db_argc + extra; in dns_cache_create()
240 cache->db_argv = NULL; in dns_cache_create()
242 if (cache->db_argc != 0) { in dns_cache_create()
243 cache->db_argv = isc_mem_get(cmctx, in dns_cache_create()
244 cache->db_argc * sizeof(char *)); in dns_cache_create()
246 for (i = 0; i < cache->db_argc; i++) { in dns_cache_create()
247 cache->db_argv[i] = NULL; in dns_cache_create()
250 cache->db_argv[0] = (char *)hmctx; in dns_cache_create()
251 for (i = extra; i < cache->db_argc; i++) { in dns_cache_create()
252 cache->db_argv[i] = isc_mem_strdup(cmctx, in dns_cache_create()
260 cache->db = NULL; in dns_cache_create()
261 result = cache_create_db(cache, &cache->db); in dns_cache_create()
273 dns_db_settask(cache->db, dbtask); in dns_cache_create()
277 cache->filename = NULL; in dns_cache_create()
279 cache->magic = CACHE_MAGIC; in dns_cache_create()
286 result = cache_cleaner_init(cache, NULL, NULL, &cache->cleaner); in dns_cache_create()
288 result = cache_cleaner_init(cache, taskmgr, timermgr, in dns_cache_create()
289 &cache->cleaner); in dns_cache_create()
295 result = dns_db_setcachestats(cache->db, cache->stats); in dns_cache_create()
300 *cachep = cache; in dns_cache_create()
304 dns_db_detach(&cache->db); in dns_cache_create()
306 for (i = extra; i < cache->db_argc; i++) { in dns_cache_create()
307 if (cache->db_argv[i] != NULL) { in dns_cache_create()
308 isc_mem_free(cmctx, cache->db_argv[i]); in dns_cache_create()
311 if (cache->db_argv != NULL) { in dns_cache_create()
312 isc_mem_put(cmctx, cache->db_argv, in dns_cache_create()
313 cache->db_argc * sizeof(char *)); in dns_cache_create()
315 isc_mem_free(cmctx, cache->db_type); in dns_cache_create()
317 isc_mutex_destroy(&cache->filelock); in dns_cache_create()
318 isc_stats_detach(&cache->stats); in dns_cache_create()
319 isc_mutex_destroy(&cache->lock); in dns_cache_create()
320 if (cache->name != NULL) { in dns_cache_create()
321 isc_mem_free(cmctx, cache->name); in dns_cache_create()
323 isc_mem_detach(&cache->hmctx); in dns_cache_create()
324 isc_mem_putanddetach(&cache->mctx, cache, sizeof(*cache)); in dns_cache_create()
329 cache_free(dns_cache_t *cache) { in cache_free() argument
330 REQUIRE(VALID_CACHE(cache)); in cache_free()
332 isc_refcount_destroy(&cache->references); in cache_free()
333 isc_refcount_destroy(&cache->live_tasks); in cache_free()
335 isc_mem_setwater(cache->mctx, NULL, NULL, 0, 0); in cache_free()
337 if (cache->cleaner.task != NULL) { in cache_free()
338 isc_task_detach(&cache->cleaner.task); in cache_free()
341 if (cache->cleaner.overmem_event != NULL) { in cache_free()
342 isc_event_free(&cache->cleaner.overmem_event); in cache_free()
345 if (cache->cleaner.resched_event != NULL) { in cache_free()
346 isc_event_free(&cache->cleaner.resched_event); in cache_free()
349 if (cache->cleaner.iterator != NULL) { in cache_free()
350 dns_dbiterator_destroy(&cache->cleaner.iterator); in cache_free()
353 isc_mutex_destroy(&cache->cleaner.lock); in cache_free()
355 if (cache->filename) { in cache_free()
356 isc_mem_free(cache->mctx, cache->filename); in cache_free()
357 cache->filename = NULL; in cache_free()
360 if (cache->db != NULL) { in cache_free()
361 dns_db_detach(&cache->db); in cache_free()
364 if (cache->db_argv != NULL) { in cache_free()
370 if (strcmp(cache->db_type, "rbt") == 0) { in cache_free()
373 for (int i = extra; i < cache->db_argc; i++) { in cache_free()
374 if (cache->db_argv[i] != NULL) { in cache_free()
375 isc_mem_free(cache->mctx, cache->db_argv[i]); in cache_free()
378 isc_mem_put(cache->mctx, cache->db_argv, in cache_free()
379 cache->db_argc * sizeof(char *)); in cache_free()
382 if (cache->db_type != NULL) { in cache_free()
383 isc_mem_free(cache->mctx, cache->db_type); in cache_free()
386 if (cache->name != NULL) { in cache_free()
387 isc_mem_free(cache->mctx, cache->name); in cache_free()
390 if (cache->stats != NULL) { in cache_free()
391 isc_stats_detach(&cache->stats); in cache_free()
394 isc_mutex_destroy(&cache->lock); in cache_free()
395 isc_mutex_destroy(&cache->filelock); in cache_free()
397 cache->magic = 0; in cache_free()
398 isc_mem_detach(&cache->hmctx); in cache_free()
399 isc_mem_putanddetach(&cache->mctx, cache, sizeof(*cache)); in cache_free()
403 dns_cache_attach(dns_cache_t *cache, dns_cache_t **targetp) { in dns_cache_attach() argument
404 REQUIRE(VALID_CACHE(cache)); in dns_cache_attach()
407 isc_refcount_increment(&cache->references); in dns_cache_attach()
409 *targetp = cache; in dns_cache_attach()
414 dns_cache_t *cache; in dns_cache_detach() local
417 cache = *cachep; in dns_cache_detach()
419 REQUIRE(VALID_CACHE(cache)); in dns_cache_detach()
421 if (isc_refcount_decrement(&cache->references) == 1) { in dns_cache_detach()
422 cache->cleaner.overmem = false; in dns_cache_detach()
427 isc_result_t result = dns_cache_dump(cache); in dns_cache_detach()
438 if (isc_refcount_decrement(&cache->live_tasks) > 1) { in dns_cache_detach()
439 isc_task_shutdown(cache->cleaner.task); in dns_cache_detach()
441 cache_free(cache); in dns_cache_detach()
447 dns_cache_attachdb(dns_cache_t *cache, dns_db_t **dbp) { in dns_cache_attachdb() argument
448 REQUIRE(VALID_CACHE(cache)); in dns_cache_attachdb()
450 REQUIRE(cache->db != NULL); in dns_cache_attachdb()
452 LOCK(&cache->lock); in dns_cache_attachdb()
453 dns_db_attach(cache->db, dbp); in dns_cache_attachdb()
454 UNLOCK(&cache->lock); in dns_cache_attachdb()
458 dns_cache_setfilename(dns_cache_t *cache, const char *filename) { in dns_cache_setfilename() argument
461 REQUIRE(VALID_CACHE(cache)); in dns_cache_setfilename()
464 newname = isc_mem_strdup(cache->mctx, filename); in dns_cache_setfilename()
466 LOCK(&cache->filelock); in dns_cache_setfilename()
467 if (cache->filename) { in dns_cache_setfilename()
468 isc_mem_free(cache->mctx, cache->filename); in dns_cache_setfilename()
470 cache->filename = newname; in dns_cache_setfilename()
471 UNLOCK(&cache->filelock); in dns_cache_setfilename()
477 dns_cache_load(dns_cache_t *cache) { in dns_cache_load() argument
480 REQUIRE(VALID_CACHE(cache)); in dns_cache_load()
482 if (cache->filename == NULL) { in dns_cache_load()
486 LOCK(&cache->filelock); in dns_cache_load()
487 result = dns_db_load(cache->db, cache->filename, dns_masterformat_text, in dns_cache_load()
489 UNLOCK(&cache->filelock); in dns_cache_load()
495 dns_cache_dump(dns_cache_t *cache) { in dns_cache_dump() argument
498 REQUIRE(VALID_CACHE(cache)); in dns_cache_dump()
500 if (cache->filename == NULL) { in dns_cache_dump()
504 LOCK(&cache->filelock); in dns_cache_dump()
505 result = dns_master_dump(cache->mctx, cache->db, NULL, in dns_cache_dump()
506 &dns_master_style_cache, cache->filename, in dns_cache_dump()
508 UNLOCK(&cache->filelock); in dns_cache_dump()
513 dns_cache_getname(dns_cache_t *cache) { in dns_cache_getname() argument
514 REQUIRE(VALID_CACHE(cache)); in dns_cache_getname()
516 return (cache->name); in dns_cache_getname()
525 cache_cleaner_init(dns_cache_t *cache, isc_taskmgr_t *taskmgr, in cache_cleaner_init() argument
533 cleaner->cache = cache; in cache_cleaner_init()
542 result = dns_db_createiterator(cleaner->cache->db, false, in cache_cleaner_init()
557 isc_refcount_increment(&cleaner->cache->live_tasks); in cache_cleaner_init()
561 cleaner_shutdown_action, cache); in cache_cleaner_init()
563 isc_refcount_decrement0(&cleaner->cache->live_tasks); in cache_cleaner_init()
572 cache->mctx, cleaner, DNS_EVENT_CACHECLEAN, in cache_cleaner_init()
577 cache->mctx, cleaner, DNS_EVENT_CACHEOVERMEM, in cache_cleaner_init()
612 result = dns_db_createiterator(cleaner->cache->db, false, in begin_cleaning()
650 (unsigned long)isc_mem_inuse(cleaner->cache->mctx)); in begin_cleaning()
672 (unsigned long)isc_mem_inuse(cleaner->cache->mctx)); in end_cleaning()
746 LOCK(&cleaner->cache->lock); in incremental_cleaning_action()
750 (void)dns_db_createiterator(cleaner->cache->db, false, in incremental_cleaning_action()
755 UNLOCK(&cleaner->cache->lock); in incremental_cleaning_action()
785 dns_db_detachnode(cleaner->cache->db, &node); in incremental_cleaning_action()
839 (unsigned long)isc_mem_inuse(cleaner->cache->mctx)); in incremental_cleaning_action()
850 dns_cache_clean(dns_cache_t *cache, isc_stdtime_t now) { in dns_cache_clean() argument
854 REQUIRE(VALID_CACHE(cache)); in dns_cache_clean()
856 result = dns_db_createiterator(cache->db, 0, &iterator); in dns_cache_clean()
874 result = dns_db_expirenode(cache->db, node, now); in dns_cache_clean()
888 dns_db_detachnode(cache->db, &node); in dns_cache_clean()
904 dns_cache_t *cache = arg; in water() local
907 REQUIRE(VALID_CACHE(cache)); in water()
909 LOCK(&cache->cleaner.lock); in water()
911 if (overmem != cache->cleaner.overmem) { in water()
912 dns_db_overmem(cache->db, overmem); in water()
913 cache->cleaner.overmem = overmem; in water()
914 isc_mem_waterack(cache->mctx, mark); in water()
917 if (cache->cleaner.overmem_event != NULL) { in water()
918 isc_task_send(cache->cleaner.task, in water()
919 &cache->cleaner.overmem_event); in water()
922 UNLOCK(&cache->cleaner.lock); in water()
926 dns_cache_setcachesize(dns_cache_t *cache, size_t size) { in dns_cache_setcachesize() argument
929 REQUIRE(VALID_CACHE(cache)); in dns_cache_setcachesize()
939 LOCK(&cache->lock); in dns_cache_setcachesize()
940 cache->size = size; in dns_cache_setcachesize()
941 UNLOCK(&cache->lock); in dns_cache_setcachesize()
957 isc_mem_setwater(cache->mctx, water, cache, 0, 0); in dns_cache_setcachesize()
963 isc_mem_setwater(cache->mctx, water, cache, hiwater, lowater); in dns_cache_setcachesize()
966 dns_db_adjusthashsize(cache->db, size); in dns_cache_setcachesize()
970 dns_cache_getcachesize(dns_cache_t *cache) { in dns_cache_getcachesize() argument
973 REQUIRE(VALID_CACHE(cache)); in dns_cache_getcachesize()
975 LOCK(&cache->lock); in dns_cache_getcachesize()
976 size = cache->size; in dns_cache_getcachesize()
977 UNLOCK(&cache->lock); in dns_cache_getcachesize()
983 dns_cache_setservestalettl(dns_cache_t *cache, dns_ttl_t ttl) { in dns_cache_setservestalettl() argument
984 REQUIRE(VALID_CACHE(cache)); in dns_cache_setservestalettl()
986 LOCK(&cache->lock); in dns_cache_setservestalettl()
987 cache->serve_stale_ttl = ttl; in dns_cache_setservestalettl()
988 UNLOCK(&cache->lock); in dns_cache_setservestalettl()
990 (void)dns_db_setservestalettl(cache->db, ttl); in dns_cache_setservestalettl()
994 dns_cache_getservestalettl(dns_cache_t *cache) { in dns_cache_getservestalettl() argument
998 REQUIRE(VALID_CACHE(cache)); in dns_cache_getservestalettl()
1004 result = dns_db_getservestalettl(cache->db, &ttl); in dns_cache_getservestalettl()
1009 dns_cache_setservestalerefresh(dns_cache_t *cache, dns_ttl_t interval) { in dns_cache_setservestalerefresh() argument
1010 REQUIRE(VALID_CACHE(cache)); in dns_cache_setservestalerefresh()
1012 LOCK(&cache->lock); in dns_cache_setservestalerefresh()
1013 cache->serve_stale_refresh = interval; in dns_cache_setservestalerefresh()
1014 UNLOCK(&cache->lock); in dns_cache_setservestalerefresh()
1016 (void)dns_db_setservestalerefresh(cache->db, interval); in dns_cache_setservestalerefresh()
1020 dns_cache_getservestalerefresh(dns_cache_t *cache) { in dns_cache_getservestalerefresh() argument
1024 REQUIRE(VALID_CACHE(cache)); in dns_cache_getservestalerefresh()
1026 result = dns_db_getservestalerefresh(cache->db, &interval); in dns_cache_getservestalerefresh()
1035 dns_cache_t *cache = event->ev_arg; in cleaner_shutdown_action() local
1039 INSIST(task == cache->cleaner.task); in cleaner_shutdown_action()
1042 if (CLEANER_BUSY(&cache->cleaner)) { in cleaner_shutdown_action()
1043 end_cleaning(&cache->cleaner, event); in cleaner_shutdown_action()
1051 isc_refcount_decrementz(&cache->live_tasks); in cleaner_shutdown_action()
1053 cache_free(cache); in cleaner_shutdown_action()
1057 dns_cache_flush(dns_cache_t *cache) { in dns_cache_flush() argument
1062 result = cache_create_db(cache, &db); in dns_cache_flush()
1073 LOCK(&cache->lock); in dns_cache_flush()
1074 LOCK(&cache->cleaner.lock); in dns_cache_flush()
1075 if (cache->cleaner.state == cleaner_s_idle) { in dns_cache_flush()
1076 olddbiterator = cache->cleaner.iterator; in dns_cache_flush()
1077 cache->cleaner.iterator = dbiterator; in dns_cache_flush()
1080 if (cache->cleaner.state == cleaner_s_busy) { in dns_cache_flush()
1081 cache->cleaner.state = cleaner_s_done; in dns_cache_flush()
1083 cache->cleaner.replaceiterator = true; in dns_cache_flush()
1085 olddb = cache->db; in dns_cache_flush()
1086 cache->db = db; in dns_cache_flush()
1087 dns_db_setcachestats(cache->db, cache->stats); in dns_cache_flush()
1088 UNLOCK(&cache->cleaner.lock); in dns_cache_flush()
1089 UNLOCK(&cache->lock); in dns_cache_flush()
1212 dns_cache_flushname(dns_cache_t *cache, const dns_name_t *name) { in dns_cache_flushname() argument
1213 return (dns_cache_flushnode(cache, name, false)); in dns_cache_flushname()
1217 dns_cache_flushnode(dns_cache_t *cache, const dns_name_t *name, bool tree) { in dns_cache_flushnode() argument
1223 return (dns_cache_flush(cache)); in dns_cache_flushnode()
1226 LOCK(&cache->lock); in dns_cache_flushnode()
1227 if (cache->db != NULL) { in dns_cache_flushnode()
1228 dns_db_attach(cache->db, &db); in dns_cache_flushnode()
1230 UNLOCK(&cache->lock); in dns_cache_flushnode()
1236 result = cleartree(cache->db, name); in dns_cache_flushnode()
1238 result = dns_db_findnode(cache->db, name, false, &node); in dns_cache_flushnode()
1246 result = clearnode(cache->db, node); in dns_cache_flushnode()
1247 dns_db_detachnode(cache->db, &node); in dns_cache_flushnode()
1256 dns_cache_getstats(dns_cache_t *cache) { in dns_cache_getstats() argument
1257 REQUIRE(VALID_CACHE(cache)); in dns_cache_getstats()
1258 return (cache->stats); in dns_cache_getstats()
1262 dns_cache_updatestats(dns_cache_t *cache, isc_result_t result) { in dns_cache_updatestats() argument
1263 REQUIRE(VALID_CACHE(cache)); in dns_cache_updatestats()
1264 if (cache->stats == NULL) { in dns_cache_updatestats()
1276 isc_stats_increment(cache->stats, in dns_cache_updatestats()
1280 isc_stats_increment(cache->stats, in dns_cache_updatestats()
1323 dns_cache_dumpstats(dns_cache_t *cache, FILE *fp) { in dns_cache_dumpstats() argument
1327 REQUIRE(VALID_CACHE(cache)); in dns_cache_dumpstats()
1329 getcounters(cache->stats, isc_statsformat_file, in dns_cache_dumpstats()
1348 fprintf(fp, "%20u %s\n", dns_db_nodecount(cache->db), in dns_cache_dumpstats()
1350 fprintf(fp, "%20" PRIu64 " %s\n", (uint64_t)dns_db_hashsize(cache->db), in dns_cache_dumpstats()
1353 fprintf(fp, "%20" PRIu64 " %s\n", (uint64_t)isc_mem_total(cache->mctx), in dns_cache_dumpstats()
1355 fprintf(fp, "%20" PRIu64 " %s\n", (uint64_t)isc_mem_inuse(cache->mctx), in dns_cache_dumpstats()
1358 (uint64_t)isc_mem_maxinuse(cache->mctx), in dns_cache_dumpstats()
1361 fprintf(fp, "%20" PRIu64 " %s\n", (uint64_t)isc_mem_total(cache->hmctx), in dns_cache_dumpstats()
1363 fprintf(fp, "%20" PRIu64 " %s\n", (uint64_t)isc_mem_inuse(cache->hmctx), in dns_cache_dumpstats()
1366 (uint64_t)isc_mem_maxinuse(cache->hmctx), in dns_cache_dumpstats()
1392 dns_cache_renderxml(dns_cache_t *cache, void *writer0) { in dns_cache_renderxml() argument
1398 REQUIRE(VALID_CACHE(cache)); in dns_cache_renderxml()
1400 getcounters(cache->stats, isc_statsformat_file, in dns_cache_renderxml()
1415 TRY0(renderstat("CacheNodes", dns_db_nodecount(cache->db), writer)); in dns_cache_renderxml()
1416 TRY0(renderstat("CacheBuckets", dns_db_hashsize(cache->db), writer)); in dns_cache_renderxml()
1418 TRY0(renderstat("TreeMemTotal", isc_mem_total(cache->mctx), writer)); in dns_cache_renderxml()
1419 TRY0(renderstat("TreeMemInUse", isc_mem_inuse(cache->mctx), writer)); in dns_cache_renderxml()
1420 TRY0(renderstat("TreeMemMax", isc_mem_maxinuse(cache->mctx), writer)); in dns_cache_renderxml()
1422 TRY0(renderstat("HeapMemTotal", isc_mem_total(cache->hmctx), writer)); in dns_cache_renderxml()
1423 TRY0(renderstat("HeapMemInUse", isc_mem_inuse(cache->hmctx), writer)); in dns_cache_renderxml()
1424 TRY0(renderstat("HeapMemMax", isc_mem_maxinuse(cache->hmctx), writer)); in dns_cache_renderxml()
1440 dns_cache_renderjson(dns_cache_t *cache, void *cstats0) { in dns_cache_renderjson() argument
1447 REQUIRE(VALID_CACHE(cache)); in dns_cache_renderjson()
1449 getcounters(cache->stats, isc_statsformat_file, in dns_cache_renderjson()
1476 obj = json_object_new_int64(dns_db_nodecount(cache->db)); in dns_cache_renderjson()
1480 obj = json_object_new_int64(dns_db_hashsize(cache->db)); in dns_cache_renderjson()
1484 obj = json_object_new_int64(isc_mem_total(cache->mctx)); in dns_cache_renderjson()
1488 obj = json_object_new_int64(isc_mem_inuse(cache->mctx)); in dns_cache_renderjson()
1492 obj = json_object_new_int64(isc_mem_maxinuse(cache->mctx)); in dns_cache_renderjson()
1496 obj = json_object_new_int64(isc_mem_total(cache->hmctx)); in dns_cache_renderjson()
1500 obj = json_object_new_int64(isc_mem_inuse(cache->hmctx)); in dns_cache_renderjson()
1504 obj = json_object_new_int64(isc_mem_maxinuse(cache->hmctx)); in dns_cache_renderjson()