114 #define QMGR_ERROR_OR_RETRY_QUEUE(queue) \
115 (strcmp(queue->transport->name, MAIL_SERVICE_RETRY) == 0 \
116 || strcmp(queue->transport->name, MAIL_SERVICE_ERROR) == 0)
118 #define QMGR_LOG_FEEDBACK(feedback) \
119 if (var_conc_feedback_debug && !QMGR_ERROR_OR_RETRY_QUEUE(queue)) \
120 msg_info("%s: feedback %g", myname, feedback);
122 #define QMGR_LOG_WINDOW(queue) \
123 if (var_conc_feedback_debug && !QMGR_ERROR_OR_RETRY_QUEUE(queue)) \
124 msg_info("%s: queue %s: limit %d window %d success %g failure %g fail_cohorts %g", \
125 myname, queue->name, queue->transport->dest_concurrency_limit, \
126 queue->window, queue->success, queue->failure, queue->fail_cohorts);
130 static void qmgr_queue_resume(
int event,
void *context)
133 const char *myname =
"qmgr_queue_resume";
162 const char *myname =
"qmgr_queue_suspend";
182 static void qmgr_queue_unthrottle_wrapper(
int unused_event,
void *context)
200 const char *myname =
"qmgr_queue_unthrottle";
228 msg_panic(
"%s: queue %s: window 0 status 0", myname, queue->
name);
280 const char *myname =
"qmgr_queue_throttle";
290 msg_panic(
"%s: queue %s: spurious reason %s",
329 while (queue->
failure - feedback / 2 < 0) {
376 const char *myname =
"qmgr_queue_done";
391 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_LIST_ROTATE(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_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
#define QMGR_LOG_FEEDBACK(feedback)
time_t event_request_timer(EVENT_NOTIFY_TIME_FN callback, void *context, int delay)
#define QMGR_LIST_PREPEND(head, object)
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)
QMGR_QUEUE * qmgr_queue_select(QMGR_TRANSPORT *transport)
#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,...)