diff options
author | Matt Kangas <matt.kangas@mongodb.com> | 2014-12-23 08:36:30 -0500 |
---|---|---|
committer | Matt Kangas <matt.kangas@mongodb.com> | 2014-12-23 12:03:28 -0500 |
commit | 55ae19200c7e17249420b4b34799e25b7d1ec92d (patch) | |
tree | 14b03241366fc2d0d53209b4f33371eb64a97d28 /src/third_party/wiredtiger/src/block/block_read.c | |
parent | e50c1c5e1e75f2da16f2b8c216b16afe93d83d8d (diff) | |
download | mongo-55ae19200c7e17249420b4b34799e25b7d1ec92d.tar.gz |
Import wiredtiger-wiredtiger-2.8-rc2-311-gbc7ed41.tar.gz from wiredtiger branch mongodb-2.8
Diffstat (limited to 'src/third_party/wiredtiger/src/block/block_read.c')
-rw-r--r-- | src/third_party/wiredtiger/src/block/block_read.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/src/third_party/wiredtiger/src/block/block_read.c b/src/third_party/wiredtiger/src/block/block_read.c index c528ee4a6aa..c8a26e77341 100644 --- a/src/third_party/wiredtiger/src/block/block_read.c +++ b/src/third_party/wiredtiger/src/block/block_read.c @@ -168,6 +168,9 @@ __wt_block_read_off(WT_SESSION_IMPL *session, WT_BLOCK *block, "off %" PRIuMAX ", size %" PRIu32 ", cksum %" PRIu32, (uintmax_t)offset, size, cksum)); + WT_STAT_FAST_CONN_INCR(session, block_read); + WT_STAT_FAST_CONN_INCRV(session, block_byte_read, size); + /* * Grow the buffer as necessary and read the block. Buffers should be * aligned for reading, but there are lots of buffers (for example, file @@ -188,25 +191,24 @@ __wt_block_read_off(WT_SESSION_IMPL *session, WT_BLOCK *block, buf->size = size; blk = WT_BLOCK_HEADER_REF(buf->mem); - blk->cksum = 0; - page_cksum = __wt_cksum(buf->mem, - F_ISSET(blk, WT_BLOCK_DATA_CKSUM) ? size : WT_BLOCK_COMPRESS_SKIP); - if (cksum != page_cksum) { - if (!F_ISSET(session, WT_SESSION_SALVAGE_CORRUPT_OK)) - __wt_errx(session, - "read checksum error [%" - PRIu32 "B @ %" PRIuMAX ", %" - PRIu32 " != %" PRIu32 "]", - size, (uintmax_t)offset, cksum, page_cksum); - - /* Panic if a checksum fails during an ordinary read. */ - return (block->verify || - F_ISSET(session, WT_SESSION_SALVAGE_CORRUPT_OK) ? - WT_ERROR : - __wt_illegal_value(session, block->name)); + page_cksum = blk->cksum; + if (page_cksum == cksum) { + blk->cksum = 0; + page_cksum = __wt_cksum(buf->mem, + F_ISSET(blk, WT_BLOCK_DATA_CKSUM) ? + size : WT_BLOCK_COMPRESS_SKIP); + if (page_cksum == cksum) + return (0); } - WT_STAT_FAST_CONN_INCR(session, block_read); - WT_STAT_FAST_CONN_INCRV(session, block_byte_read, size); - return (0); + if (!F_ISSET(session, WT_SESSION_SALVAGE_CORRUPT_OK)) + __wt_errx(session, + "read checksum error [%" PRIu32 "B @ %" PRIuMAX ", %" + PRIu32 " != %" PRIu32 "]", + size, (uintmax_t)offset, cksum, page_cksum); + + /* Panic if a checksum fails during an ordinary read. */ + return (block->verify || + F_ISSET(session, WT_SESSION_SALVAGE_CORRUPT_OK) ? + WT_ERROR : __wt_illegal_value(session, block->name)); } |