X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fblock.c;h=b407264dcd7239012c1db04fc2e27fa3b6c0d023;hb=22a5d43f2bf48e4d5c056dc17bd7cff90d84290e;hp=89410716a71d7769558dc8e103377464e0f6db1d;hpb=9b08891a1f633f194adc4cbadc512d343f6f46de;p=bacula%2Fbacula diff --git a/bacula/src/stored/block.c b/bacula/src/stored/block.c index 89410716a7..b407264dcd 100644 --- a/bacula/src/stored/block.c +++ b/bacula/src/stored/block.c @@ -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 */