From c91a1d5628634c8c2675f423b4699ba84bd7f791 Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Thu, 1 Mar 2007 08:38:47 +0000 Subject: [PATCH] kes Correct virtual changer check which was backwards. This caused volumes to be unloaded into slots already occupied. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@4288 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/kernstodo | 3 +++ bacula/src/dird/ua_prune.c | 46 +++++++++++++++++++-------------- bacula/src/dird/ua_restore.c | 41 ++++++++++++++++++----------- bacula/src/lib/var.c | 5 ++-- bacula/src/stored/autochanger.c | 2 +- bacula/technotes-2.1 | 12 ++++++++- 6 files changed, 71 insertions(+), 38 deletions(-) diff --git a/bacula/kernstodo b/bacula/kernstodo index 766e57a122..306bf100e2 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -6,6 +6,8 @@ Project Developer ======= ========= Document: +- !!! Cannot restore two jobs a the same time that were + written simultaneously unless they were totally spooled. - Document cleaning up the spool files: db, pid, state, bsr, mail, conmsg, spool - Document the multiple-drive-changer.txt script. @@ -41,6 +43,7 @@ Document: Priority: +- Look at sg_logs -a /dev/sg0 for getting soft errors. - btape "test" command with Offline on Unmount = yes This test is essential to Bacula. diff --git a/bacula/src/dird/ua_prune.c b/bacula/src/dird/ua_prune.c index 30e8dab2b2..89a0f82164 100644 --- a/bacula/src/dird/ua_prune.c +++ b/bacula/src/dird/ua_prune.c @@ -1,16 +1,7 @@ -/* - * - * Bacula Director -- User Agent Database prune Command - * Applies retention periods - * - * Kern Sibbald, February MMII - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2002-2006 Free Software Foundation Europe e.V. + Copyright (C) 2002-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. @@ -34,6 +25,15 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * + * Bacula Director -- User Agent Database prune Command + * Applies retention periods + * + * Kern Sibbald, February MMII + * + * Version $Id$ + */ #include "bacula.h" #include "dird.h" @@ -267,11 +267,15 @@ int prune_files(UAContext *ua, CLIENT *client) db_sql_query(ua->db, query, file_delete_handler, (void *)&del); for (i=0; i < del.num_ids; i++) { - purge_files_from_job(ua, del.JobId[i]); + /* Don't prune current job */ + if (ua->jcr->JobId != del.JobId[i]) { + purge_files_from_job(ua, del.JobId[i]); + del.num_del++; + } } - edit_uint64_with_commas(del.num_ids, ed1); + edit_uint64_with_commas(del.num_del, ed1); bsendmsg(ua, _("Pruned Files from %s Jobs for client %s from catalog.\n"), - ed1, client->hdr.name); + ed1, client->name()); bail_out: db_unlock(ua->db); @@ -418,13 +422,17 @@ int prune_jobs(UAContext *ua, CLIENT *client, int JobType) * Then delete the Job entry, and finally and JobMedia records. */ for (i=0; i < del.num_ids; i++) { - if (!del.PurgedFiles[i]) { - purge_files_from_job(ua, del.JobId[i]); + /* Don't prune current job */ + if (ua->jcr->JobId != del.JobId[i]) { + if (!del.PurgedFiles[i]) { + purge_files_from_job(ua, del.JobId[i]); + } + purge_job_from_catalog(ua, del.JobId[i]); + del.num_del++; } - purge_job_from_catalog(ua, del.JobId[i]); } - bsendmsg(ua, _("Pruned %d %s for client %s from catalog.\n"), del.num_ids, - del.num_ids==1?_("Job"):_("Jobs"), client->hdr.name); + bsendmsg(ua, _("Pruned %d %s for client %s from catalog.\n"), del.num_del, + del.num_del==1?_("Job"):_("Jobs"), client->name()); bail_out: drop_temp_tables(ua); @@ -523,7 +531,7 @@ bool prune_volume(UAContext *ua, MEDIA_DBR *mr) continue; } Dmsg2(200, "Looking at %s JobTdate=%d\n", jr.Job, (int)jr.JobTDate); - if (jr.JobTDate >= (now - period)) { + if (jr.JobTDate >= (now - period) || ua->jcr->JobId == del.JobId[i]) { continue; } purge_files_from_job(ua, del.JobId[i]); diff --git a/bacula/src/dird/ua_restore.c b/bacula/src/dird/ua_restore.c index 420931d5f1..cce2821ff0 100644 --- a/bacula/src/dird/ua_restore.c +++ b/bacula/src/dird/ua_restore.c @@ -625,23 +625,19 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) } } - if (*rx->JobIds == 0) { - bsendmsg(ua, _("No Jobs selected.\n")); - return 0; - } - if (strchr(rx->JobIds,',')) { - bsendmsg(ua, _("You have selected the following JobIds: %s\n"), rx->JobIds); - } - else { - bsendmsg(ua, _("You have selected the following JobId: %s\n"), rx->JobIds); - } - - + POOLMEM *JobIds = get_pool_memory(PM_FNAME); + *JobIds = 0; rx->TotalFiles = 0; + /* + * Find total number of files to be restored, and filter the JobId + * list to contain only ones permitted by the ACL conditions. + */ for (p=rx->JobIds; ; ) { + char ed1[50]; int stat = get_next_jobid_from_list(&p, &JobId); if (stat < 0) { bsendmsg(ua, _("Invalid JobId in list.\n")); + free_pool_memory(JobIds); return 0; } if (stat == 0) { @@ -653,18 +649,33 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx) memset(&jr, 0, sizeof(JOB_DBR)); jr.JobId = JobId; if (!db_get_job_record(ua->jcr, ua->db, &jr)) { - char ed1[50]; bsendmsg(ua, _("Unable to get Job record for JobId=%s: ERR=%s\n"), edit_int64(JobId, ed1), db_strerror(ua->db)); + free_pool_memory(JobIds); return 0; } if (!acl_access_ok(ua, Job_ACL, jr.Name)) { - bsendmsg(ua, _("No authorization. Job \"%s\" not selected.\n"), - jr.Name); + bsendmsg(ua, _("No authorization for JobId=%s (Job \"%s\"). Not selected.\n"), + edit_int64(JobId, ed1), jr.Name); continue; } + if (*JobIds != 0) { + pm_strcat(JobIds, ","); + } + pm_strcat(JobIds, edit_int64(JobId, ed1)); rx->TotalFiles += jr.JobFiles; } + free_pool_memory(rx->JobIds); + rx->JobIds = JobIds; /* Set ACL filtered list */ + if (*rx->JobIds == 0) { + bsendmsg(ua, _("No Jobs selected.\n")); + return 0; + } + if (strchr(rx->JobIds,',')) { + bsendmsg(ua, _("You have selected the following JobIds: %s\n"), rx->JobIds); + } else { + bsendmsg(ua, _("You have selected the following JobId: %s\n"), rx->JobIds); + } return 1; } diff --git a/bacula/src/lib/var.c b/bacula/src/lib/var.c index aac43f66e9..27bf15d75d 100644 --- a/bacula/src/lib/var.c +++ b/bacula/src/lib/var.c @@ -1990,8 +1990,9 @@ parse_variable_complex( rc = VAR_ERR_INCOMPLETE_VARIABLE_SPEC; goto error_return; } - inc = (*p == '+'); /* increment variable */ - p++; + if ((inc = (*p++ == '+'))) { + p++; /* skip the + */ + } /* lookup the variable value now */ if (failed) { diff --git a/bacula/src/stored/autochanger.c b/bacula/src/stored/autochanger.c index f278ebe622..afa7ed8464 100644 --- a/bacula/src/stored/autochanger.c +++ b/bacula/src/stored/autochanger.c @@ -251,7 +251,7 @@ int get_autochanger_loaded_slot(DCR *dcr) return dev->Slot; } /* Virtual disk autochanger */ - if (dcr->device->changer_command[0]) { + if (dcr->device->changer_command[0] ==0) { return 1; } diff --git a/bacula/technotes-2.1 b/bacula/technotes-2.1 index 003bba7755..f31be91d43 100644 --- a/bacula/technotes-2.1 +++ b/bacula/technotes-2.1 @@ -1,6 +1,16 @@ Technical notes on version 2.1 General: +29Feb07 +kes Correct virtual changer check which was backwards. This caused + volumes to be unloaded into slots already occupied. +28Feb07 +kes Apply Command ACL filter to JobId list in restore command. +kes Correct typeo in var.c patch. +27Feb07 +kes Don't let Bacula prune File or Job records for the current Job. +kes Fix variable substitution pad + inc bug reported (with patch) + in bug #791. 26Feb07 kes Correct SQLite log table index as reported by Luca Berra. 24Feb07 @@ -112,7 +122,7 @@ kes Test on job_canceled() and sd_msg_thread_done inside Fixes bug #771. kes Remove rl_catch_signal from console.c as it conflicted with the header definition. Fixes bug #765. -ebl Fixes bug #766 about RunsOnClient = Yes +ebl Fixes bug #766 about RunsOnClient = Yes (case sensitive) 04Feb07 kes Clarify some stored/acquire messages to indicate if the problem is with read or append. -- 2.39.5