fr_time_t checked_timeout; //!< when we last checked the tails of the queues
fr_time_t last_event; //!< last time we ran the event loop
- fr_time_t next_cleanup; //!< when we next do the max_request_time checks
fr_event_timer_t const *ev_cleanup; //!< timer for max_request_time
fr_channel_t **channel; //!< list of channels
worker->stats.out++;
}
-static void worker_reset_timer(fr_worker_t *worker);
+static void worker_max_request_timer(fr_worker_t *worker);
/** Reply to a request
* be deleted.
*/
while ((request = fr_heap_peek_tail(worker->time_order)) != NULL) {
+ fr_time_t cleanup;
+
REQUEST_VERIFY(request);
+ cleanup = request->async->recv_time;
+ cleanup += worker->max_request_time;
+ if (cleanup > now) break;
+
/*
* Waiting too long, delete it.
*/
}
/*
- * There are still active requests. Reset the timer.
+ * Reset the max request timer.
*/
- worker_reset_timer(worker);
+ worker_max_request_timer(worker);
}
/** See when we next need to service the time_order heap for "too old"
* packets.
*
*/
-static void worker_reset_timer(fr_worker_t *worker)
+static void worker_max_request_timer(fr_worker_t *worker)
{
fr_time_t cleanup;
REQUEST *request;
*/
request = fr_heap_peek_tail(worker->time_order);
if (!request) {
- if (worker->ev_cleanup) fr_event_timer_delete(worker->el, &worker->ev_cleanup);
- return;
+ cleanup = fr_event_list_time(worker->el);
+ } else {
+ cleanup = request->async->recv_time;
}
- rad_assert(worker->num_active > 0);
-
- cleanup = request->async->recv_time;
cleanup += worker->max_request_time;
- /*
- * Suppress the timer update if it's within 1s of the
- * previous one.
- */
- if (worker->ev_cleanup) {
- if ((cleanup > worker->next_cleanup) &&
- (cleanup - worker->next_cleanup) <= NSEC) return;
- }
-
- worker->next_cleanup = cleanup;
-
DEBUG2("Resetting worker %s cleanup timer to +%pV",
worker->name, fr_box_time_delta(worker->max_request_time));
if (fr_event_timer_at(worker, worker->el, &worker->ev_cleanup,
worker->num_active++;
rad_assert(request->runnable_id < 0);
- worker_reset_timer(worker);
return request;
}
}
fr_worker_send_reply(worker, request, size);
- worker_reset_timer(worker);
}
/** Run the event loop 'pre' callback
goto fail2;
}
+ /*
+ * Set the initial cleanup timer
+ */
+ worker_max_request_timer(worker);
+
return worker;
}