From 4de0d0c985a4176e5565f9cc7a7f54161ae4acc1 Mon Sep 17 00:00:00 2001 From: Eric Bollengier Date: Fri, 2 Jan 2009 12:24:34 +0000 Subject: [PATCH] ebl Avoid attributes transfert when director and storage are 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 | 288 +++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100644 bacula/patches/testing/blastattributes.patch diff --git a/bacula/patches/testing/blastattributes.patch b/bacula/patches/testing/blastattributes.patch new file mode 100644 index 0000000000..f7d302d011 --- /dev/null +++ b/bacula/patches/testing/blastattributes.patch @@ -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); -- 2.39.5