From: Michal Rakowski Date: Mon, 24 May 2021 21:59:26 +0000 (+0200) Subject: Allow to use 'StorageGroupPolicy' directive in Pool resource X-Git-Tag: Release-11.3.2~529 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d6bd8231b14832f5a0378612190489c37ae0122c;p=thirdparty%2Fbacula.git Allow to use 'StorageGroupPolicy' directive in Pool resource --- diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index 66cc4c210..abf87d771 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -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) { diff --git a/bacula/src/dird/dird_conf.h b/bacula/src/dird/dird_conf.h index 7f54ea460..cb9e276a1 100644 --- a/bacula/src/dird/dird_conf.h +++ b/bacula/src/dird/dird_conf.h @@ -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 */ diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index d6100da4a..5f8e04acf 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -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 */