summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Gorrod <alexg@wiredtiger.com>2013-05-14 13:01:34 +1000
committerAlex Gorrod <alexg@wiredtiger.com>2013-05-14 13:01:34 +1000
commitacbdc1cd4983ef887ee50e364e8b899bcf5ec716 (patch)
tree6b5c43a6324043a073293f460e88ffaa493f3bec
parent467ebb699f537322ff765d900c5f1cf0b4973016 (diff)
downloadmongo-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.py1
-rw-r--r--src/block/block_read.c9
-rw-r--r--src/btree/bt_handle.c13
-rw-r--r--src/include/flags.h7
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