]> git.sur5r.net Git - bacula/bacula/commitdiff
Fix Verify InitCatalog by making it cache attributes.
authorKern Sibbald <kern@sibbald.com>
Sat, 12 May 2007 12:55:42 +0000 (12:55 +0000)
committerKern Sibbald <kern@sibbald.com>
Sat, 12 May 2007 12:55:42 +0000 (12:55 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4760 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/dird/catreq.c
bacula/src/dird/fd_cmds.c
bacula/src/dird/verify.c
bacula/technotes-2.1

index 3e3800ec489042de632446125c937bd4eb30077b..23e3795f2180261cf2b123ae1fff3098d1cca5cc 100644 (file)
@@ -1,21 +1,7 @@
-/*
- *
- *   Bacula Director -- catreq.c -- handles the message channel
- *    catalog request from the Storage daemon.
- *
- *     Kern Sibbald, March MMI
- *
- *    This routine runs as a thread and must be thread reentrant.
- *
- *  Basic tasks done here:
- *      Handle Catalog services.
- *
- *   Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2001-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2001-2007 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ *
+ *   Bacula Director -- catreq.c -- handles the message channel
+ *    catalog request from the Storage daemon.
+ *
+ *     Kern Sibbald, March MMI
+ *
+ *    This routine runs as a thread and must be thread reentrant.
+ *
+ *  Basic tasks done here:
+ *      Handle Catalog services.
+ *
+ *   Version $Id$
+ */
 
 #include "bacula.h"
 #include "dird.h"
index 23194a9ddebaeada52cb939212ae2b9870ebef7c..cb9f6dd3e553d64337b9a94f66b28a52d404c8d7 100644 (file)
@@ -44,6 +44,8 @@
 #include "dird.h"
 #include "findlib/find.h"
 
+const int dbglvl = 400;
+
 /* Commands sent to File daemon */
 static char filesetcmd[]  = "fileset%s\n"; /* set full fileset */
 static char jobcmd[]      = "JobId=%s Job=%s SDid=%u SDtime=%u Authorization=%s\n";
@@ -595,23 +597,17 @@ int get_attributes_and_put_in_catalog(JCR *jcr)
 {
    BSOCK   *fd;
    int n = 0;
-   ATTR_DBR ar;
+   ATTR_DBR *ar = NULL;
 
    fd = jcr->file_bsock;
    jcr->jr.FirstIndex = 1;
    memset(&ar, 0, sizeof(ar));
    jcr->FileIndex = 0;
-   jcr->cached_attribute = false;
 
    Dmsg0(120, "bdird: waiting to receive file attributes\n");
    /* Pickup file attributes and digest */
    while (!fd->errors && (n = bget_dirmsg(fd)) > 0) {
-
-   /*****FIXME****** improve error handling to stop only on
-    * really fatal problems, or the number of errors is too
-    * large.
-    */
-      unsigned long file_index;
+      uint32_t file_index;
       int stream, len;
       char *attr, *p, *fn;
       char Opts_Digest[MAXSTRING];      /* either Verify opts or MD5/SHA1 digest */
@@ -624,89 +620,82 @@ int get_attributes_and_put_in_catalog(JCR *jcr)
          set_jcr_job_status(jcr, JS_ErrorTerminated);
          return 0;
       }
+      /* Start transaction allocates jcr->attr and jcr->ar if needed */
+      db_start_transaction(jcr, jcr->db);     /* start transaction if not already open */
       p = fd->msg;
       skip_nonspaces(&p);             /* skip FileIndex */
       skip_spaces(&p);
       skip_nonspaces(&p);             /* skip Stream */
       skip_spaces(&p);
-      skip_nonspaces(&p);             /* skip Opts_SHA1 */
+      skip_nonspaces(&p);             /* skip Opts_Digest */
       p++;                            /* skip space */
-      fn = jcr->fname;
-      while (*p != 0) {
-         *fn++ = *p++;                /* copy filename */
-      }
-      *fn = *p++;                     /* term filename and point to attribs */
-      attr = p;
-
-
-      /*
-       * First, get STREAM_UNIX_ATTRIBUTES and fill ATTR_DBR structure
-       * Next, we CAN have a CRYPTO_DIGEST, so we fill ATTR_DBR with it (or not)
-       * When we get a new STREAM_UNIX_ATTRIBUTES, we known that we can add file to the catalog
-       * At the end, we have to add the last file
-       */
+      if (stream == STREAM_UNIX_ATTRIBUTES || stream == STREAM_UNIX_ATTRIBUTES_EX) {
+         if (jcr->cached_attribute) {
+            Dmsg2(dbglvl, "Cached attr. Stream=%d fname=%s\n", ar->Stream, ar->fname);
+            if (!db_create_file_attributes_record(jcr, jcr->db, ar)) {
+               Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db));
+            }
+         }
+         /* Any cached attr is flushed so we can reuse jcr->attr and jcr->ar */
+         fn = jcr->fname;
+         while (*p != 0) {
+            *fn++ = *p++;                /* copy filename */
+         }
+         *fn = *p++;                     /* term filename and point to attribs */
+         attr = p;
+         ar = jcr->ar;
+         len = strlen(attr);
+         jcr->attr = check_pool_memory_size(jcr->attr, len);
+         memcpy(jcr->attr, attr, len);
+         jcr->JobFiles++;
+         jcr->FileIndex = file_index;
+         ar->attr = attr;
+         ar->fname = jcr->fname;
+         ar->FileIndex = file_index;
+         ar->Stream = stream;
+         ar->link = NULL;
+         ar->JobId = jcr->JobId;
+         ar->ClientId = jcr->ClientId;
+         ar->PathId = 0;
+         ar->FilenameId = 0;
+         ar->Digest = NULL;
+         ar->DigestType = CRYPTO_DIGEST_NONE;
+         jcr->cached_attribute = true;
 
-      if (crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
-         if (jcr->FileIndex != file_index) {
+         Dmsg2(dbglvl, "dird<filed: stream=%d %s\n", stream, jcr->fname);
+         Dmsg1(dbglvl, "dird<filed: attr=%s\n", attr);
+         jcr->FileId = ar->FileId;
+      } else if (crypto_digest_stream_type(stream) != CRYPTO_DIGEST_NONE) {
+         if (jcr->FileIndex != (uint32_t)file_index) {
             Jmsg3(jcr, M_ERROR, 0, _("%s index %d not same as attributes %d\n"),
-                  stream_to_ascii(stream), file_index, jcr->FileIndex);
-            set_jcr_job_status(jcr, JS_Error);
+               stream_to_ascii(stream), file_index, jcr->FileIndex);
             continue;
          }
          db_escape_string(digest, Opts_Digest, strlen(Opts_Digest));
-         Dmsg2(120, "DigestLen=%d Digest=%s\n", strlen(digest), digest);
-         ar.Digest = digest;
-         ar.DigestType = crypto_digest_stream_type(stream) ;
-      }
-
-      if (stream == STREAM_UNIX_ATTRIBUTES || stream == STREAM_UNIX_ATTRIBUTES_EX) {
-         /* commit previous stream */
+         ar->Digest = digest;
+         ar->DigestType = crypto_digest_stream_type(stream);
+         Dmsg3(dbglvl, "DigestLen=%d Digest=%s type=%d\n", strlen(digest), digest,
+               ar->DigestType);
          if (jcr->cached_attribute) {
-            if (!db_create_file_attributes_record(jcr, jcr->db, &ar)) {
-               Jmsg1(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
-               set_jcr_job_status(jcr, JS_Error);
+            Dmsg2(dbglvl, "Cached attr with digest. Stream=%d fname=%s\n", ar->Stream, ar->fname);
+            if (!db_create_file_attributes_record(jcr, jcr->db, ar)) {
+               Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db));
+            }
+            jcr->cached_attribute = false; 
+         } else {
+            if (!db_add_digest_to_file_record(jcr, jcr->db, ar->FileId, 
+                 ar->Digest, ar->DigestType)) {
+               Jmsg(jcr, M_ERROR, 0, _("Catalog error updating file digest. %s"),
+                  db_strerror(jcr->db));
             }
-            jcr->cached_attribute = false;
          }
       }
-      
-      if (stream == STREAM_UNIX_ATTRIBUTES || stream == STREAM_UNIX_ATTRIBUTES_EX) {
-         jcr->cached_attribute = true;
-         jcr->JobFiles++;
-         jcr->FileIndex = file_index;
-         ar.attr = attr;
-         ar.fname = jcr->fname;
-         ar.FileIndex = file_index;
-         ar.Stream = stream;
-         ar.link = NULL;
-         ar.JobId = jcr->JobId;
-         ar.ClientId = jcr->ClientId;
-         ar.PathId = 0;
-         ar.FilenameId = 0;
-         ar.Digest = NULL;
-         ar.DigestType = CRYPTO_DIGEST_NONE;
-
-         Dmsg2(111, "dird<filed: stream=%d %s\n", stream, jcr->fname);
-         Dmsg1(120, "dird<filed: attr=%s\n", attr);
-      } 
-
       jcr->jr.JobFiles = jcr->JobFiles = file_index;
       jcr->jr.LastIndex = file_index;
    }
-
-   /* insert the last file */
-   if (jcr->cached_attribute) {
-      if (!db_create_file_attributes_record(jcr, jcr->db, &ar)) {
-         Jmsg1(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
-         set_jcr_job_status(jcr, JS_Error);
-      }
-      jcr->cached_attribute = false;
-   }
-
    if (is_bnet_error(fd)) {
       Jmsg1(jcr, M_FATAL, 0, _("<filed: Network error getting attributes. ERR=%s\n"),
                         bnet_strerror(fd));
-      set_jcr_job_status(jcr, JS_ErrorTerminated);
       return 0;
    }
 
index ddce0354ca9a5818f37fa9fde4636c7fe4ee2630..192cbbc2c1fc607c4cfff2c5707fbe0e98cf4db4 100644 (file)
@@ -322,6 +322,8 @@ bool do_verify(JCR *jcr)
       jcr->sd_msg_thread_done = true;   /* no SD msg thread, so it is done */
       jcr->SDJobStatus = JS_Terminated;
       get_attributes_and_put_in_catalog(jcr);
+      db_end_transaction(jcr, jcr->db);   /* terminate any open transaction */
+      db_write_batch_file_records(jcr);
       break;
 
    default:
index 3afa1733a46fb7aabff98272b9c45d37ab6472c9..c38694dd44032dcee6cfe6f5f242ecdafe6d703f 100644 (file)
@@ -3,6 +3,7 @@
 General:
 12May07
 kes  Update the po files.
+kes  Fix Verify InitCatalog by making it cache attributes.
 11May07
 kes  Change name bacula-bat to bat for man 1 page to correspond to
      Makefile.