]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Fix editing of retention time difference to use 64 bit
authorKern Sibbald <kern@sibbald.com>
Fri, 24 Oct 2008 13:04:16 +0000 (13:04 +0000)
committerKern Sibbald <kern@sibbald.com>
Fri, 24 Oct 2008 13:04:16 +0000 (13:04 +0000)
     int instead of 64 bit unsigned. This should permit very
     long retention periods.
kes  Implement code to prohibit a write job from appending to  a
     Volume that will be used for a read operation.  This is
     new code and could possibly cause some conflicts.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@7892 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/dird/fd_cmds.c
bacula/src/dird/job.c
bacula/src/dird/ua_prune.c
bacula/src/stored/askdir.c
bacula/src/stored/dev.h
bacula/src/stored/vol_mgr.c
bacula/src/version.h
bacula/technotes-2.5

index 99b123b38fe6bfcb86873f46b3aedf64b02de3c5..5badf778bf660770008d0533b7bbc00c9e552295 100644 (file)
@@ -164,7 +164,7 @@ void get_level_since_time(JCR *jcr, char *since, int since_len)
    bool have_full;
    bool do_full = false;
    bool do_diff = false;
-   time_t now;
+   utime_t now;
    utime_t last_full_time;
    utime_t last_diff_time;
 
@@ -189,7 +189,7 @@ void get_level_since_time(JCR *jcr, char *since, int since_len)
    case L_INCREMENTAL:
       POOLMEM *stime = get_pool_memory(PM_MESSAGE);
       /* Look up start time of last Full job */
-      now = time(NULL);
+      now = (utime_t)time(NULL);
       jcr->jr.JobId = 0;     /* flag to return since time */
       have_full = db_find_job_start_time(jcr, jcr->db, &jcr->jr, &jcr->stime);
       /* If there was a successful job, make sure it is recent enough */
index 5529ee6f846247df5e05ffbaa8108ac49dec6e2f..adaf765a101735cf210d19ef76363587b5e3ca12 100644 (file)
@@ -662,7 +662,7 @@ bool allow_duplicate_job(JCR *jcr)
          if (strcmp(job->name(), djcr->job->name()) == 0) {
             bool cancel_queued = false;
             if (job->DuplicateJobProximity > 0) {
-               time_t now = time(NULL);
+               utime_t now = (utime_t)time(NULL);
                if ((now - djcr->start_time) > job->DuplicateJobProximity) {
                   continue;               /* not really a duplicate */
                }
index 102ec3e35af9d25c76172ede5bdb864def28ed09..2621d3f7ea3272a9c2c491fc56468c56eb455b2e 100644 (file)
@@ -195,7 +195,7 @@ int prune_stats(UAContext *ua, utime_t retention)
 
    db_lock(ua->db);
    Mmsg(query, "DELETE FROM JobHistory WHERE JobTDate < %s", 
-        edit_uint64(now - retention, ed1));
+        edit_int64(now - retention, ed1));
    db_sql_query(ua->db, query.c_str(), NULL, NULL);
    db_unlock(ua->db);
 
@@ -237,7 +237,7 @@ int prune_files(UAContext *ua, CLIENT *client)
    now = (utime_t)time(NULL);
 
    /* Select Jobs -- for counting */
-   Mmsg(query, count_select_job, edit_uint64(now - period, ed1), 
+   Mmsg(query, count_select_job, edit_int64(now - period, ed1), 
         edit_int64(cr.ClientId, ed2));
    Dmsg3(050, "select now=%u period=%u sql=%s\n", (uint32_t)now, 
                (uint32_t)period, query.c_str());
@@ -265,7 +265,7 @@ int prune_files(UAContext *ua, CLIENT *client)
    del.JobId = (JobId_t *)malloc(sizeof(JobId_t) * del.max_ids);
 
    /* Now process same set but making a delete list */
-   Mmsg(query, select_job, edit_uint64(now - period, ed1), 
+   Mmsg(query, select_job, edit_int64(now - period, ed1), 
         edit_int64(cr.ClientId, ed2));
    db_sql_query(ua->db, query.c_str(), file_delete_handler, (void *)&del);
 
@@ -355,7 +355,7 @@ int prune_jobs(UAContext *ua, CLIENT *client, int JobType)
     * Select all files that are older than the JobRetention period
     *  and stuff them into the "DeletionCandidates" table.
     */
-   edit_uint64(now - period, ed1);
+   edit_int64(now - period, ed1);
    Mmsg(query, insert_delcand, (char)JobType, ed1, 
         edit_int64(cr.ClientId, ed2));
    if (!db_sql_query(ua->db, query.c_str(), NULL, (void *)NULL)) {
@@ -483,10 +483,10 @@ int get_prune_list_for_volume(UAContext *ua, MEDIA_DBR *mr, del_ctx *del)
    edit_int64(mr->MediaId, ed1); 
    period = mr->VolRetention;
    now = (utime_t)time(NULL);
-   edit_uint64(now-period, ed2);
+   edit_int64(now-period, ed2);
    Mmsg(query, sel_JobMedia, ed1, ed2);
-   Dmsg3(250, "Now=%d period=%d now-period=%d\n", (int)now, (int)period,
-      (int)(now-period));
+   Dmsg3(250, "Now=%d period=%d now-period=%s\n", (int)now, (int)period,
+      ed2);
 
    Dmsg1(050, "Query=%s\n", query.c_str());
    if (!db_sql_query(ua->db, query.c_str(), file_delete_handler, (void *)del)) {
index 4d33c255ae8c2bc074d29f8d1256dc62ef9ecca5..276a5020cfe818a4ae64f4fe2614574e673b492e 100644 (file)
@@ -281,7 +281,7 @@ bool dir_find_next_appendable_volume(DCR *dcr)
              break;
           }
           bstrncpy(lastVolume, dcr->VolumeName, sizeof(lastVolume));
-          if (dcr->can_i_use_volume()) {
+          if (dcr->can_i_write_volume()) {
              Dmsg1(100, "Call reserve_volume. Vol=%s\n", dcr->VolumeName);
              if (reserve_volume(dcr, dcr->VolumeName) == NULL) {
                 Dmsg2(100, "Could not reserve volume %s on %s\n", dcr->VolumeName,
index 57adacce32f116b08f5e0f001721a800c79c736d..8c044f000320668a32f018b0c9104d5c35945eb7 100644 (file)
@@ -538,7 +538,10 @@ public:
    void clear_reserved();
    void set_reserved();
    void unreserve_device();
+
+   /* Methods in vol_mgr.c */
    bool can_i_use_volume();
+   bool can_i_write_volume();
 
    /* Methods in mount.c */
    bool mount_next_write_volume();
index f48dddb58fc5af492e70568812d210114397dc83..a3c7dc15b0fa230adffed7de1e3d6f50c20db006 100644 (file)
@@ -498,6 +498,10 @@ void switch_device(DCR *dcr, DEVICE *dev)
 VOLRES *find_volume(const char *VolumeName) 
 {
    VOLRES vol, *fvol;
+
+   if (vol_list->empty()) {
+      return NULL;
+   }
    /* Do not lock reservations here */
    lock_volumes();
    vol.vol_name = bstrdup(VolumeName);
@@ -509,6 +513,31 @@ VOLRES *find_volume(const char *VolumeName)
    return fvol;
 }
 
+/*
+ * Search for a Volume name in the read Volume list.
+ *
+ *  Returns: VOLRES entry on success
+ *           NULL if the Volume is not in the list
+ */
+static VOLRES *find_read_volume(const char *VolumeName) 
+{
+   VOLRES vol, *fvol;
+
+   if (read_vol_list->empty()) {
+      return NULL;
+   }
+   /* Do not lock reservations here */
+   lock_read_volumes();
+   vol.vol_name = bstrdup(VolumeName);
+   /* Note, we do want a simple my_compare on volume name only here */
+   fvol = (VOLRES *)read_vol_list->binary_search(&vol, my_compare);
+   free(vol.vol_name);
+   Dmsg2(dbglvl, "find_read_vol=%s found=%d\n", VolumeName, fvol!=NULL);
+   unlock_read_volumes();
+   return fvol;
+}
+
+
 /*  
  * Free a Volume from the Volume list if it is no longer used
  *   Note, for tape drives we want to remember where the Volume
@@ -643,6 +672,26 @@ void free_volume_lists()
    }
 }
 
+/* 
+ * Determine if caller can write on volume
+ */
+bool DCR::can_i_write_volume()
+{
+   VOLRES *vol;
+
+   lock_read_volumes();
+   vol = find_read_volume(VolumeName);
+   unlock_read_volumes();
+   if (vol) {
+      Dmsg1(100, "Found in read list; cannot write vol=%s\n", VolumeName);
+      return false;
+   }
+   return can_i_use_volume();
+}
+
+/*
+ * Determine if caller can read or write volume
+ */
 bool DCR::can_i_use_volume()
 {
    bool rtn = true;
index a3ff69825b93709bc72c529f8f570a5eeebcf22e..6bd9d09bf4dbe0d6b8393398ec5bc1b45a92d147 100644 (file)
@@ -4,8 +4,8 @@
 
 #undef  VERSION
 #define VERSION "2.5.17"
-#define BDATE   "23 October 2008"
-#define LSMDATE "23Oct08"
+#define BDATE   "24 October 2008"
+#define LSMDATE "24Oct08"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2008 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2008"       /* year for copyright messages in progs */
index 7c92cbce7c9ad06c947739f222cc7d14190b13ab..bb10defe89d89e139c2dc426a81387bd7ba76c61 100644 (file)
@@ -11,45 +11,20 @@ dbi database driver
 --with-db-port
 enhancement to wait command: wait mount  ...
 parse config
-
 dbport in dbcheck
 dbdriver
 filepattern (restore with regex in bsr)
 libtool
-
 remove reader/writer in FOPTS????
 
-==================   Warning !!!!!! ==========================
-This BETA release of Bacula 2.5.x development code uses libtool
-to generate the Bacula libraries as shared objects rather than
-being directly linked in as in prior versions.  This means that
-the Bacula shared objects, must either be in a shared object 
-directory known to the loader or they must be in the directory
-that may be specified on the ./configure line using the
---libdir option as:
-
-  ./configure --libdir=/full-path/dir
-
-the default /usr/lib. If --libdir is specified, there should be
-no need to modify your loader configuration provided that
-the shared objects are installed in that directory (Bacula
-does this with the make install command). The shared objects 
-that Bacula references are:
-
-libbaccfg.so
-libbacfind.so
-libbacpy.so
-libbac.so
-
-If you have problems with libtool or you wish to use the old 
-way of building static libraries, you can do so by disabling 
-libtool on the configure command line with:
-
-  ./configure --disable-libtool
-==============================================================
-
-
 General:
+24Oct08
+kes  Fix editing of retention time difference to use 64 bit
+     int instead of 64 bit unsigned. This should permit very
+     long retention periods.
+kes  Implement code to prohibit a write job from appending to  a 
+     Volume that will be used for a read operation.  This is
+     new code and could possibly cause some conflicts.
 23Oct08
 kes  Integrate James Harper's Exchange Win32 plugin patch.
 kes  Apply patch from Marco van Wieringen that implements the new