mirror of
https://github.com/NLnetLabs/unbound.git
synced 2026-08-17 21:25:50 +02:00
- Extended test for cachedb serve expired.
This commit is contained in:
@@ -157,6 +157,7 @@ repevt_string(enum replay_event_type t)
|
||||
case repevt_traffic: return "TRAFFIC";
|
||||
case repevt_infra_rtt: return "INFRA_RTT";
|
||||
case repevt_flush_message: return "FLUSH_MESSAGE";
|
||||
case repevt_expire_message: return "EXPIRE_MESSAGE";
|
||||
default: return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
@@ -718,6 +719,42 @@ do_flush_message(struct replay_runtime* runtime)
|
||||
slabhash_remove(runtime->daemon->env->msg_cache, h, &k);
|
||||
}
|
||||
|
||||
/** Expire message from message cache. */
|
||||
static void
|
||||
do_expire_message(struct replay_runtime* runtime)
|
||||
{
|
||||
struct replay_moment* now = runtime->now;
|
||||
uint8_t rr[1024];
|
||||
size_t rr_len = sizeof(rr), dname_len = 0;
|
||||
hashvalue_type h;
|
||||
struct query_info k;
|
||||
struct lruhash_entry* e;
|
||||
|
||||
if(sldns_str2wire_rr_question_buf(now->string, rr, &rr_len,
|
||||
&dname_len, NULL, 0, NULL, 0) != 0)
|
||||
fatal_exit("could not parse '%s'", now->string);
|
||||
|
||||
log_info("expire message %s", now->string);
|
||||
k.qname = rr;
|
||||
k.qname_len = dname_len;
|
||||
k.qtype = sldns_wirerr_get_type(rr, rr_len, dname_len);
|
||||
k.qclass = sldns_wirerr_get_class(rr, rr_len, dname_len);
|
||||
k.local_alias = NULL;
|
||||
h = query_info_hash(&k, 0);
|
||||
|
||||
e = slabhash_lookup(runtime->daemon->env->msg_cache, h, &k, 0);
|
||||
if(e) {
|
||||
struct msgreply_entry* msg = (struct msgreply_entry*)e->key;
|
||||
struct reply_info* rep = (struct reply_info*)msg->entry.data;
|
||||
time_t expired = runtime->now_secs;
|
||||
expired -= 3;
|
||||
rep->ttl = expired;
|
||||
rep->prefetch_ttl = expired;
|
||||
rep->serve_expired_ttl = expired;
|
||||
lock_rw_unlock(&msg->entry.lock);
|
||||
}
|
||||
}
|
||||
|
||||
/** perform exponential backoff on the timeout */
|
||||
static void
|
||||
expon_timeout_backoff(struct replay_runtime* runtime)
|
||||
@@ -827,6 +864,10 @@ do_moment_and_advance(struct replay_runtime* runtime)
|
||||
do_flush_message(runtime);
|
||||
advance_moment(runtime);
|
||||
break;
|
||||
case repevt_expire_message:
|
||||
do_expire_message(runtime);
|
||||
advance_moment(runtime);
|
||||
break;
|
||||
default:
|
||||
fatal_exit("testbound: unknown event type %d",
|
||||
runtime->now->evt_type);
|
||||
|
||||
@@ -355,6 +355,13 @@ replay_moment_read(char* remain, FILE* in, const char* name,
|
||||
strip_end_white(remain);
|
||||
mom->string = strdup(remain);
|
||||
if(!mom->string) fatal_exit("out of memory");
|
||||
} else if(parse_keyword(&remain, "EXPIRE_MESSAGE")) {
|
||||
mom->evt_type = repevt_expire_message;
|
||||
while(isspace((unsigned char)*remain))
|
||||
remain++;
|
||||
strip_end_white(remain);
|
||||
mom->string = strdup(remain);
|
||||
if(!mom->string) fatal_exit("out of memory");
|
||||
} else {
|
||||
log_err("%d: unknown event type %s", pstate->lineno, remain);
|
||||
free(mom);
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
* o CHECK_TEMPFILE [fname] - followed by FILE_BEGIN [to match] FILE_END
|
||||
* o INFRA_RTT [ip] [dp] [rtt] - update infra cache entry with rtt.
|
||||
* o FLUSH_MESSAGE name type class - flushes entry in message cache.
|
||||
* o EXPIRE_MESSAGE name type class - expires entry in message cache.
|
||||
* o ERROR
|
||||
* ; following entry starts on the next line, ENTRY_BEGIN.
|
||||
* ; more STEP items
|
||||
@@ -216,6 +217,8 @@ struct replay_moment {
|
||||
repevt_infra_rtt,
|
||||
/** flush message cache entry */
|
||||
repevt_flush_message,
|
||||
/** expire message cache entry */
|
||||
repevt_expire_message,
|
||||
/** cause traffic to flow */
|
||||
repevt_traffic
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user