diff options
author | Alex Gorrod <alexander.gorrod@mongodb.com> | 2015-12-09 15:31:31 +1100 |
---|---|---|
committer | Alex Gorrod <alexander.gorrod@mongodb.com> | 2015-12-09 15:31:31 +1100 |
commit | f468b29dc717eb65bf56aefab97f085e22b8afa2 (patch) | |
tree | 962a6b51fa980f4c72a546667859c58b0ed9311f /src | |
parent | b04ebc77028b45312de76db0e3c2243db0487b18 (diff) | |
parent | e056120130da0752c1957f804ae670c5d45ec683 (diff) | |
download | mongo-f468b29dc717eb65bf56aefab97f085e22b8afa2.tar.gz |
Merge pull request #2358 from wiredtiger/wt-2258-preload-directio
Diffstat (limited to 'src')
-rw-r--r-- | src/block/block_read.c | 40 | ||||
-rw-r--r-- | src/include/extern.h | 2 |
2 files changed, 22 insertions, 20 deletions
diff --git a/src/block/block_read.c b/src/block/block_read.c index 4b32e02a73a..ca7797f17af 100644 --- a/src/block/block_read.c +++ b/src/block/block_read.c @@ -13,10 +13,11 @@ * Pre-load a page. */ int -__wt_bm_preload(WT_BM *bm, - WT_SESSION_IMPL *session, const uint8_t *addr, size_t addr_size) +__wt_bm_preload( + WT_BM *bm, WT_SESSION_IMPL *session, const uint8_t *addr, size_t addr_size) { WT_BLOCK *block; + WT_DECL_ITEM(tmp); WT_DECL_RET; wt_off_t offset; uint32_t cksum, size; @@ -24,7 +25,15 @@ __wt_bm_preload(WT_BM *bm, WT_UNUSED(addr_size); block = bm->block; - ret = EINVAL; /* Play games due to conditional compilation */ + + /* + * Turn off pre-load when direct I/O is configured for the file, + * the kernel cache isn't interesting. + */ + if (block->fh->direct_io) + return (0); + + WT_STAT_FAST_CONN_INCR(session, block_preload); /* Crack the cookie. */ WT_RET(__wt_block_buffer_to_addr(block, addr, &offset, &size, &cksum)); @@ -32,26 +41,19 @@ __wt_bm_preload(WT_BM *bm, /* Check for a mapped block. */ mapped = bm->map != NULL && offset + size <= (wt_off_t)bm->maplen; if (mapped) - WT_RET(__wt_mmap_preload( + return (__wt_mmap_preload( session, (uint8_t *)bm->map + offset, size)); - else { + #ifdef HAVE_POSIX_FADVISE - ret = posix_fadvise(block->fh->fd, - (wt_off_t)offset, (wt_off_t)size, POSIX_FADV_WILLNEED); + if (posix_fadvise(block->fh->fd, + (wt_off_t)offset, (wt_off_t)size, POSIX_FADV_WILLNEED) == 0) + return (0); #endif - if (ret != 0) { - WT_DECL_ITEM(tmp); - WT_RET(__wt_scr_alloc(session, size, &tmp)); - ret = __wt_block_read_off( - session, block, tmp, offset, size, cksum); - __wt_scr_free(session, &tmp); - WT_RET(ret); - } - } - WT_STAT_FAST_CONN_INCR(session, block_preload); - - return (0); + WT_RET(__wt_scr_alloc(session, size, &tmp)); + ret = __wt_block_read_off(session, block, tmp, offset, size, cksum); + __wt_scr_free(session, &tmp); + return (ret); } /* diff --git a/src/include/extern.h b/src/include/extern.h index 3efd1d7fd46..573a45336cd 100644 --- a/src/include/extern.h +++ b/src/include/extern.h @@ -51,7 +51,7 @@ extern int __wt_block_close(WT_SESSION_IMPL *session, WT_BLOCK *block); extern int __wt_desc_init(WT_SESSION_IMPL *session, WT_FH *fh, uint32_t allocsize); extern void __wt_block_stat(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_DSRC_STATS *stats); extern int __wt_block_manager_size( WT_SESSION_IMPL *session, const char *filename, WT_DSRC_STATS *stats); -extern int __wt_bm_preload(WT_BM *bm, WT_SESSION_IMPL *session, const uint8_t *addr, size_t addr_size); +extern int __wt_bm_preload( WT_BM *bm, WT_SESSION_IMPL *session, const uint8_t *addr, size_t addr_size); extern int __wt_bm_read(WT_BM *bm, WT_SESSION_IMPL *session, WT_ITEM *buf, const uint8_t *addr, size_t addr_size); extern int __wt_block_read_off_blind( WT_SESSION_IMPL *session, WT_BLOCK *block, WT_ITEM *buf, wt_off_t offset); extern int __wt_block_read_off(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_ITEM *buf, wt_off_t offset, uint32_t size, uint32_t cksum); |