]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
This patch fixes a problem in SQL reconnection algorithm which is managed in
author/C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org </C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org>
Sat, 5 Apr 2008 14:02:56 +0000 (14:02 +0000)
committer/C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org </C=EU/ST=EU/CN=Pablo Neira Ayuso/emailAddress=pablo@netfilter.org>
Sat, 5 Apr 2008 14:02:56 +0000 (14:02 +0000)
the db.c file for PgSQL and MySQL. In case of problem during request execution
a new connection to the database was immediatly started without closing the
previous one. The consequence was to block the database by having too much
simultaneous open connections.

This patch fixes the problem by disconnectinng from the database after a
request failure and trying to reconnect after a delay which is by default
of 2 secondes. This delay can be customized via the reconnect configuration
variable in the database configuration section.

Signed-off-by: Eric Leblond <eric@inl.fr>
include/ulogd/db.h
util/db.c

index 94cdbcbb2e8b8eeedf6cd56bf04f7c4c14f60c0c..62819f2fe8ef0aa1f40f71ea3c007be2f3eb98ff 100644 (file)
@@ -23,6 +23,7 @@ struct db_instance {
        struct db_driver *driver;
 };
 #define TIME_ERR               ((time_t)-1)    /* Be paranoid */
+#define RECONNECT_DEFAULT      2
 
 #define DB_CES                                                 \
                {                                               \
@@ -33,6 +34,7 @@ struct db_instance {
                {                                               \
                        .key = "reconnect",                     \
                        .type = CONFIG_TYPE_INT,                \
+                       .u.value = RECONNECT_DEFAULT,           \
                },                                              \
                {                                               \
                        .key = "ip_as_string",                  \
index 49f6c29b35f1a86f83fb4cb84d790909cebac9bb..b9ca8db24f0eee96d68ff16c5fb7ce6ea23fe7a1 100644 (file)
--- a/util/db.c
+++ b/util/db.c
@@ -176,6 +176,8 @@ static int _init_reconnect(struct ulogd_pluginstance *upi)
        struct db_instance *di = (struct db_instance *) upi->private;
 
        if (reconnect_ce(upi->config_kset).u.value) {
+               if (time(NULL) < di->reconnect)
+                       return -1;
                di->reconnect = time(NULL);
                if (di->reconnect != TIME_ERR) {
                        ulogd_log(ULOGD_ERROR, "no connection to database, "
@@ -312,8 +314,11 @@ static int __interp_db(struct ulogd_pluginstance *upi)
 
        /* now we have created our statement, insert it */
 
-       if (di->driver->execute(upi, di->stmt, strlen(di->stmt)) < 0)
-               return _init_db(upi);
+       if (di->driver->execute(upi, di->stmt, strlen(di->stmt)) < 0) {
+               /* error occur, database connexion need to be closed */
+               di->driver->close_db(upi);
+               return _init_reconnect(upi);
+       }
 
        return 0;
 }