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()) {
*/
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) {
JCR *jcr = dcr->jcr;
DEVICE *dev = dcr->dev;
DEV_BLOCK *block = dcr->block;
+
+ ASSERT(dev->is_open());
if (dev->at_eot()) {
return false;
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 */