diff options
author | Alex Gorrod <alexg@wiredtiger.com> | 2013-05-14 13:01:34 +1000 |
---|---|---|
committer | Alex Gorrod <alexg@wiredtiger.com> | 2013-05-14 13:01:34 +1000 |
commit | acbdc1cd4983ef887ee50e364e8b899bcf5ec716 (patch) | |
tree | 6b5c43a6324043a073293f460e88ffaa493f3bec | |
parent | 467ebb699f537322ff765d900c5f1cf0b4973016 (diff) | |
download | mongo-acbdc1cd4983ef887ee50e364e8b899bcf5ec716.tar.gz |
Preload internal pages into file system cache with compression.
Previously the functionality only worked without compression enabled.
-rw-r--r-- | dist/flags.py | 1 | ||||
-rw-r--r-- | src/block/block_read.c | 9 | ||||
-rw-r--r-- | src/btree/bt_handle.c | 13 | ||||
-rw-r--r-- | src/include/flags.h | 7 |
4 files changed, 17 insertions, 13 deletions
diff --git a/dist/flags.py b/dist/flags.py index 607c7f13aa9..9be60903ee7 100644 --- a/dist/flags.py +++ b/dist/flags.py @@ -70,6 +70,7 @@ flags = { 'SESSION_INTERNAL', 'SESSION_NO_CACHE', 'SESSION_NO_CACHE_CHECK', + 'SESSION_PRELOAD_PAGES', 'SESSION_SALVAGE_QUIET_ERR', 'SESSION_SCHEMA_LOCKED', ], diff --git a/src/block/block_read.c b/src/block/block_read.c index bfb39dc567d..bbbd572bd8f 100644 --- a/src/block/block_read.c +++ b/src/block/block_read.c @@ -16,9 +16,10 @@ __wt_bm_read(WT_BM *bm, WT_SESSION_IMPL *session, WT_ITEM *buf, const uint8_t *addr, uint32_t addr_size) { WT_BLOCK *block; - off_t offset; - uint32_t size, cksum; int mapped; + off_t offset; + uint32_t cksum, size; + size_t preload_size; WT_UNUSED(addr_size); block = bm->block; @@ -49,7 +50,9 @@ __wt_bm_read(WT_BM *bm, WT_SESSION_IMPL *session, buf->size = size; F_SET(buf, WT_ITEM_MAPPED); - WT_RET(__wt_mmap_preload(session, buf->mem, buf->size)); + preload_size = F_ISSET(session, WT_SESSION_PRELOAD_PAGES) ? + bm->maplen - offset : buf->size; + WT_RET(__wt_mmap_preload(session, buf->mem, preload_size)); WT_CSTAT_INCR(session, block_map_read); WT_CSTAT_INCRV(session, block_byte_map_read, size); diff --git a/src/btree/bt_handle.c b/src/btree/bt_handle.c index 608796ac34f..87b86372389 100644 --- a/src/btree/bt_handle.c +++ b/src/btree/bt_handle.c @@ -496,6 +496,7 @@ __wt_btree_evictable(WT_SESSION_IMPL *session, int on) static int __btree_warm_cache(WT_SESSION_IMPL *session) { + WT_DECL_RET; WT_BTREE *btree; WT_BM *bm; WT_PAGE *page; @@ -503,7 +504,7 @@ __btree_warm_cache(WT_SESSION_IMPL *session) btree = S2BT(session); bm = btree->bm; - if (bm->map == NULL || btree->compressor != NULL) + if (bm->map == NULL) return (0); /* @@ -513,15 +514,13 @@ __btree_warm_cache(WT_SESSION_IMPL *session) * child, ending with the root. */ page = NULL; - WT_RET(__wt_tree_walk(session, &page, 0)); + F_SET(session, WT_SESSION_PRELOAD_PAGES); + ret = __wt_tree_walk(session, &page, 0); + F_CLR(session, WT_SESSION_PRELOAD_PAGES); + WT_RET(ret); if (page == NULL) return (WT_NOTFOUND); - if (page->parent->dsk < btree->root_page->dsk) - WT_RET(__wt_mmap_preload( - session, page->parent->dsk, - WT_PTRDIFF(btree->root_page->dsk, page->parent->dsk))); - return (__wt_page_release(session, page)); } diff --git a/src/include/flags.h b/src/include/flags.h index 3f4658b56b1..9df89c2930d 100644 --- a/src/include/flags.h +++ b/src/include/flags.h @@ -13,9 +13,10 @@ #define WT_DIRECTIO_DATA 0x00000002 #define WT_DIRECTIO_LOG 0x00000001 #define WT_EVICTION_SERVER_LOCKED 0x00000004 -#define WT_SESSION_INTERNAL 0x00000010 -#define WT_SESSION_NO_CACHE 0x00000008 -#define WT_SESSION_NO_CACHE_CHECK 0x00000004 +#define WT_SESSION_INTERNAL 0x00000020 +#define WT_SESSION_NO_CACHE 0x00000010 +#define WT_SESSION_NO_CACHE_CHECK 0x00000008 +#define WT_SESSION_PRELOAD_PAGES 0x00000004 #define WT_SESSION_SALVAGE_QUIET_ERR 0x00000002 #define WT_SESSION_SCHEMA_LOCKED 0x00000001 #define WT_SKIP_UPDATE_ERR 0x00000002 |