*/
ok = db_find_next_volume(jcr, jcr->db, index, InChanger, mr);
Dmsg2(100, "catreq after find_next_vol ok=%d FW=%d\n", ok, mr->FirstWritten);
+
if (!ok) {
/*
* 2. Try finding a recycled volume
*/
prune_volumes(jcr);
ok = recycle_oldest_purged_volume(jcr, InChanger, mr);
+ if (!ok) {
+ /*
+ * 5. Try pulling a volume from the Scratch pool
+ */
+ ok = get_scratch_volume(jcr, mr, InChanger);
+ }
+ /*
+ * If we are using an Autochanger and have not found
+ * a volume, retry looking for any volume.
+ */
if (InChanger) {
InChanger = false;
if (!ok) {
}
}
- if (!ok) {
- /*
- * 5. Try pulling a volume from the Scratch pool
- */
- ok = get_scratch_volume(jcr, mr, InChanger);
- }
if (!ok && create) {
/*
}
} else {
*reason = _("but should be Append, Purged or Recycle (cannot automatically "
- "recycle current volume, as it still contains unpruned data)");
+ "recycle current volume, as it still contains unpruned data "
+ "or the Volume Retention time has not expired.)");
}
}
}
/* Only one thread at a time can pull from the scratch pool */
P(mutex);
- /*
- * Get pool record where the Scratch Volume will go
- */
- memset(&pr, 0, sizeof(pr));
- bstrncpy(pr.Name, jcr->pool->hdr.name, sizeof(pr.Name));
- if (!db_get_pool_record(jcr, jcr->db, &pr)) {
- Jmsg(jcr, M_WARNING, 0, _("Unable to get Pool record: ERR=%s"),
- db_strerror(jcr->db));
- goto bail_out;
- }
- if (pr.MaxVols > 0 && pr.NumVols >= pr.MaxVols) {
- Jmsg(jcr, M_WARNING, 0, _("Unable to use Scratch Volume, Pool full MaxVols=%d\n"),
- pr.MaxVols);
- goto bail_out;
- }
/*
* Get Pool record for Scratch Pool
*/
if (db_get_pool_record(jcr, jcr->db, &spr)) {
memset(&smr, 0, sizeof(smr));
smr.PoolId = spr.PoolId;
+ if (InChanger) {
+ smr.StorageId = mr->StorageId; /* want only Scratch Volumes in changer */
+ }
bstrncpy(smr.VolStatus, "Append", sizeof(smr.VolStatus)); /* want only appendable volumes */
bstrncpy(smr.MediaType, mr->MediaType, sizeof(smr.MediaType));
if (db_find_next_volume(jcr, jcr->db, 1, InChanger, &smr)) {
POOL_MEM query(PM_MESSAGE);
+
+ /*
+ * Get pool record where the Scratch Volume will go to ensure
+ * that we can add a Volume.
+ */
+ memset(&pr, 0, sizeof(pr));
+ bstrncpy(pr.Name, jcr->pool->hdr.name, sizeof(pr.Name));
+ if (!db_get_pool_record(jcr, jcr->db, &pr)) {
+ Jmsg(jcr, M_WARNING, 0, _("Unable to get Pool record: ERR=%s"),
+ db_strerror(jcr->db));
+ goto bail_out;
+ }
+ if (pr.MaxVols > 0 && pr.NumVols >= pr.MaxVols) {
+ Jmsg(jcr, M_WARNING, 0, _("Unable add Scratch Volume, Pool \"%s\" full MaxVols=%d\n"),
+ jcr->pool->hdr.name, pr.MaxVols);
+ goto bail_out;
+ }
+
+ /* OK, now move Scratch Volume */
db_lock(jcr->db);
Mmsg(query, "UPDATE Media SET PoolId=%s WHERE MediaId=%s",
edit_int64(mr->PoolId, ed1),