]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl fix technotes
authorEric Bollengier <eric@eb.homelinux.org>
Wed, 15 Jul 2009 10:08:00 +0000 (10:08 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Wed, 15 Jul 2009 10:08:00 +0000 (10:08 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@8999 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/cats/sql_cmds.c
bacula/src/cats/sql_cmds.h
bacula/src/dird/dird.c
bacula/technotes

index 171162c43687707ef8f445e8963024a0567487f7..476ba63d75821beeba237b79a5b6dfc316aad9b4 100644 (file)
 #include "bacula.h"
 #include "cats.h"
 
+const char *cleanup_created_job =
+   "UPDATE Job SET JobStatus='f', StartTime=SchedTime, EndTime=SchedTime "
+   "WHERE JobStatus = 'C'";
+const char *cleanup_running_job = 
+   "UPDATE Job SET JobStatus='f', EndTime=StartTime WHERE JobStatus = 'R'";
 
 /* For sql_update.c db_update_stats */
 const char *fill_jobhisto =
index 438f7591b08bd061c42ce66d0007ffc4447eced9..7b967572e8f7d4feb3778f6a6e39626d3318f6dd 100644 (file)
@@ -50,6 +50,8 @@ extern const char CATS_IMP_EXP *cnt_JobMedia;
 extern const char CATS_IMP_EXP *sel_JobMedia;
 extern const char CATS_IMP_EXP *upd_Purged;
 
+extern const char CATS_IMP_EXP *cleanup_created_job;
+extern const char CATS_IMP_EXP *cleanup_running_job;
 extern const char CATS_IMP_EXP *uar_list_jobs;
 extern const char CATS_IMP_EXP *uar_count_files;
 extern const char CATS_IMP_EXP *uar_sel_files;
index fc59364e1f084ba1a9d91c7d457cdba8a3243d5c..441a0eb29819613b8ed5d91ee623a2d88e0911b1 100644 (file)
@@ -53,7 +53,6 @@ extern int job_setattr(PyObject *self, char *attrname, PyObject *value);
 /* Forward referenced subroutines */
 void terminate_dird(int sig);
 static bool check_resources();
-static bool check_catalog();
 static void dir_sql_query(JCR *jcr, const char *cmd);
   
 /* Exported subroutines */
@@ -96,8 +95,16 @@ extern "C" { // work around visual compiler mangling variables
 extern URES res_all;
 #endif
 
+typedef enum {
+   CHECK_CONNECTION,  /* Check catalog connection */
+   UPDATE_CATALOG,    /* Ensure that catalog is ok with conf */
+   UPDATE_AND_FIX     /* Ensure that catalog is ok, and fix old jobs */
+} cat_op;
+static bool check_catalog(cat_op mode);
+
 #define CONFIG_FILE "bacula-dir.conf" /* default configuration file */
 
+
 static void usage()
 {
    fprintf(stderr, _(
@@ -265,11 +272,14 @@ int main (int argc, char *argv[])
 
    drop(uid, gid);                    /* reduce privileges if requested */
 
-   if (!check_catalog()) {
+   /* If we are in testing mode, we don't try to fix the catalog */
+   cat_op mode=(test_config)?CHECK_CONNECTION:UPDATE_AND_FIX;
+
+   if (!check_catalog(mode)) {
       Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
    }
-
-   if (test_config) {
+   
+   if (test_config) {      
       terminate_dird(0);
    }
 
@@ -513,7 +523,7 @@ void reload_config(int sig)
    ok = parse_dir_config(config, configfile, M_ERROR);
 
    Dmsg0(100, "Reloaded config file\n");
-   if (!ok || !check_resources() || !check_catalog()) {
+   if (!ok || !check_resources() || !check_catalog(UPDATE_CATALOG)) {
       rtable = find_free_reload_table_entry();    /* save new, bad table */
       if (rtable < 0) {
          Jmsg(NULL, M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile);
@@ -905,7 +915,13 @@ static bool check_resources()
    return OK;
 }
 
-static bool check_catalog()
+/* 
+ * In this routine, 
+ *  - we can check the connection (mode=CHECK_CONNECTION)
+ *  - we can synchronize the catalog with the configuration (mode=UPDATE_CATALOG)
+ *  - we can synchronize, and fix old job records (mode=UPDATE_AND_FIX)
+ */
+static bool check_catalog(cat_op mode)
 {
    bool OK = true;
    bool need_tls;
@@ -936,6 +952,12 @@ static bool check_catalog()
          continue;
       }
 
+      /* we are in testing mode, so don't touch anything in the catalog */
+      if (mode == CHECK_CONNECTION) {
+         db_close_database(NULL, db);
+         continue;
+      }
+
       /* Loop over all pools, defining/updating them in each database */
       POOL *pool;
       foreach_res(pool, R_POOL) {
@@ -1055,6 +1077,12 @@ static bool check_catalog()
             counter->CurrentValue = counter->MinValue;  /* default value */
          }
       }
+      /* cleanup old job records */
+      if (mode == UPDATE_AND_FIX) {
+         db_sql_query(db, cleanup_created_job, NULL, NULL);
+         db_sql_query(db, cleanup_running_job, NULL, NULL);
+      }
+
       db_close_database(NULL, db);
    }
    /* Set type in global for debugging */
index e570254ad42f5c27ded1a0d7e096dfbe74de9137..447040a961aa192215215f9a8db461dc4c965e45 100644 (file)
@@ -4,6 +4,8 @@ General:
 
 15Jul09
 kes  Add more example SD Device configurations.
+ebl  Cleanup old job records when starting the director 
+     (Created/Running -> Failed)
 14Jul09
 kes  Tweak debug print in accurate
 kes  Apply patch in bug #1315 by McMichaeli that fixes scripts/logwatch