52 ods_lookup_table *lt = ods_lookup_by_id(
worker_str, type);
69 ods_log_debug(
"[%s[%i]] create", worker2str(type), num+1);
96 const char* str,
const char* name,
task_id* what, time_t* when)
99 ods_log_verbose(
"[%s[%i]] %s zone %s", worker2str(worker->
type),
127 ods_log_assert(worker);
143 ods_status status = ODS_STATUS_UNCHANGED;
145 ods_log_assert(worker);
146 ods_log_assert(worker->
task);
148 ods_log_assert(rrset);
150 lock_basic_lock(&q->
q_lock);
151 status =
fifoq_push(q, (
void*) rrset, worker, &tries);
152 while (status == ODS_STATUS_UNCHANGED) {
155 lock_basic_unlock(&q->
q_lock);
165 status =
fifoq_push(q, (
void*) rrset, worker, &tries);
167 lock_basic_unlock(&q->
q_lock);
169 ods_log_assert(status == ODS_STATUS_OK);
185 ods_log_assert(worker);
187 ods_log_assert(domain);
190 worker_queue_rrset(worker, q, rrset);
194 if (denial && denial->
rrset) {
195 worker_queue_rrset(worker, q, denial->
rrset);
207 ldns_rbnode_t* node = LDNS_RBTREE_NULL;
209 ods_log_assert(worker);
211 ods_log_assert(zone);
212 worker_clear_jobs(worker);
216 if (zone->
db->
domains->root != LDNS_RBTREE_NULL) {
217 node = ldns_rbtree_first(zone->
db->
domains);
219 while (node && node != LDNS_RBTREE_NULL) {
221 worker_queue_domain(worker, q, domain);
222 node = ldns_rbtree_next(node);
234 ods_log_assert(worker);
235 ods_log_assert(task);
238 ods_log_error(
"[%s[%i]] sign zone %s failed: %lu RRsets failed",
242 return ODS_STATUS_ERR;
244 ods_log_error(
"[%s[%i]] sign zone %s failed: processed %lu of %lu " 249 return ODS_STATUS_ERR;
251 ods_log_debug(
"[%s[%i]] sign zone %s failed: worker needs to exit",
254 return ODS_STATUS_ERR;
256 ods_log_debug(
"[%s[%i]] sign zone %s ok: %lu of %lu RRsets " 263 return ODS_STATUS_OK;
279 time_t never = (3600*24*365);
280 ods_status status = ODS_STATUS_OK;
291 ods_log_debug(
"[%s[%i]] perform task %s for zone %s",
295 switch (task->
what) {
301 if (status == ODS_STATUS_UNCHANGED) {
303 ods_log_debug(
"[%s[%i]] no signconf.xml for zone %s yet",
306 status = ODS_STATUS_ERR;
309 if (status == ODS_STATUS_UNCHANGED) {
311 goto task_perform_continue;
313 status = ODS_STATUS_OK;
314 }
else if (status == ODS_STATUS_OK) {
319 goto task_perform_fail;
321 goto task_perform_continue;
330 ods_log_debug(
"[%s[%i]] no signconf.xml for zone %s yet",
333 status = ODS_STATUS_ERR;
335 if (hsm_check_context()) {
336 ods_log_error(
"signer instructed to reload due to hsm reset in read task");
338 status = ODS_STATUS_ERR;
344 if (status == ODS_STATUS_UNCHANGED) {
345 ods_log_verbose(
"[%s[%i]] zone %s unsigned data not changed, " 348 status = ODS_STATUS_OK;
350 if (status == ODS_STATUS_OK) {
357 goto task_perform_fail;
359 goto task_perform_continue;
368 if (status == ODS_STATUS_OK) {
374 ods_log_error(
"[%s[%i]] unable to sign zone %s: " 375 "failed to increment serial",
379 goto task_perform_fail;
381 goto task_perform_continue;
398 if (hsm_check_context()) {
399 ods_log_error(
"signer instructed to reload due to hsm reset in sign task");
401 goto task_perform_fail;
405 if (status == ODS_STATUS_OK) {
407 worker_queue_zone(worker, engine->
signq, zone);
408 ods_log_deeebug(
"[%s[%i]] wait until drudgers are finished " 409 "signing zone %s", worker2str(worker->
type),
417 if (status == ODS_STATUS_OK) {
418 status = worker_check_jobs(worker, task);
420 worker_clear_jobs(worker);
421 if (status == ODS_STATUS_OK && zone->
stats) {
426 if (status != ODS_STATUS_OK) {
428 goto task_perform_fail;
430 goto task_perform_continue;
444 if (status == ODS_STATUS_OK) {
452 goto task_perform_fail;
454 goto task_perform_continue;
463 ods_log_error(
"[%s[%i]] unable to retrieve resign interval " 464 "for zone %s: duration2time() failed",
467 ods_log_info(
"[%s[%i]] defaulting to 1H resign interval for " 478 ods_log_warning(
"[%s[%i]] none task for zone %s",
481 when = time_now() + never;
486 ods_log_warning(
"[%s[%i]] unknown task, trying full sign zone %s",
496 ods_log_debug(
"[%s[%i]] interrupt task %s for zone %s",
502 task->
when = time_now();
504 ods_log_debug(
"[%s[%i]] next task %s for zone %s",
516 if (status != ODS_STATUS_OK) {
517 ods_log_warning(
"[%s[%i]] unable to backup zone %s: %s",
521 status = ODS_STATUS_OK;
528 if (status != ODS_STATUS_XFR_NOT_READY) {
530 ods_log_crit(
"[%s[%i]] CRITICAL: failed to sign zone %s: %s",
541 if (task->
backoff > ODS_SE_MAX_BACKOFF) {
542 task->
backoff = ODS_SE_MAX_BACKOFF;
544 ods_log_info(
"[%s[%i]] backoff task %s for zone %s with %lu seconds",
550 task_perform_continue:
551 ods_log_info(
"[%s[%i]] continue task %s for zone %s",
574 ods_status status = ODS_STATUS_OK;
576 ods_log_assert(worker);
581 ods_log_debug(
"[%s[%i]] report for duty", worker2str(worker->
type),
592 ods_log_debug(
"[%s[%i]] start working on zone %s",
595 worker_perform_task(worker);
597 ods_log_debug(
"[%s[%i]] finished working on zone %s",
604 if (status != ODS_STATUS_OK) {
605 ods_log_error(
"[%s[%i]] unable to schedule task for zone %s: " 607 zone->
name, ods_status2str(status));
620 ods_log_debug(
"[%s[%i]] nothing to do", worker2str(worker->
type),
625 timeout = (worker->
task->
when - now);
629 if (timeout > ODS_SE_MAX_BACKOFF) {
630 timeout = ODS_SE_MAX_BACKOFF;
650 ods_status status = ODS_STATUS_OK;
652 hsm_ctx_t* ctx = NULL;
654 ods_log_assert(worker);
655 ods_log_assert(worker->
engine);
660 ods_log_deeebug(
"[%s[%i]] report for duty", worker2str(worker->
type),
670 ods_log_deeebug(
"[%s[%i]] nothing to do, wait",
686 ods_log_assert(superior);
688 ods_log_debug(
"[%s[%i]] create hsm context",
690 ctx = hsm_create_context();
693 ods_log_crit(
"[%s[%i]] error creating libhsm context",
696 ods_log_error(
"signer instructed to reload due to hsm reset while signing");
703 task = superior->
task;
704 ods_log_assert(task);
707 ods_log_assert(zone);
708 ods_log_assert(zone->
apex);
713 if (status == ODS_STATUS_OK) {
720 if (worker_fulfilled(superior) && superior->
sleeping) {
721 ods_log_deeebug(
"[%s[%i]] wake up superior[%u], work is " 733 hsm_destroy_context(ctx);
745 ods_log_assert(worker);
746 switch (worker->
type) {
748 worker_drudge(worker);
754 ods_log_error(
"[worker] illegal worker (id=%i)", worker->
type);
767 ods_log_assert(worker);
785 ods_log_assert(worker);
787 while (!worker->
need_to_exit && !worker_fulfilled(worker)) {
791 ods_log_debug(
"[%s[%i]] somebody poked me, check completed jobs %lu " 792 "appointed, %lu completed, %lu failed", worker2str(worker->
type),
807 ods_log_assert(worker);
809 ods_log_debug(
"[%s[%i]] wake up", worker2str(worker->
type),
826 lock_basic_lock(lock);
827 lock_basic_broadcast(condition);
828 lock_basic_unlock(lock);
task_type * schedule_get_first_task(schedule_type *schedule)
worker_type * worker_create(int num, worker_id type)
lock_basic_type worker_lock
cond_basic_type signal_cond
cond_basic_type q_threshold
ods_status schedule_task(schedule_type *schedule, task_type *task, int log)
const char * task_who2str(task_type *task)
void worker_start(worker_type *worker)
lock_basic_type zone_lock
lock_basic_type stats_lock
void worker_cleanup(worker_type *worker)
enum task_id_enum task_id
ods_status fifoq_push(fifoq_type *q, void *item, worker_type *worker, int *tries)
lock_basic_type signal_lock
void worker_sleep(worker_type *worker, time_t timeout)
task_type * schedule_pop_task(schedule_type *schedule)
void worker_notify_all(lock_basic_type *lock, cond_basic_type *condition)
ods_status zone_backup2(zone_type *zone)
ods_status zone_update_serial(zone_type *zone)
void worker_wakeup(worker_type *worker)
enum worker_enum worker_id
void worker_sleep_unless(worker_type *worker, time_t timeout)
ods_status zone_prepare_keys(zone_type *zone)
duration_type * sig_resign_interval
cond_basic_type worker_alarm
ods_status rrset_sign(hsm_ctx_t *ctx, rrset_type *rrset, time_t signtime)
lock_basic_type schedule_lock
cond_basic_type q_nonfull
const char * task_what2str(task_id what)
ods_lookup_table worker_str[]
void * fifoq_pop(fifoq_type *q, worker_type **worker)