]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Apply jobstat patch to add longterm statistics
authorEric Bollengier <eric@eb.homelinux.org>
Thu, 20 Mar 2008 10:29:57 +0000 (10:29 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Thu, 20 Mar 2008 10:29:57 +0000 (10:29 +0000)
     in catalog.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6650 91ce42f0-d328-0410-95d8-f526ca767f89

14 files changed:
bacula/src/cats/make_mysql_tables.in
bacula/src/cats/make_postgresql_tables.in
bacula/src/cats/make_sqlite3_tables.in
bacula/src/cats/make_sqlite_tables.in
bacula/src/cats/protos.h
bacula/src/cats/sql_create.c
bacula/src/cats/sql_update.c
bacula/src/dird/dird_conf.c
bacula/src/dird/dird_conf.h
bacula/src/dird/job.c
bacula/src/dird/ua_prune.c
bacula/src/jcr.h
bacula/src/stored/bscan.c
bacula/technotes-2.3

index cbe9f61b54a744eb84f88134ae7ff4b71f9aa324..32a5b4d9843549ca14e05942ef6a8392025bb208 100644 (file)
@@ -115,6 +115,8 @@ CREATE TABLE Job (
    INDEX (Name(128))
    );
 
+-- Create a table like Job for long term statistics 
+CREATE TABLE JobStat (LIKE Job);
 
 CREATE TABLE Location (
    LocationId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
index 599a4a306393746f1ee3e519bd8cefaba9e89234..d63e2de69912d08b1e3768022c5eccbce3b87836 100644 (file)
@@ -81,6 +81,9 @@ CREATE TABLE job
 
 CREATE INDEX job_name_idx on job (name);
 
+-- Create a table like Job for long term statistics 
+CREATE TABLE jobstat (LIKE job);
+
 CREATE TABLE Location (
    LocationId        serial      not null,
    Location          text        not null,
index b284fcb2c37a191b868f9e5491310fc1fc9eaaea..aea3628f6e8f3b105735696a2dc6c6f9c045d915 100644 (file)
@@ -75,6 +75,9 @@ CREATE TABLE Job (
    );
 CREATE INDEX inx6 ON Job (Name);
 
+-- Create a table like Job for long term statistics 
+CREATE TABLE JobStat (LIKE Job);
+
 CREATE TABLE Location (
    LocationId INTEGER,
    Location TEXT NOT NULL,
index 7fdcbada56c9d5aa50fe43834ebbad9ab257e2ca..6173a56a59861a14d712e806054231d7b618f554 100644 (file)
@@ -75,6 +75,9 @@ CREATE TABLE Job (
    );
 CREATE INDEX inx6 ON Job (Name);
 
+-- Create a table like Job for long term statistics 
+CREATE TABLE JobStat (LIKE Job);
+
 CREATE TABLE Location (
    LocationId INTEGER,
    Location TEXT NOT NULL,
index 2d78a3169dd7e46e84a40f28c93904280539a96a..2b4ecc8ed04a74791386ee96a9de43e9de2d28f2 100644 (file)
@@ -124,7 +124,7 @@ void db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *
 
 /* sql_update.c */
 bool db_update_job_start_record(JCR *jcr, B_DB *db, JOB_DBR *jr);
-int  db_update_job_end_record(JCR *jcr, B_DB *db, JOB_DBR *jr);
+int  db_update_job_end_record(JCR *jcr, B_DB *db, JOB_DBR *jr, bool stats_enabled);
 int  db_update_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr);
 int  db_update_pool_record(JCR *jcr, B_DB *db, POOL_DBR *pr);
 bool db_update_storage_record(JCR *jcr, B_DB *mdb, STORAGE_DBR *sr);
index 38268bdc98a922e3b5f78a203649f0f6172636c7..447974b969a9e93da6e3ffb185d159c1f4b22992 100644 (file)
@@ -112,7 +112,7 @@ db_create_job_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
 bool
 db_create_jobmedia_record(JCR *jcr, B_DB *mdb, JOBMEDIA_DBR *jm)
 {
-   bool ok = true;;
+   bool ok = true;
    int count;
    char ed1[50], ed2[50];
 
@@ -162,8 +162,6 @@ db_create_jobmedia_record(JCR *jcr, B_DB *mdb, JOBMEDIA_DBR *jm)
    return ok;
 }
 
-
-
 /* Create Unique Pool record
  * Returns: false on failure
  *          true  on success
index 5f037fba3cb73014218c7094dc70211589d3c984..161effa98d19dba01c733ea5a8c4c3a2e5ab2786 100644 (file)
@@ -142,7 +142,7 @@ static void edit_num_or_null(char *s, size_t n, uint64_t id) {
  *           1 on success
  */
 int
-db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
+db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr, bool stats_enabled)
 {
    char dt[MAX_TIME_LENGTH];
    char rdt[MAX_TIME_LENGTH];
@@ -192,11 +192,17 @@ db_update_job_end_record(JCR *jcr, B_DB *mdb, JOB_DBR *jr)
       edit_int64(jr->JobId, ed3));
 
    stat = UPDATE_DB(jcr, mdb, mdb->cmd);
+
+   if (stat && stats_enabled) {
+      Mmsg(mdb->cmd,
+          "INSERT INTO JobStat (SELECT * FROM Job WHERE JobId=%s)",
+          edit_int64(jr->JobId, ed3));
+      INSERT_DB(jcr, mdb, mdb->cmd); /* TODO: get a message ? */
+   }
    db_unlock(mdb);
    return stat;
 }
 
-
 /*
  * Update Client record
  *   Returns: 0 on failure
index 86a2e5f4d2af27b94c7981ae75caf4aa8a71e8d0..8e4dbea1be04e0ba288df8e73529a4fbded1c29e 100644 (file)
@@ -133,6 +133,7 @@ static RES_ITEM dir_items[] = {
    {"tlskey",               store_dir,       ITEM(res_dir.tls_keyfile), 0, 0, 0},
    {"tlsdhfile",            store_dir,       ITEM(res_dir.tls_dhfile), 0, 0, 0},
    {"tlsallowedcn",         store_alist_str, ITEM(res_dir.tls_allowed_cns), 0, 0, 0},
+   {"statisticsretention",  store_time,      ITEM(res_dir.stats_retention),  0, ITEM_DEFAULT, 60*60*24*31*12*5},
    {NULL, NULL, {0}, 0, 0, 0}
 };
 
@@ -322,6 +323,7 @@ RES_ITEM job_items[] = {
    {"selectionpattern",   store_str, ITEM(res_job.selection_pattern), 0, 0, 0},
    {"runscript",          store_runscript, ITEM(res_job.RunScripts), 0, ITEM_NO_EQUALS, 0},
    {"selectiontype",      store_migtype, ITEM(res_job.selection_type), 0, 0, 0},
+   {"usestatistics",      store_bool,  ITEM(res_job.stats_enabled), 0, 0, 0},
    {"accurate",           store_bool, ITEM(res_job.accurate), 0,0,0},
    {"allowduplicatejobs", store_bool, ITEM(res_job.AllowDuplicateJobs), 0, ITEM_DEFAULT, false},
    {"allowhigherduplicates",   store_bool, ITEM(res_job.AllowHigherDuplicates), 0, ITEM_DEFAULT, true},
@@ -652,6 +654,9 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm
       if (res->res_job.RegexWhere) {
            sendit(sock, _("  --> RegexWhere=%s\n"), NPRT(res->res_job.RegexWhere));
       }
+      if (res->res_job.stats_enabled) {
+           sendit(sock, _("  --> StatsEnabled=%d\n"), res->res_job.stats_enabled);
+      }
       if (res->res_job.RestoreBootstrap) {
          sendit(sock, _("  --> Bootstrap=%s\n"), NPRT(res->res_job.RestoreBootstrap));
       }
index f525562e1254d41cb5c705a4290b4745d314727e..f13205096d52af15e3ecef7810feba6132ddcc53 100644 (file)
@@ -129,6 +129,7 @@ public:
    bool tls_enable;                   /* Enable TLS */
    bool tls_require;                  /* Require TLS */
    bool tls_verify_peer;              /* TLS Verify Client Certificate */
+   utime_t stats_retention;           /* Stats retention period in seconds */
 
    /* Methods */
    char *name() const;
@@ -426,6 +427,7 @@ public:
    bool write_part_after_job;         /* Set to write part after job in SD */
    bool enabled;                      /* Set if job enabled */
    bool OptimizeJobScheduling;        /* Set if we should optimize Job scheduling */
+   bool stats_enabled;                /* Keep job records in a table for long term statistics */
    bool accurate;                     /* Set if it is an accurate backup job */
    bool AllowDuplicateJobs;           /* Allow duplicate jobs */
    bool AllowHigherDuplicates;        /* Permit Higher Level */
index 3a0bd8f7f2afca99d7632f5e824a1ac6f0fcae6f..e394699f63f312b8d721f4598394c5457e3ab544 100644 (file)
@@ -806,7 +806,7 @@ void update_job_end_record(JCR *jcr)
    jcr->jr.VolSessionId = jcr->VolSessionId;
    jcr->jr.VolSessionTime = jcr->VolSessionTime;
    jcr->jr.JobErrors = jcr->Errors;
-   if (!db_update_job_end_record(jcr, jcr->db, &jcr->jr)) {
+   if (!db_update_job_end_record(jcr, jcr->db, &jcr->jr, jcr->job->stats_enabled)) {
       Jmsg(jcr, M_WARNING, 0, _("Error updating job record. %s"),
          db_strerror(jcr->db));
    }
index 764ae2af1aeb1ae8837e0af8e1d3593047914ad2..641117f690009b4a0c70fdcfb877386c3066daa1 100644 (file)
@@ -107,6 +107,7 @@ int file_delete_handler(void *ctx, int num_fields, char **row)
  *    prune files (from) client=xxx
  *    prune jobs (from) client=xxx
  *    prune volume=xxx
+ *    prune stats
  */
 int prunecmd(UAContext *ua, const char *cmd)
 {
@@ -119,6 +120,7 @@ int prunecmd(UAContext *ua, const char *cmd)
       NT_("Files"),
       NT_("Jobs"),
       NT_("Volume"),
+      NT_("Stats"),
       NULL};
 
    if (!open_client_db(ua)) {
@@ -127,7 +129,7 @@ int prunecmd(UAContext *ua, const char *cmd)
 
    /* First search args */
    kw = find_arg_keyword(ua, keywords);
-   if (kw < 0 || kw > 2) {
+   if (kw < 0 || kw > 3) {
       /* no args, so ask user */
       kw = do_keyword_prompt(ua, _("Choose item to prune"), keywords);
    }
@@ -162,6 +164,9 @@ int prunecmd(UAContext *ua, const char *cmd)
       }
       prune_volume(ua, &mr);
       return true;
+   case 3:  /* prune stats */
+      /* TODO: prune JobStat table */
+      return true;
    default:
       break;
    }
index 36494a89f81edbcdefc59232f648e28e4193e50d..4d41daa64d41ade202a6fbe3261a4104df64b8ee 100644 (file)
@@ -289,6 +289,7 @@ public:
    bool unlink_bsr;                   /* Unlink bsr file created */
    bool VSS;                          /* VSS used by FD */
    bool Encrypt;                      /* Encryption used by FD */
+   bool stats_enabled;                /* Keep all job records in a table for long term statistics */
 #endif /* DIRECTOR_DAEMON */
 
 
index 25b7d702d2bfea8f38feb25a51c70c6fe11263d2..64640e6bb7cfa1391afeea3ce6936c46e4b98866 100644 (file)
@@ -619,7 +619,7 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
                jr.VolSessionTime = mjcr->VolSessionTime;
                jr.JobTDate = (utime_t)mjcr->start_time;
                jr.ClientId = mjcr->ClientId;
-               if (!db_update_job_end_record(bjcr, db, &jr)) {
+               if (!db_update_job_end_record(bjcr, db, &jr, false)) {
                   Pmsg1(0, _("Could not update job record. ERR=%s\n"), db_strerror(db));
                }
                mjcr->read_dcr = NULL;
@@ -1122,7 +1122,7 @@ static int update_job_record(B_DB *db, JOB_DBR *jr, SESSION_LABEL *elabel,
       return 1;
    }
 
-   if (!db_update_job_end_record(bjcr, db, jr)) {
+   if (!db_update_job_end_record(bjcr, db, jr, false)) {
       Pmsg2(0, _("Could not update JobId=%u record. ERR=%s\n"), jr->JobId,  db_strerror(db));
       free_jcr(mjcr);
       return 0;
index 2500be4d73a591f62a3336434f5d253be039bb79..650869d35b89a37407dadfdf1242a0c715fc966a 100644 (file)
@@ -18,10 +18,13 @@ Honor nodump flag
 Improved status commands for Bat
 Spooling/despooling status
 Implement ftruncate for NFS devices
+Add long term statistic job table
 
 
 General:
 20Mar08
+ebl  Apply jobstat patch for long term statistics. Have to implement
+     purge stats command and upgrade scripts.
 kes  Fix mtx-changer.in for broken Debian mt program.
 19Mar08
 kes  Fix large number of JobMedia records reported by Eric Bollengier.