]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/autoprune.c
Big backport from Enterprise
[bacula/bacula] / bacula / src / dird / autoprune.c
index 73f0d24fd46367f168bf6a379e2c68fadf34fdf9..621cca820198bf4817b538f39d8c5f2ab8b3ba2a 100644 (file)
@@ -1,38 +1,26 @@
 /*
-   Bacula® - The Network Backup Solution
-
-   Copyright (C) 2002-2008 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.
-   This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
-   License as published by the Free Software Foundation and included
-   in the file LICENSE.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301, USA.
-
-   Bacula® is a registered trademark of Kern Sibbald.
-   The licensor of Bacula is the Free Software Foundation Europe
-   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
-   Switzerland, email:ftf@fsfeurope.org.
+   Bacula(R) - The Network Backup Solution
+
+   Copyright (C) 2000-2017 Kern Sibbald
+
+   The original author of Bacula is Kern Sibbald, with contributions
+   from many others, a complete list can be found in the file AUTHORS.
+
+   You may use this file and others of this release according to the
+   license defined in the LICENSE file, which includes the Affero General
+   Public License, v3.0 ("AGPLv3") and some additional permissions and
+   terms pursuant to its AGPLv3 Section 7.
+
+   This notice must be preserved when any source code is 
+   conveyed and/or propagated.
+
+   Bacula(R) is a registered trademark of Kern Sibbald.
 */
 /*
- *
  *   Bacula Director -- Automatic Pruning
  *      Applies retention periods
  *
  *     Kern Sibbald, May MMII
- *
- *   Version $Id$
  */
 
 #include "bacula.h"
@@ -85,15 +73,17 @@ void do_autoprune(JCR *jcr)
  *   volume and no appendable volumes are available.
  *
  */
-void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr) 
+void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr,
+        STORE *store)
 {
    int count;
    int i;
    dbid_list ids;
    struct del_ctx prune_list;
-   POOL_MEM query(PM_MESSAGE);
+   POOL_MEM query(PM_MESSAGE), changer(PM_MESSAGE);
    UAContext *ua;
    char ed1[50], ed2[100], ed3[50];
+
    POOL_DBR spr;
 
    Dmsg1(100, "Prune volumes PoolId=%d\n", jcr->jr.PoolId);
@@ -123,7 +113,7 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr)
       ed2[0] = 0;
    }
 
-   if(mr->ScratchPoolId) {
+   if (mr->ScratchPoolId) {
       edit_int64(mr->ScratchPoolId, ed3);
       bstrncat(ed2, ed3, sizeof(ed2));
       bstrncat(ed2, ",", sizeof(ed2));
@@ -132,7 +122,7 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr)
    Dmsg1(100, "Scratch pool(s)=%s\n", ed2);
    /*
     * ed2 ends up with scratch poolid and current poolid or
-    *   just current poolid if there is no scratch pool 
+    *   just current poolid if there is no scratch pool
     */
    bstrncat(ed2, ed1, sizeof(ed2));
 
@@ -144,16 +134,13 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr)
         "(PoolId=%s OR RecyclePoolId IN (%s)) AND MediaType='%s' %s"
         "ORDER BY LastWritten ASC,MediaId";
 
+   set_storageid_in_mr(store, mr);
    if (InChanger) {
-      char changer[100];
-      /* Ensure it is in this autochanger */
-      bsnprintf(changer, sizeof(changer), "AND InChanger=1 AND StorageId=%s ",
-         edit_int64(mr->StorageId, ed3));
-      Mmsg(query, select, ed1, ed2, mr->MediaType, changer);
-   } else {
-      Mmsg(query, select, ed1, ed2, mr->MediaType, "");
+      Mmsg(changer, "AND InChanger=1 AND StorageId IN (%s) ", mr->sid_group);
    }
 
+   Mmsg(query, select, ed1, ed2, mr->MediaType, changer.c_str());
+
    Dmsg1(100, "query=%s\n", query.c_str());
    if (!db_get_query_dbids(ua->jcr, ua->db, query, ids)) {
       Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
@@ -165,9 +152,8 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr)
    /* Visit each Volume and Prune it until we find one that is purged */
    for (i=0; i<ids.num_ids; i++) {
       MEDIA_DBR lmr;
-      memset(&lmr, 0, sizeof(lmr));
       lmr.MediaId = ids.DBId[i];
-      Dmsg1(100, "Get record MediaId=%d\n", (int)lmr.MediaId);
+      Dmsg1(100, "Get record MediaId=%lu\n", lmr.MediaId);
       if (!db_get_media_record(jcr, jcr->db, &lmr)) {
          Jmsg(jcr, M_ERROR, 0, "%s", db_strerror(jcr->db));
          continue;
@@ -181,7 +167,7 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr)
       /* Prune only Volumes with status "Full", or "Used" */
       if (strcmp(lmr.VolStatus, "Full")   == 0 ||
           strcmp(lmr.VolStatus, "Used")   == 0) {
-         Dmsg2(100, "Add prune list MediaId=%d Volume %s\n", (int)lmr.MediaId, lmr.VolumeName);
+         Dmsg2(100, "Add prune list MediaId=%lu Volume %s\n", lmr.MediaId, lmr.VolumeName);
          count = get_prune_list_for_volume(ua, &lmr, &prune_list);
          Dmsg1(100, "Num pruned = %d\n", count);
          if (count != 0) {
@@ -189,10 +175,10 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr)
             prune_list.num_ids = 0;             /* reset count */
          }
          if (!is_volume_purged(ua, &lmr)) {
-            Dmsg1(050, "Vol=%s not pruned\n", lmr.VolumeName);
+            Dmsg1(100, "Vol=%s not pruned\n", lmr.VolumeName);
             continue;
          }
-         Dmsg1(050, "Vol=%s is purged\n", lmr.VolumeName);
+         Dmsg1(100, "Vol=%s is purged\n", lmr.VolumeName);
 
          /*
           * Since we are also pruning the Scratch pool, continue
@@ -200,11 +186,13 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr)
           * If not, just skip this volume and try the next one
           */
          if (InChanger) {
+            /* ***FIXME*** should be any StorageId in sid_group */
             if (!lmr.InChanger || (lmr.StorageId != mr->StorageId)) {
-               Dmsg1(100, "Vol=%s not inchanger or correct StoreId\n", lmr.VolumeName);
+               Dmsg1(100, "Vol=%s not inchanger\n", lmr.VolumeName);
                continue;                  /* skip this volume, ie not loadable */
             }
          }
+
          if (!lmr.Recycle) {
             Dmsg1(100, "Vol=%s not recyclable\n", lmr.VolumeName);
             continue;
@@ -216,12 +204,13 @@ void prune_volumes(JCR *jcr, bool InChanger, MEDIA_DBR *mr)
          }
 
          /*
-          * If purged and not moved to another Pool, 
+          * If purged and not moved to another Pool,
           *   then we stop pruning and take this volume.
           */
          if (lmr.PoolId == mr->PoolId) {
-            Dmsg2(100, "Got Vol=%s MediaId=%d purged.\n", lmr.VolumeName, (int)lmr.MediaId);
-            memcpy(mr, &lmr, sizeof(lmr));
+            Dmsg2(100, "Got Vol=%s MediaId=%lu purged.\n", lmr.VolumeName, lmr.MediaId);
+            mr->copy(&lmr);
+            set_storageid_in_mr(store, mr);
             break;                        /* got a volume */
          }
       }