{"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},
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) {
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 */
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 */
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();
}
}
-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"));
}
}
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 */