From: Kern Sibbald Date: Thu, 1 Mar 2007 08:38:47 +0000 (+0000) Subject: kes Correct virtual changer check which was backwards. This caused X-Git-Tag: Release-2.2.0~955 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e1a7cf02e47179636ad3e3b73bc1fe7bb6032663;p=bacula%2Fbacula 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 --- 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/src/win32/README.mingw32 b/bacula/src/win32/README.mingw32 index 92cb86ee77..18bf31de2d 100644 --- a/bacula/src/win32/README.mingw32 +++ b/bacula/src/win32/README.mingw32 @@ -18,7 +18,7 @@ your questions on the bacula-devel list, but we can't guarantee anything. One-time Setup ============== -If you're reading this file you've probably already enlisted in the CVS tree or +If you're reading this file you've probably already enlisted in the SVN tree or extracted the contents of the source tar. If not you need to do that first. You also need to download one of the doc tar balls and extract to your 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.