/* * Called here before the job is run to do the job * specific setup. */ bool do_backup_init(JCR *jcr) { if (jcr->get_JobLevel() == L_VIRTUAL_FULL) { return do_vbackup_init(jcr); } free_rstorage(jcr); /* we don't read so release */ if (!get_or_create_fileset_record(jcr)) { return false; } /* * Get definitive Job level and since time */ get_level_since_time(jcr, jcr->since, sizeof(jcr->since)); apply_pool_overrides(jcr); if (!allow_duplicate_job(jcr)) { return false; } jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->pool->name()); if (jcr->jr.PoolId == 0) { return false; } /* If pool storage specified, use it instead of job storage */ copy_wstorage(jcr, jcr->pool->storage, _("Pool resource")); if (!jcr->wstorage) { Jmsg(jcr, M_FATAL, 0, _("No Storage specification found in Job or Pool.\n")); return false; } create_clones(jcr); /* run any clone jobs */ return true; }
/* * Called here before the job is run to do the job * specific setup. */ bool do_native_vbackup_init(JCR *jcr) { const char *storage_source; if (!get_or_create_fileset_record(jcr)) { Dmsg1(dbglevel, "JobId=%d no FileSet\n", (int)jcr->JobId); return false; } apply_pool_overrides(jcr); if (!allow_duplicate_job(jcr)) { return false; } jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->res.pool->name()); if (jcr->jr.PoolId == 0) { Dmsg1(dbglevel, "JobId=%d no PoolId\n", (int)jcr->JobId); Jmsg(jcr, M_FATAL, 0, _("Could not get or create a Pool record.\n")); return false; } /* * Note, at this point, pool is the pool for this job. We * transfer it to rpool (read pool), and a bit later, * pool will be changed to point to the write pool, * which comes from pool->NextPool. */ jcr->res.rpool = jcr->res.pool; /* save read pool */ pm_strcpy(jcr->res.rpool_source, jcr->res.pool_source); /* If pool storage specified, use it for restore */ copy_rstorage(jcr, jcr->res.pool->storage, _("Pool resource")); Dmsg2(dbglevel, "Read pool=%s (From %s)\n", jcr->res.rpool->name(), jcr->res.rpool_source); jcr->start_time = time(NULL); jcr->jr.StartTime = jcr->start_time; if (!db_update_job_start_record(jcr, jcr->db, &jcr->jr)) { Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db)); } /* * See if there is a next pool override. */ if (jcr->res.run_next_pool_override) { pm_strcpy(jcr->res.npool_source, _("Run NextPool override")); pm_strcpy(jcr->res.pool_source, _("Run NextPool override")); storage_source = _("Storage from Run NextPool override"); } else { /* * See if there is a next pool override in the Job definition. */ if (jcr->res.job->next_pool) { jcr->res.next_pool = jcr->res.job->next_pool; pm_strcpy(jcr->res.npool_source, _("Job's NextPool resource")); pm_strcpy(jcr->res.pool_source, _("Job's NextPool resource")); storage_source = _("Storage from Job's NextPool resource"); } else { /* * Fall back to the pool's NextPool definition. */ jcr->res.next_pool = jcr->res.pool->NextPool; pm_strcpy(jcr->res.npool_source, _("Job Pool's NextPool resource")); pm_strcpy(jcr->res.pool_source, _("Job Pool's NextPool resource")); storage_source = _("Storage from Pool's NextPool resource"); } } /* * If the original backup pool has a NextPool, make sure a * record exists in the database. Note, in this case, we * will be migrating from pool to pool->NextPool. */ if (jcr->res.next_pool) { jcr->jr.PoolId = get_or_create_pool_record(jcr, jcr->res.next_pool->name()); if (jcr->jr.PoolId == 0) { return false; } } if (!set_migration_wstorage(jcr, jcr->res.pool, jcr->res.next_pool, storage_source)) { return false; } jcr->res.pool = jcr->res.next_pool; Dmsg2(dbglevel, "Write pool=%s read rpool=%s\n", jcr->res.pool->name(), jcr->res.rpool->name()); // create_clones(jcr); return true; }