+/*
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2000-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.
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version two of the GNU General Public
+ License as published by the Free Software Foundation plus additions
+ that are listed in the file LICENSE.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Bacula® is a registered trademark of John Walker.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
/*
*
* Bacula Director -- verify.c -- responsible for running file verification
*
* Version $Id$
*/
-/*
- Copyright (C) 2000-2006 Kern Sibbald
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- version 2 as amended with additional clauses defined in the
- file LICENSE in the main source directory.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- the file LICENSE for additional details.
-
- */
#include "bacula.h"
#include "dird.h"
#include "findlib/find.h"
-/* Imported Global Variables */
-extern int debug_level;
-
/* Commands sent to File daemon */
static char verifycmd[] = "verify level=%s\n";
static char storaddr[] = "storage address=%s port=%d ssl=0\n";
*/
bool do_verify_init(JCR *jcr)
{
+ return true;
+}
+
+
+/*
+ * Do a verification of the specified files against the Catlaog
+ *
+ * Returns: false on failure
+ * true on success
+ */
+bool do_verify(JCR *jcr)
+{
+ const char *level;
+ BSOCK *fd;
+ int stat;
+ char ed1[100];
JOB_DBR jr;
JobId_t verify_jobid = 0;
const char *Name;
- memset(&jcr->previous_jr, 0, sizeof(jcr->previous_jr));
+ free_wstorage(jcr); /* we don't write */
- Dmsg1(9, "bdird: created client %s record\n", jcr->client->hdr.name);
+ memset(&jcr->previous_jr, 0, sizeof(jcr->previous_jr));
/*
- * Find JobId of last job that ran. E.g.
- * for VERIFY_CATALOG we want the JobId of the last INIT.
- * for VERIFY_VOLUME_TO_CATALOG, we want the JobId of the
+ * Find JobId of last job that ran. Note, we do this when
+ * the job actually starts running, not at schedule time,
+ * so that we find the last job that terminated before
+ * this job runs rather than before it is scheduled. This
+ * permits scheduling a Backup and Verify at the same time,
+ * but with the Verify at a lower priority.
+ *
+ * For VERIFY_CATALOG we want the JobId of the last INIT.
+ * For VERIFY_VOLUME_TO_CATALOG, we want the JobId of the
* last backup Job.
*/
if (jcr->JobLevel == L_VERIFY_CATALOG ||
if (jcr->verify_job &&
(jcr->JobLevel == L_VERIFY_VOLUME_TO_CATALOG ||
jcr->JobLevel == L_VERIFY_DISK_TO_CATALOG)) {
- Name = jcr->verify_job->hdr.name;
+ Name = jcr->verify_job->name();
} else {
Name = NULL;
}
jcr->fileset = jcr->verify_job->fileset;
}
Dmsg2(100, "ClientId=%u JobLevel=%c\n", jcr->previous_jr.ClientId, jcr->JobLevel);
- return true;
-}
-
-
-/*
- * Do a verification of the specified files against the Catlaog
- *
- * Returns: false on failure
- * true on success
- */
-bool do_verify(JCR *jcr)
-{
- const char *level;
- BSOCK *fd;
- int stat;
- char ed1[100];
if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) {
Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
/*
* Now start a job with the Storage daemon
*/
- if (!start_storage_daemon_job(jcr, jcr->storage, NULL)) {
+ if (!start_storage_daemon_job(jcr, jcr->rstorage, NULL)) {
return false;
}
if (!bnet_fsend(jcr->store_bsock, "run")) {
/*
* send Storage daemon address to the File daemon
*/
- if (jcr->store->SDDport == 0) {
- jcr->store->SDDport = jcr->store->SDport;
+ if (jcr->rstore->SDDport == 0) {
+ jcr->rstore->SDDport = jcr->rstore->SDport;
}
- bnet_fsend(fd, storaddr, jcr->store->address, jcr->store->SDDport);
+ bnet_fsend(fd, storaddr, jcr->rstore->address, jcr->rstore->SDDport);
if (!response(jcr, fd, OKstore, "Storage", DISPLAY_ERROR)) {
return false;
}
return false;
}
- if (!send_run_before_and_after_commands(jcr)) {
+ if (!send_runscripts_commands(jcr)) {
return false;
}
const char *Name;
// Dmsg1(100, "Enter verify_cleanup() TermCod=%d\n", TermCode);
- dequeue_messages(jcr); /* display any queued messages */
Dmsg3(900, "JobLevel=%c Expected=%u JobFiles=%u\n", jcr->JobLevel,
jcr->ExpectedFiles, jcr->JobFiles);
}
JobId = jcr->jr.JobId;
- set_jcr_job_status(jcr, TermCode);
- update_job_end_record(jcr);
+ update_job_end(jcr, TermCode);
+
if (jcr->unlink_bsr && jcr->RestoreBootstrap) {
unlink(jcr->RestoreBootstrap);
jcr->unlink_bsr = false;
char *attr, *p, *fn;
char Opts_Digest[MAXSTRING]; /* Verify Opts or MD5/SHA1 digest */
+ if (job_canceled(jcr)) {
+ return false;
+ }
fname = check_pool_memory_size(fname, fd->msglen);
jcr->fname = check_pool_memory_size(jcr->fname, fd->msglen);
Dmsg1(200, "Atts+Digest=%s\n", fd->msg);
*/
jcr->fn_printed = false;
bsnprintf(buf, sizeof(buf),
-"SELECT Path.Path,Filename.Name FROM File,Path,Filename "
-"WHERE File.JobId=%d "
-"AND File.MarkId!=%d AND File.PathId=Path.PathId "
-"AND File.FilenameId=Filename.FilenameId",
- JobId, jcr->JobId);
+ "SELECT Path.Path,Filename.Name FROM File,Path,Filename "
+ "WHERE File.JobId=%d "
+ "AND File.MarkId!=%d AND File.PathId=Path.PathId "
+ "AND File.FilenameId=Filename.FilenameId",
+ JobId, jcr->JobId);
/* missing_handler is called for each file found */
db_sql_query(jcr->db, buf, missing_handler, (void *)jcr);
if (jcr->fn_printed) {
{
JCR *jcr = (JCR *)ctx;
+ if (job_canceled(jcr)) {
+ return 1;
+ }
if (!jcr->fn_printed) {
Jmsg(jcr, M_INFO, 0, "\n");
- Jmsg(jcr, M_INFO, 0, _("The following files are missing:\n"));
+ Jmsg(jcr, M_INFO, 0, _("The following files are in the Catalog but not on disk:\n"));
jcr->fn_printed = true;
}
Jmsg(jcr, M_INFO, 0, " %s%s\n", row[0]?row[0]:"", row[1]?row[1]:"");