#include "util/net_help.h"
#include "util/log.h"
#include "util/ub_event.h"
+#include "util/timeval_func.h"
#include "util/data/dname.h"
/** Auth load notification to string, for descriptive purposes. */
auth_load_thread_process(struct auth_load_thread* thr)
{
struct auth_load_task* task = thr->task;
+ struct timeval start, end;
+ if(gettimeofday(&start, NULL) < 0)
+ log_err("gettimeofday: %s", strerror(errno));
/* apply data */
if(task->on_http) {
if(!auth_load_process_axfr(thr))
return 0;
}
+
+ if(gettimeofday(&end, NULL) < 0)
+ log_err("gettimeofday: %s", strerror(errno));
+ timeval_subtract(&thr->task->time_taken, &end, &start);
return 1;
}
struct auth_chunk* chunk_list;
struct module_env* env = &thr->task->worker->env;
int ixfr_fail;
+ struct timeval time_taken;
log_assert(thr->commpair[0] >= 0);
ret = recv(thr->commpair[0], &recv_item, 1, 0);
lock_basic_lock(&xfr->lock);
lock_rw_unlock(&thr->task->worker->env.auth_zones->lock);
ixfr_fail = thr->task->ixfr_fail;
+ time_taken = thr->task->time_taken;
if(thr->task->on_http) {
chunk_list = thr->task->chunks_first;
thr->task->chunks_first = NULL;
auth_load_thread_delete(thr);
auth_load_info_release_thread(env);
xfr_process_load_end_transfer(xfr, env, recv_item, ixfr_fail,
- chunk_list);
+ &time_taken, chunk_list);
}
/** Attach worker to the auth load thread. */
struct auth_chunk* chunks_last;
/** size of data in data chunks. */
size_t chunks_total;
+
+ /** time taken for the task */
+ struct timeval time_taken;
};
/**
* ends holding xfr lock. */
static int
xfr_process_loaded_transfer(struct auth_xfer* xfr, struct module_env* env,
- int* gone)
+ int* gone, struct timeval* time_taken)
{
struct auth_zone* z = NULL;
verbose(VERB_ALGO, "xfr_process_loaded_transfer");
if(verbosity >= VERB_QUERY && xfr->have_zone) {
char zname[LDNS_MAX_DOMAINLEN];
dname_str(xfr->name, zname);
- verbose(VERB_QUERY, "auth zone %s updated to serial %u", zname,
- (unsigned)xfr->serial);
+ verbose(VERB_QUERY, "auth zone %s updated to serial %u",
+ zname, (unsigned)xfr->serial);
+ verbose(VERB_ALGO, "auth zone %s processing time was %d.%6.6ds",
+ zname, (int)time_taken->tv_sec,
+ (int)time_taken->tv_usec);
}
verbose(VERB_ALGO, "xfr_process_loaded_transfer: write after update");
/* see if we need to write to a zonefile */
void xfr_process_load_end_transfer(struct auth_xfer* xfr,
struct module_env* env, uint8_t status, int ixfr_fail,
- struct auth_chunk* chunk_list)
+ struct timeval* time_taken, struct auth_chunk* chunk_list)
{
/* Chunks are put here for the auth zone write for the http case. */
verbose(VERB_ALGO, "xfr_process_load_end_transfer");
xfr->task_transfer->chunks_first = chunk_list;
if(status) {
int gone = 0;
- if(!xfr_process_loaded_transfer(xfr, env, &gone)) {
+ if(!xfr_process_loaded_transfer(xfr, env, &gone, time_taken)) {
status = 0;
if(gone) {
/* the zone is gone from the authzones. */
/** Handle the end of an auth load task. */
void xfr_process_load_end_transfer(struct auth_xfer* xfr,
struct module_env* env, uint8_t status, int ixfr_fail,
- struct auth_chunk* chunk_list);
+ struct timeval* time_taken, struct auth_chunk* chunk_list);
/** Log preview of http transfer */
void xfr_http_preview(const char* file, struct auth_chunk* chunk_list);