]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Improve bscan so that it reinserts file records after prunning
authorMichal Rakowski <michal.rakowski@baculasystems.com>
Thu, 3 Dec 2020 05:58:29 +0000 (06:58 +0100)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:02:59 +0000 (09:02 +0100)
bacula/src/jcr.h
bacula/src/stored/bscan.c

index 3734669cb9d297e0a76ecbee9b296d5c2f110f78..f419d7c3b1dd5ee218397942b9d2c0060123498c 100644 (file)
@@ -524,6 +524,7 @@ public:
    bool Resched;                      /* Job may be rescheduled */
    bool bscan_insert_jobmedia_records; /*Bscan: needs to insert job media records */
    bool bscan_created;                /* Flag for bscan to know if this jcr was created by it or not */
+   bool bscan_files_purged;           /* Flag for bscan to know if this jcr has purged files */
    bool sd_client;                    /* Set if acting as client */
    bool use_new_match_all;            /* TODO: Remove when the match_bsr() will be well tested */
 
index 615cbf552a71103928c9abac1e95d5a30b4cbaf4..7c5cf05ba172d57ef8aa9f9215b1c59ce8da24de 100644 (file)
@@ -736,7 +736,6 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
    switch (rec->maskedStream) {
    case STREAM_UNIX_ATTRIBUTES:
    case STREAM_UNIX_ATTRIBUTES_EX:
-
       if (!unpack_attributes_record(bjcr, rec->Stream, rec->data, rec->data_len, attr)) {
          Emsg0(M_ERROR_TERM, 0, _("Cannot continue.\n"));
       }
@@ -756,11 +755,23 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
                      edit_uint64_with_commas(rec->Addr, ed2),
                      edit_uint64_with_commas(mr.VolBytes, ed3));
       }
-      if (!create_file_attributes_record(mjcr, attr, rec)) {
+
+      mjcr = get_jcr_by_session(rec->VolSessionId, rec->VolSessionTime);
+      if (!mjcr) {
+         Pmsg2(000, _("Could not find SessId=%d SessTime=%d for File record.\n"),
+               rec->VolSessionId, rec->VolSessionTime);
+         break;
+      }
+
+      if (mjcr->bscan_files_purged || mjcr->bscan_created) {
+         // We need to insert file records etiher because job that has files purged or bscan created it
+         if (!create_file_attributes_record(mjcr, attr, rec)) {
          Jmsg2(mjcr, M_ERROR, 0, _("Failed to insert record for file: %s. err: %s\n"),
                attr->fname, db_strerror(db));
-         break;
+         }
       }
+
+      mjcr->dec_use_count(); /* Decrease reference counter increased by get_jcr_by_session call */
       break;
 
    case STREAM_RESTORE_OBJECT:
@@ -1274,6 +1285,11 @@ static JCR *create_job_record(BDB *db, JOB_DBR *jr, SESSION_LABEL *label,
            db_driver, db_name);
    }
 
+   // Bscan needs to be aware if files were previously purged
+   if (jr->PurgedFiles) {
+      mjcr->bscan_files_purged = true;
+   }
+
    if (!update_db) {
       return mjcr;
    }