summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Gorrod <alexander.gorrod@mongodb.com>2015-12-09 15:31:31 +1100
committerAlex Gorrod <alexander.gorrod@mongodb.com>2015-12-09 15:31:31 +1100
commitf468b29dc717eb65bf56aefab97f085e22b8afa2 (patch)
tree962a6b51fa980f4c72a546667859c58b0ed9311f /src
parentb04ebc77028b45312de76db0e3c2243db0487b18 (diff)
parente056120130da0752c1957f804ae670c5d45ec683 (diff)
downloadmongo-f468b29dc717eb65bf56aefab97f085e22b8afa2.tar.gz
Merge pull request #2358 from wiredtiger/wt-2258-preload-directio
Diffstat (limited to 'src')
-rw-r--r--src/block/block_read.c40
-rw-r--r--src/include/extern.h2
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);