]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Avoid attributes transfert when director and storage are
authorEric Bollengier <eric@eb.homelinux.org>
Fri, 2 Jan 2009 12:24:34 +0000 (12:24 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Fri, 2 Jan 2009 12:24:34 +0000 (12:24 +0000)
     on the same machine

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

bacula/patches/testing/blastattributes.patch [new file with mode: 0644]

diff --git a/bacula/patches/testing/blastattributes.patch b/bacula/patches/testing/blastattributes.patch
new file mode 100644 (file)
index 0000000..f7d302d
--- /dev/null
@@ -0,0 +1,288 @@
+Index: src/dird/catreq.c
+===================================================================
+--- src/dird/catreq.c  (révision 8261)
++++ src/dird/catreq.c  (copie de travail)
+@@ -356,14 +356,7 @@
+    return;
+ }
+-/*
+- * Update File Attributes in the catalog with data
+- *  sent by the Storage daemon.  Note, we receive the whole
+- *  attribute record, but we select out only the stat packet,
+- *  VolSessionId, VolSessionTime, FileIndex, file type, and 
+- *  file name to store in the catalog.
+- */
+-void catalog_update(JCR *jcr, BSOCK *bs)
++static void insert_attribute(JCR *jcr, char *msg, int32_t msglen)
+ {
+    unser_declare;
+    uint32_t VolSessionId, VolSessionTime;
+@@ -375,20 +368,7 @@
+    int len;
+    char *fname, *attr;
+    ATTR_DBR *ar = NULL;
+-   POOLMEM *omsg;
+-   if (job_canceled(jcr) || !jcr->pool->catalog_files) {
+-      goto bail_out;                  /* user disabled cataloging */
+-   }
+-   if (!jcr->db) {
+-      omsg = get_memory(bs->msglen+1);
+-      pm_strcpy(omsg, bs->msg);
+-      bs->fsend(_("1994 Invalid Catalog Update: %s"), omsg);    
+-      Jmsg1(jcr, M_FATAL, 0, _("Invalid Catalog Update; DB not open: %s"), omsg);
+-      free_memory(omsg);
+-      goto bail_out;
+-   }
+-
+    /* Start transaction allocates jcr->attr and jcr->ar if needed */
+    db_start_transaction(jcr, jcr->db);     /* start transaction if not already open */
+    ar = jcr->ar;      
+@@ -397,7 +377,7 @@
+     *  there may be a cached attr so we cannot yet write into
+     *  jcr->attr or jcr->ar  
+     */
+-   p = bs->msg;
++   p = msg;
+    skip_nonspaces(&p);                /* UpdCat */
+    skip_spaces(&p);
+    skip_nonspaces(&p);                /* Job=nnn */
+@@ -412,7 +392,7 @@
+    unser_uint32(data_len);
+    p += unser_length(p);
+-   Dmsg1(400, "UpdCat msg=%s\n", bs->msg);
++   Dmsg1(400, "UpdCat msg=%s\n", msg);
+    Dmsg5(400, "UpdCat VolSessId=%d VolSessT=%d FI=%d Strm=%d data_len=%d\n",
+       VolSessionId, VolSessionTime, FileIndex, Stream, data_len);
+@@ -424,9 +404,9 @@
+          }
+       }
+       /* Any cached attr is flushed so we can reuse jcr->attr and jcr->ar */
+-      jcr->attr = check_pool_memory_size(jcr->attr, bs->msglen);
+-      memcpy(jcr->attr, bs->msg, bs->msglen);
+-      p = jcr->attr - bs->msg + p;    /* point p into jcr->attr */
++      jcr->attr = check_pool_memory_size(jcr->attr, msglen);
++      memcpy(jcr->attr, msg, msglen);
++      p = jcr->attr - msg + p;    /* point p into jcr->attr */
+       skip_nonspaces(&p);             /* skip FileIndex */
+       skip_spaces(&p);
+       filetype = str_to_int32(p);     /* TODO: choose between unserialize and str_to_int32 */
+@@ -510,8 +490,103 @@
+          }
+       }
+    }
++}
++
++/*
++ * Update File Attributes in the catalog with data
++ *  sent by the Storage daemon.  Note, we receive the whole
++ *  attribute record, but we select out only the stat packet,
++ *  VolSessionId, VolSessionTime, FileIndex, file type, and 
++ *  file name to store in the catalog.
++ */
++void catalog_update(JCR *jcr, BSOCK *bs)
++{
++   POOLMEM *omsg;
++
++   if (job_canceled(jcr) || !jcr->pool->catalog_files) {
++      goto bail_out;                  /* user disabled cataloging */
++   }
++   if (!jcr->db) {
++      omsg = get_memory(bs->msglen+1);
++      pm_strcpy(omsg, bs->msg);
++      bs->fsend(_("1994 Invalid Catalog Update: %s"), omsg);    
++      Jmsg1(jcr, M_FATAL, 0, _("Invalid Catalog Update; DB not open: %s"), omsg);
++      free_memory(omsg);
++      goto bail_out;
++
++   }
++
++   insert_attribute(jcr, bs->msg, bs->msglen);
++
+ bail_out:
+    if (job_canceled(jcr)) {
+       cancel_storage_daemon_job(jcr);
+    }
+ }
++
++bool despool_attributes_from_file(JCR *jcr, const char *file)
++{
++   bool ret=false;
++   int32_t pktsiz;
++   size_t nbytes;
++   ssize_t last = 0, size = 0;
++   int count = 0;
++   int32_t msglen;                    /* message length */
++   POOLMEM *msg = get_pool_memory(PM_MESSAGE);
++   FILE *spool_fd;
++
++   Dmsg0(0, "Begin despool_attributes_from_file\n");
++
++   spool_fd = fopen(file, "rb");
++   if (!spool_fd) {
++      /* send an error message */
++      goto bail_out;
++   }
++#if defined(HAVE_POSIX_FADVISE) && defined(POSIX_FADV_WILLNEED)
++   posix_fadvise(fileno(spool_fd), 0, 0, POSIX_FADV_WILLNEED);
++#endif
++
++   while (fread((char *)&pktsiz, 1, sizeof(int32_t), spool_fd) ==
++          sizeof(int32_t)) {
++      size += sizeof(int32_t);
++      msglen = ntohl(pktsiz);
++      if (msglen > 0) {
++         if (msglen > (int32_t) sizeof_pool_memory(msg)) {
++            msg = realloc_pool_memory(msg, msglen + 1);
++         }
++         nbytes = fread(msg, 1, msglen, spool_fd);
++         if (nbytes != (size_t) msglen) {
++            berrno be;
++            Dmsg2(400, "nbytes=%d msglen=%d\n", nbytes, msglen);
++            Qmsg1(jcr, M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
++                  be.bstrerror());
++            goto bail_out;
++         }
++         size += nbytes;
++         if ((++count & 0x3F) == 0) {
++            last = size;
++         }
++      }
++      insert_attribute(jcr, msg, msglen);
++   }
++   if (ferror(spool_fd)) {
++      berrno be;
++      Qmsg1(jcr, M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
++            be.bstrerror());
++      goto bail_out;
++   }
++   ret = true;
++
++bail_out:
++   if (spool_fd) {
++      fclose(spool_fd);
++   }
++
++   if (job_canceled(jcr)) {
++      cancel_storage_daemon_job(jcr);
++   }
++
++   free_pool_memory(msg);
++   Dmsg1(0, "End despool_attributes_from_file ret=%i\n", ret);
++   return ret;
++}
+Index: src/dird/getmsg.c
+===================================================================
+--- src/dird/getmsg.c  (révision 8258)
++++ src/dird/getmsg.c  (copie de travail)
+@@ -135,7 +135,7 @@
+    for (;;) {
+       n = bs->recv();
+-      Dmsg2(300, "bget_dirmsg %d: %s\n", n, bs->msg);
++      Dmsg2(0, "bget_dirmsg %d: %s\n", n, bs->msg);
+       if (is_bnet_stop(bs)) {
+          return n;                    /* error or terminate */
+@@ -236,6 +236,22 @@
+          catalog_update(jcr, bs);
+          continue;
+       }
++      if (bs->msg[0] == 'B') {        /* SD sending file spool attributes */
++         Dmsg2(0, "Blast attributes jcr 0x%x: %s", jcr, bs->msg);
++         char filename[MAX_NAME_LENGTH];
++         if (sscanf(bs->msg, "BlastAttr Job=%127s File=%127s", 
++                    Job, filename) != 2) {
++            Jmsg1(jcr, M_ERROR, 0, _("Malformed message: %s\n"), bs->msg);
++            continue;
++         }
++         unbash_spaces(filename);
++         if (despool_attributes_from_file(jcr, filename)) {
++            bs->fsend("1000 OK BlastAttr\n");
++         } else {
++            bs->fsend("3000 ERROR BlastAttr\n");
++         }
++         continue;
++      }
+       if (bs->msg[0] == 'M') {        /* Mount request */
+          Dmsg1(900, "Mount req: %s", bs->msg);
+          mount_request(jcr, bs, msg);
+Index: src/dird/protos.h
+===================================================================
+--- src/dird/protos.h  (révision 8258)
++++ src/dird/protos.h  (copie de travail)
+@@ -80,6 +80,7 @@
+ /* catreq.c */
+ extern void catalog_request(JCR *jcr, BSOCK *bs);
+ extern void catalog_update(JCR *jcr, BSOCK *bs);
++extern bool despool_attributes_from_file(JCR *jcr, const char *file);
+ /* dird_conf.c */
+ extern const char *level_to_str(int level);
+Index: src/stored/spool.c
+===================================================================
+--- src/stored/spool.c (révision 8258)
++++ src/stored/spool.c (copie de travail)
+@@ -622,13 +622,19 @@
+    V(mutex);
+ }
++static void make_unique_spool_filename(JCR *jcr, POOLMEM **name, int fd)
++{
++   Mmsg(name, "%s/%s.attr.%s.%d.spool", working_directory, my_name,
++      jcr->Job, fd);
++}
++
+ bool commit_attribute_spool(JCR *jcr)
+ {
+    boffset_t size;
+    char ec1[30];
+    char tbuf[100];
+-   Dmsg1(100, "Commit attributes at %s\n", bstrftimes(tbuf, sizeof(tbuf),
++   Dmsg1(0, "Commit attributes at %s\n", bstrftimes(tbuf, sizeof(tbuf),
+          ( utime_t)time(NULL)));
+    if (are_attributes_spooled(jcr)) {
+       if (fseeko(jcr->dir_bsock->m_spool_fd, 0, SEEK_END) != 0) {
+@@ -654,7 +660,23 @@
+       dir_send_job_status(jcr);
+       Jmsg(jcr, M_INFO, 0, _("Sending spooled attrs to the Director. Despooling %s bytes ...\n"),
+             edit_uint64_with_commas(size, ec1));
+-      jcr->dir_bsock->despool(update_attr_spool_size, size);
++
++      /* send full spool file name */
++      POOLMEM *name  = get_pool_memory(PM_MESSAGE);
++      make_unique_spool_filename(jcr, &name, jcr->dir_bsock->m_fd);
++      bash_spaces(name);
++      jcr->dir_bsock->fsend("BlastAttr Job=%s File=%s\n",
++                            jcr->Job, name);
++      free_pool_memory(name);
++
++      if (jcr->dir_bsock->recv() <= 0) {
++         Jmsg(jcr, M_FATAL, 0, _("Network error on BlastAttributes.\n"));
++         goto bail_out;
++      }
++
++      if (!bstrcmp(jcr->dir_bsock->msg, "1000 OK BlastAttr\n")) {
++         jcr->dir_bsock->despool(update_attr_spool_size, size);
++      }
+       return close_attr_spool_file(jcr, jcr->dir_bsock);
+    }
+    return true;
+@@ -664,13 +686,6 @@
+    return false;
+ }
+-static void make_unique_spool_filename(JCR *jcr, POOLMEM **name, int fd)
+-{
+-   Mmsg(name, "%s/%s.attr.%s.%d.spool", working_directory, my_name,
+-      jcr->Job, fd);
+-}
+-
+-
+ bool open_attr_spool_file(JCR *jcr, BSOCK *bs)
+ {
+    POOLMEM *name  = get_pool_memory(PM_MESSAGE);