From 65a29b21f81eaed591900257ce42d0264556a7d2 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Sat, 12 May 2007 12:55:42 +0000 Subject: [PATCH] Fix Verify InitCatalog by making it cache attributes. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4760 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/src/dird/catreq.c | 30 ++++----- bacula/src/dird/fd_cmds.c | 129 +++++++++++++++++--------------------- bacula/src/dird/verify.c | 2 + bacula/technotes-2.1 | 1 + 4 files changed, 77 insertions(+), 85 deletions(-) diff --git a/bacula/src/dird/catreq.c b/bacula/src/dird/catreq.c index 3e3800ec48..23e3795f21 100644 --- a/bacula/src/dird/catreq.c +++ b/bacula/src/dird/catreq.c @@ -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. @@ -39,6 +25,20 @@ (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" diff --git a/bacula/src/dird/fd_cmds.c b/bacula/src/dird/fd_cmds.c index 23194a9dde..cb9f6dd3e5 100644 --- a/bacula/src/dird/fd_cmds.c +++ b/bacula/src/dird/fd_cmds.c @@ -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, "dirdfname); + Dmsg1(dbglvl, "dirdFileId = 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, "dirdfname); - Dmsg1(120, "dirdjr.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, _("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: diff --git a/bacula/technotes-2.1 b/bacula/technotes-2.1 index 3afa1733a4..c38694dd44 100644 --- a/bacula/technotes-2.1 +++ b/bacula/technotes-2.1 @@ -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. -- 2.39.5