Skip to content

Commit

Permalink
Merge pull request #1476
Browse files Browse the repository at this point in the history
status storage: fix wrong data displayed about waiting jobs
  • Loading branch information
BareosBot committed Aug 1, 2023
2 parents ad4211d + 16d0d45 commit 35c99ec
Show file tree
Hide file tree
Showing 12 changed files with 141 additions and 149 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -106,6 +106,7 @@ and since Bareos version 20 this project adheres to [Semantic Versioning](https:
- scripts: config-lib improve setup_sd_user [PR #1448]
- cats: fix creates, grants and drops postgresql [PR #1502]
- stored: fix blocksize warning [PR #1503]
- status storage: fix wrong data displayed about waiting jobs [PR #1476]

### Documentation
- add explanation about binary version numbers [PR #1354]
Expand Down Expand Up @@ -196,6 +197,7 @@ and since Bareos version 20 this project adheres to [Semantic Versioning](https:
[PR #1469]: https://github.com/bareos/bareos/pull/1469
[PR #1473]: https://github.com/bareos/bareos/pull/1473
[PR #1474]: https://github.com/bareos/bareos/pull/1474
[PR #1476]: https://github.com/bareos/bareos/pull/1476
[PR #1477]: https://github.com/bareos/bareos/pull/1477
[PR #1479]: https://github.com/bareos/bareos/pull/1479
[PR #1484]: https://github.com/bareos/bareos/pull/1484
Expand Down
11 changes: 5 additions & 6 deletions core/src/dird/backup.cc
Expand Up @@ -893,7 +893,6 @@ void GenerateBackupSummary(JobControlRecord *jcr, ClientDbRecord *cr, int msg_ty
char sdt[50], edt[50], schedt[50], gdt[50];
char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30], compress[50];
char ec6[30], ec7[30], ec8[30], elapsed[50];
char fd_term_msg[100], sd_term_msg[100];
double kbps, compression;
utime_t RunTime;
MediaDbRecord mr;
Expand Down Expand Up @@ -958,8 +957,8 @@ void GenerateBackupSummary(JobControlRecord *jcr, ClientDbRecord *cr, int msg_ty
}
}

JobstatusToAscii(jcr->dir_impl->FDJobStatus, fd_term_msg, sizeof(fd_term_msg));
JobstatusToAscii(jcr->dir_impl->SDJobStatus, sd_term_msg, sizeof(sd_term_msg));
std::string fd_term_msg = JobstatusToAscii(jcr->dir_impl->FDJobStatus);
std::string sd_term_msg = JobstatusToAscii(jcr->dir_impl->SDJobStatus);

switch (jcr->getJobProtocol()) {
case PT_NDMP_BAREOS:
Expand Down Expand Up @@ -1053,7 +1052,7 @@ void GenerateBackupSummary(JobControlRecord *jcr, ClientDbRecord *cr, int msg_ty
" SD termination status: %s\n"
" Accurate: %s\n"),
jcr->dir_impl->SDErrors,
sd_term_msg,
sd_term_msg.c_str(),
jcr->accurate ? _("yes") : _("no"));
} else {
if (jcr->HasBase) {
Expand Down Expand Up @@ -1091,8 +1090,8 @@ void GenerateBackupSummary(JobControlRecord *jcr, ClientDbRecord *cr, int msg_ty
" SD termination status: %s\n"),
jcr->JobErrors,
jcr->dir_impl->SDErrors,
fd_term_msg,
sd_term_msg);
fd_term_msg.c_str(),
sd_term_msg.c_str());

if (me->secure_erase_cmdline) {
Mmsg(temp," Dir Secure Erase Cmd: %s\n", me->secure_erase_cmdline);
Expand Down
7 changes: 3 additions & 4 deletions core/src/dird/migrate.cc
Expand Up @@ -1515,7 +1515,7 @@ static inline void GenerateMigrateSummary(JobControlRecord* jcr,
double kbps;
utime_t RunTime;
JobControlRecord* mig_jcr = jcr->dir_impl->mig_jcr;
char term_code[100], sd_term_msg[100];
char term_code[100];
char sdt[MAX_TIME_LENGTH], edt[MAX_TIME_LENGTH];
char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30], elapsed[50];
char ec6[50], ec7[50], ec8[50];
Expand All @@ -1526,8 +1526,7 @@ static inline void GenerateMigrateSummary(JobControlRecord* jcr,
bstrftimes(edt, sizeof(edt), jcr->dir_impl->jr.EndTime);
RunTime = jcr->dir_impl->jr.EndTime - jcr->dir_impl->jr.StartTime;

JobstatusToAscii(jcr->dir_impl->SDJobStatus, sd_term_msg,
sizeof(sd_term_msg));
std::string sd_term_msg = JobstatusToAscii(jcr->dir_impl->SDJobStatus);
if (jcr->dir_impl->previous_jr.JobId != 0) {
// Copy/Migrate worker Job.
if (RunTime <= 0) {
Expand Down Expand Up @@ -1605,7 +1604,7 @@ static inline void GenerateMigrateSummary(JobControlRecord* jcr,
mig_jcr ? mig_jcr->VolumeName : _("*None*"), jcr->VolSessionId,
jcr->VolSessionTime, edit_uint64_with_commas(mr->VolBytes, ec4),
edit_uint64_with_suffix(mr->VolBytes, ec5), jcr->dir_impl->SDErrors,
sd_term_msg, kBareosVersionStrings.JoblogMessage,
sd_term_msg.c_str(), kBareosVersionStrings.JoblogMessage,
JobTriggerToString(jcr->dir_impl->job_trigger).c_str(), term_code);
} else {
// Copy/Migrate selection only Job.
Expand Down
15 changes: 7 additions & 8 deletions core/src/dird/restore.cc
Expand Up @@ -482,7 +482,6 @@ void GenerateRestoreSummary(JobControlRecord* jcr,
{
char sdt[MAX_TIME_LENGTH], edt[MAX_TIME_LENGTH];
char ec1[30], ec2[30], ec3[30], elapsed[50];
char fd_term_msg[100], sd_term_msg[100];
utime_t RunTime;
double kbps;
PoolMem temp, secure_erase_status;
Expand All @@ -497,10 +496,8 @@ void GenerateRestoreSummary(JobControlRecord* jcr,
}
if (kbps < 0.05) { kbps = 0; }

JobstatusToAscii(jcr->dir_impl->FDJobStatus, fd_term_msg,
sizeof(fd_term_msg));
JobstatusToAscii(jcr->dir_impl->SDJobStatus, sd_term_msg,
sizeof(sd_term_msg));
std::string fd_term_msg = JobstatusToAscii(jcr->dir_impl->FDJobStatus);
std::string sd_term_msg = JobstatusToAscii(jcr->dir_impl->SDJobStatus);

ClientDbRecord cr;
bstrncpy(cr.Name, jcr->dir_impl->res.client->resource_name_, sizeof(cr.Name));
Expand Down Expand Up @@ -540,7 +537,8 @@ void GenerateRestoreSummary(JobControlRecord* jcr,
edit_uint64_with_commas((uint64_t)jcr->dir_impl->ExpectedFiles, ec1),
edit_uint64_with_commas((uint64_t)jcr->dir_impl->jr.JobFiles, ec2),
edit_uint64_with_commas(jcr->dir_impl->jr.JobBytes, ec3),
(float)kbps, sd_term_msg, kBareosVersionStrings.JoblogMessage,
(float)kbps, sd_term_msg.c_str(),
kBareosVersionStrings.JoblogMessage,
JobTriggerToString(jcr->dir_impl->job_trigger).c_str(), TermMsg);
break;
default:
Expand Down Expand Up @@ -587,8 +585,9 @@ void GenerateRestoreSummary(JobControlRecord* jcr,
edit_uint64_with_commas((uint64_t)jcr->dir_impl->ExpectedFiles, ec1),
edit_uint64_with_commas((uint64_t)jcr->dir_impl->jr.JobFiles, ec2),
edit_uint64_with_commas(jcr->dir_impl->jr.JobBytes, ec3),
(float)kbps, jcr->JobErrors, fd_term_msg, sd_term_msg,
secure_erase_status.c_str(), kBareosVersionStrings.JoblogMessage,
(float)kbps, jcr->JobErrors, fd_term_msg.c_str(),
sd_term_msg.c_str(), secure_erase_status.c_str(),
kBareosVersionStrings.JoblogMessage,
JobTriggerToString(jcr->dir_impl->job_trigger).c_str(), TermMsg);
break;
}
Expand Down
14 changes: 7 additions & 7 deletions core/src/dird/verify.cc
Expand Up @@ -435,7 +435,7 @@ void VerifyCleanup(JobControlRecord* jcr, int TermCode)
int JobLevel;
char sdt[50], edt[50];
char ec1[30], ec2[30];
char term_code[100], fd_term_msg[100], sd_term_msg[100];
char term_code[100];
const char* TermMsg;
int msg_type;
const char* Name;
Expand Down Expand Up @@ -492,12 +492,11 @@ void VerifyCleanup(JobControlRecord* jcr, int TermCode)
Name = "";
}

JobstatusToAscii(jcr->dir_impl->FDJobStatus, fd_term_msg,
sizeof(fd_term_msg));
std::string fd_term_msg = JobstatusToAscii(jcr->dir_impl->FDJobStatus);
std::string sd_term_msg = JobstatusToAscii(jcr->dir_impl->SDJobStatus);

switch (JobLevel) {
case L_VERIFY_VOLUME_TO_CATALOG:
JobstatusToAscii(jcr->dir_impl->SDJobStatus, sd_term_msg,
sizeof(sd_term_msg));
Jmsg(jcr, msg_type, 0,
_("%s %s %s (%s):\n"
" Build OS: %s\n"
Expand Down Expand Up @@ -527,7 +526,8 @@ void VerifyCleanup(JobControlRecord* jcr, int TermCode)
jcr->dir_impl->previous_jr.JobId, Name, sdt, edt,
edit_uint64_with_commas(jcr->dir_impl->ExpectedFiles, ec1),
edit_uint64_with_commas(jcr->JobFiles, ec2), jcr->JobErrors,
fd_term_msg, sd_term_msg, kBareosVersionStrings.JoblogMessage,
fd_term_msg.c_str(), sd_term_msg.c_str(),
kBareosVersionStrings.JoblogMessage,
JobTriggerToString(jcr->dir_impl->job_trigger).c_str(), TermMsg);
break;
default:
Expand Down Expand Up @@ -557,7 +557,7 @@ void VerifyCleanup(JobControlRecord* jcr, int TermCode)
jcr->dir_impl->res.client->resource_name_,
jcr->dir_impl->previous_jr.JobId, Name, sdt, edt,
edit_uint64_with_commas(jcr->JobFiles, ec1), jcr->JobErrors,
fd_term_msg, kBareosVersionStrings.JoblogMessage,
fd_term_msg.c_str(), kBareosVersionStrings.JoblogMessage,
JobTriggerToString(jcr->dir_impl->job_trigger).c_str(), TermMsg);
break;
}
Expand Down
4 changes: 3 additions & 1 deletion core/src/include/jcr.h
Expand Up @@ -138,6 +138,7 @@ class JobControlRecord {
void MyThreadSendSignal(int sig); /**< in lib/jcr.c */
void SetKillable(bool killable); /**< in lib/jcr.c */
bool IsKillable() const { return my_thread_killable_; }
void UpdateJobStats();

dlink<JobControlRecord> link; /**< JobControlRecord chain link */
pthread_t my_thread_id{}; /**< Id of thread controlling jcr */
Expand All @@ -159,7 +160,8 @@ class JobControlRecord {
uint32_t JobFiles{}; /**< Number of files written, this job */
uint32_t JobErrors{}; /**< Number of non-fatal errors this job */
uint32_t JobWarnings{}; /**< Number of warning messages */
uint32_t LastRate{}; /**< Last sample bytes/sec */
uint32_t AverageRate{}; /**< Last average bytes/sec */
uint32_t LastRate{}; /**< Last sample bytes/sec */
uint64_t JobBytes{}; /**< Number of bytes processed this job */
uint64_t LastJobBytes{}; /**< Last sample number bytes */
uint64_t ReadBytes{}; /**< Bytes read -- before compression */
Expand Down
17 changes: 17 additions & 0 deletions core/src/lib/jcr.cc
Expand Up @@ -841,6 +841,23 @@ void JcrWalkEnd(JobControlRecord* jcr)
}
}


void JobControlRecord::UpdateJobStats()
{
time_t now = time(nullptr);
int sec;

if (last_time == 0) { last_time = run_time; }
sec = now - last_time;
if (sec <= 0) { sec = 1; }
LastRate = (JobBytes - LastJobBytes) / sec;
time_t totalruntime = now - run_time;
if (totalruntime <= 0) { totalruntime = 1; }
AverageRate = JobBytes / totalruntime;
LastJobBytes = JobBytes;
last_time = now;
}

// Return number of Jobs
int JobCount()
{
Expand Down
116 changes: 53 additions & 63 deletions core/src/lib/util.cc
Expand Up @@ -359,98 +359,88 @@ bool ConvertTimeoutToTimespec(timespec& timeout, int timeout_in_seconds)
}

// Convert a JobStatus code into a human readable form
void JobstatusToAscii(int JobStatus, char* msg, int maxlen)
std::string JobstatusToAscii(int JobStatus)
{
const char* jobstat;
char buf[100];

switch (JobStatus) {
case JS_Created:
jobstat = _("Created");
break;
return "Created";

case JS_Running:
jobstat = _("Running");
break;
return "Running";

case JS_Blocked:
jobstat = _("Blocked");
break;
return "Blocked";

case JS_Terminated:
jobstat = _("OK");
break;
return "OK";

case JS_Incomplete:
jobstat = _("Error: incomplete job");
break;
return "Error: incomplete job";

case JS_FatalError:
jobstat = _("Fatal Error");
break;
return "Fatal Error";

case JS_ErrorTerminated:
jobstat = _("Error");
break;
return "Error";

case JS_Error:
jobstat = _("Non-fatal error");
break;
return "Non-fatal error";

case JS_Warnings:
jobstat = _("OK -- with warnings");
break;
return "OK -- with warnings";

case JS_Canceled:
jobstat = _("Canceled");
break;
return "Canceled";

case JS_Differences:
jobstat = _("Verify differences");
break;
return "Verify differences";

case JS_WaitFD:
jobstat = _("Waiting on FD");
break;
return "Waiting on FD";

case JS_WaitSD:
jobstat = _("Wait on SD");
break;
return "Wait on SD";

case JS_WaitMedia:
jobstat = _("Wait for new Volume");
break;
return "Wait for new Volume";

case JS_WaitMount:
jobstat = _("Waiting for mount");
break;
return "Waiting for mount";

case JS_WaitStoreRes:
jobstat = _("Waiting for Storage resource");
break;
return "Waiting for Storage resource";

case JS_WaitJobRes:
jobstat = _("Waiting for Job resource");
break;
return "Waiting for Job resource";

case JS_WaitClientRes:
jobstat = _("Waiting for Client resource");
break;
return "Waiting for Client resource";

case JS_WaitMaxJobs:
jobstat = _("Waiting on Max Jobs");
break;
return "Waiting on Max Jobs";

case JS_WaitStartTime:
jobstat = _("Waiting for Start Time");
break;
return "Waiting for Start Time";

case JS_WaitPriority:
jobstat = _("Waiting on Priority");
break;
return "Waiting on Priority";

case JS_DataCommitting:
jobstat = _("SD committing Data");
break;
return "SD committing Data";

case JS_DataDespooling:
jobstat = _("SD despooling Data");
break;
return "SD despooling Data";

case JS_AttrDespooling:
jobstat = _("SD despooling Attributes");
break;
return "SD despooling Attributes";

case JS_AttrInserting:
jobstat = _("Dir inserting Attributes");
break;
return "Dir inserting Attributes";
case 0:
return "";
default:
if (JobStatus == 0) {
buf[0] = 0;
} else {
Bsnprintf(buf, sizeof(buf), _("Unknown Job termination status=%d"),
JobStatus);
}
jobstat = buf;
break;
return "Unknown Job termination status=" + std::to_string(JobStatus);
}
bstrncpy(msg, jobstat, maxlen);
}

// Convert Job Termination Status into a string
Expand Down
3 changes: 1 addition & 2 deletions core/src/lib/util.h
Expand Up @@ -58,8 +58,7 @@ char* encode_time(utime_t time, char* buf);
bool ConvertTimeoutToTimespec(timespec& timeout, int timeout_in_seconds);
char* encode_mode(mode_t mode, char* buf);
int DoShellExpansion(char* name, int name_len);
void JobstatusToAscii(int JobStatus, char* msg, int maxlen);
void JobstatusToAsciiGui(int JobStatus, char* msg, int maxlen);
std::string JobstatusToAscii(int JobStatus);
int RunProgram(char* prog, int wait, POOLMEM*& results);
int RunProgramFullOutput(char* prog, int wait, POOLMEM*& results);
char* action_on_purge_to_string(int aop, PoolMem& ret);
Expand Down

0 comments on commit 35c99ec

Please sign in to comment.