From: Kern S. <ke...@us...> - 2006-05-26 21:02:47
|
Update of /cvsroot/bacula/bacula/src/dird In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv23410/src/dird Modified Files: inc_conf.c jobq.c migrate.c query.sql restore.c sql_cmds.c ua_prune.c ua_purge.c ua_server.c ua_tree.c verify.c Log Message: 26May06 - Prevent DVD code from rewriting label if the device cannot be opened read/write. - Used __GNUC__ to detect GNU g++ as suggested by John Goerzen to fix Debian build bug. - Fix Dir/SD run race in migrate.c, verify.c, and restore.c - Integrate manpages contributed by Jose Luis. - Update projects file. - Add manpages Makefile.in to configure.in - Remove installation of bacula.8 in scripts directory. 24May06 - Implement patch submitted by cesarb in bug #606 to implement O_NOATIME support. O_NOATIME is a open() flag which makes it possible to read a file without updating the inode atime (and also without the inode ctime update which happens if you try to set the atime back to its previous value). It also prevents a race condition when two programs are reading the same file, but only one does not want to change the atime. It's most useful for backup programs and file integrity checkers (and bacula can fit on both categories). Recent versions of the Linux kernel and glibc have support for it (the glibc support being mostly copying the O_NOATIME definition to bits/fcntl.h). If there's no support for it on the kernel, trying to use it does nothing (since the kernel ignores unknown flags). If the kernel has support for it, trying to use it either works, fails silently (mostly in remote filesystems), or returns errno=EPERM (if you are not either the owner of the file or root). A simple way to prevent the failure is to open the file without the flag and set it later with fcntl(F_SETFL), ignoring any EPERM errors. - Applied patch posted by Jaime Ventura to bug #570 to correct failure of restarted jobs to complete (due to a destroyed pthreads conditional variable used by the message thread). - Fixed bug #619 where Bacula would not restart jobs with MaxRestartTimes set to zero. - Apply patch from John Goerzen bug #611 to fix bad manual links in the code. - Apply patch from Rudolf Cejka bug #614 to removed trailing colons in query.sql file. - Apply patch from Rudolf Cejka bug #613 to correct prunning of files not to create orphans. - Apply patch from Rudolf Cejka bug #617 to use mtime instead of ctime in restore long listing. - Apply patch from Rudolf Cejka bug #609 to use MarkId in verify.c instead of incorrect MarkedId. - Apply patch from adioso bug #616 to correct text in manual (replace Director with File daemon). - Rework a few of the zlib changes so that they build properly. Index: verify.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/verify.c,v retrieving revision 1.76 retrieving revision 1.77 diff -u -d -r1.76 -r1.77 --- verify.c 11 Apr 2006 16:23:36 -0000 1.76 +++ verify.c 26 May 2006 21:02:29 -0000 1.77 @@ -177,6 +177,9 @@ if (!start_storage_daemon_job(jcr, jcr->storage, NULL)) { return false; } + if (!bnet_fsend(jcr->store_bsock, "run")) { + return false; + } /* * Now start a Storage daemon message thread */ @@ -185,9 +188,6 @@ } Dmsg0(50, "Storage daemon connection OK\n"); - if (!bnet_fsend(jcr->store_bsock, "run")) { - return false; - } } /* * OK, now connect to the File daemon Index: migrate.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/migrate.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- migrate.c 23 Apr 2006 15:15:05 -0000 1.15 +++ migrate.c 26 May 2006 21:02:29 -0000 1.16 @@ -273,6 +273,10 @@ return false; } + if (!bnet_fsend(sd, "run")) { + return false; + } + /* * Now start a Storage daemon message thread */ @@ -280,9 +284,6 @@ return false; } - if (!bnet_fsend(sd, "run")) { - return false; - } set_jcr_job_status(jcr, JS_Running); set_jcr_job_status(prev_jcr, JS_Running); Index: ua_purge.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/ua_purge.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- ua_purge.c 11 Apr 2006 16:23:36 -0000 1.32 +++ ua_purge.c 26 May 2006 21:02:29 -0000 1.33 @@ -121,7 +121,7 @@ del->PurgedFiles = (char *)brealloc(del->PurgedFiles, del->max_ids); } del->JobId[del->num_ids] = (JobId_t)str_to_int64(row[0]); - del->PurgedFiles[del->num_ids++] = (char)str_to_int64(row[0]); + del->PurgedFiles[del->num_ids++] = (char)str_to_int64(row[1]); return 0; } Index: ua_server.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/ua_server.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- ua_server.c 19 Apr 2006 17:14:18 -0000 1.42 +++ ua_server.c 26 May 2006 21:02:29 -0000 1.43 @@ -176,8 +176,8 @@ ua->db = jcr->db; ua->cmd = get_pool_memory(PM_FNAME); ua->args = get_pool_memory(PM_FNAME); - ua->verbose = 1; - ua->automount = TRUE; + ua->verbose = true; + ua->automount = true; return ua; } Index: ua_prune.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/ua_prune.c,v retrieving revision 1.52 retrieving revision 1.53 diff -u -d -r1.52 -r1.53 --- ua_prune.c 23 Apr 2006 13:07:40 -0000 1.52 +++ ua_prune.c 26 May 2006 21:02:29 -0000 1.53 @@ -123,7 +123,7 @@ del->PurgedFiles = (char *)brealloc(del->PurgedFiles, del->max_ids); } del->JobId[del->num_ids] = (JobId_t)str_to_int64(row[0]); - del->PurgedFiles[del->num_ids++] = (char)str_to_int64(row[0]); + del->PurgedFiles[del->num_ids++] = (char)str_to_int64(row[1]); return 0; } Index: ua_tree.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/ua_tree.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- ua_tree.c 21 Apr 2006 11:25:15 -0000 1.42 +++ ua_tree.c 26 May 2006 21:02:29 -0000 1.43 @@ -484,7 +484,7 @@ p += n; n = sprintf(p, "%s,", edit_uint64(statp->st_size, ec1)); p += n; - p = encode_time(statp->st_ctime, p); + p = encode_time(statp->st_mtime, p); *p++ = ','; *p++ = *tag; *p++ = ','; Index: sql_cmds.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/sql_cmds.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- sql_cmds.c 8 Mar 2006 21:17:09 -0000 1.59 +++ sql_cmds.c 26 May 2006 21:02:29 -0000 1.60 @@ -110,7 +110,7 @@ * (i.e. no files, ...) for deletion. */ const char *select_backup_del = - "SELECT DISTINCT DelCandidates.JobId " + "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles " "FROM Job,DelCandidates " "WHERE (Job.JobTDate<%s AND ((DelCandidates.JobFiles=0) OR " "(DelCandidates.JobStatus!='T'))) OR " @@ -126,7 +126,7 @@ * This is the list of Jobs to delete for a Verify Job. */ const char *select_verify_del = - "SELECT DISTINCT DelCandidates.JobId " + "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles " "FROM Job,DelCandidates " "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR " "(Job.JobTDate>%s " @@ -141,7 +141,7 @@ * This is the list of Jobs to delete for a Restore Job. */ const char *select_restore_del = - "SELECT DISTINCT DelCandidates.JobId " + "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles " "FROM Job,DelCandidates " "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR " "(Job.JobTDate>%s " @@ -152,7 +152,7 @@ * This is the list of Jobs to delete for an Admin Job. */ const char *select_admin_del = - "SELECT DISTINCT DelCandidates.JobId " + "SELECT DISTINCT DelCandidates.JobId,DelCandidates.PurgedFiles " "FROM Job,DelCandidates " "WHERE (Job.JobTdate<%s AND DelCandidates.JobStatus!='T') OR " "(Job.JobTDate>%s " Index: inc_conf.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/inc_conf.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- inc_conf.c 15 Apr 2006 09:01:11 -0000 1.44 +++ inc_conf.c 26 May 2006 21:02:29 -0000 1.45 @@ -97,6 +97,7 @@ {"ignorecase", store_opts, NULL, 0, 0, 0}, {"fstype", store_fstype, NULL, 0, 0, 0}, {"hfsplussupport", store_opts, NULL, 0, 0, 0}, + {"noatime", store_opts, NULL, 0, 0, 0}, {NULL, NULL, NULL, 0, 0, 0} }; @@ -120,7 +121,8 @@ INC_KW_EXCLUDE, INC_KW_ACL, INC_KW_IGNORECASE, - INC_KW_HFSPLUS + INC_KW_HFSPLUS, + INC_KW_NOATIME }; /* @@ -147,6 +149,7 @@ {"aclsupport", INC_KW_ACL}, {"ignorecase", INC_KW_IGNORECASE}, {"hfsplussupport", INC_KW_HFSPLUS}, + {"noatime", INC_KW_NOATIME}, {NULL, 0} }; @@ -208,6 +211,8 @@ {"no", INC_KW_IGNORECASE, "0"}, {"yes", INC_KW_HFSPLUS, "R"}, /* "R" for resource fork */ {"no", INC_KW_HFSPLUS, "0"}, + {"yes", INC_KW_NOATIME, "K"}, + {"no", INC_KW_NOATIME, "0"}, {NULL, 0, 0} }; Index: query.sql =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/query.sql,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- query.sql 17 Jan 2006 09:40:14 -0000 1.30 +++ query.sql 26 May 2006 21:02:29 -0000 1.31 @@ -1,12 +1,5 @@ -:List Job totals: -SELECT count(*) AS Jobs,sum(JobFiles) AS Files, - sum(JobBytes) AS Bytes,Name AS Job - FROM Job - GROUP BY Name; -SELECT max(JobId) AS Jobs,sum(JobFiles) AS Files,sum(JobBytes) As Bytes - FROM Job; -# 2 -:List up to 20 places where a File is saved regardless of the directory: +# 1 +:List up to 20 places where a File is saved regardless of the directory *Enter Filename (no path): SELECT DISTINCT Job.JobId as JobId, Client.Name as Client, Path.Path,Filename.Name,StartTime,Level,JobFiles,JobBytes @@ -15,8 +8,8 @@ AND Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId AND Filename.Name='%1' ORDER BY Job.StartTime LIMIT 20; -# 3 -:List where the most recent copies of a file are saved: +# 2 +:List where the most recent copies of a file are saved *Enter path with trailing slash: *Enter filename: *Enter Client name: @@ -32,8 +25,8 @@ AND JobMedia.MediaId=Media.MediaId AND Client.ClientId=Job.ClientId ORDER BY Job.StartTime DESC LIMIT 5; -# 4 -:List last 20 Full Backups for a Client: +# 3 +:List last 20 Full Backups for a Client *Enter Client name: SELECT DISTINCT Job.JobId,Client.Name AS Client,StartTime,JobFiles,JobBytes, JobMedia.StartFile as VolFile,VolumeName @@ -43,7 +36,7 @@ AND Level='F' AND JobStatus='T' AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId ORDER BY Job.StartTime DESC LIMIT 20; -# 5 +# 4 :List all backups for a Client after a specified time *Enter Client Name: *Enter time in YYYY-MM-DD HH:MM:SS format: @@ -55,7 +48,7 @@ AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId AND Job.StartTime >= '%2' ORDER BY Job.StartTime; -# 6 +# 5 :List all backups for a Client *Enter Client Name: SELECT DISTINCT Job.JobId as JobId,Client.Name as Client, @@ -67,23 +60,23 @@ AND JobStatus='T' AND Job.FileSetId=FileSet.FileSetId AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId ORDER BY Job.StartTime; -# 7 -:List Volume Attributes for a selected Volume: +# 6 +:List Volume Attributes for a selected Volume *Enter Volume name: SELECT Slot,MaxVolBytes,VolCapacityBytes,VolStatus,Recycle,VolRetention, VolUseDuration,MaxVolJobs,MaxVolFiles FROM Media WHERE VolumeName='%1'; -# 8 -:List Volumes used by selected JobId: +# 7 +:List Volumes used by selected JobId *Enter JobId: SELECT DISTINCT Job.JobId,VolumeName FROM Job,JobMedia,Media WHERE Job.JobId=%1 AND Job.JobId=JobMedia.JobId AND JobMedia.MediaId=Media.MediaId; -# 9 -:List Volumes to Restore All Files: +# 8 +:List Volumes to Restore All Files *Enter Client Name: !DROP TABLE temp; !DROP TABLE temp2; @@ -132,32 +125,32 @@ SELECT DISTINCT VolumeName from temp2; !DROP TABLE temp; !DROP TABLE temp2; -# 10 -:List Pool Attributes for a selected Pool: +# 9 +:List Pool Attributes for a selected Pool *Enter Pool name: SELECT Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes FROM Pool WHERE Name='%1'; -# 11 -:List total files/bytes by Job: +# 10 +:List total files/bytes by Job SELECT count(*) AS Jobs,sum(JobFiles) AS Files,sum(JobBytes) AS Bytes,Name AS Job FROM Job GROUP by Name; -# 12 -:List total files/bytes by Volume: +# 11 +:List total files/bytes by Volume SELECT count(*) AS Jobs,sum(JobFiles) AS Files,sum(JobBytes) AS Bytes,VolumeName FROM Job,JobMedia,Media WHERE JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId GROUP by VolumeName; -# 13 -:List Files for a selected JobId: +# 12 +:List Files for a selected JobId *Enter JobId: SELECT Path.Path,Filename.Name FROM File,Filename,Path WHERE File.JobId=%1 AND Filename.FilenameId=File.FilenameId AND Path.PathId=File.PathId ORDER BY Path.Path,Filename.Name; -# 14 -:List Jobs stored in a selected MediaId: +# 13 +:List Jobs stored in a selected MediaId *Enter MediaId: SELECT DISTINCT Job.JobId,Job.Name,Job.StartTime,Job.Type, Job.Level,Job.JobFiles,Job.JobBytes,Job.JobStatus @@ -165,8 +158,8 @@ WHERE JobMedia.JobId=Job.JobId AND JobMedia.MediaId=%1 ORDER by Job.StartTime; -# 15 -:List Jobs stored for a given Volume name: +# 14 +:List Jobs stored for a given Volume name *Enter Volume name: SELECT DISTINCT Job.JobId as JobId,Job.Name as Name,Job.StartTime as StartTime, Job.Type as Type,Job.Level as Level,Job.JobFiles as Files, @@ -176,8 +169,8 @@ AND Media.MediaId=JobMedia.MediaId AND JobMedia.JobId=Job.JobId ORDER by Job.StartTime; -# 16 -:List Volumes Bacula thinks are in changer: +# 15 +:List Volumes Bacula thinks are in changer SELECT MediaId,VolumeName,VolBytes/(1024*1024*1024) AS GB,Storage.Name AS Storage,Slot,Pool.Name AS Pool,MediaType,VolStatus FROM Media,Pool,Storage @@ -185,7 +178,7 @@ AND Slot>0 AND InChanger=1 AND Media.StorageId=Storage.StorageId ORDER BY MediaType ASC, Slot ASC; -# 17 +# 16 :List Volumes likely to need replacement from age or errors SELECT VolumeName AS Volume,VolMounts AS Mounts,VolErrors AS Errors, VolWrites AS Writes,VolStatus AS Status Index: jobq.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/jobq.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- jobq.c 19 Apr 2006 17:14:18 -0000 1.40 +++ jobq.c 26 May 2006 21:02:29 -0000 1.41 @@ -208,6 +208,16 @@ pthread_t id; wait_pkt *sched_pkt; + if (!jcr->term_wait_inited) { + /* Initialize termination condition variable */ + if ((stat = pthread_cond_init(&jcr->term_wait, NULL)) != 0) { + berrno be; + Jmsg1(jcr, M_FATAL, 0, _("Unable to init job cond variable: ERR=%s\n"), be.strerror(stat)); + return stat; + } + jcr->term_wait_inited = true; + } + Dmsg3(2300, "jobq_add jobid=%d jcr=0x%x use_count=%d\n", jcr->JobId, jcr, jcr->use_count()); if (jq->valid != JOBQ_VALID) { Jmsg0(jcr, M_ERROR, 0, "Jobq_add queue not initialized.\n"); @@ -466,7 +476,8 @@ jcr->JobStatus != JS_Canceled && jcr->job->RescheduleTimes > 0 && jcr->JobType == JT_BACKUP && - jcr->reschedule_count < jcr->job->RescheduleTimes) { + (jcr->job->RescheduleTimes == 0 || + jcr->reschedule_count < jcr->job->RescheduleTimes)) { char dt[50], dt2[50]; /* @@ -488,7 +499,6 @@ jcr->SDJobStatus = 0; if (jcr->JobBytes == 0) { Dmsg2(2300, "Requeue job=%d use=%d\n", jcr->JobId, jcr->use_count()); - set_jcr_job_status(jcr, JS_WaitStartTime); V(jq->mutex); jobq_add(jq, jcr); /* queue the job to run again */ P(jq->mutex); @@ -501,10 +511,11 @@ * the old JobId or there will be database record * conflicts. We now create a new job, copying the * appropriate fields. - */ + */ JCR *njcr = new_jcr(sizeof(JCR), dird_free_jcr); set_jcr_defaults(njcr, jcr->job); njcr->reschedule_count = jcr->reschedule_count; + njcr->sched_time = jcr->sched_time; njcr->JobLevel = jcr->JobLevel; njcr->JobStatus = -1; set_jcr_job_status(njcr, jcr->JobStatus); Index: restore.c =================================================================== RCS file: /cvsroot/bacula/bacula/src/dird/restore.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- restore.c 30 Jan 2006 14:24:17 -0000 1.59 +++ restore.c 26 May 2006 21:02:29 -0000 1.60 @@ -99,6 +99,9 @@ restore_cleanup(jcr, JS_ErrorTerminated); return false; } + if (!bnet_fsend(jcr->store_bsock, "run")) { + return false; + } /* * Now start a Storage daemon message thread */ @@ -108,9 +111,6 @@ } Dmsg0(50, "Storage daemon connection OK\n"); - if (!bnet_fsend(jcr->store_bsock, "run")) { - return false; - } /* * Start conversation with File daemon |