]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Allow to use 'StorageGroupPolicy' directive in Pool resource
authorMichal Rakowski <michal.rakowski@baculasystems.com>
Mon, 24 May 2021 21:59:26 +0000 (23:59 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:03:02 +0000 (09:03 +0100)
bacula/src/dird/dird_conf.c
bacula/src/dird/dird_conf.h
bacula/src/dird/job.c

index 66cc4c210fa25d7c3d4200feea3dd183f0dc263c..abf87d77183e0476f50fca11deaa852829274a93 100644 (file)
@@ -759,6 +759,7 @@ static RES_ITEM pool_items[] = {
    {"MigrationLowBytes", store_size64,  ITEM(res_pool.MigrationLowBytes), 0, 0, 0},
    {"NextPool",      store_res,       ITEM(res_pool.NextPool), R_POOL, 0, 0},
    {"Storage",       store_alist_res, ITEM(res_pool.storage),  R_STORAGE, 0, 0},
+   {"StorageGroupPolicy",   store_storage_mngr, ITEM(res_job.storage_policy),  0, 0, 0},
    {"AutoPrune",     store_bool,      ITEM(res_pool.AutoPrune), 0, ITEM_DEFAULT, true},
    {"Recycle",       store_bool,      ITEM(res_pool.Recycle),   0, ITEM_DEFAULT, true},
    {"RecyclePool",   store_res,       ITEM(res_pool.RecyclePool), R_POOL, 0, 0},
@@ -1835,6 +1836,9 @@ void free_resource(RES *rres, int type)
       if (res->res_pool.storage) {
          delete res->res_pool.storage;
       }
+      if (res->res_pool.storage_policy) {
+         free(res->res_pool.storage_policy);
+      }
       break;
    case R_SCHEDULE:
       if (res->res_sch.run) {
index 7f54ea4604e2e32498b1f5fa233c1607a7b77d31..cb9e276a142b3719483d4b248000f2a72d9f5080 100644 (file)
@@ -482,7 +482,7 @@ public:
    CLIENT    *client;                 /* Who to backup */
    FILESET   *fileset;                /* What to backup -- Fileset */
    alist     *storage;                /* Where is device -- list of Storage to be used */
-   char      *storage_policy;         /* Storage policy (e.g. round robin, least used...) */
+   char      *storage_policy;         /* Storage policy (e.g. listed order, least used...) */
    POOL      *pool;                   /* Where is media -- Media Pool */
    POOL      *next_pool;              /* Next Pool for Copy/Migrate/VirtualFull */
    POOL      *full_pool;              /* Pool for Full backups */
@@ -697,6 +697,7 @@ public:
    uint64_t MigrationLowBytes;        /* When migration stops */
    POOL  *NextPool;                   /* Next pool for migration */
    alist *storage;                    /* Where is device -- list of Storage to be used */
+   char  *storage_policy;             /* Storage policy (e.g. listed order, least used...) */
    bool  use_catalog;                 /* maintain catalog for media */
    bool  catalog_files;               /* maintain file entries in catalog */
    bool  use_volume_once;             /* write on volume only once */
index d6100da4a2f95b80e859290e80b3e2b76a7f9dc5..5f8e04acf62913a14abd7061e9d24a7884ed9795 100644 (file)
@@ -36,6 +36,8 @@ static bool job_check_maxruntime(JCR *jcr);
 static bool job_check_maxrunschedtime(JCR *jcr);
 static void set_jcr_default_store(JCR *jcr, JOB *job);
 
+static const int dbglvl_store_mngr = 200;
+
 /* Imported subroutines and variables */
 extern void term_scheduler();
 extern void term_ua_server();
@@ -1579,10 +1581,35 @@ void get_job_storage(USTORE *store, JOB *job, RUN *run)
    }
 }
 
-static void set_jcr_default_store(JCR *jcr, JOB *job) {
+/* Init storage manager with specified storage group policy */
+static void init_store_manager(JCR *jcr, const char *policy)
+{
+   if (policy) {
+      if (strcmp(policy, "LeastUsed") == 0) {
+         Dmsg1(dbglvl_store_mngr, "Setting LeastUsed storage group policy for JobId: %d\n", jcr->JobId);
+         jcr->store_mngr = New(LeastUsedStore());
+      } else if (strcmp(policy, "ListedOrder") == 0) {
+         Dmsg1(dbglvl_store_mngr, "Setting ListedOrder storage group policy for JobId: %d\n", jcr->JobId);
+         jcr->store_mngr = New(ListedOrderStore());
+      }
+   } else {
+      Dmsg1(dbglvl_store_mngr, "Setting ListedOrder storage group policy for JobId: %d\n", jcr->JobId);
+      jcr->store_mngr = New(ListedOrderStore());
+   }
+}
+
+static void set_jcr_default_store(JCR *jcr, JOB *job)
+{
+   const char *store_policy = job->storage_policy ? job->storage_policy : job->pool->storage_policy;
+
+   init_store_manager(jcr, store_policy);
+
+   /* Use storage definition from proper resource */
    if (job->storage) {
+      Dmsg1(dbglvl_store_mngr, "Using Storage definition from the Job resource for JobId: %d\n", jcr->JobId);
       copy_rwstorage(jcr, job->storage, _("Job resource"));
    } else {
+      Dmsg1(dbglvl_store_mngr, "Using Storage definition from the Pool resource for JobId: %d\n", jcr->JobId);
       copy_rwstorage(jcr, job->pool->storage, _("Pool resource"));
    }
 }
@@ -1626,16 +1653,6 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
 
    jcr->JobPriority = job->Priority;
 
-   if (job->storage_policy) {
-      if (strcmp(job->storage_policy, "LeastUsed") == 0) {
-         jcr->store_mngr = New(LeastUsedStore());
-      } else if (strcmp(job->storage_policy, "ListedOrder") == 0) {
-         jcr->store_mngr = New(ListedOrderStore());
-      }
-   } else {
-      jcr->store_mngr = New(ListedOrderStore());
-   }
-
    set_jcr_default_store(jcr, job);
 
    /* check if we run a restore */