dovecot-1.2: dict proxy: Disconnect from dict server after 1 sec...
dovecot at dovecot.org
dovecot at dovecot.org
Tue Apr 20 13:02:44 EEST 2010
details: http://hg.dovecot.org/dovecot-1.2/rev/0dca2668004f
changeset: 9562:0dca2668004f
user: Timo Sirainen <tss at iki.fi>
date: Tue Apr 20 12:56:48 2010 +0300
description:
dict proxy: Disconnect from dict server after 1 second of idling.
diffstat:
src/lib-dict/dict-client.c | 39 +++++++++++++++++++++++++++++++++++++++
1 files changed, 39 insertions(+), 0 deletions(-)
diffs (97 lines):
diff -r e4c096fae5ac -r 0dca2668004f src/lib-dict/dict-client.c
--- a/src/lib-dict/dict-client.c Fri Apr 16 13:22:00 2010 +0300
+++ b/src/lib-dict/dict-client.c Tue Apr 20 12:56:48 2010 +0300
@@ -13,6 +13,12 @@
#include <unistd.h>
#include <fcntl.h>
+/* Disconnect from dict server after this many milliseconds of idling after
+ sending a command. This timeout is short, because dict server does blocking
+ dict accesses, so it can handle only one client at a time. increasing the
+ timeout increases number of idling dict processes. */
+#define DICT_CLIENT_TIMEOUT_MSECS 1000
+
struct client_dict {
struct dict dict;
@@ -27,6 +33,7 @@
struct istream *input;
struct ostream *output;
struct io *io;
+ struct timeout *to_idle;
struct client_dict_transaction_context *transactions;
@@ -308,12 +315,36 @@
return 1;
}
+static bool client_dict_is_finished(struct client_dict *dict)
+{
+ return dict->transactions == NULL && !dict->in_iteration &&
+ dict->async_commits == 0;
+}
+
+static void client_dict_timeout(struct client_dict *dict)
+{
+ if (client_dict_is_finished(dict))
+ client_dict_disconnect(dict);
+}
+
+static void client_dict_add_timeout(struct client_dict *dict)
+{
+ if (dict->to_idle != NULL)
+ timeout_reset(dict->to_idle);
+ else if (client_dict_is_finished(dict)) {
+ dict->to_idle = timeout_add(DICT_CLIENT_TIMEOUT_MSECS,
+ client_dict_timeout, dict);
+ }
+}
+
static char *client_dict_read_line(struct client_dict *dict)
{
char *line;
while (client_dict_read_one_line(dict, &line) == 0)
;
+
+ client_dict_add_timeout(dict);
return line;
}
@@ -363,6 +394,8 @@
dict->connect_counter++;
dict->handshaked = FALSE;
+ if (dict->to_idle != NULL)
+ timeout_remove(&dict->to_idle);
if (dict->io != NULL)
io_remove(&dict->io);
if (dict->input != NULL)
@@ -542,6 +575,8 @@
pool_unref(&ctx->pool);
i_free(ctx);
dict->in_iteration = FALSE;
+
+ client_dict_add_timeout(dict);
}
static struct dict_transaction_context *
@@ -619,6 +654,8 @@
if (ret < 0 || !async) {
DLLIST_REMOVE(&dict->transactions, ctx);
i_free(ctx);
+
+ client_dict_add_timeout(dict);
}
return ret;
}
@@ -640,6 +677,8 @@
DLLIST_REMOVE(&dict->transactions, ctx);
i_free(ctx);
+
+ client_dict_add_timeout(dict);
}
static void client_dict_set(struct dict_transaction_context *_ctx,
More information about the dovecot-cvs
mailing list