pgqd: support database_list
authorMarko Kreen <markokr@gmail.com>
Mon, 1 Jun 2009 06:14:41 +0000 (09:14 +0300)
committerMarko Kreen <markokr@gmail.com>
Mon, 1 Jun 2009 07:14:45 +0000 (10:14 +0300)
sql/ticker/Makefile
sql/ticker/pgqd.c
sql/ticker/pgqd.h

index d05699c93ecc630ba71638e6d5d2c645338309c8..feb5bfe539e8a9dfc88eb1cebf2b042177cf5295 100644 (file)
@@ -4,7 +4,7 @@ include ../../config.mak
 USUAL_DIR = ../../lib
 USUAL_OBJDIR = .
 USUAL_MODULES = logging daemon event string time cfparser fileutil \
-               socket compat heap-impl base
+               socket compat heap-impl base mbuf
 include $(USUAL_DIR)/Setup.mk
 
 PROGRAM = pgqd
index e5b79d3ef571438ad2a645ec3fa041017ac03559..ed9931ebc09d04f54167ba47b0318f5aaad59503 100644 (file)
@@ -11,6 +11,9 @@
 #include <usual/cfparser.h>
 #include <usual/time.h>
 
+static void detect_dbs(void);
+static void recheck_dbs(void);
+
 static const char *usage_str =
 "usage: pgq-ticker [switches] config.file\n"
 "Switches:\n"
@@ -83,6 +86,7 @@ static void handle_sighup(int sock, short flags, void *arg)
 {
        log_info("Got SIGHUP re-reading config");
        load_config(true);
+       recheck_dbs();
 }
 
 static void signal_setup(void)
@@ -138,8 +142,10 @@ static void launch_db(const char *dbname)
        /* check of already exists */
        statlist_for_each(elem, &database_list) {
                db = container_of(elem, struct PgDatabase, head);
-               if (strcmp(db->name, dbname) == 0)
+               if (strcmp(db->name, dbname) == 0) {
+                       db->dropped = false;
                        return;
+               }
        }
 
        /* create new db entry */
@@ -153,7 +159,15 @@ static void launch_db(const char *dbname)
        launch_ticker(db);
 }
 
-static void detect_dbs(void);
+static void drop_db(struct PgDatabase *db)
+{
+       statlist_remove(&database_list, &db->head);
+       db_free(db->c_ticker);
+       db_free(db->c_maint);
+       db_free(db->c_retry);
+       free(db->name);
+       free(db);
+}
 
 static void detect_handler(struct PgSocket *db, void *arg, enum PgEvent ev, PGresult *res)
 {
@@ -192,6 +206,40 @@ static void detect_dbs(void)
        free(cstr);
 }
 
+static bool launch_db_cb(void *arg, const char *db)
+{
+       launch_db(db);
+       return true;
+}
+
+static void recheck_dbs(void)
+{
+       struct PgDatabase *db;
+       struct List *el, *tmp;
+       if (cf.database_list && cf.database_list[0]) {
+               statlist_for_each(el, &database_list) {
+                       db = container_of(el, struct PgDatabase, head);
+                       db->dropped = true;
+               }
+               if (!parse_word_list(cf.database_list, launch_db_cb, NULL)) {
+                       log_warning("database_list parsing failed: %s", strerror(errno));
+                       return;
+               }
+               statlist_for_each_safe(el, &database_list, tmp) {
+                       db = container_of(el, struct PgDatabase, head);
+                       if (db->dropped)
+                               drop_db(db);
+               }
+               if (db_template) {
+                       db_free(db_template);
+                       db_template = NULL;
+               }
+       } else if (!db_template) {
+               log_info("auto-detecting dbs ...");
+               detect_dbs();
+       }
+}
+
 static void main_loop_once(void)
 {
        reset_time_cache();
@@ -241,12 +289,7 @@ int main(int argc, char *argv[])
 
        signal_setup();
 
-       if (!cf.database_list || !cf.database_list[0]) {
-               log_info("auto-detecting dbs ...");
-               detect_dbs();
-       } else {
-               fatal("fixed list not implemented yet: '%s'", cf.database_list);
-       }
+       recheck_dbs();
 
        while (1)
                main_loop_once();
index e1d017b3c0cc7ea3c9b2cb770833824236bbf341..2139e96bba4e46db03c4a4d56255bdc262015c06 100644 (file)
@@ -38,6 +38,7 @@ struct PgDatabase {
        enum DbState state;
        enum DbState maint_state;
        struct StatList maint_item_list;
+       bool dropped;
 };
 
 struct Config {