]> git.sur5r.net Git - bacula/bacula/commitdiff
Modify find_next_volume_for_append() to not send the same volume twice
authorEric Bollengier <eric@baculasystems.com>
Thu, 17 Sep 2015 17:07:35 +0000 (19:07 +0200)
committerKern Sibbald <kern@sibbald.com>
Sun, 20 Dec 2015 11:45:13 +0000 (12:45 +0100)
bacula/src/cats/cats.h
bacula/src/cats/sql_find.c
bacula/src/dird/job.c
bacula/src/dird/next_vol.c
bacula/src/jcr.h

index e21a838e42f124453080bdcc2bf5827b9a5132bb..2908f152f572619d050f5354b37fa6147c96e7f3 100644 (file)
@@ -370,6 +370,7 @@ public:
    char    cLastWritten[MAX_TIME_LENGTH];  /* LastWritten returned from DB */
    char    cLabelDate[MAX_TIME_LENGTH];    /* LabelData returned from DB */
    char    cInitialWrite[MAX_TIME_LENGTH]; /* InitialWrite returned from DB */
+   char   *exclude_list;                   /* Optionnal exclude list for db_find_next_volume() */
    bool    set_first_written;
    bool    set_label_date;
 };
index 1c41c9cc041527f26c11a6b43c674787c7cd0c4c..16c8c3e77016c70fa47a27d1a75d9ab239f2a5a1 100644 (file)
@@ -343,11 +343,19 @@ int BDB::bdb_find_next_volume(JCR *jcr, int item, bool InChanger, MEDIA_DBR *mr)
    } else {
       POOL_MEM changer(PM_FNAME);
       POOL_MEM voltype(PM_FNAME);
+      POOL_MEM exclude(PM_FNAME);
       /* Find next available volume */
       if (InChanger) {
          Mmsg(changer, " AND InChanger=1 AND StorageId=%s ",
                  edit_int64(mr->StorageId, ed1));
       }
+      /* Volumes will be automatically excluded from the query, we just take the
+       * first one of the list 
+       */
+      if (mr->exclude_list && *mr->exclude_list) {
+         item = 1;
+         Mmsg(exclude, " AND MediaId NOT IN (%s) ", mr->exclude_list);
+      }
       if (strcmp(mr->VolStatus, "Recycle") == 0 ||
           strcmp(mr->VolStatus, "Purged") == 0) {
          order = "AND Recycle=1 ORDER BY LastWritten ASC,MediaId";  /* take oldest that can be recycled */
@@ -365,11 +373,12 @@ int BDB::bdb_find_next_volume(JCR *jcr, int item, bool InChanger, MEDIA_DBR *mr)
          "AND VolStatus='%s' "
          "%s "
          "%s "
+         "%s "
          "%s LIMIT %d",
          edit_int64(mr->PoolId, ed1), esc_type,
          esc_status,
          voltype.c_str(),
-         changer.c_str(), order, item);
+         changer.c_str(), exclude.c_str(), order, item);
    }
    Dmsg1(100, "fnextvol=%s\n", cmd);
    if (!QueryDB(jcr, cmd)) {
index 75840f601c4c0405537cfbe7c4b7ff02363f2dbd..d45f55ceca5be0f0e1a26607306e980a2b8dd180 100644 (file)
@@ -1433,6 +1433,7 @@ void dird_free_jcr(JCR *jcr)
    free_and_null_pool_memory(jcr->rpool_source);
    free_and_null_pool_memory(jcr->wstore_source);
    free_and_null_pool_memory(jcr->rstore_source);
+   free_and_null_pool_memory(jcr->next_vol_list);
 
    /* Delete lists setup to hold storage pointers */
    free_rwstorage(jcr);
@@ -1495,7 +1496,9 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
       jcr->setJobLevel(job->JobLevel);
       break;
    }
-
+   if (!jcr->next_vol_list) {
+      jcr->next_vol_list = get_pool_memory(PM_FNAME);
+   }
    if (!jcr->fname) {
       jcr->fname = get_pool_memory(PM_FNAME);
    }
index 54fa108eb12874c5f32fa1f2ab985a8ff465988b..522e3234c1f508b0289f83430575fe142be8805a 100644 (file)
@@ -47,6 +47,29 @@ void set_storageid_in_mr(STORE *store, MEDIA_DBR *mr)
    mr->StorageId = store->StorageId;
 }
 
+static void add_volume_to_exclude_list(JCR *jcr, int index, MEDIA_DBR *mr)
+{
+   char ed1[50];
+   if (index == 1) {
+      *jcr->next_vol_list = 0;
+
+   } else if (*jcr->next_vol_list) {
+      pm_strcat(jcr->next_vol_list, ",");
+   }
+   pm_strcat(jcr->next_vol_list, edit_int64(mr->MediaId, ed1));
+
+   /* The list is valid only in find_next_volume_for_append() */
+   mr->exclude_list = NULL;
+}
+
+static void set_volume_to_exclude_list(JCR *jcr, int index, MEDIA_DBR *mr)
+{
+   if (index == 1) {
+      *jcr->next_vol_list = 0;
+   }
+   mr->exclude_list = jcr->next_vol_list;
+}
+
 /*
  *  Items needed:
  *   mr.PoolId must be set
@@ -75,6 +98,9 @@ int find_next_volume_for_append(JCR *jcr, MEDIA_DBR *mr, int index,
     */
    InChanger = (store->autochanger)? true : false;
 
+   /* Make sure we don't send two times the same volume in the same session */
+   set_volume_to_exclude_list(jcr, index, mr);
+
    /*
     * Find the Next Volume for Append
     */
@@ -197,6 +223,11 @@ int find_next_volume_for_append(JCR *jcr, MEDIA_DBR *mr, int index,
    } /* end for loop */
    db_unlock(jcr->db);
    Dmsg1(dbglvl, "return ok=%d find_next_vol\n", ok);
+
+   /* We keep the record of all previous volumes requested */
+   if (ok) {
+      add_volume_to_exclude_list(jcr, index, mr);;
+   }
    return ok;
 }
 
index e9fc3715b07f3ca24d0c053238ed8686248532e8..154b62cbc4a315026562398821d1f0a9e335697b 100644 (file)
@@ -366,6 +366,7 @@ public:
    POOLMEM *rstore_source;            /* Where read storage came from */
    POOLMEM *wstore_source;            /* Where write storage came from */
    POOLMEM *catalog_source;           /* Where catalog came from */
+   POOLMEM *next_vol_list;            /* Volumes previously requested */
    uint32_t replace;                  /* Replace option */
    int32_t NumVols;                   /* Number of Volume used in pool */
    int32_t reschedule_count;          /* Number of times rescheduled */