Skip to content

Commit

Permalink
lmtp: Handle lmtp_user_concurrency_limit before lmtp_rcpt_check_quota
Browse files Browse the repository at this point in the history
The quota lookup is more expensive, so it shouldn't be done unnecessarily.
  • Loading branch information
sirainen committed Oct 13, 2016
1 parent ba9270a commit 4236767
Showing 1 changed file with 24 additions and 19 deletions.
43 changes: 24 additions & 19 deletions src/lmtp/commands.c
Expand Up @@ -595,6 +595,23 @@ lmtp_rcpt_to_is_over_quota(struct client *client,
return ret;
}

static bool cmd_rcpt_finish(struct client *client, struct mail_recipient *rcpt)
{
int ret;

if ((ret = lmtp_rcpt_to_is_over_quota(client, rcpt)) != 0) {
if (ret < 0) {
client_send_line(client, ERRSTR_TEMP_MAILBOX_FAIL,
rcpt->address);
}
mail_storage_service_user_free(&rcpt->service_user);
return FALSE;
}
array_append(&client->state.rcpt_to, &rcpt, 1);
client_send_line(client, "250 2.1.5 OK");
return TRUE;
}

static void rcpt_anvil_lookup_callback(const char *reply, void *context)
{
struct mail_recipient *rcpt = context;
Expand All @@ -609,20 +626,17 @@ static void rcpt_anvil_lookup_callback(const char *reply, void *context)
i_error("Invalid reply from anvil: %s", reply);
}

if (parallel_count < client->lmtp_set->lmtp_user_concurrency_limit) {
client_send_line(client, "250 2.1.5 OK");

if (parallel_count >= client->lmtp_set->lmtp_user_concurrency_limit) {
client_send_line(client, ERRSTR_TEMP_USERDB_FAIL_PREFIX
"Too many concurrent deliveries for user",
rcpt->address);
mail_storage_service_user_free(&rcpt->service_user);
} else if (cmd_rcpt_finish(client, rcpt)) {
rcpt->anvil_connect_sent = TRUE;
input = mail_storage_service_user_get_input(rcpt->service_user);
master_service_anvil_send(master_service, t_strconcat(
"CONNECT\t", my_pid, "\t", master_service_get_name(master_service),
"/", input->username, "\n", NULL));
array_append(&client->state.rcpt_to, &rcpt, 1);
} else {
client_send_line(client, ERRSTR_TEMP_USERDB_FAIL_PREFIX
"Too many concurrent deliveries for user",
rcpt->address);
mail_storage_service_user_free(&rcpt->service_user);
}

client_io_reset(client);
Expand Down Expand Up @@ -722,18 +736,9 @@ int cmd_rcpt(struct client *client, const char *args)

rcpt->address = p_strdup(client->state_pool, address);
rcpt->detail = p_strdup(client->state_pool, detail);
if ((ret = lmtp_rcpt_to_is_over_quota(client, rcpt)) != 0) {
if (ret < 0) {
client_send_line(client, ERRSTR_TEMP_MAILBOX_FAIL,
rcpt->address);
}
mail_storage_service_user_free(&rcpt->service_user);
return 0;
}

if (client->lmtp_set->lmtp_user_concurrency_limit == 0) {
array_append(&client->state.rcpt_to, &rcpt, 1);
client_send_line(client, "250 2.1.5 OK");
(void)cmd_rcpt_finish(client, rcpt);
return 0;
} else {
const char *query = t_strconcat("LOOKUP\t",
Expand Down

0 comments on commit 4236767

Please sign in to comment.