120 #define QMGR_ERROR_OR_RETRY_QUEUE(queue) \
121 (strcmp(queue->transport->name, MAIL_SERVICE_RETRY) == 0 \
122 || strcmp(queue->transport->name, MAIL_SERVICE_ERROR) == 0)
124 #define QMGR_LOG_FEEDBACK(feedback) \
125 if (var_conc_feedback_debug && !QMGR_ERROR_OR_RETRY_QUEUE(queue)) \
126 msg_info("%s: feedback %g", myname, feedback);
128 #define QMGR_LOG_WINDOW(queue) \
129 if (var_conc_feedback_debug && !QMGR_ERROR_OR_RETRY_QUEUE(queue)) \
130 msg_info("%s: queue %s: limit %d window %d success %g failure %g fail_cohorts %g", \
131 myname, queue->name, queue->transport->dest_concurrency_limit, \
132 queue->window, queue->success, queue->failure, queue->fail_cohorts);
136 static void qmgr_queue_resume(
int event,
void *context)
139 const char *myname =
"qmgr_queue_resume";
179 const char *myname =
"qmgr_queue_suspend";
199 static void qmgr_queue_unthrottle_wrapper(
int unused_event,
void *context)
217 const char *myname =
"qmgr_queue_unthrottle";
245 msg_panic(
"%s: queue %s: window 0 status 0", myname, queue->
name);
297 const char *myname =
"qmgr_queue_throttle";
307 msg_panic(
"%s: queue %s: spurious reason %s",
346 while (queue->
failure - feedback / 2 < 0) {
372 const char *myname =
"qmgr_queue_done";
387 msg_panic(
"%s: queue %s: spurious reason %s",
int dest_concurrency_limit
char * mystrdup(const char *str)
NORETURN msg_panic(const char *fmt,...)
#define QMGR_QUEUE_STAT_THROTTLED
QMGR_FEEDBACK neg_feedback
#define QMGR_QUEUE_STAT_SUSPENDED
QMGR_QUEUE * qmgr_queue_find(QMGR_TRANSPORT *transport, const char *name)
int init_dest_concurrency
#define QMGR_LIST_INIT(head)
#define QMGR_LOG_FEEDBACK(feedback)
#define QMGR_LIST_APPEND(head, object)
#define QMGR_LOG_WINDOW(queue)
#define QMGR_FEEDBACK_VAL(fb, win)
struct HTABLE * queue_byname
#define QMGR_QUEUE_SUSPENDED(q)
void qmgr_queue_throttle(QMGR_QUEUE *queue, DSN *dsn)
void qmgr_queue_suspend(QMGR_QUEUE *queue, int delay)
void qmgr_job_blocker_update(QMGR_QUEUE *)
void qmgr_queue_unthrottle(QMGR_QUEUE *queue)
void * htable_find(HTABLE *table, const char *key)
#define QMGR_QUEUE_STATUS(q)
QMGR_QUEUE * qmgr_queue_create(QMGR_TRANSPORT *transport, const char *name, const char *nexthop)
QMGR_TRANSPORT * transport
#define QMGR_LIST_UNLINK(head, type, object)
QMGR_QUEUE_LIST queue_list
time_t event_request_timer(EVENT_NOTIFY_TIME_FN callback, void *context, int delay)
QMGR_FEEDBACK pos_feedback
#define QMGR_QUEUE_READY(q)
void qmgr_queue_done(QMGR_QUEUE *queue)
void htable_delete(HTABLE *table, const char *key, void(*free_fn)(void *))
int event_cancel_timer(EVENT_NOTIFY_TIME_FN callback, void *context)
#define QMGR_QUEUE_THROTTLED(q)
void * mymalloc(ssize_t len)
HTABLE_INFO * htable_enter(HTABLE *table, const char *key, void *value)
void msg_info(const char *fmt,...)