From 55e4c16a0919f8fa379c88583ee7c3456fff583c Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Sat, 24 Jul 2004 10:26:51 +0000 Subject: [PATCH] Restore JobIds in right order + Tru64 porting git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1488 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/autoconf/config.h.in | 3 + bacula/autoconf/configure.in | 33 +++++++++++ bacula/configure | 111 +++++++++++++++++++++++++++++++++++ bacula/kernstodo | 11 +++- bacula/src/baconfig.h | 6 ++ bacula/src/dird/dird.c | 4 +- bacula/src/dird/query.sql | 78 ++++++++++++------------ bacula/src/dird/sql_cmds.c | 2 +- bacula/src/filed/backup.c | 10 +++- bacula/src/lib/bsys.c | 7 ++- bacula/src/lib/btimers.c | 1 + bacula/src/lib/watchdog.c | 2 +- 12 files changed, 219 insertions(+), 49 deletions(-) diff --git a/bacula/autoconf/config.h.in b/bacula/autoconf/config.h.in index b022208675..eb39c8f7d8 100644 --- a/bacula/autoconf/config.h.in +++ b/bacula/autoconf/config.h.in @@ -443,6 +443,9 @@ `HAVE_STRUCT_STAT_ST_RDEV' instead. */ #undef HAVE_ST_RDEV +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_BITYPES_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_BYTEORDER_H diff --git a/bacula/autoconf/configure.in b/bacula/autoconf/configure.in index fff33f7ac1..b9b99087c9 100644 --- a/bacula/autoconf/configure.in +++ b/bacula/autoconf/configure.in @@ -972,6 +972,7 @@ AC_CHECK_HEADERS( \ string.h \ termios.h \ unistd.h \ + sys/bitypes.h \ sys/byteorder.h \ sys/ioctl.h \ sys/select.h \ @@ -1228,6 +1229,38 @@ if test -z "$have_u_intxx_t" ; then fi fi +if (test -z "$have_u_int64_t" || test -z "$have_int64_t" && \ + test "x$ac_cv_header_sys_bitypes_h" = "xyes") +then + AC_MSG_CHECKING([for int64_t and u_int64_t types in sys/bitypes.h]) + AC_TRY_COMPILE( + [ #include ], + [ int64_t a; u_int64_t b; + a = b = 1; ], + [ AC_DEFINE(HAVE_U_INT64_T) + AC_DEFINE(HAVE_INT64_T) + AC_MSG_RESULT(yes) ], + [ AC_MSG_RESULT(no)] + ) +fi + +if (test -z "$have_uintxx_t" && \ + test "x$ac_cv_header_sys_bitypes_h" = "xyes") +then + AC_MSG_CHECKING([for uintXX_t types in sys/bitypes.h]) + AC_TRY_COMPILE( + [ #include ], + [ uint8_t a; uint16_t b; + uint32_t c; a = b = c = 1; ], + [ AC_DEFINE(HAVE_UINTXX_T) + AC_MSG_RESULT(yes) ], + [ AC_MSG_RESULT(no)] + ) + +fi + + + dnl# -------------------------------------------------------------------------- dnl# CHECKING FOR REQUIRED LIBRARY FUNCTIONS diff --git a/bacula/configure b/bacula/configure index a355cebc11..836e187dd4 100755 --- a/bacula/configure +++ b/bacula/configure @@ -9136,6 +9136,7 @@ fi + for ac_header in \ @@ -9151,6 +9152,7 @@ for ac_header in \ string.h \ termios.h \ unistd.h \ + sys/bitypes.h \ sys/byteorder.h \ sys/ioctl.h \ sys/select.h \ @@ -15062,6 +15064,115 @@ _ACEOF fi fi +if (test -z "$have_u_int64_t" || test -z "$have_int64_t" && \ + test "x$ac_cv_header_sys_bitypes_h" = "xyes") +then + echo "$as_me:$LINENO: checking for int64_t and u_int64_t types in sys/bitypes.h" >&5 +echo $ECHO_N "checking for int64_t and u_int64_t types in sys/bitypes.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + #include +int +main () +{ + int64_t a; u_int64_t b; + a = b = 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_U_INT64_T 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define HAVE_INT64_T 1 +_ACEOF + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi + +if (test -z "$have_uintxx_t" && \ + test "x$ac_cv_header_sys_bitypes_h" = "xyes") +then + echo "$as_me:$LINENO: checking for uintXX_t types in sys/bitypes.h" >&5 +echo $ECHO_N "checking for uintXX_t types in sys/bitypes.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + #include +int +main () +{ + uint8_t a; uint16_t b; + uint32_t c; a = b = c = 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_UINTXX_T 1 +_ACEOF + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi + + + diff --git a/bacula/kernstodo b/bacula/kernstodo index e949a44cbc..50cc64f0a4 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -4,12 +4,12 @@ 1.35 Items to do: - Do tape alerts -- see tapealert.txt - Fix errno handling in win32 compat routines. +- Add better error codes to run_program (10000+) - Revisit and revise Disaster Recovery (fix SCSI and RAID disk detection) - Document a get out of jail procedure if everything breaks if you lost/broke the Catalog -- do the same for "I know my file is there how do I get it back?". -- Add better error codes to run_program (10000+) - When passwords do not match, print message that points the user to the doc. - Make Verify jobs require exclusive use of Volume as Restore @@ -23,6 +23,8 @@ devices by a single job. - bscan does not put first of two volumes back with all info in bscan-test. +- Fix restore ++++ that get intermingled with "Building directory tree" +- Solve the termcap.h problem on Solaris configure. Documentation to do: (any release a little bit at a time) - Document query file format. @@ -1105,3 +1107,10 @@ Block Position: 0 - Fix GROUP BYs in all SQL (done by Dan -- thanks) - Make entering multiple Storage names in Dir illegal. - Make btape release the drive during the "test" append. +- Fix restore: + You have selected the following JobIds: 739,856,797 + Building directory tree for JobId 739 ... + Building directory tree for JobId 856 ... + Building directory tree for JobId 797 ...3 + Jobs inserted into the tree. + diff --git a/bacula/src/baconfig.h b/bacula/src/baconfig.h index 31441a8576..455e498bbb 100644 --- a/bacula/src/baconfig.h +++ b/bacula/src/baconfig.h @@ -483,6 +483,12 @@ extern "C" int getdomainname(char *name, int len); #ifdef HAVE_AIX_OS #endif + +#ifdef HAVE_OSF1_OS +#undef HAVE_CHFLAGS /* chflags is incorrectly detected */ +extern "C" int fchdir(int filedes); +extern "C" long gethostid(void); +#endif /* This probably should be done on a machine by machine basic, but it works */ #define ALIGN_SIZE (sizeof(double)) diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index 38a6678a6e..a7afb0f5bf 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -318,7 +318,7 @@ static void free_saved_resources(int table) */ static void reload_job_end_cb(JCR *jcr, void *ctx) { - int reload_id = (int)ctx; + int reload_id = (int)((long int)ctx); Dmsg3(100, "reload job_end JobId=%d table=%d cnt=%d\n", jcr->JobId, reload_id, reload_table[reload_id].job_count); lock_jcr_chain(); @@ -419,7 +419,7 @@ void reload_config(int sig) foreach_jcr(jcr) { if (jcr->JobType != JT_SYSTEM) { reload_table[table].job_count++; - job_end_push(jcr, reload_job_end_cb, (void *)table); + job_end_push(jcr, reload_job_end_cb, (void *)((long int)table)); njobs++; } free_locked_jcr(jcr); diff --git a/bacula/src/dird/query.sql b/bacula/src/dird/query.sql index 9df7ec16cf..29787b9c40 100644 --- a/bacula/src/dird/query.sql +++ b/bacula/src/dird/query.sql @@ -1,14 +1,15 @@ :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; +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 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 + Path.Path,Filename.Name,StartTime,Level,JobFiles,JobBytes FROM Client,Job,File,Filename,Path WHERE Client.ClientId=Job.ClientId AND JobStatus='T' AND Job.JobId=File.JobId AND Path.PathId=File.PathId AND Filename.FilenameId=File.FilenameId @@ -35,7 +36,7 @@ SELECT DISTINCT Job.JobId,StartTime AS JobStartTime,VolumeName,Client.Name AS Cl :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 + JobMedia.StartFile as VolFile,VolumeName FROM Client,Job,JobMedia,Media WHERE Client.Name='%1' AND Client.ClientId=Job.ClientId @@ -47,28 +48,28 @@ JobMedia.StartFile as VolFile,VolumeName *Enter Client Name: *Enter time in YYYY-MM-DD HH:MM:SS format: SELECT DISTINCT Job.JobId,Client.Name as Client,Level,StartTime,JobFiles,JobBytes,VolumeName - FROM Client,Job,JobMedia,Media - WHERE Client.Name='%1' - AND Client.ClientId=Job.ClientId - AND JobStatus='T' - AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId - AND Job.StartTime >= '%2' - ORDER BY Job.StartTime; + FROM Client,Job,JobMedia,Media + WHERE Client.Name='%1' + AND Client.ClientId=Job.ClientId + AND JobStatus='T' + AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId + AND Job.StartTime >= '%2' + ORDER BY Job.StartTime; # 6 :List all backups for a Client *Enter Client Name: SELECT DISTINCT Job.JobId,Client.Name as Client,Level,StartTime,JobFiles,JobBytes,VolumeName - FROM Client,Job,JobMedia,Media - WHERE Client.Name='%1' - AND Client.ClientId=Job.ClientId - AND JobStatus='T' - AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId - ORDER BY Job.StartTime; + FROM Client,Job,JobMedia,Media + WHERE Client.Name='%1' + AND Client.ClientId=Job.ClientId + AND JobStatus='T' + AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId + ORDER BY Job.StartTime; # 7 :List Volume Attributes for a selected Volume: *Enter Volume name: SELECT Slot,MaxVolBytes,VolCapacityBytes,VolStatus,Recycle,VolRetention, - VolUseDuration,MaxVolJobs,MaxVolFiles + VolUseDuration,MaxVolJobs,MaxVolFiles FROM Media WHERE VolumeName='%1'; # 8 @@ -102,7 +103,7 @@ CREATE TABLE temp2 (JobId BIGINT NOT NULL, VolSessionTime BIGINT); # Select last Full save INSERT INTO temp SELECT Job.JobId,JobTDate,Job.ClientId,Job.Level, - StartTime,VolumeName,JobMedia.StartFile,VolSessionId,VolSessionTime + StartTime,VolumeName,JobMedia.StartFile,VolSessionId,VolSessionTime FROM Client,Job,JobMedia,Media WHERE Client.Name='%1' AND Client.ClientId=Job.ClientId AND Level='F' AND JobStatus='T' @@ -111,14 +112,14 @@ INSERT INTO temp SELECT Job.JobId,JobTDate,Job.ClientId,Job.Level, ORDER BY Job.JobTDate DESC LIMIT 1; # Copy into temp 2 getting all volumes of Full save INSERT INTO temp2 SELECT Job.JobId,Job.StartTime,Media.VolumeName,Job.Level, - JobMedia.StartFile,Job.VolSessionId,Job.VolSessionTime + JobMedia.StartFile,Job.VolSessionId,Job.VolSessionTime FROM temp,Job,JobMedia,Media WHERE temp.JobId=Job.JobId AND Job.Level='F' AND Job.JobStatus='T' AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId; # Now add subsequent incrementals INSERT INTO temp2 SELECT DISTINCT Job.JobId,Job.StartTime,Media.VolumeName, - Job.Level,JobMedia.StartFile,Job.VolSessionId,Job.VolSessionTime + Job.Level,JobMedia.StartFile,Job.VolSessionId,Job.VolSessionTime FROM Job,temp,JobMedia,Media WHERE Job.JobTDate>temp.JobTDate AND Job.ClientId=temp.ClientId @@ -137,13 +138,11 @@ SELECT Recycle,VolRetention,VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes WHERE Name='%1'; # 11 :List total files/bytes by Job: -SELECT count(*) AS Jobs, sum(JobFiles) AS Files, - sum(JobBytes) AS Bytes, Name AS 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: -SELECT count(*) AS Jobs, sum(JobFiles) AS Files, - sum(JobBytes) AS Bytes, VolumeName +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 @@ -151,8 +150,7 @@ SELECT count(*) AS Jobs, sum(JobFiles) AS Files, # 13 :List Files for a selected JobId: *Enter JobId: -SELECT Path.Path,Filename.Name FROM File, - Filename,Path WHERE File.JobId=%1 +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; @@ -160,19 +158,19 @@ SELECT Path.Path,Filename.Name FROM File, :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 - FROM JobMedia,Job - WHERE JobMedia.JobId=Job.JobId - AND JobMedia.MediaId=%1 - ORDER by Job.StartTime; + Job.Level,Job.JobFiles,Job.JobBytes,Job.JobStatus + FROM JobMedia,Job + WHERE JobMedia.JobId=Job.JobId + AND JobMedia.MediaId=%1 + ORDER by Job.StartTime; # 15 :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, Job.JobBytes as Bytes,Job.JobStatus as Status - FROM Media,JobMedia,Job - WHERE Media.VolumeName='%1' - AND Media.MediaId=JobMedia.MediaId - AND JobMedia.JobId=Job.JobId - ORDER by Job.StartTime; + FROM Media,JobMedia,Job + WHERE Media.VolumeName='%1' + AND Media.MediaId=JobMedia.MediaId + AND JobMedia.JobId=Job.JobId + ORDER by Job.StartTime; diff --git a/bacula/src/dird/sql_cmds.c b/bacula/src/dird/sql_cmds.c index 26afbc4e9f..fa983d374e 100644 --- a/bacula/src/dird/sql_cmds.c +++ b/bacula/src/dird/sql_cmds.c @@ -284,7 +284,7 @@ const char *uar_list_temp = "ORDER BY StartTime ASC"; -const char *uar_sel_jobid_temp = "SELECT JobId FROM temp"; +const char *uar_sel_jobid_temp = "SELECT JobId FROM temp ORDER BY StartTime ASC"; const char *uar_sel_all_temp1 = "SELECT * FROM temp1"; diff --git a/bacula/src/filed/backup.c b/bacula/src/filed/backup.c index 8680c9ea64..aa9d4a1916 100644 --- a/bacula/src/filed/backup.c +++ b/bacula/src/filed/backup.c @@ -239,10 +239,16 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr) Jmsg(jcr, M_NOTSAVED, -1, _(" Cannot open %s: ERR=%s.\n"), ff_pkt->fname, berror(&ff_pkt->bfd)); jcr->Errors++; - stop_thread_timer(tid); + if (tid) { + stop_thread_timer(tid); + tid = NULL; + } return 1; } - stop_thread_timer(tid); + if (tid) { + stop_thread_timer(tid); + tid = NULL; + } } Dmsg1(130, "bfiled: sending %s to stored\n", ff_pkt->fname); diff --git a/bacula/src/lib/bsys.c b/bacula/src/lib/bsys.c index a375d728ac..bb36376c16 100644 --- a/bacula/src/lib/bsys.c +++ b/bacula/src/lib/bsys.c @@ -509,11 +509,14 @@ int bmicrosleep(time_t sec, long usec) timeout.tv_sec++; } - Dmsg1(200, "pthread_cond_timedwait sec=%d\n", timeout.tv_sec); + Dmsg2(200, "pthread_cond_timedwait sec=%d usec=%d\n", sec, usec); /* Note, this unlocks mutex during the sleep */ P(timer_mutex); stat = pthread_cond_timedwait(&timer, &timer_mutex, &timeout); - Dmsg1(200, "pthread_cond_timedwait stat=%d\n", stat); + if (stat != 0) { + Dmsg2(200, "pthread_cond_timedwait stat=%d ERR=%s\n", stat, + strerror(stat)); + } V(timer_mutex); return stat; } diff --git a/bacula/src/lib/btimers.c b/bacula/src/lib/btimers.c index d3de55373e..d9acb56996 100644 --- a/bacula/src/lib/btimers.c +++ b/bacula/src/lib/btimers.c @@ -127,6 +127,7 @@ btimer_t *start_thread_timer(pthread_t tid, uint32_t wait) btimer_t *wid; wid = btimer_start_common(wait); if (wid == NULL) { + Dmsg1(200, "start_thread_timer return NULL from common. wait=%d.\n", wait); return NULL; } wid->type = TYPE_PTHREAD; diff --git a/bacula/src/lib/watchdog.c b/bacula/src/lib/watchdog.c index fb03a8b375..916a0748d3 100755 --- a/bacula/src/lib/watchdog.c +++ b/bacula/src/lib/watchdog.c @@ -32,7 +32,7 @@ /* Exported globals */ time_t watchdog_time = 0; /* this has granularity of SLEEP_TIME */ -time_t watchdog_sleep_time = 1; /* examine things every second */ +time_t watchdog_sleep_time = 10; /* examine things every 10 seconds */ /* Forward referenced functions */ -- 2.39.5