]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dict-client: Don't log slow background async commit/iteration replies.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 1 Jul 2016 13:34:26 +0000 (16:34 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 1 Jul 2016 14:43:32 +0000 (17:43 +0300)
If a caller has already finished iteration, or does async commit without a
callback, it means that it started the query without caring when it
finishes. The caller may already have been doing blocking work while
waiting for the dict reply. We don't want to log a warning, because it
could be completely wrong.

src/lib-dict/dict-client.c
src/lib-dict/dict-private.h
src/lib-dict/dict.c

index 2fb5f4c79df28bc0fdd1caf76020035d611a2161..18490967ae225ca19668de6be00dffe90a795f4e 100644 (file)
@@ -36,6 +36,7 @@ struct client_dict_cmd {
        bool retry_errors;
        bool no_replies;
        bool unfinished;
+       bool background;
 
        void (*callback)(struct client_dict_cmd *cmd,
                         const char *line, const char *error);
@@ -361,7 +362,8 @@ static int dict_conn_input_line(struct connection *_conn, const char *line)
                /* more lines needed for this command */
                return 1;
        }
-       diff = timeval_diff_msecs(&ioloop_timeval, &cmds[0]->start_time);
+       diff = cmds[0]->background ? 0 :
+               timeval_diff_msecs(&ioloop_timeval, &cmds[0]->start_time);
        if (diff >= DICT_CLIENT_REQUEST_WARN_TIMEOUT_MSECS) {
                i_warning("read(%s): dict lookup took %u.%03u seconds: %s",
                          dict->conn.conn.name, diff/1000, diff % 1000,
@@ -711,6 +713,9 @@ client_dict_iter_async_callback(struct client_dict_cmd *cmd, const char *line,
        struct client_dict_iter_result *result;
        const char *key = NULL, *value = NULL;
 
+       if (ctx->deinit)
+               cmd->background = TRUE;
+
        if (error != NULL) {
                /* failed */
        } else switch (*line) {
@@ -919,6 +924,8 @@ client_dict_transaction_commit(struct dict_transaction_context *_ctx,
                cmd->callback = client_dict_transaction_commit_callback;
                cmd->api_callback.commit = callback;
                cmd->api_callback.context = context;
+               if (callback == dict_transaction_commit_async_noop_callback)
+                       cmd->background = TRUE;
                if (client_dict_cmd_send(dict, &cmd, NULL)) {
                        if (!async)
                                client_dict_wait(_ctx->dict);
index 841edbc47d38bcfbcd0f428ecbd1e88698aee8ab..2f922248e31a0f82e5f632a46c24b005e2112e52 100644 (file)
@@ -63,6 +63,9 @@ struct dict_transaction_context {
        bool changed:1;
 };
 
+void dict_transaction_commit_async_noop_callback(
+       const struct dict_commit_result *result, void *context);
+
 extern struct dict dict_driver_client;
 extern struct dict dict_driver_file;
 extern struct dict dict_driver_fs;
index 71e48049649fac6939782eb9dc2e230da7c48e65..52651c73184c9ddf056ddaabd46fb302a3b08ba4 100644 (file)
@@ -22,8 +22,8 @@ static struct dict *dict_driver_lookup(const char *name)
        return NULL;
 }
 
-static
-void dict_transaction_commit_default_callback(const struct dict_commit_result *result ATTR_UNUSED, 
+void dict_transaction_commit_async_noop_callback(
+       const struct dict_commit_result *result ATTR_UNUSED,
        void *context ATTR_UNUSED)
 {
        /* do nothing */
@@ -241,7 +241,7 @@ void dict_transaction_commit_async(struct dict_transaction_context **_ctx,
 
        *_ctx = NULL;
        if (callback == NULL)
-               callback = dict_transaction_commit_default_callback;
+               callback = dict_transaction_commit_async_noop_callback;
        ctx->dict->v.transaction_commit(ctx, TRUE, callback, context);
 }