Exemple #1
0
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);
}
Exemple #2
0
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);
	}
}
Exemple #3
0
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;
}