dovecot-1.0: Timeout queued queries after a while if we can't co...

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 9 20:47:19 EEST 2007


details:   http://hg.dovecot.org/dovecot-1.0/rev/e0e2a826528e
changeset: 5377:e0e2a826528e
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 09 20:38:16 2007 +0300
description:
Timeout queued queries after a while if we can't connect to server.

diffstat:

1 file changed, 28 insertions(+), 2 deletions(-)
src/lib-sql/driver-pgsql.c |   30 ++++++++++++++++++++++++++++--

diffs (67 lines):

diff -r 1b6c41524c6a -r e0e2a826528e src/lib-sql/driver-pgsql.c
--- a/src/lib-sql/driver-pgsql.c	Thu Aug 09 20:02:10 2007 +0300
+++ b/src/lib-sql/driver-pgsql.c	Thu Aug 09 20:38:16 2007 +0300
@@ -9,6 +9,8 @@
 #include <stdlib.h>
 #include <time.h>
 #include <libpq-fe.h>
+
+#define QUERY_TIMEOUT_SECS 6
 
 struct pgsql_db {
 	struct sql_db api;
@@ -362,7 +364,7 @@ static void send_query(struct pgsql_resu
 	}
 }
 
-static void queue_send_next(struct pgsql_db *db)
+static struct pgsql_queue *queue_unlink_first(struct pgsql_db *db)
 {
 	struct pgsql_queue *queue;
 
@@ -371,13 +373,36 @@ static void queue_send_next(struct pgsql
 
 	if (db->queue == NULL)
 		db->queue_tail = &db->queue;
-
+	return queue;
+}
+
+static void queue_send_next(struct pgsql_db *db)
+{
+	struct pgsql_queue *queue;
+
+	queue = queue_unlink_first(db);
 	send_query(queue->result, queue->query);
 
 	i_free(queue->query);
 	i_free(queue);
 }
 
+static void queue_drop_timed_out_queries(struct pgsql_db *db)
+{
+	struct pgsql_queue *queue;
+
+	while (db->queue != NULL &&
+	       db->queue->created + QUERY_TIMEOUT_SECS < ioloop_time) {
+		queue = queue_unlink_first(db);
+
+		queue->result->api = sql_not_connected_result;
+		queue->result->callback(&queue->result->api,
+					queue->result->context);
+		i_free(queue->query);
+		i_free(queue);
+	}
+}
+
 static void queue_timeout(void *context)
 {
 	struct pgsql_db *db = context;
@@ -386,6 +411,7 @@ static void queue_timeout(void *context)
 		return;
 
 	if (!db->connected) {
+		queue_drop_timed_out_queries(db);
 		driver_pgsql_connect(&db->api);
 		return;
 	}


More information about the dovecot-cvs mailing list