From: Kern Sibbald Date: Mon, 10 Dec 2007 17:54:41 +0000 (+0000) Subject: Correct a problem where the maximum concurrent storage jobs counter gets out of sync... X-Git-Tag: Release-2.2.7~18 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=04bcbe30e026e41c83f4f0f9c2366960890832f9;p=bacula%2Fbacula Correct a problem where the maximum concurrent storage jobs counter gets out of sync during restore jobs causing jobs to 'wait on max Storage jobs'. Fixes bug #1009. git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/branches/Branch-2.2@6033 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/examples/nagios/nagios_plugin_check_bacula.tgz b/bacula/examples/nagios/nagios_plugin_check_bacula.tgz index 229dad743b..e800236da5 100644 Binary files a/bacula/examples/nagios/nagios_plugin_check_bacula.tgz and b/bacula/examples/nagios/nagios_plugin_check_bacula.tgz differ diff --git a/bacula/src/cats/create_postgresql_database.in b/bacula/src/cats/create_postgresql_database.in index 5b82375c88..0debbc67ef 100644 --- a/bacula/src/cats/create_postgresql_database.in +++ b/bacula/src/cats/create_postgresql_database.in @@ -9,9 +9,15 @@ db_name=@db_name@ # use SQL_ASCII to be able to put any filename into # the database even those created with unusual character sets ENCODING="ENCODING 'SQL_ASCII'" + # use UTF8 if you are using standard Unix/Linux LANG specifications # that use UTF8 -- this is normally the default and *should* be -# your standard. Bacula consoles work correctly *only* with UTF8. +# your standard. Bacula works correctly *only* with correct UTF8. +# +# Note, with this encoding, if you have any "weird" filenames on +# your system (names generated from Win32 or Mac OS), you may +# get Bacula batch insert failures. +# #ENCODING="ENCODING 'UTF8'" diff --git a/bacula/src/dird/jobq.c b/bacula/src/dird/jobq.c index 768d6b34c8..7013f48979 100644 --- a/bacula/src/dird/jobq.c +++ b/bacula/src/dird/jobq.c @@ -1,22 +1,3 @@ -/* - * Bacula job queue routines. - * - * This code consists of three queues, the waiting_jobs - * queue, where jobs are initially queued, the ready_jobs - * queue, where jobs are placed when all the resources are - * allocated and they can immediately be run, and the - * running queue where jobs are placed when they are - * running. - * - * Kern Sibbald, July MMIII - * - * Version $Id$ - * - * This code was adapted from the Bacula workq, which was - * adapted from "Programming with POSIX Threads", by - * David R. Butenhof - * - */ /* Bacula® - The Network Backup Solution @@ -44,6 +25,25 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * Bacula job queue routines. + * + * This code consists of three queues, the waiting_jobs + * queue, where jobs are initially queued, the ready_jobs + * queue, where jobs are placed when all the resources are + * allocated and they can immediately be run, and the + * running queue where jobs are placed when they are + * running. + * + * Kern Sibbald, July MMIII + * + * Version $Id$ + * + * This code was adapted from the Bacula workq, which was + * adapted from "Programming with POSIX Threads", by + * David R. Butenhof + * + */ #include "bacula.h" #include "dird.h" @@ -453,6 +453,7 @@ void *jobq_server(void *arg) } } jq->running_jobs->append(je); +// set_jcr_in_tsd(jcr); Dmsg1(2300, "Took jobid=%d from ready and appended to run\n", jcr->JobId); /* Release job queue lock */ @@ -682,14 +683,13 @@ static bool acquire_resources(JCR *jcr) jcr->acquired_resource_locks = false; if (jcr->rstore) { Dmsg1(200, "Rstore=%s\n", jcr->rstore->name()); - if (jcr->rstore->NumConcurrentJobs == 0 && - jcr->rstore->NumConcurrentJobs < jcr->rstore->MaxConcurrentJobs) { - /* Simple case, first job */ + /* + * Let only one Restore/Verify job run at a time regardless + * of MaxConcurrentjobs. + */ + if (jcr->rstore->NumConcurrentJobs == 0) { jcr->rstore->NumConcurrentJobs = 1; Dmsg0(200, "Set rncj=1\n"); - } else if (jcr->rstore->NumConcurrentJobs < jcr->rstore->MaxConcurrentJobs) { - jcr->rstore->NumConcurrentJobs++; - Dmsg1(200, "Inc rncj=%d\n", jcr->rstore->NumConcurrentJobs); } else { Dmsg1(200, "Fail rncj=%d\n", jcr->rstore->NumConcurrentJobs); set_jcr_job_status(jcr, JS_WaitStoreRes); @@ -700,7 +700,7 @@ static bool acquire_resources(JCR *jcr) if (jcr->wstore) { Dmsg1(200, "Wstore=%s\n", jcr->wstore->name()); if (jcr->rstore == jcr->wstore) { /* deadlock */ - jcr->rstore->NumConcurrentJobs--; /* back out rstore */ + jcr->rstore->NumConcurrentJobs = 0; /* back out rstore */ Jmsg(jcr, M_FATAL, 0, _("Job canceled. Attempt to read and write same device.\n" " Read storage \"%s\" (From %s) -- Write storage \"%s\" (From %s)\n"), jcr->rstore->name(), jcr->rstore_source, jcr->wstore->name(), jcr->wstore_source); @@ -716,7 +716,7 @@ static bool acquire_resources(JCR *jcr) jcr->wstore->NumConcurrentJobs++; Dmsg1(200, "Inc wncj=%d\n", jcr->wstore->NumConcurrentJobs); } else if (jcr->rstore) { - jcr->rstore->NumConcurrentJobs--; /* back out rstore */ + jcr->rstore->NumConcurrentJobs = 0; /* back out rstore */ Dmsg1(200, "Fail wncj=%d\n", jcr->wstore->NumConcurrentJobs); skip_this_jcr = true; } else { @@ -738,7 +738,7 @@ static bool acquire_resources(JCR *jcr) Dmsg1(200, "Dec wncj=%d\n", jcr->wstore->NumConcurrentJobs); } if (jcr->rstore) { - jcr->rstore->NumConcurrentJobs--; + jcr->rstore->NumConcurrentJobs = 0; Dmsg1(200, "Dec rncj=%d\n", jcr->rstore->NumConcurrentJobs); } set_jcr_job_status(jcr, JS_WaitClientRes); @@ -753,7 +753,7 @@ static bool acquire_resources(JCR *jcr) Dmsg1(200, "Dec wncj=%d\n", jcr->wstore->NumConcurrentJobs); } if (jcr->rstore) { - jcr->rstore->NumConcurrentJobs--; + jcr->rstore->NumConcurrentJobs = 0; Dmsg1(200, "Dec rncj=%d\n", jcr->rstore->NumConcurrentJobs); } jcr->client->NumConcurrentJobs--; diff --git a/bacula/technotes-2.1 b/bacula/technotes-2.1 index 2517a65646..0c7e94e952 100644 --- a/bacula/technotes-2.1 +++ b/bacula/technotes-2.1 @@ -1,6 +1,10 @@ Technical notes on version 2.2 General: +10Dec07 +kes This patch corrects a problem where the maximum concurrent storage + jobs counter gets out of sync during restore jobs causing jobs to + 'wait on max Storage jobs'. This patch fixes bug #1009. 08Dec07 kes Add new include to postgresql.c suggested by Marc Cousins so that it compiles correctly with pgre version 8.3. Also fix