(cd scripts; \
chmod 755 startmysql stopmysql bacula fd startit stopit btraceback; \
chmod 755 mtx-changer console gconsole)
- chmod 755 src/console/btraceback src/lib/btraceback
- chmod 755 src/dird/btraceback src/filed/btraceback
- chmod 755 src/stored/btraceback
chmod 755 src/cats/make_mysql_tables src/cats/drop_mysql_tables
chmod 755 src/cats/make_sqlite_tables src/cats/drop_sqlite_tables
chmod 755 src/cats/make_bdb_tables src/cats/drop_bdb_tables
Kern's ToDo List
- 14 November 2002
+ 18 November 2002
-To do:
+Documentation to do:
- Document to have patience when SD first starts.
- Document running a test version.
- Document saving MySQL databases, where to find code for shutting
http://www.backupcentral.com/free-backup-software1.html
- Document -i option on FD
-Test:
+Testing to do:
- that restore options work in FD.
- that mod of restore options works.
- that console command line options work
- blocksize recognition code.
+- make sure that update of volume new parameters works
For 1.27 release:
-- Add ORDER BY JobId to list of Jobs in query.sql, and in
- ua_list.c (list command).
+- drive MaxVolJobs, VolUseDuration from media record
+ rather than Resource.
+
After 1.27
- Check if both CatalogFiles and UseCatalog are set to SD.
- Make sure pruning of Jobs removes JobMediaId
- Write bcopy program -- recovery of bad tape.
- Make gethostbyname() thread safe in bnet.c
+- Add ORDER BY JobId to list of Jobs in query.sql, and in
+ ua_output.c (list command).
int AcceptAnyVolume; /* set to accept any volume sequence */
int AutoPrune; /* set to prune automatically */
int Recycle; /* default Vol recycle flag */
- utime_t VolRetention; /* retention period in seconds */
+ utime_t VolRetention; /* retention period in seconds */
+ utime_t VolUseDuration; /* time in secs volume can be used */
+ uint32_t MaxVolJobs; /* Max jobs on volume */
char PoolType[MAX_NAME_LENGTH];
char LabelFormat[MAX_NAME_LENGTH];
/* Extra stuff not in DB */
uint64_t VolMaxBytes; /* max bytes to write */
uint64_t VolCapacityBytes; /* capacity estimate */
utime_t VolRetention; /* Volume retention in seconds */
+ utime_t VolUseDuration; /* time in secs volume can be used */
+ uint32_t MaxVolJobs; /* Max jobs on volume */
int Recycle; /* recycle yes/no */
int32_t Slot; /* slot in changer */
char VolStatus[20]; /* Volume status */
db_create_pool_record(B_DB *mdb, POOL_DBR *pr)
{
int stat;
- char ed1[30];
+ char ed1[30], ed2[30];
db_lock(mdb);
Mmsg(&mdb->cmd, "SELECT PoolId,Name FROM Pool WHERE Name='%s'", pr->Name);
/* Must create it */
Mmsg(&mdb->cmd,
-"INSERT INTO Pool (Name, NumVols, MaxVols, UseOnce, UseCatalog, \
-AcceptAnyVolume, AutoPrune, Recycle, VolRetention, PoolType, LabelFormat) \
-VALUES ('%s', %d, %d, %d, %d, %d, %d, %d, %s, '%s', '%s')",
+"INSERT INTO Pool (Name,NumVols,MaxVols,UseOnce,UseCatalog,\
+AcceptAnyVolume,AutoPrune,Recycle,VolRetention,VolUseDuration,\
+MaxVolJobs,PoolType,LabelFormat) \
+VALUES ('%s',%u,%u,%d,%d,%d,%d,%d,%s,%s,%u,'%s','%s')",
pr->Name,
pr->NumVols, pr->MaxVols,
pr->UseOnce, pr->UseCatalog,
pr->AcceptAnyVolume,
pr->AutoPrune, pr->Recycle,
edit_uint64(pr->VolRetention, ed1),
+ edit_uint64(pr->VolUseDuration, ed2),
+ pr->MaxVolJobs,
pr->PoolType, pr->LabelFormat);
Dmsg1(500, "Create Pool: %s\n", mdb->cmd);
if (!INSERT_DB(mdb, mdb->cmd)) {
PoolType, LabelFormat FROM Pool WHERE Pool.PoolId=%d", pdbr->PoolId);
} else { /* find by name */
Mmsg(&mdb->cmd,
-"SELECT PoolId, Name, NumVols, MaxVols, UseOnce, UseCatalog, AcceptAnyVolume, \
-AutoPrune, Recycle, VolRetention, \
-PoolType, LabelFormat FROM Pool WHERE Pool.Name='%s'", pdbr->Name);
+"SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,AcceptAnyVolume,\
+AutoPrune,Recycle,VolRetention,VolUseDuration,MaxVolJobs,\
+PoolType,LabelFormat FROM Pool WHERE Pool.Name='%s'", pdbr->Name);
}
if (QUERY_DB(mdb, mdb->cmd)) {
pdbr->AutoPrune = atoi(row[7]);
pdbr->Recycle = atoi(row[8]);
pdbr->VolRetention = (utime_t)strtod(row[9], NULL);
- strcpy(pdbr->PoolType, row[10]);
- if (row[11]) {
- strcpy(pdbr->LabelFormat, row[11]);
+ pdbr->VolUseDuration = (utime_t)strtod(row[10], NULL);
+ pdbr->MaxVolJobs = atoi(row[11]);
+ strcpy(pdbr->PoolType, row[12]);
+ if (row[13]) {
+ strcpy(pdbr->LabelFormat, row[13]);
} else {
pdbr->LabelFormat[0] = 0;
}
if (mr->MediaId != 0) { /* find by id */
Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\
VolBytes,VolMounts,VolErrors,VolWrites,VolMaxBytes,VolCapacityBytes,\
-MediaType,VolStatus,PoolId,VolRetention,Recycle,Slot, FirstWritten \
+MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,\
+Recycle,Slot, FirstWritten \
FROM Media WHERE MediaId=%d", mr->MediaId);
} else { /* find by name */
Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,VolJobs,VolFiles,VolBlocks,\
VolBytes,VolMounts,VolErrors,VolWrites,VolMaxBytes,VolCapacityBytes,\
-MediaType,VolStatus,PoolId,VolRetention,Recycle,Slot,FirstWritten \
+MediaType,VolStatus,PoolId,VolRetention,VolUseDuration,MaxVolJobs,\
+Recycle,Slot,FirstWritten \
FROM Media WHERE VolumeName='%s'", mr->VolumeName);
}
strcpy(mr->VolStatus, row[12]);
mr->PoolId = atoi(row[13]);
mr->VolRetention = (utime_t)strtod(row[14], NULL);
- mr->Recycle = atoi(row[15]);
- mr->Slot = atoi(row[16]);
- strcpy(mr->cFirstWritten, row[17]);
+ mr->VolUseDuration = (utime_t)strtod(row[15], NULL);
+ mr->MaxVolJobs = atoi(row[16]);
+ mr->Recycle = atoi(row[17]);
+ mr->Slot = atoi(row[18]);
+ strcpy(mr->cFirstWritten, row[19]);
stat = mr->MediaId;
}
} else {
/* Now see if Volume should only be used once */
} else if (mr.VolBytes > 0 && jcr->pool->use_volume_once) {
- Jmsg(jcr, M_INFO, 0, _("Volume used once. As configured, "
- "marking Volume \"%s\" as Used.\n"), mr.VolumeName);
+ Jmsg(jcr, M_INFO, 0, _("Volume used once. "
+ "Marking Volume \"%s\" as Used.\n"), mr.VolumeName);
strcpy(mr.VolStatus, "Used");
/* Now see if Max Jobs written to volume */
- } else if (jcr->pool->MaxVolumeJobs > 0 &&
- jcr->pool->MaxVolumeJobs <= mr.VolJobs) {
+ } else if (jcr->pool->MaxVolJobs > 0 &&
+ jcr->pool->MaxVolJobs <= mr.VolJobs) {
Jmsg(jcr, M_INFO, 0, _("Max configured Volume jobs exceeded. "
"Marking Volume \"%s\" as Used.\n"), mr.VolumeName);
strcpy(mr.VolStatus, "Used");
* name handler value code flags default_value
*/
static struct res_items pool_items[] = {
- {"name", store_name, ITEM(res_pool.hdr.name), 0, ITEM_REQUIRED, 0},
- {"description", store_str, ITEM(res_pool.hdr.desc), 0, 0, 0},
- {"pooltype", store_strname, ITEM(res_pool.pool_type), 0, ITEM_REQUIRED, 0},
- {"labelformat", store_strname, ITEM(res_pool.label_format), 0, 0, 0},
+ {"name", store_name, ITEM(res_pool.hdr.name), 0, ITEM_REQUIRED, 0},
+ {"description", store_str, ITEM(res_pool.hdr.desc), 0, 0, 0},
+ {"pooltype", store_strname, ITEM(res_pool.pool_type), 0, ITEM_REQUIRED, 0},
+ {"labelformat", store_strname, ITEM(res_pool.label_format), 0, 0, 0},
{"usecatalog", store_yesno, ITEM(res_pool.use_catalog), 1, ITEM_DEFAULT, 1},
{"usevolumeonce", store_yesno, ITEM(res_pool.use_volume_once), 1, 0, 0},
{"maximumvolumes", store_pint, ITEM(res_pool.max_volumes), 0, 0, 0},
- {"maximumvolumejobs", store_pint, ITEM(res_pool.MaxVolumeJobs), 0, 0, 0},
+ {"maximumvolumejobs", store_pint, ITEM(res_pool.MaxVolJobs), 0, 0, 0},
{"acceptanyvolume", store_yesno, ITEM(res_pool.accept_any_volume), 1, ITEM_DEFAULT, 1},
{"catalogfiles", store_yesno, ITEM(res_pool.catalog_files), 1, ITEM_DEFAULT, 1},
- {"volumeretention", store_time, ITEM(res_pool.VolRetention), 0, ITEM_DEFAULT, 60*60*24*365},
- {"volumeuseduration", store_time, ITEM(res_pool.VolUseDuration), 0, 0, 0},
+ {"volumeretention", store_time, ITEM(res_pool.VolRetention), 0, ITEM_DEFAULT, 60*60*24*365},
+ {"volumeuseduration", store_time, ITEM(res_pool.VolUseDuration),0, 0, 0},
{"autoprune", store_yesno, ITEM(res_pool.AutoPrune), 1, ITEM_DEFAULT, 1},
{"recycle", store_yesno, ITEM(res_pool.Recycle), 1, ITEM_DEFAULT, 1},
{NULL, NULL, NULL, 0, 0, 0}
int catalog_files; /* maintain file entries in catalog */
int use_volume_once; /* write on volume only once */
int accept_any_volume; /* accept any volume */
- int max_volumes; /* max number of volumes */
+ uint32_t max_volumes; /* max number of volumes */
utime_t VolRetention; /* volume retention period in seconds */
utime_t VolUseDuration; /* duration volume can be used */
- uint32_t MaxVolumeJobs; /* Maximum jobs on the volume */
+ uint32_t MaxVolJobs; /* Maximum jobs on the volume */
int AutoPrune; /* default for pool auto prune */
int Recycle; /* default for media recycle yes/no */
};
pr.AcceptAnyVolume = pool->accept_any_volume;
pr.Recycle = pool->Recycle;
pr.VolRetention = pool->VolRetention;
+ pr.VolUseDuration = pool->VolUseDuration;
+ pr.MaxVolJobs = pool->MaxVolJobs;
pr.AutoPrune = pool->AutoPrune;
if (pool->label_format) {
strcpy(pr.LabelFormat, pool->label_format);
start_prompt(ua, _("Parameters to modify:\n"));
add_prompt(ua, _("Volume Status"));
add_prompt(ua, _("Volume Retention Period"));
+ add_prompt(ua, _("Volume Use Duration"));
+ add_prompt(ua, _("Maximum Volume Jobs"));
add_prompt(ua, _("Recycle Flag"));
add_prompt(ua, _("Slot"));
add_prompt(ua, _("Done"));
}
strcpy(mr.VolStatus, ua->cmd);
query = get_pool_memory(PM_MESSAGE);
- Mmsg(&query, "UPDATE Media SET VolStatus='%s' WHERE MediaId=%d",
+ Mmsg(&query, "UPDATE Media SET VolStatus='%s' WHERE MediaId=%u",
mr.VolStatus, mr.MediaId);
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
break;
}
query = get_pool_memory(PM_MESSAGE);
- Mmsg(&query, "UPDATE Media SET VolRetention=%s WHERE MediaId=%d",
+ Mmsg(&query, "UPDATE Media SET VolRetention=%s WHERE MediaId=%u",
edit_uint64(mr.VolRetention, ed1), mr.MediaId);
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
}
free_pool_memory(query);
break;
- case 2: /* Recycle */
+
+ case 2: /* Use Duration */
+ bsendmsg(ua, _("Current value is: %s\n"),
+ edit_utime(mr.VolUseDuration, ed1));
+ if (!get_cmd(ua, _("Enter Volume Use Duration: "))) {
+ return 0;
+ }
+ if (!duration_to_utime(ua->cmd, &mr.VolUseDuration)) {
+ bsendmsg(ua, _("Invalid use duration specified.\n"));
+ break;
+ }
+ query = get_pool_memory(PM_MESSAGE);
+ Mmsg(&query, "UPDATE Media SET VolUseDuration=%s WHERE MediaId=%u",
+ edit_uint64(mr.VolUseDuration, ed1), mr.MediaId);
+ if (!db_sql_query(ua->db, query, NULL, NULL)) {
+ bsendmsg(ua, "%s", db_strerror(ua->db));
+ }
+ free_pool_memory(query);
+ break;
+
+ case 3: /* Max Jobs */
+ int32_t maxjobs;
+ bsendmsg(ua, _("Current value is: %u\n"), mr.MaxVolJobs);
+ if (!get_cmd(ua, _("Enter new Maximum Jobs: "))) {
+ return 0;
+ }
+ maxjobs = atoi(ua->cmd);
+ if (maxjobs < 0) {
+ bsendmsg(ua, _("Invalid number, it must be 0 or greater\n"));
+ break;
+ }
+ query = get_pool_memory(PM_MESSAGE);
+ Mmsg(&query, "UPDATE Media SET MaxVolJobs=%u WHERE MediaId=%u",
+ maxjobs, mr.MediaId);
+ if (!db_sql_query(ua->db, query, NULL, NULL)) {
+ bsendmsg(ua, "%s", db_strerror(ua->db));
+ } else {
+ bsendmsg(ua, "New value is: %u\n", maxjobs);
+ }
+ free_pool_memory(query);
+ break;
+
+
+ case 4: /* Recycle */
int recycle;
bsendmsg(ua, _("Current value is: %s\n"),
mr.Recycle==1?_("yes"):_("no"));
break;
}
query = get_pool_memory(PM_MESSAGE);
- Mmsg(&query, "UPDATE Media SET Recycle=%d WHERE MediaId=%d",
+ Mmsg(&query, "UPDATE Media SET Recycle=%d WHERE MediaId=%u",
recycle, mr.MediaId);
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
free_pool_memory(query);
break;
- case 3: /* Slot */
+ case 5: /* Slot */
int slot;
bsendmsg(ua, _("Current value is: %d\n"), mr.Slot);
if (!get_cmd(ua, _("Enter new Slot: "))) {
break;
}
query = get_pool_memory(PM_MESSAGE);
- Mmsg(&query, "UPDATE Media SET Slot=%d WHERE MediaId=%d",
+ Mmsg(&query, "UPDATE Media SET Slot=%d WHERE MediaId=%u",
slot, mr.MediaId);
if (!db_sql_query(ua->db, query, NULL, NULL)) {
bsendmsg(ua, "%s", db_strerror(ua->db));
free_pool_memory(query);
break;
-
default: /* Done or error */
bsendmsg(ua, "Selection done.\n");
return 1;
return 0;
}
strcpy(pr.PoolType, pool->pool_type);
- if (pr.MaxVols != (uint32_t) (pool->max_volumes)) {
+ if (pr.MaxVols != pool->max_volumes) {
pr.MaxVols = pool->max_volumes;
}
if (pr.MaxVols != 0 && pr.MaxVols < pr.NumVols) {
pr.UseCatalog = pool->use_catalog;
pr.AcceptAnyVolume = pool->accept_any_volume;
pr.VolRetention = pool->VolRetention;
+ pr.VolUseDuration = pool->VolUseDuration;
+ pr.MaxVolJobs = pool->MaxVolJobs;
if (pool->label_format) {
strcpy(pr.LabelFormat, pool->label_format);
} else {
/* */
#define VERSION "1.27"
#define VSTRING "1"
-#define DATE "15 November 2002"
-#define LSMDATE "15Nov02"
+#define DATE "18 November 2002"
+#define LSMDATE "18Nov02"
/* Debug flags */
#define DEBUG 1