Release Notes for Bacula 1.34.1
- Bacula code: Total files = 306 Total lines = 91,155 (*.h *.c *.in)
+ Bacula code: Total files = 343 Total lines = 98,503 (*.h *.c *.in)
Changes for 1.34.1:
- Autochanger users, please note you must add %d to the end of the
changer command line in your Device resource in your bacula-sd.conf
file.
+- Fixed a major race condition in the job scheduler when multiple
+ simultaneous jobs is enabled. This occurred only when on job had
+ blocked another because of resource usage.
+- Changed the backup report to indicate "Backup OK -- with warnings
+ if any warning messages were generated.
+- Change output of restore report to indicate:
+ "Restore OK -- warning file count mismatch"
- Make backup report say "Backup OK with warnings" if either FD or SD
report any non-fatal errors.
- Modify bscan to print some elementary statistics (#Jobs, #Files, ...)
- Add multiple-media-types.txt
- look at mxt-changer.html
+- Why is Files Expected zero on restore from tape?
+
For version 1.35:
- Finish SIGHUP work.
- Check that all change in wait status in the SD are
@$(RMF) core core.* a.out *.o *.bak *~ *.intpro *.extpro 1 2 3
@$(RMF) AUTHORS ChangeLog Makefile.am NEWS README acconfig.h autogen.sh
@$(RMF) configure.in stamp.h
+ @$(RMF) -r po
(cd gnome-console; $(MAKE) clean)
(cd gnome2-console; $(MAKE) clean)
init_stack_dump();
my_name_is(argc, argv, "bconsole");
- textdomain("bacula-console");
+ textdomain("bacula");
init_msg(NULL, NULL);
working_directory = "/tmp";
args = get_pool_memory(PM_FNAME);
#!/bin/sh
rm -f 1
touch 1
-for i in . console gnome-console cats dird filed filed/win32 win32 findlib lib stored tools; do
+for i in . console gnome-console cats dird filed filed/win32 \
+ win32 win32/compat findlib lib wx-console stored tools; do
ls -1 $i/*.c $i/*.cpp $i/*.h $i/*.in 2>/dev/null >>1
done
cat 1 | $HOME/bin/lines
switch (jcr->JobStatus) {
case JS_Terminated:
if (jcr->Errors || jcr->SDErrors) {
- term_msg = _("Backup OK with warnings");
+ term_msg = _("Backup OK -- with warnings");
} else {
term_msg = _("Backup OK");
}
init_stack_dump();
my_name_is(argc, argv, "bacula-dir");
- textdomain("bacula-dir");
+ textdomain("bacula");
init_msg(NULL, NULL); /* initialize message handler */
init_reload();
daemon_start_time = time(NULL);
jobq_t *jq = (jobq_t *)arg;
jobq_item_t *je; /* job entry in queue */
int stat;
- bool timedout;
+ bool timedout = false;
bool work = true;
Dmsg0(300, "Start jobq_server\n");
struct timezone tz;
Dmsg0(300, "Top of for loop\n");
- timedout = false;
- gettimeofday(&tv, &tz);
- timeout.tv_nsec = 0;
- timeout.tv_sec = tv.tv_sec + 4;
-
- while (!work && !jq->quit) {
- /*
- * Wait 4 seconds, then if no more work, exit
- */
- Dmsg0(300, "pthread_cond_timedwait()\n");
- stat = pthread_cond_timedwait(&jq->work, &jq->mutex, &timeout);
- if (stat == ETIMEDOUT) {
- Dmsg0(300, "timedwait timedout.\n");
- timedout = true;
+ if (!work && !jq->quit) {
+ gettimeofday(&tv, &tz);
+ timeout.tv_nsec = 0;
+ timeout.tv_sec = tv.tv_sec + 4;
+
+ while (!jq->quit) {
+ /*
+ * Wait 4 seconds, then if no more work, exit
+ */
+ Dmsg0(300, "pthread_cond_timedwait()\n");
+ stat = pthread_cond_timedwait(&jq->work, &jq->mutex, &timeout);
+ if (stat == ETIMEDOUT) {
+ Dmsg0(300, "timedwait timedout.\n");
+ timedout = true;
+ break;
+ } else if (stat != 0) {
+ /* This shouldn't happen */
+ Dmsg0(300, "This shouldn't happen\n");
+ jq->num_workers--;
+ pthread_mutex_unlock(&jq->mutex);
+ return NULL;
+ }
break;
- } else if (stat != 0) {
- /* This shouldn't happen */
- Dmsg0(300, "This shouldn't happen\n");
- jq->num_workers--;
- pthread_mutex_unlock(&jq->mutex);
- return NULL;
- }
- break;
- }
+ }
+ }
/*
* If anything is in the ready queue, run it
*/
jq->num_workers--;
break;
}
- work = !jq->ready_jobs->empty() || !jq->waiting_jobs->empty();
+ work = !jq->ready_jobs->empty() || !jq->waiting_jobs->empty();
+ if (work) {
+ /*
+ * If a job is waiting on a Resource, don't consume all
+ * the CPU time looping looking for work, and even more
+ * important, release the lock so that a job that has
+ * terminated can give us the resource.
+ */
+ pthread_mutex_unlock(&jq->mutex);
+ bmicrosleep(2, 0); /* pause for 2 seconds */
+ pthread_mutex_unlock(&jq->mutex);
+ /* Recompute work as something may have changed in last 2 secs */
+ work = !jq->ready_jobs->empty() || !jq->waiting_jobs->empty();
+ }
Dmsg1(300, "Loop again. work=%d\n", work);
} /* end of big for loop */
msg_type = M_INFO; /* by default INFO message */
switch (TermCode) {
case JS_Terminated:
- term_msg = _("Restore OK");
+ if (jcr->ExpectedFiles > jcr->jr.JobFiles) {
+ term_msg = _("Restore OK -- warning file count mismatch");
+ } else {
+ term_msg = _("Restore OK");
+ }
break;
case JS_FatalError:
case JS_ErrorTerminated:
init_stack_dump();
my_name_is(argc, argv, "bacula-fd");
- textdomain("bacula-fd");
+ textdomain("bacula");
init_msg(NULL, NULL);
daemon_start_time = time(NULL);
init_stack_dump();
my_name_is(argc, argv, "bacula-sd");
- textdomain("bacula-sd");
+ textdomain("bacula");
init_msg(NULL, NULL);
daemon_start_time = time(NULL);
#undef VERSION
#define VERSION "1.35.0"
#define VSTRING "1"
-#define BDATE "16 Apr 2004"
-#define LSMDATE "16Apr04"
+#define BDATE "18 Apr 2004"
+#define LSMDATE "18Apr04"
/* Debug flags */
#undef DEBUG
windres.exe -i wx-console_private.rc -I rc -o wx-console_private.res -O coff
clean:
- @$(RMF) $(OBJ) wx-console $(WIN32RES)
+ @$(RMF) $(CONSOBJS) wx-console $(WIN32RES)
distclean: clean
$(RMF) Makefile