]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Fix org#2500 .bvfs_get_jobids jobid=X must return X in the list
authorAlain Spineux <alain@baculasystems.com>
Fri, 19 Feb 2021 10:22:20 +0000 (11:22 +0100)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:03:01 +0000 (09:03 +0100)
- 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.

bacula/src/cats/sql_get.c

index 53a73375433e71899e0e6504a1e6051761f3c0d9..2ea05947e332618513b68082c6db21e2f633e7c5 100644 (file)
@@ -1544,7 +1544,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);
@@ -1561,11 +1561,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 */
@@ -1574,7 +1576,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)) {