summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSami Tolvanen <samitolvanen@google.com>2015-12-17 18:20:11 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-12-17 18:20:11 +0000
commitf2f800951aa3ec920a719556d71c2fbee734209d (patch)
tree710e3d50230941ab6273c5bb8e7e2b4f7e7c3f6d
parentd9f71f5ff33cd268d795f5ff6177f5dbfe5e3578 (diff)
parente9677cc6a7487093d3af11e14d0240b659ebd3be (diff)
downloadextras-f2f800951aa3ec920a719556d71c2fbee734209d.tar.gz
Merge "libfec: handle IO errors"
-rw-r--r--libfec/fec_read.cpp23
1 files changed, 12 insertions, 11 deletions
diff --git a/libfec/fec_read.cpp b/libfec/fec_read.cpp
index 3736e337..2d29da8e 100644
--- a/libfec/fec_read.cpp
+++ b/libfec/fec_read.cpp
@@ -127,20 +127,21 @@ static int __ecc_read(fec_handle *f, void *rs, uint8_t *dest, uint64_t offset,
data_index = i;
}
- /* copy raw data to reconstruct the RS block */
- uint8_t bbuf[FEC_BLOCKSIZE];
+ /* to improve our chances of correcting IO errors, initialize the
+ buffer to zeros even if we are going to read to it later */
+ uint8_t bbuf[FEC_BLOCKSIZE] = {0};
- if (unlikely(interleaved >= e->start) ||
- is_zero(f, interleaved)) {
- memset(bbuf, 0, FEC_BLOCKSIZE);
- } else {
+ if (likely(interleaved < e->start) && !is_zero(f, interleaved)) {
+ /* copy raw data to reconstruct the RS block */
if (!raw_pread(f, bbuf, FEC_BLOCKSIZE, interleaved)) {
- error("failed to read: %s", strerror(errno));
- return -1;
- }
+ warn("failed to read: %s", strerror(errno));
- if (use_erasures && neras <= e->roots &&
- is_erasure(f, interleaved, bbuf)) {
+ /* treat errors as corruption */
+ if (use_erasures && neras <= e->roots) {
+ erasures[neras++] = i;
+ }
+ } else if (use_erasures && neras <= e->roots &&
+ is_erasure(f, interleaved, bbuf)) {
erasures[neras++] = i;
}
}