]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/patches/testing/jobstat.patch
ebl More tests
[bacula/bacula] / bacula / patches / testing / jobstat.patch
index 039fcf34fc176a419d4038571ce92289cdcb9810..7c59ca1bb939bfed21a41025e8ba824077ffb29b 100644 (file)
-Index: src/dird/job.c
+Index: src/dird/ua_update.c
 ===================================================================
---- src/dird/job.c     (révision 6151)
-+++ src/dird/job.c     (copie de travail)
-@@ -734,7 +734,7 @@
-    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: src/dird/ua_prune.c
-===================================================================
---- src/dird/ua_prune.c        (révision 6151)
-+++ src/dird/ua_prune.c        (copie de travail)
-@@ -107,6 +107,7 @@
-  *    prune files (from) client=xxx
-  *    prune jobs (from) client=xxx
-  *    prune volume=xxx
-+ *    prune stats
+--- src/dird/ua_update.c       (révision 7144)
++++ src/dird/ua_update.c       (copie de travail)
+@@ -42,6 +42,7 @@
+ static int update_volume(UAContext *ua);
+ static bool update_pool(UAContext *ua);
+ static bool update_job(UAContext *ua);
++static bool update_stats(UAContext *ua);
+ /*
+  * Update a Pool Record in the database.
+@@ -53,6 +54,8 @@
+  *         changes pool info for volume
+  *    update slots [scan=...]
+  *         updates autochanger slots
++ *    update stats [days=...]
++ *         updates long term statistics
   */
- int prunecmd(UAContext *ua, const char *cmd)
+ int update_cmd(UAContext *ua, const char *cmd)
  {
-@@ -119,6 +120,7 @@
-       NT_("Files"),
-       NT_("Jobs"),
-       NT_("Volume"),
-+      NT_("Stats"),
+@@ -62,6 +65,7 @@
+       NT_("pool"),   /* 2 */
+       NT_("slots"),  /* 3 */
+       NT_("jobid"),  /* 4 */
++      NT_("stats"),  /* 5 */
        NULL};
  
     if (!open_client_db(ua)) {
-@@ -127,7 +129,7 @@
-    /* 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);
+@@ -82,6 +86,9 @@
+    case 4:
+       update_job(ua);
+       return 1;
++   case 5:
++      update_stats(ua);
++      return 1;
+    default:
+       break;
     }
-@@ -162,6 +164,9 @@
-       }
-       prune_volume(ua, &mr);
-       return true;
-+   case 3:  /* prune stats */
-+      /* TODO: prune JobStat table */
-+      return true;
+@@ -90,6 +97,7 @@
+    add_prompt(ua, _("Volume parameters"));
+    add_prompt(ua, _("Pool from resource"));
+    add_prompt(ua, _("Slots from autochanger"));
++   add_prompt(ua, _("Long term statistics"));
+    switch (do_prompt(ua, _("item"), _("Choose catalog item to update"), NULL, 0)) {
+    case 0:
+       update_volume(ua);
+@@ -100,6 +108,9 @@
+    case 2:
+       update_slots(ua);
+       break;
++   case 3:
++      update_stats(ua);
++      break;
     default:
        break;
     }
-Index: src/dird/dird_conf.c
-===================================================================
---- src/dird/dird_conf.c       (révision 6151)
-+++ src/dird/dird_conf.c       (copie de travail)
-@@ -133,6 +133,7 @@
-    {"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}
- };
-@@ -318,6 +319,7 @@
-    {"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},
-    {NULL, NULL, {0}, 0, 0, 0}
- };
-@@ -637,6 +639,9 @@
-       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: src/dird/dird_conf.h
-===================================================================
---- src/dird/dird_conf.h       (révision 6151)
-+++ src/dird/dird_conf.h       (copie de travail)
-@@ -129,6 +129,7 @@
-    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 */
+@@ -789,6 +800,24 @@
+ }
  
-    /* Methods */
-    char *name() const;
-@@ -399,6 +400,7 @@
-    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 */
-    
-    MSGS      *messages;               /* How and where to send messages */
-    SCHED     *schedule;               /* When -- Automatic schedule */
+ /*
++ * Update long term statistics
++ */
++static bool update_stats(UAContext *ua)
++{
++   int i = find_arg_with_value(ua, NT_("days"));
++   utime_t since=0;
++
++   if (i >= 0) {
++      since = atoi(ua->argv[i]) * 24*60*60;
++   }
++
++   int nb = db_update_stats(ua->jcr, ua->db, since);
++   ua->info_msg(_("Updating %i job(s).\n"), nb);
++
++   return true;
++}
++
++/*
+  * Update pool record -- pull info from current POOL resource
+  */
+ static bool update_pool(UAContext *ua)
 Index: src/cats/sql_update.c
 ===================================================================
---- src/cats/sql_update.c      (révision 6151)
+--- src/cats/sql_update.c      (révision 7144)
 +++ src/cats/sql_update.c      (copie de travail)
-@@ -142,7 +142,7 @@
-  *           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 @@
-       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;
+@@ -126,6 +126,28 @@
  }
  
--
  /*
-  * Update Client record
-  *   Returns: 0 on failure
-Index: src/cats/make_sqlite3_tables.in
-===================================================================
---- src/cats/make_sqlite3_tables.in    (révision 6151)
-+++ src/cats/make_sqlite3_tables.in    (copie de travail)
-@@ -75,6 +75,9 @@
-    );
- CREATE INDEX inx6 ON Job (Name);
-+-- Create a table like Job for long term statistics 
-+CREATE TABLE JobStat (LIKE Job);
++ * Update Long term statistics with all jobs that were run before
++ * age seconds
++ */
++int
++db_update_stats(JCR *jcr, B_DB *mdb, time_t age)
++{
++   char ed1[30];
++   utime_t now = (utime_t)time(NULL);
++   edit_uint64(now - age, ed1);
 +
- CREATE TABLE Location (
-    LocationId INTEGER,
-    Location TEXT NOT NULL,
-Index: src/cats/make_postgresql_tables.in
-===================================================================
---- src/cats/make_postgresql_tables.in (révision 6151)
-+++ src/cats/make_postgresql_tables.in (copie de travail)
-@@ -79,6 +79,9 @@
- 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: src/cats/protos.h
-===================================================================
---- src/cats/protos.h  (révision 6151)
-+++ src/cats/protos.h  (copie de travail)
-@@ -117,7 +117,7 @@
- /* 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: src/cats/make_sqlite_tables.in
-===================================================================
---- src/cats/make_sqlite_tables.in     (révision 6151)
-+++ src/cats/make_sqlite_tables.in     (copie de travail)
-@@ -75,6 +75,9 @@
-    );
- CREATE INDEX inx6 ON Job (Name);
-+-- Create a table like Job for long term statistics 
-+CREATE TABLE JobStat (LIKE Job);
++   Mmsg(mdb->cmd,
++        "INSERT INTO JobStat " 
++         "SELECT * " 
++          "FROM Job "
++         "WHERE JobStatus IN ('T', 'f', 'A', 'E') "
++           "AND JobId NOT IN (SELECT JobId FROM JobStat) "
++           "AND JobTDate < %s ", ed1);
++   QUERY_DB(jcr, mdb, mdb->cmd); /* TODO: get a message ? */
++   return sql_affected_rows(mdb);
++}
 +
- CREATE TABLE Location (
-    LocationId INTEGER,
-    Location TEXT NOT NULL,
-Index: src/cats/sql_create.c
-===================================================================
---- src/cats/sql_create.c      (révision 6151)
-+++ src/cats/sql_create.c      (copie de travail)
-@@ -112,7 +112,7 @@
- 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 @@
-    return ok;
++/*
+  * Given an incoming integer, set the string buffer to either NULL or the value
+  *
+  */
+@@ -134,7 +156,6 @@
+    bsnprintf(s, n, id ? "%s" : "NULL", edit_int64(id, ed1));
  }
  
 -
+ /*
+  * Update the Job record at end of Job
+  *
+@@ -292,7 +313,6 @@
+ {
+    int stat;
+    char ed1[50];
 -
- /* Create Unique Pool record
-  * Returns: false on failure
-  *          true  on success
-Index: src/cats/make_mysql_tables.in
-===================================================================
---- src/cats/make_mysql_tables.in      (révision 6151)
-+++ src/cats/make_mysql_tables.in      (copie de travail)
-@@ -115,6 +115,8 @@
-    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: src/stored/bscan.c
-===================================================================
---- src/stored/bscan.c (révision 6151)
-+++ src/stored/bscan.c (copie de travail)
-@@ -622,7 +622,7 @@
-                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;
-@@ -1112,7 +1112,7 @@
-       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: src/jcr.h
+    db_lock(mdb);
+    Mmsg(mdb->cmd, "UPDATE Storage SET AutoChanger=%d WHERE StorageId=%s", 
+       sr->AutoChanger, edit_int64(sr->StorageId, ed1));
+Index: src/cats/protos.h
 ===================================================================
---- src/jcr.h  (révision 6156)
-+++ src/jcr.h  (copie de travail)
-@@ -260,6 +260,7 @@
-    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 */
+--- src/cats/protos.h  (révision 7144)
++++ src/cats/protos.h  (copie de travail)
+@@ -134,5 +134,6 @@
+ int  db_add_digest_to_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, char *digest, int type);
+ int  db_mark_file_record(JCR *jcr, B_DB *mdb, FileId_t FileId, JobId_t JobId);
+ void db_make_inchanger_unique(JCR *jcr, B_DB *mdb, MEDIA_DBR *mr);
++int db_update_stats(JCR *jcr, B_DB *mdb, time_t age);
  
+ #endif /* __SQL_PROTOS_H */