From: Kern Sibbald Date: Mon, 18 Nov 2002 11:37:18 +0000 (+0000) Subject: Write MaxVolJobs and VolUseDuration to DB X-Git-Tag: Release-1.27~19 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=5714a90191fdc7ef9368600cfe0742bd324581db;p=bacula%2Fbacula Write MaxVolJobs and VolUseDuration to DB git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@199 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/Makefile.in b/bacula/Makefile.in index 48467ac468..86aaedf97f 100755 --- a/bacula/Makefile.in +++ b/bacula/Makefile.in @@ -109,9 +109,6 @@ Makefiles: (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 diff --git a/bacula/kernstodo b/bacula/kernstodo index 37b51350f4..f91896693c 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -1,7 +1,7 @@ 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 @@ -9,15 +9,17 @@ To do: 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. @@ -597,3 +599,5 @@ Done: (see kernsdone for more) - 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). diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index 169513e89a..6fd62190b5 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -358,7 +358,9 @@ typedef struct { 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 */ @@ -385,6 +387,8 @@ typedef struct { 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 */ diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index cc7c9df05d..f79e7158af 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -162,7 +162,7 @@ int 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); @@ -183,15 +183,18 @@ db_create_pool_record(B_DB *mdb, POOL_DBR *pr) /* 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)) { diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index da60768593..3f7bd2e9dd 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -486,9 +486,9 @@ AutoPrune, Recycle, VolRetention, \ 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)) { @@ -513,9 +513,11 @@ PoolType, LabelFormat FROM Pool WHERE Pool.Name='%s'", pdbr->Name); 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; } @@ -650,12 +652,14 @@ int db_get_media_record(B_DB *mdb, MEDIA_DBR *mr) 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); } @@ -687,9 +691,11 @@ 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 { diff --git a/bacula/src/dird/catreq.c b/bacula/src/dird/catreq.c index 7099fbe057..f2b4ca28de 100644 --- a/bacula/src/dird/catreq.c +++ b/bacula/src/dird/catreq.c @@ -215,13 +215,13 @@ MediaType=%s\n", mr.PoolId, jcr->PoolId, mr.VolStatus, mr.Slot, mr.MediaType); /* 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"); diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index 01c29b2bae..367a13d49d 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -227,18 +227,18 @@ static struct res_items group_items[] = { * 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} diff --git a/bacula/src/dird/dird_conf.h b/bacula/src/dird/dird_conf.h index e036a3c638..7c588252a2 100644 --- a/bacula/src/dird/dird_conf.h +++ b/bacula/src/dird/dird_conf.h @@ -245,10 +245,10 @@ struct s_res_pool { 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 */ }; diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index d616d7b863..b30f41bae1 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -476,6 +476,8 @@ int create_pool(B_DB *db, POOL *pool) 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); @@ -607,6 +609,8 @@ static int update_volume(UAContext *ua) 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")); @@ -629,7 +633,7 @@ static int update_volume(UAContext *ua) } 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)); @@ -647,14 +651,57 @@ static int update_volume(UAContext *ua) 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")); @@ -670,7 +717,7 @@ static int update_volume(UAContext *ua) 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)); @@ -678,7 +725,7 @@ static int update_volume(UAContext *ua) 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: "))) { @@ -694,7 +741,7 @@ static int update_volume(UAContext *ua) 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)); @@ -704,7 +751,6 @@ static int update_volume(UAContext *ua) free_pool_memory(query); break; - default: /* Done or error */ bsendmsg(ua, "Selection done.\n"); return 1; @@ -734,7 +780,7 @@ static int update_pool(UAContext *ua) 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) { @@ -744,6 +790,8 @@ static int update_pool(UAContext *ua) 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 { diff --git a/bacula/src/version.h b/bacula/src/version.h index 08a29752cc..db75bc6016 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,8 +1,8 @@ /* */ #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