]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/block.c
kes Apply the recycle patch from Richard Mortimer.
[bacula/bacula] / bacula / src / stored / block.c
index 89410716a71d7769558dc8e103377464e0f6db1d..b407264dcd7239012c1db04fc2e27fa3b6c0d023 100644 (file)
@@ -401,6 +401,7 @@ bool write_block_to_dev(DCR *dcr)
    return true;
 #endif
    ASSERT(block->binbuf == ((uint32_t) (block->bufp - block->buf)));
+   ASSERT(dev->is_open());
 
    /* dump_block(block, "before write"); */
    if (dev->at_weot()) {
@@ -514,16 +515,21 @@ bool write_block_to_dev(DCR *dcr)
     */ 
    int retry = 0;
    errno = 0;
+   stat = 0;
    do {
-      if ((retry > 0 && errno == EBUSY) || retry > 10) {
-         bmicrosleep(0, 50000);    /* pause a bit if busy or lots of errors */
+      if (retry > 0 && stat == -1 && errno == EBUSY) {
+         berrno be;
+         Dmsg4(100, "===== write retry=%d stat=%d errno=%d: ERR=%s\n",
+               retry, stat, errno, be.strerror());
+         bmicrosleep(5, 0);    /* pause a bit if busy or lots of errors */
+         dev->clrerror(-1);
       }
       if (dev->is_tape()) {
          stat = tape_write(dev->fd, block->buf, (size_t)wlen);
       } else {
          stat = write(dev->fd, block->buf, (size_t)wlen);
       }
-   } while (stat == -1 && (errno == EBUSY || errno == EIO) && retry++ < 30);
+   } while (stat == -1 && (errno == EBUSY || errno == EIO) && retry++ < 3);
 
 #ifdef DEBUG_BLOCK_ZEROING
    if (bp[0] == 0 && bp[1] == 0 && bp[2] == 0 && block->buf[12] == 0) {
@@ -904,6 +910,8 @@ bool read_block_from_dev(DCR *dcr, bool check_block_numbers)
    JCR *jcr = dcr->jcr;
    DEVICE *dev = dcr->dev;
    DEV_BLOCK *block = dcr->block;
+
+   ASSERT(dev->is_open());
    
    if (dev->at_eot()) {
       return false;
@@ -951,24 +959,28 @@ reread:
    
    retry = 0;
    errno = 0;
+   stat = 0;
    do {
-      if ((retry > 0 && errno == EBUSY) || retry > 10) {
-         bmicrosleep(0, 50000);    /* pause a bit if busy or lots of errors */
+      if ((retry > 0 && stat == -1 && errno == EBUSY)) {
+         berrno be;
+         Dmsg4(100, "===== read retry=%d stat=%d errno=%d: ERR=%s\n",
+               retry, stat, errno, be.strerror());
+         bmicrosleep(10, 0);    /* pause a bit if busy or lots of errors */
+         dev->clrerror(-1);
       }
       if (dev->is_tape()) {
          stat = tape_read(dev->fd, block->buf, (size_t)block->buf_len);
       } else {
          stat = read(dev->fd, block->buf, (size_t)block->buf_len);
       }
-   } while (stat == -1 && (errno == EBUSY || errno == EINTR || errno == EIO) && retry++ < 30);
+   } while (stat == -1 && (errno == EBUSY || errno == EINTR || errno == EIO) && retry++ < 3);
    if (stat < 0) {
       berrno be;
-      dev->VolCatInfo.VolCatErrors++;
       dev->clrerror(-1);
       Dmsg1(200, "Read device got: ERR=%s\n", be.strerror());
       block->read_len = 0;
-      Mmsg4(dev->errmsg, _("Read error at file:blk %u:%u on device %s. ERR=%s.\n"),
-         dev->file, dev->block_num, dev->print_name(), be.strerror());
+      Mmsg5(dev->errmsg, _("Read error on fd=%d at file:blk %u:%u on device %s. ERR=%s.\n"),
+         dev->fd, dev->file, dev->block_num, dev->print_name(), be.strerror());
       Jmsg(jcr, M_ERROR, 0, "%s", dev->errmsg);
       if (dev->at_eof()) {        /* EOF just seen? */
          dev->set_eot();          /* yes, error => EOT */