The default kick command timeout should be larger than the lookup timeout.
T_BEGIN {
anvil_client_query(penalty->client,
t_strdup_printf("PENALTY-GET\t%s", ident),
+ ANVIL_DEFAULT_LOOKUP_TIMEOUT_MSECS,
auth_penalty_anvil_callback, request);
} T_END;
}
user->username_hash);
dir->users_kicking_count++;
ctx->anvil_cmd = anvil_client_query(dir->anvil, cmd,
+ ANVIL_DEFAULT_KICK_TIMEOUT_MSECS,
director_kill_user_callback, ctx);
} else {
/* a) we didn't even know about the user before now.
str_append_tabescaped(cmd, username);
dir->users_kicking_count++;
anvil_client_query(dir->anvil, str_c(cmd),
+ ANVIL_DEFAULT_KICK_TIMEOUT_MSECS,
director_kick_user_callback, dir);
if (orig_src == NULL) {
str_append_tabescaped(cmd, value);
dir->users_kicking_count++;
anvil_client_query(dir->anvil, str_c(cmd),
+ ANVIL_DEFAULT_KICK_TIMEOUT_MSECS,
director_kick_user_callback, dir);
if (orig_src == NULL) {
username_hash, net_ip2addr(except_ip));
dir->users_kicking_count++;
anvil_client_query(dir->anvil, cmd,
+ ANVIL_DEFAULT_KICK_TIMEOUT_MSECS,
director_kick_user_callback, dir);
if (orig_src == NULL) {
}
anvil_client_query(anvil, str_c(cmd),
+ ANVIL_DEFAULT_KICK_TIMEOUT_MSECS,
kick_user_anvil_callback, ctx);
io_loop_run(current_ioloop);
}
struct anvil_query {
struct anvil_client *client;
struct timeout *to;
+ unsigned int timeout_msecs;
anvil_callback_t *callback;
void *context;
#define ANVIL_INBUF_SIZE 1024
#define ANVIL_RECONNECT_MIN_SECS 5
-#define ANVIL_QUERY_TIMEOUT_MSECS (1000*5)
static void anvil_client_destroy(struct connection *conn);
static int anvil_client_input_line(struct connection *conn, const char *line);
i_assert(aqueue_count(client->queries) > 0);
e_error(client->conn.event,
- "Anvil queries timed out after %u secs - aborting queries",
- ANVIL_QUERY_TIMEOUT_MSECS/1000);
+ "Anvil queries timed out after %u.%03u secs - aborting queries",
+ anvil_query->timeout_msecs / 1000,
+ anvil_query->timeout_msecs % 1000);
/* perhaps reconnect helps */
anvil_client_destroy(&client->conn);
}
struct anvil_query *
anvil_client_query(struct anvil_client *client, const char *query,
+ unsigned int timeout_msecs,
anvil_callback_t *callback, void *context)
{
struct anvil_query *anvil_query;
+ i_assert(timeout_msecs > 0);
+
anvil_query = i_new(struct anvil_query, 1);
anvil_query->client = client;
+ anvil_query->timeout_msecs = timeout_msecs;
anvil_query->callback = callback;
anvil_query->context = context;
aqueue_append(client->queries, &anvil_query);
anvil_client_cancel_queries, client);
}
} else {
- anvil_query->to = timeout_add(ANVIL_QUERY_TIMEOUT_MSECS,
+ anvil_query->to = timeout_add(timeout_msecs,
anvil_client_timeout, anvil_query);
}
return anvil_query;
#ifndef ANVIL_CLIENT_H
#define ANVIL_CLIENT_H
+#define ANVIL_DEFAULT_LOOKUP_TIMEOUT_MSECS (5*1000)
+#define ANVIL_DEFAULT_KICK_TIMEOUT_MSECS (25*1000)
+
enum anvil_client_flags {
/* if connect() fails with ENOENT, hide the error */
ANVIL_CLIENT_FLAG_HIDE_ENOENT = 0x01
be sent. */
struct anvil_query *
anvil_client_query(struct anvil_client *client, const char *query,
+ unsigned int timeout_msecs,
anvil_callback_t *callback, void *context);
void anvil_client_query_abort(struct anvil_client *client,
struct anvil_query **query);
str_tabescape(input->username), "\t",
master_service_get_name(master_service), "\t", NULL);
llrcpt->anvil_query = anvil_client_query(anvil, query,
+ ANVIL_DEFAULT_LOOKUP_TIMEOUT_MSECS,
lmtp_local_rcpt_anvil_cb, llrcpt);
return 0;
}
net_ip2addr(&client->ip), NULL);
client->anvil_request = req;
client->anvil_query =
- anvil_client_query(anvil, query, anvil_lookup_callback, req);
+ anvil_client_query(anvil, query,
+ ANVIL_DEFAULT_LOOKUP_TIMEOUT_MSECS,
+ anvil_lookup_callback, req);
}
static bool