]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mysql: Added connect/read/write_timeout settings. Default to 30s read/write_timeout.
authorTimo Sirainen <tss@iki.fi>
Tue, 20 Oct 2015 14:07:20 +0000 (17:07 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 20 Oct 2015 14:07:20 +0000 (17:07 +0300)
src/lib-sql/driver-mysql.c

index 9a54036dd56b5cd6658a90d7e7c73a9c48c0cfcd..72a3d1fb910913138b905165a9182040f513582e 100644 (file)
@@ -23,6 +23,9 @@
 #endif
 #include <errmsg.h>
 
+#define MYSQL_DEFAULT_READ_TIMEOUT_SECS 30
+#define MYSQL_DEFAULT_WRITE_TIMEOUT_SECS 30
+
 struct mysql_db {
        struct sql_db api;
 
@@ -33,6 +36,7 @@ struct mysql_db {
        const char *option_file, *option_group;
        in_port_t port;
        unsigned int client_flags;
+       unsigned int connect_timeout, read_timeout, write_timeout;
        time_t last_success;
 
        MYSQL *mysql;
@@ -76,7 +80,7 @@ static int driver_mysql_connect(struct sql_db *_db)
        struct mysql_db *db = (struct mysql_db *)_db;
        const char *unix_socket, *host;
        unsigned long client_flags = db->client_flags;
-       unsigned int secs_used, connect_timeout = SQL_CONNECT_TIMEOUT_SECS;
+       unsigned int secs_used;
        time_t start_time;
        bool failed;
 
@@ -97,7 +101,9 @@ static int driver_mysql_connect(struct sql_db *_db)
                              db->option_file);
        }
 
-       mysql_options(db->mysql, MYSQL_OPT_CONNECT_TIMEOUT, &connect_timeout);
+       mysql_options(db->mysql, MYSQL_OPT_CONNECT_TIMEOUT, &db->connect_timeout);
+       mysql_options(db->mysql, MYSQL_OPT_READ_TIMEOUT, &db->read_timeout);
+       mysql_options(db->mysql, MYSQL_OPT_WRITE_TIMEOUT, &db->write_timeout);
        mysql_options(db->mysql, MYSQL_READ_DEFAULT_GROUP,
                      db->option_group != NULL ? db->option_group : "client");
 
@@ -162,6 +168,9 @@ static void driver_mysql_parse_connect_string(struct mysql_db *db,
 
        db->ssl_cipher = "HIGH";
        db->ssl_verify_server_cert = 0; /* FIXME: change to 1 for v2.3 */
+       db->connect_timeout = SQL_CONNECT_TIMEOUT_SECS;
+       db->read_timeout = MYSQL_DEFAULT_READ_TIMEOUT_SECS;
+       db->write_timeout = MYSQL_DEFAULT_WRITE_TIMEOUT_SECS;
 
        args = t_strsplit_spaces(connect_string, " ");
        for (; *args != NULL; args++) {
@@ -189,6 +198,15 @@ static void driver_mysql_parse_connect_string(struct mysql_db *db,
                } else if (strcmp(name, "client_flags") == 0) {
                        if (str_to_uint(value, &db->client_flags) < 0)
                                i_fatal("mysql: Invalid client flags: %s", value);
+               } else if (strcmp(name, "connect_timeout") == 0) {
+                       if (str_to_uint(value, &db->connect_timeout) < 0)
+                               i_fatal("mysql: Invalid read_timeout: %s", value);
+               } else if (strcmp(name, "read_timeout") == 0) {
+                       if (str_to_uint(value, &db->read_timeout) < 0)
+                               i_fatal("mysql: Invalid read_timeout: %s", value);
+               } else if (strcmp(name, "write_timeout") == 0) {
+                       if (str_to_uint(value, &db->write_timeout) < 0)
+                               i_fatal("mysql: Invalid read_timeout: %s", value);
                } else if (strcmp(name, "ssl_cert") == 0)
                        field = &db->ssl_cert;
                else if (strcmp(name, "ssl_key") == 0)