]> git.sur5r.net Git - bacula/bacula/commitdiff
Send checksum only when the FD will use it
authorEric Bollengier <eric@eb.homelinux.org>
Wed, 30 Sep 2009 12:47:21 +0000 (14:47 +0200)
committerEric Bollengier <eric@eb.homelinux.org>
Wed, 30 Sep 2009 12:47:21 +0000 (14:47 +0200)
bacula/src/dird/backup.c
bacula/src/jcr.h

index 30e1cd1e551ad0035e395f6cdbd6f1f0b9b6fbe1..6d809b01baaee8b7a657ffb337ef487e023b3dd0 100644 (file)
@@ -152,7 +152,11 @@ static int accurate_list_handler(void *ctx, int num_fields, char **row)
    }
 
    /* sending with checksum */
-   if (num_fields == 6 && row[5][0] && row[5][1]) { /* skip checksum = '0' */
+   if (jcr->use_accurate_chksum 
+       && num_fields == 6 
+       && row[5][0] /* skip checksum = '0' */
+       && row[5][1])
+   { 
       jcr->file_bsock->fsend("%s%s%c%s%c%s", 
                              row[0], row[1], 0, row[4], 0, row[5]); 
    } else {
@@ -162,6 +166,56 @@ static int accurate_list_handler(void *ctx, int num_fields, char **row)
    return 0;
 }
 
+/* In this procedure, we check if the current fileset is using
+ * FileSet-> Include-> Options-> Accurate/Verify/BaseJob=checksum
+ */
+static bool is_checksum_needed_by_fileset(JCR *jcr)
+{
+   FILESET *f;
+   INCEXE *inc;
+   FOPTS *fopts;
+   bool in_block=false;
+   if (!jcr->job || !jcr->job->fileset) {
+      return false;
+   }
+
+   f = jcr->job->fileset;
+   
+   for (int i=0; i < f->num_includes; i++) {
+      inc = f->include_items[i];
+      
+      for (int j=0; j < inc->num_opts; j++) {
+         fopts = inc->opts_list[j];
+         
+         for (char *k=fopts->opts; *k ; k++) {
+            switch (*k) {
+            case 'V':           /* verify */
+               in_block = (jcr->get_JobType() == JT_VERIFY);
+               break;
+            case 'J':           /* Basejob */
+               in_block = (jcr->get_JobLevel() == L_FULL);
+               break;
+            case 'C':           /* Accurate */
+               in_block = (jcr->get_JobLevel() != L_FULL);
+               break;
+            case ':':
+               in_block = false;
+               break;
+            case '5':           /* MD5  */
+            case '1':           /* SHA1 */
+               if (in_block) {
+                  return true;
+               }
+               break;
+            default:
+               break;
+            }
+         }
+      }
+   }
+   return false;
+}
+
 /*
  * Send current file list to FD
  *    DIR -> FD : accurate files=xxxx
@@ -184,6 +238,9 @@ bool send_accurate_current_files(JCR *jcr)
    if (jcr->get_JobLevel() == L_BASE) {
       return true;
    }
+   
+   /* Don't send and store the checksum if fileset doesn't require it */
+   jcr->use_accurate_chksum = is_checksum_needed_by_fileset(jcr);
 
    if (jcr->get_JobLevel() == L_FULL) {
       /* On Full mode, if no previous base job, no accurate things */
index 57d287c92b0cd9c3a817023b7b8f06f0f614cb7b..f9378d82a2a239fda163f2db6c50091973af5161 100644 (file)
@@ -347,6 +347,7 @@ public:
    bool stats_enabled;                /* Keep all job records in a table for long term statistics */
    bool no_maxtime;                   /* Don't check Max*Time for this JCR */
    bool keep_sd_auth_key;             /* Clear or not the SD auth key after connection*/
+   bool use_accurate_chksum;          /* Use or not checksum option in accurate code */
 #endif /* DIRECTOR_DAEMON */