Skip to content

Commit

Permalink
dict-client: Code cleanup to timeout handling.
Browse files Browse the repository at this point in the history
No functional changes.
  • Loading branch information
sirainen committed Nov 15, 2016
1 parent 26bab69 commit 80a903b
Showing 1 changed file with 31 additions and 21 deletions.
52 changes: 31 additions & 21 deletions src/lib-dict/dict-client.c
Expand Up @@ -196,38 +196,48 @@ dict_cmd_callback_error(struct client_dict_cmd *cmd, const char *error,
i_assert(!cmd->unfinished);
}

static void client_dict_input_timeout(struct client_dict *dict)
static struct client_dict_cmd *
client_dict_cmd_first_nonbg(struct client_dict *dict)
{
struct client_dict_cmd *const *cmds;
unsigned int i, count;
const char *error;
int cmd_diff;

/* find the first expired non-background command */
cmds = array_get(&dict->cmds, &count);
for (i = 0; i < count; i++) {
if (cmds[i]->background)
continue;
cmd_diff = timeval_diff_msecs(&ioloop_timeval, &cmds[i]->start_time);
if (cmd_diff < DICT_CLIENT_REQUEST_TIMEOUT_MSECS) {
/* need to re-create this timeout. the currently-oldest
command was added when another command was still
running with an older timeout. */
timeout_remove(&dict->to_requests);
dict->to_requests =
timeout_add(DICT_CLIENT_REQUEST_TIMEOUT_MSECS - cmd_diff,
client_dict_input_timeout, dict);
return;
}
break;
if (!cmds[i]->background)
return cmds[i];
}
return NULL;
}

static void client_dict_input_timeout(struct client_dict *dict)
{
struct client_dict_cmd *cmd;
const char *error;
int cmd_diff;

/* find the first non-background command. there must be at least one. */
cmd = client_dict_cmd_first_nonbg(dict);
i_assert(cmd != NULL);

cmd_diff = timeval_diff_msecs(&ioloop_timeval, &cmd->start_time);
if (cmd_diff < DICT_CLIENT_REQUEST_TIMEOUT_MSECS) {
/* need to re-create this timeout. the currently-oldest
command was added when another command was still
running with an older timeout. */
timeout_remove(&dict->to_requests);
dict->to_requests =
timeout_add(DICT_CLIENT_REQUEST_TIMEOUT_MSECS - cmd_diff,
client_dict_input_timeout, dict);
return;
}
i_assert(i < count); /* we can't have only background commands */

(void)client_dict_reconnect(dict, t_strdup_printf(
"Dict server timeout: %s "
"(%u commands pending, oldest sent %u.%03u secs ago: %s)",
connection_input_timeout_reason(&dict->conn.conn), count,
cmd_diff/1000, cmd_diff%1000, cmds[0]->query), &error);
connection_input_timeout_reason(&dict->conn.conn),
array_count(&dict->cmds),
cmd_diff/1000, cmd_diff%1000, cmd->query), &error);
}

static int
Expand Down

0 comments on commit 80a903b

Please sign in to comment.