From: Alain Spineux Date: Fri, 19 Feb 2021 10:22:20 +0000 (+0100) Subject: Fix org#2500 .bvfs_get_jobids jobid=X must return X in the list X-Git-Tag: Release-11.0.3~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=44b8d23f6670b70f7292c45d7e33b43b1ac09dad;p=thirdparty%2Fbacula.git Fix org#2500 .bvfs_get_jobids jobid=X must return X in the list - when multiple backups of the same job finish at the exact same time, then .bvfs_get_jobids can "mix" them. - it is not "admissible" to ask bacula for restoring job X and see bacula restore job Y because they are "interchangeable". - this mostly happens in regression test - the code does : If the jobid is specified then force the SQL query to use it. --- diff --git a/bacula/src/cats/sql_get.c b/bacula/src/cats/sql_get.c index 22eaeb7e4..e64fc36ff 100644 --- a/bacula/src/cats/sql_get.c +++ b/bacula/src/cats/sql_get.c @@ -1461,7 +1461,7 @@ bool BDB::bdb_get_accurate_jobids(JCR *jcr, char clientid[50], jobid[50], filesetid[50]; char date[MAX_TIME_LENGTH]; char esc[MAX_ESCAPE_NAME_LENGTH]; - POOL_MEM query(PM_MESSAGE), name(PM_FNAME); + POOL_MEM query(PM_MESSAGE), name(PM_FNAME), aux(PM_FNAME); /* Take the current time as upper limit if nothing else specified */ utime_t StartTime = (jr->StartTime)?jr->StartTime:time(NULL); @@ -1478,11 +1478,13 @@ bool BDB::bdb_get_accurate_jobids(JCR *jcr, V(btemp_mutex); } else { edit_uint64(jcr->JobId, jobid); + Mmsg(aux, " AND JobId = %s ", jobid); } if (jr->Name[0] != 0) { bdb_escape_string(jcr, esc, jr->Name, strlen(jr->Name)); Mmsg(name, " AND Name = '%s' ", esc); + aux.strcat(name.c_str()); } /* First, find the last good Full backup for this job/client/fileset */ @@ -1491,7 +1493,7 @@ bool BDB::bdb_get_accurate_jobids(JCR *jcr, edit_uint64(jr->ClientId, clientid), date, edit_uint64(jr->FileSetId, filesetid), - name.c_str() + aux.c_str() ); if (!bdb_sql_query(query.c_str(), NULL, NULL)) {