From 268e10670e97a2ac9a554ffae75114d4766c37dd Mon Sep 17 00:00:00 2001 From: Martin Pihlak Date: Wed, 8 Apr 2009 16:30:54 +0300 Subject: [PATCH] - add PQerrorMessage to conn_error() - reconnect on db error and timeout - getopt parentheses bugfix --- sql/ticker/connection.c | 18 +++++++++++++++--- sql/ticker/connection.h | 3 +++ sql/ticker/maint.c | 31 +++++++++++++++++++------------ sql/ticker/pgqd.c | 4 ++-- sql/ticker/retry.c | 5 ++--- sql/ticker/ticker.c | 11 +++++++---- 6 files changed, 48 insertions(+), 24 deletions(-) diff --git a/sql/ticker/connection.c b/sql/ticker/connection.c index c4f4b546..bdd3a4d7 100644 --- a/sql/ticker/connection.c +++ b/sql/ticker/connection.c @@ -12,8 +12,6 @@ #define W_SOCK 1 #define W_TIME 2 -typedef void (*libev_cb)(int sock, short flags, void *arg); - struct PgSocket { struct event ev; @@ -24,6 +22,8 @@ struct PgSocket { void *handler_arg; }; +typedef void (*libev_cb)(int sock, short flags, void *arg); + static void send_event(struct PgSocket *db, enum PgEvent ev) { db->handler_func(db, db->handler_arg, ev, NULL); @@ -71,6 +71,7 @@ void db_sleep(struct PgSocket *db, double timeout) static void conn_error(struct PgSocket *db, enum PgEvent ev, const char *desc) { log_error("connection error: %s", desc); + log_error("libpq: %s", PQerrorMessage(db->con)); send_event(db, ev); } @@ -198,6 +199,12 @@ void db_disconnect(struct PgSocket *db) } } +void db_reconnect(struct PgSocket *db) +{ + db_disconnect(db); + db_sleep(db, 60); +} + void db_free(struct PgSocket *db) { if (db) { @@ -214,7 +221,7 @@ void db_send_query_simple(struct PgSocket *db, const char *q) log_debug("%s", q); res = PQsendQuery(db->con, q); if (!res) { - conn_error(db, DB_RESULT_BAD, "PQsendQueryParams"); + conn_error(db, DB_RESULT_BAD, "PQsendQuery"); return; } @@ -255,3 +262,8 @@ void db_send_query_params(struct PgSocket *db, const char *q, int cnt, ...) conn_error(db, DB_RESULT_BAD, "PQflush"); } +int db_connection_valid(struct PgSocket *db) +{ + return (db->con != NULL); +} + diff --git a/sql/ticker/connection.h b/sql/ticker/connection.h index bbdfd5a1..c8d071ff 100644 --- a/sql/ticker/connection.h +++ b/sql/ticker/connection.h @@ -21,11 +21,14 @@ void db_free(struct PgSocket *db); void db_connect(struct PgSocket *db, const char *cstr); void db_disconnect(struct PgSocket *db); +void db_reconnect(struct PgSocket *db); void db_send_query_simple(struct PgSocket *db, const char *query); void db_send_query_params(struct PgSocket *db, const char *query, int args, ...); void db_sleep(struct PgSocket *db, double timeout); +int db_connection_valid(struct PgSocket *db); + #endif diff --git a/sql/ticker/maint.c b/sql/ticker/maint.c index b59b4fff..681c8a9c 100644 --- a/sql/ticker/maint.c +++ b/sql/ticker/maint.c @@ -1,4 +1,3 @@ - #include "pgqd.h" struct MaintItem { @@ -155,26 +154,34 @@ static void maint_handler(struct PgSocket *s, void *arg, enum PgEvent ev, PGresu break; case DB_TIMEOUT: log_debug("%s: maint timeout", db->name); - run_queue_list(db); + if (!db_connection_valid(db->c_maint)) + launch_maint(db); + else + run_queue_list(db); break; default: - printf("failure\n"); - exit(1); + db_reconnect(db->c_maint); } } void launch_maint(struct PgDatabase *db) { - const char *cstr = make_connstr(db->name); - if (db->c_maint) { + log_debug("%s: launch_maint", db->name); + + if (!db->c_maint) { + free_maint_list(db); + db->c_maint = db_create(maint_handler, db); + } + + if (!db_connection_valid(db->c_maint)) { + const char *cstr = make_connstr(db->name); + + db_connect(db->c_maint, cstr); + free(cstr); + } else { + /* Already have a connection, what are we doing here */ log_error("%s: maint already initialized", db->name); return; } - free_maint_list(db); - - log_debug("%s: launch_maint", db->name); - db->c_maint = db_create(maint_handler, db); - db_connect(db->c_maint, cstr); - free(cstr); } diff --git a/sql/ticker/pgqd.c b/sql/ticker/pgqd.c index 16943b05..609c0fe6 100644 --- a/sql/ticker/pgqd.c +++ b/sql/ticker/pgqd.c @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) { int c, i; - while ((c = getopt(argc, argv, "T:p:U:h:HvVd") != -1)) { + while ((c = getopt(argc, argv, "T:p:U:h:HvVd")) != -1) { switch (c) { case 'T': cf.db_template = optarg; @@ -128,7 +128,7 @@ int main(int argc, char *argv[]) event_init(); if (optind == argc) { - printf("auto-detecting dbs"); + printf("auto-detecting dbs ...\n"); detect_dbs(); } else { for (i = optind; i < argc; i++) { diff --git a/sql/ticker/retry.c b/sql/ticker/retry.c index 4f140876..3681c015 100644 --- a/sql/ticker/retry.c +++ b/sql/ticker/retry.c @@ -43,8 +43,7 @@ static void retry_handler(struct PgSocket *s, void *arg, enum PgEvent ev, PGresu launch_retry(db); break; default: - printf("failure\n"); - exit(1); + db_reconnect(db->c_retry); } } @@ -52,7 +51,7 @@ void launch_retry(struct PgDatabase *db) { const char *cstr; if (db->c_retry) { - log_error("%s: retry already initialized", db->name); + log_debug("%s: retry already initialized", db->name); } else { log_debug("%s: launch_retry", db->name); db->c_retry = db_create(retry_handler, db); diff --git a/sql/ticker/ticker.c b/sql/ticker/ticker.c index 77eb4aae..6954e1eb 100644 --- a/sql/ticker/ticker.c +++ b/sql/ticker/ticker.c @@ -109,11 +109,13 @@ static void tick_handler(struct PgSocket *s, void *arg, enum PgEvent ev, PGresul break; case DB_TIMEOUT: log_debug("%s: tick timeout", db->name); - run_ticker(db); + if (!db_connection_valid(db->c_ticker)) + launch_ticker(db); + else + run_ticker(db); break; default: - printf("failure\n"); - exit(1); + db_reconnect(db->c_ticker); } } @@ -121,7 +123,8 @@ void launch_ticker(struct PgDatabase *db) { const char *cstr = make_connstr(db->name); log_debug("%s: launch_ticker", db->name); - db->c_ticker = db_create(tick_handler, db); + if (!db->c_ticker) + db->c_ticker = db_create(tick_handler, db); db_connect(db->c_ticker, cstr); free(cstr); } -- 2.39.5