static void parse_version_check(struct PgDatabase *db, PGresult *res) { char *ver; if (PQntuples(res) != 1) { log_debug("%s: calling pgq.version() failed", db->name); goto badpgq; } ver = PQgetvalue(res, 0, 0); if (ver[0] < '3') { log_debug("%s: bad pgq version: %s", db->name, ver); goto badpgq; } log_info("%s: pgq version ok: %s", db->name, ver); PQclear(res); run_ticker(db); if (!db->c_maint) launch_maint(db); if (!db->c_retry) launch_retry(db); return; badpgq: PQclear(res); db->has_pgq = false; log_info("%s: bad pgq version, ignoring", db->name); close_ticker(db, cf.check_period); }
static void tick_handler(struct PgSocket *s, void *arg, enum PgEvent ev, PGresult *res) { struct PgDatabase *db = arg; switch (ev) { case DB_CONNECT_OK: run_pgq_check(db); break; case DB_RESULT_OK: switch (db->state) { case DB_TICKER_CHECK_PGQ: parse_pgq_check(db, res); break; case DB_TICKER_CHECK_VERSION: parse_version_check(db, res); break; case DB_TICKER_RUN: parse_ticker_result(db, res); break; default: fatal("bad state"); } break; case DB_TIMEOUT: log_debug("%s: tick timeout", db->name); if (!db_connection_valid(db->c_ticker)) launch_ticker(db); else run_ticker(db); break; default: db_reconnect(db->c_ticker); } }
int main (int argc, char *argv[]) { db_t *database; int opt; log_debug_flags = DEBUG_TICKER | DEBUG_TAKEOVER | DEBUG_FAME | DEBUG_HERO | DEBUG_ARTEFACT; while ((opt = getopt(argc, argv, "C:V")) >= 0) { switch (opt) { case 'C': config_file = optarg; break; case 'V': puts("$Id: ticker.c 2391 2009-01-12 20:14:20Z root $"); return 0; default: return 1; } } #ifdef DEBUG_MALLOC GC_find_leak = 1; #endif /* init random number generator */ srand(time(NULL)); /* init function parser */ function_setup(); /* read config file */ config_read_file(config_file); fetch_config_values(); /* open ticker logfiles */ if (chdir(ticker_home)) error("%s: %s", ticker_home, strerror(errno)); debug_log = log_handler_new(debug_logfile); error_log = log_handler_new(error_logfile); msg_log = log_handler_new(msg_logfile); log_set_debug_handler(debug_log); log_set_warning_handler(error_log); log_set_error_handler(error_log); message_set_log_handler(msg_log); /* connect to the database */ debug(DEBUG_TICKER, "init"); write_pidfile(pid_file); try { database = db_connect(db_host, db_user, db_passwd, db_name); } catch (DB_EXCEPTION) { error("%s", except_msg); } end_try; /* read last tick */ tick_init(); /* install signal handler */ signal(SIGTERM, set_finish); signal(SIGINT, set_finish); #ifdef SIGHUP signal(SIGHUP, set_reload); #endif /* start the ticker */ run_ticker(database); /* clean up */ debug(DEBUG_TICKER, "cleanup"); db_close(database); remove(pid_file); return 0; }