]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/read_record.c
Fix bad bsr generation, make restore forward space more, misc cleanups
[bacula/bacula] / bacula / src / stored / read_record.c
index 8e34737869e67a9e9e3bfeae10f9426496876a92..1ef694db8bc47a0dc5640bd0e1ac7f743f1a1574 100644 (file)
@@ -34,6 +34,7 @@
 #include "stored.h"
 
 static void handle_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sessrec);
+static BSR *position_to_first_file(JCR *jcr, DEVICE *dev);
 #ifdef DEBUG
 static char *rec_state_to_str(DEV_RECORD *rec);
 #endif
@@ -52,6 +53,7 @@ int read_records(JCR *jcr,  DEVICE *dev,
 
    block = new_block(dev);
    recs = new dlist(rec, &rec->link);
+   position_to_first_file(jcr, dev);
 
    for ( ; ok && !done; ) {
       if (job_canceled(jcr)) {
@@ -59,18 +61,13 @@ int read_records(JCR *jcr,  DEVICE *dev,
         break;
       }
       if (!read_block_from_device(jcr, dev, block, CHECK_BLOCK_NUMBERS)) {
-         Dmsg0(20, "!read_record()\n");
         if (dev_state(dev, ST_EOT)) {
            DEV_RECORD *trec = new_record();
 
-            Dmsg3(100, "EOT. stat=%s blk=%d rem=%d\n", rec_state_to_str(rec), 
-                 block->BlockNumber, rec->remainder);
             Jmsg(jcr, M_INFO, 0, "End of Volume at file %u  on device %s, Volume \"%s\"\n", 
                 dev->file, dev_name(dev), jcr->VolumeName);
            if (!mount_cb(jcr, dev, block)) {
                Jmsg(jcr, M_INFO, 0, "End of all volumes.\n");
-               Dmsg3(100, "After mount next vol. stat=%s blk=%d rem=%d\n", rec_state_to_str(rec), 
-                 block->BlockNumber, rec->remainder);
               ok = FALSE;
               /*
                * Create EOT Label so that Media record may
@@ -79,13 +76,10 @@ int read_records(JCR *jcr,  DEVICE *dev,
                */
               trec->FileIndex = EOT_LABEL;
               trec->File = dev->file;
-              trec->Block = rec->Block; /* return block last read */
               ok = record_cb(jcr, dev, block, trec);
               free_record(trec);
               break;
            }
-            Dmsg3(100, "After mount next vol. stat=%s blk=%d rem=%d\n", rec_state_to_str(rec), 
-                 block->BlockNumber, rec->remainder);
            /*
             * We just have a new tape up, now read the label (first record)
             *  and pass it off to the callback routine, then continue
@@ -96,33 +90,15 @@ int read_records(JCR *jcr,  DEVICE *dev,
            handle_session_record(dev, trec, &sessrec);
            ok = record_cb(jcr, dev, block, trec);
            free_record(trec);
-           /*
-            * Now find and position to first file and block 
-            *   on this tape.
-            */
-           if (jcr->bsr) {
-              BSR *bsr;
-
-              jcr->bsr->reposition = true;
-              bsr = find_next_bsr(jcr->bsr, dev);
-              if (bsr) {
-                  Jmsg(jcr, M_INFO, 0, _("Forward spacing to file:block %u:%u.\n"), 
-                    bsr->volfile->sfile, bsr->volblock->sblock);
-                  Dmsg4(100, "Reposition new from (file:block) %d:%d to %d:%d\n",
-                       dev->file, dev->block_num, bsr->volfile->sfile,
-                       bsr->volblock->sblock);
-                 reposition_dev(dev, bsr->volfile->sfile, bsr->volblock->sblock);
-                  Dmsg2(100, "Now at (file:block) %d:%d\n",
-                       dev->file, dev->block_num);
-              }
-           }
+           position_to_first_file(jcr, dev);
            /* After reading label, we must read first data block */
            continue;
 
         } else if (dev_state(dev, ST_EOF)) {
-            Jmsg(jcr, M_INFO, 0, "Got EOF at file %u  on device %s, Volume \"%s\"\n", 
+           if (verbose) {
+               Jmsg(jcr, M_INFO, 0, "Got EOF at file %u  on device %s, Volume \"%s\"\n", 
                  dev->file, dev_name(dev), jcr->VolumeName);
-            Dmsg0(20, "read_record got eof. try again\n");
+           }
            continue;
         } else if (dev_state(dev, ST_SHORT)) {
             Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
@@ -134,16 +110,15 @@ int read_records(JCR *jcr,  DEVICE *dev,
            break;
         }
       }
-      Dmsg5(100, "Read block: dev=%d blk=%d VI=%u VT=%u blen=%d\n", dev->block_num, block->BlockNumber, 
+      Dmsg2(100, "New block at position=(file:block) %d:%d\n", dev->file, dev->block_num);
+      Dmsg5(100, "Read block: devblk=%d blk=%d VI=%u VT=%u blen=%d\n", dev->block_num, block->BlockNumber, 
         block->VolSessionId, block->VolSessionTime, block->block_len);
+#ifdef FAST_BLOCK_REJECTION
+      /* this does not stop when file/block are too big */
       if (!match_bsr_block(jcr->bsr, block)) {
-         Dmsg5(100, "reject Blk=%u blen=%u bVer=%d SessId=%u SessTim=%u\n",
-           block->BlockNumber, block->block_len, block->BlockVer,
-           block->VolSessionId, block->VolSessionTime);
         continue;
       }
-      Dmsg4(100, "Block: %d VI=%u VT=%u blen=%d\n", block->BlockNumber, 
-        block->VolSessionId, block->VolSessionTime, block->block_len);
+#endif
 
       /*
        * Get a new record for each Job as defined by
@@ -163,10 +138,12 @@ int read_records(JCR *jcr,  DEVICE *dev,
          Dmsg2(100, "New record for SI=%d ST=%d\n",
             block->VolSessionId, block->VolSessionTime);
       } else {
+#ifdef xxx
         if (rec->Block != 0 && (rec->Block+1) != block->BlockNumber) {
             Jmsg(jcr, M_ERROR, 0, _("Invalid block number. Expected %u, got %u\n"),
                 rec->Block+1, block->BlockNumber);
         }
+#endif 
       }
       Dmsg3(100, "After mount next vol. stat=%s blk=%d rem=%d\n", rec_state_to_str(rec), 
            block->BlockNumber, rec->remainder);
@@ -220,6 +197,7 @@ int read_records(JCR *jcr,  DEVICE *dev,
            int stat = match_bsr(jcr->bsr, rec, &dev->VolHdr, &sessrec);
            if (stat == -1) { /* no more possible matches */
               done = true;   /* all items found, stop */
+               Dmsg2(100, "All done=(file:block) %d:%d\n", dev->file, dev->block_num);
               break;
            } else if (stat == 0) {  /* no match */
               BSR *bsr;
@@ -237,6 +215,11 @@ int read_records(JCR *jcr,  DEVICE *dev,
                   Dmsg4(100, "Reposition from (file:block) %d:%d to %d:%d\n",
                     dev->file, dev->block_num, bsr->volfile->sfile,
                     bsr->volblock->sblock);
+                 if (verbose) {
+                     Jmsg(jcr, M_INFO, 0, "Reposition from (file:block) %d:%d to %d:%d\n",
+                       dev->file, dev->block_num, bsr->volfile->sfile,
+                       bsr->volblock->sblock);
+                 }
                  reposition_dev(dev, bsr->volfile->sfile, bsr->volblock->sblock);
                  rec->Block = 0;
                   Dmsg2(100, "Now at (file:block) %d:%d\n",
@@ -257,6 +240,7 @@ int read_records(JCR *jcr,  DEVICE *dev,
         ok = record_cb(jcr, dev, block, rec);
       } /* end for loop over records */
    } /* end for loop over blocks */
+   Dmsg2(100, "Position=(file:block) %d:%d\n", dev->file, dev->block_num);
 
    /* Walk down list and free all remaining allocated recs */
    for (rec=(DEV_RECORD *)recs->first(); rec; ) {
@@ -271,6 +255,30 @@ int read_records(JCR *jcr,  DEVICE *dev,
    return ok;
 }
 
+static BSR *position_to_first_file(JCR *jcr, DEVICE *dev)
+{
+   BSR *bsr = NULL;
+   /*
+    * Now find and position to first file and block 
+    *  on this tape.
+    */
+   if (jcr->bsr) {
+      jcr->bsr->reposition = true;
+      bsr = find_next_bsr(jcr->bsr, dev);
+      if (bsr) {
+         Jmsg(jcr, M_INFO, 0, _("Forward spacing to file:block %u:%u.\n"), 
+           bsr->volfile->sfile, bsr->volblock->sblock);
+         Dmsg4(100, "Reposition new from (file:block) %d:%d to %d:%d\n",
+              dev->file, dev->block_num, bsr->volfile->sfile,
+              bsr->volblock->sblock);
+        reposition_dev(dev, bsr->volfile->sfile, bsr->volblock->sblock);
+         Dmsg2(100, "Now at (file:block) %d:%d\n",
+              dev->file, dev->block_num);
+      }
+   }
+   return bsr;
+}
+
 
 static void handle_session_record(DEVICE *dev, DEV_RECORD *rec, SESSION_LABEL *sessrec)
 {