summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@wiredtiger.com>2012-03-09 17:30:56 +1100
committerMichael Cahill <michael.cahill@wiredtiger.com>2012-03-09 17:30:56 +1100
commite85d9528804635e7794ed089192ed935b5cd3703 (patch)
treed9bcde51aba228c57612318fa045656456a48dd3
parent63960ed5463713bace9e283092d6ae894e9f6464 (diff)
downloadmongo-e85d9528804635e7794ed089192ed935b5cd3703.tar.gz
Account for memory allocated when reading a page into cache.
-rw-r--r--src/btree/bt_handle.c2
-rw-r--r--src/btree/bt_page.c49
-rw-r--r--src/btree/bt_read.c7
-rw-r--r--src/btree/bt_slvg.c4
-rw-r--r--src/include/extern.h1
5 files changed, 41 insertions, 22 deletions
diff --git a/src/btree/bt_handle.c b/src/btree/bt_handle.c
index 6cfb2ae8b88..6d3c6ee4f5e 100644
--- a/src/btree/bt_handle.c
+++ b/src/btree/bt_handle.c
@@ -252,7 +252,7 @@ __wt_btree_root_init(WT_SESSION_IMPL *session, WT_ITEM *addr)
WT_RET(__wt_bm_read(session, &tmp, addr->data, addr->size));
/* Build the in-memory version of the page. */
- WT_ERR(__wt_page_inmem(session, NULL, NULL, tmp.mem, &page));
+ WT_ERR(__wt_page_inmem(session, NULL, NULL, tmp.mem, NULL, &page));
/* This page can never leave memory. */
F_SET(page, WT_PAGE_PINNED);
diff --git a/src/btree/bt_page.c b/src/btree/bt_page.c
index 8e334044035..c9d19691b8a 100644
--- a/src/btree/bt_page.c
+++ b/src/btree/bt_page.c
@@ -7,11 +7,11 @@
#include "wt_internal.h"
-static int __inmem_col_fix(WT_SESSION_IMPL *, WT_PAGE *);
-static int __inmem_col_int(WT_SESSION_IMPL *, WT_PAGE *);
-static int __inmem_col_var(WT_SESSION_IMPL *, WT_PAGE *);
-static int __inmem_row_int(WT_SESSION_IMPL *, WT_PAGE *);
-static int __inmem_row_leaf(WT_SESSION_IMPL *, WT_PAGE *);
+static int __inmem_col_fix(WT_SESSION_IMPL *, WT_PAGE *, size_t *);
+static int __inmem_col_int(WT_SESSION_IMPL *, WT_PAGE *, size_t *);
+static int __inmem_col_var(WT_SESSION_IMPL *, WT_PAGE *, size_t *);
+static int __inmem_row_int(WT_SESSION_IMPL *, WT_PAGE *, size_t *);
+static int __inmem_row_leaf(WT_SESSION_IMPL *, WT_PAGE *, size_t *);
/*
* __wt_page_in --
@@ -88,7 +88,8 @@ __wt_page_in_func(
*/
int
__wt_page_inmem(WT_SESSION_IMPL *session,
- WT_PAGE *parent, WT_REF *parent_ref, WT_PAGE_HEADER *dsk, WT_PAGE **pagep)
+ WT_PAGE *parent, WT_REF *parent_ref, WT_PAGE_HEADER *dsk,
+ size_t *inmem_sizep, WT_PAGE **pagep)
{
WT_PAGE *page;
int ret;
@@ -102,6 +103,8 @@ __wt_page_inmem(WT_SESSION_IMPL *session,
* Set the LRU so the page is not immediately selected for eviction.
*/
WT_RET(__wt_calloc_def(session, 1, &page));
+ if (inmem_sizep != NULL)
+ *inmem_sizep = sizeof(*page) + dsk->size;
page->type = dsk->type;
page->parent = parent;
page->ref = parent_ref;
@@ -115,21 +118,21 @@ __wt_page_inmem(WT_SESSION_IMPL *session,
switch (page->type) {
case WT_PAGE_COL_FIX:
page->u.col_fix.recno = dsk->recno;
- WT_ERR(__inmem_col_fix(session, page));
+ WT_ERR(__inmem_col_fix(session, page, inmem_sizep));
break;
case WT_PAGE_COL_INT:
page->u.intl.recno = dsk->recno;
- WT_ERR(__inmem_col_int(session, page));
+ WT_ERR(__inmem_col_int(session, page, inmem_sizep));
break;
case WT_PAGE_COL_VAR:
page->u.col_var.recno = dsk->recno;
- WT_ERR(__inmem_col_var(session, page));
+ WT_ERR(__inmem_col_var(session, page, inmem_sizep));
break;
case WT_PAGE_ROW_INT:
- WT_ERR(__inmem_row_int(session, page));
+ WT_ERR(__inmem_row_int(session, page, inmem_sizep));
break;
case WT_PAGE_ROW_LEAF:
- WT_ERR(__inmem_row_leaf(session, page));
+ WT_ERR(__inmem_row_leaf(session, page, inmem_sizep));
break;
WT_ILLEGAL_VALUE(session);
}
@@ -158,11 +161,13 @@ __wt_page_modify_init(WT_SESSION_IMPL *session, WT_PAGE *page)
* Build in-memory index for fixed-length column-store leaf pages.
*/
static int
-__inmem_col_fix(WT_SESSION_IMPL *session, WT_PAGE *page)
+__inmem_col_fix(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *inmem_sizep)
{
WT_BTREE *btree;
WT_PAGE_HEADER *dsk;
+ WT_UNUSED(inmem_sizep);
+
btree = session->btree;
dsk = page->dsk;
@@ -176,7 +181,7 @@ __inmem_col_fix(WT_SESSION_IMPL *session, WT_PAGE *page)
* Build in-memory index for column-store internal pages.
*/
static int
-__inmem_col_int(WT_SESSION_IMPL *session, WT_PAGE *page)
+__inmem_col_int(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *inmem_sizep)
{
WT_BTREE *btree;
WT_CELL *cell;
@@ -195,6 +200,8 @@ __inmem_col_int(WT_SESSION_IMPL *session, WT_PAGE *page)
*/
WT_RET(__wt_calloc_def(
session, (size_t)dsk->u.entries, &page->u.intl.t));
+ if (inmem_sizep != NULL)
+ *inmem_sizep += dsk->u.entries * sizeof(*page->u.intl.t);
/*
* Walk the page, building references: the page contains value items.
@@ -218,7 +225,7 @@ __inmem_col_int(WT_SESSION_IMPL *session, WT_PAGE *page)
* column-store trees.
*/
static int
-__inmem_col_var(WT_SESSION_IMPL *session, WT_PAGE *page)
+__inmem_col_var(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *inmem_sizep)
{
WT_BTREE *btree;
WT_COL *cip;
@@ -243,6 +250,8 @@ __inmem_col_var(WT_SESSION_IMPL *session, WT_PAGE *page)
*/
WT_RET(__wt_calloc_def(
session, (size_t)dsk->u.entries, &page->u.col_var.d));
+ if (inmem_sizep != NULL)
+ *inmem_sizep += dsk->u.entries * sizeof(*page->u.col_var.d);
/*
* Walk the page, building references: the page contains unsorted value
@@ -279,6 +288,8 @@ __inmem_col_var(WT_SESSION_IMPL *session, WT_PAGE *page)
page->u.col_var.repeats = repeats;
page->u.col_var.nrepeats = nrepeats;
page->entries = dsk->u.entries;
+ if (inmem_sizep != NULL)
+ *inmem_sizep += bytes_allocated;
return (0);
}
@@ -287,7 +298,7 @@ __inmem_col_var(WT_SESSION_IMPL *session, WT_PAGE *page)
* Build in-memory index for row-store internal pages.
*/
static int
-__inmem_row_int(WT_SESSION_IMPL *session, WT_PAGE *page)
+__inmem_row_int(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *inmem_sizep)
{
WT_BTREE *btree;
WT_ITEM *current, *last, *tmp;
@@ -316,6 +327,8 @@ __inmem_row_int(WT_SESSION_IMPL *session, WT_PAGE *page)
*/
nindx = dsk->u.entries / 2;
WT_RET((__wt_calloc_def(session, (size_t)nindx, &page->u.intl.t)));
+ if (inmem_sizep != NULL)
+ *inmem_sizep += nindx * sizeof(*page->u.intl.t);
/*
* Set the number of elements now -- we're about to allocate memory,
@@ -391,6 +404,8 @@ __inmem_row_int(WT_SESSION_IMPL *session, WT_PAGE *page)
WT_ERR(__wt_row_ikey_alloc(session,
WT_PAGE_DISK_OFFSET(page, cell),
current->data, current->size, (WT_IKEY **)&ref->u.key));
+ if (inmem_sizep != NULL)
+ *inmem_sizep += sizeof(WT_IKEY) + current->size;
/*
* Swap buffers if it's not an overflow key, we have a new
@@ -413,7 +428,7 @@ err: __wt_scr_free(&current);
* Build in-memory index for row-store leaf pages.
*/
static int
-__inmem_row_leaf(WT_SESSION_IMPL *session, WT_PAGE *page)
+__inmem_row_leaf(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *inmem_sizep)
{
WT_BTREE *btree;
WT_CELL *cell;
@@ -433,6 +448,8 @@ __inmem_row_leaf(WT_SESSION_IMPL *session, WT_PAGE *page)
*/
WT_RET((__wt_calloc_def(
session, (size_t)dsk->u.entries * 2, &page->u.row.d)));
+ if (inmem_sizep != NULL)
+ *inmem_sizep += 2 * dsk->u.entries * sizeof(*page->u.row.d);
/*
* Walk a row-store page of WT_CELLs, building indices and finding the
diff --git a/src/btree/bt_read.c b/src/btree/bt_read.c
index 6e9691462ba..9ba5346f197 100644
--- a/src/btree/bt_read.c
+++ b/src/btree/bt_read.c
@@ -18,6 +18,7 @@ __wt_cache_read(WT_SESSION_IMPL *session, WT_PAGE *parent, WT_REF *ref)
WT_PAGE *page;
uint32_t size;
const uint8_t *addr;
+ size_t inmem_size;
int ret;
/*
@@ -36,10 +37,10 @@ __wt_cache_read(WT_SESSION_IMPL *session, WT_PAGE *parent, WT_REF *ref)
WT_ERR(__wt_bm_read(session, &tmp, addr, size));
/* Build the in-memory version of the page. */
- WT_ERR(__wt_page_inmem(session, parent, ref, tmp.mem, &page));
+ WT_ERR(__wt_page_inmem(
+ session, parent, ref, tmp.mem, &inmem_size, &page));
- __wt_cache_page_read(
- session, page, sizeof(WT_PAGE) + page->dsk->size);
+ __wt_cache_page_read(session, page, inmem_size);
WT_VERBOSE(session, read,
"page %p, %s", page, __wt_page_type_string(page->type));
diff --git a/src/btree/bt_slvg.c b/src/btree/bt_slvg.c
index cdfd6697697..9c821194eb2 100644
--- a/src/btree/bt_slvg.c
+++ b/src/btree/bt_slvg.c
@@ -514,7 +514,7 @@ __slvg_trk_leaf(WT_SESSION_IMPL *session, WT_PAGE_HEADER *dsk,
* on every leaf page, and if you need to speed up the salvage,
* it's probably a great place to start.
*/
- WT_ERR(__wt_page_inmem(session, NULL, NULL, dsk, &page));
+ WT_ERR(__wt_page_inmem(session, NULL, NULL, dsk, NULL, &page));
WT_ERR(__wt_row_key(session,
page, &page->u.row.d[0], &trk->row_start));
WT_ERR(__wt_row_key(session,
@@ -1559,7 +1559,7 @@ __slvg_row_trk_update_start(
*/
WT_RET(__wt_scr_alloc(session, trk->size, &dsk));
WT_ERR(__wt_bm_read(session, dsk, trk->addr.addr, trk->addr.size));
- WT_ERR(__wt_page_inmem(session, NULL, NULL, dsk->mem, &page));
+ WT_ERR(__wt_page_inmem(session, NULL, NULL, dsk->mem, NULL, &page));
/*
* Walk the page, looking for a key sorting greater than the specified
diff --git a/src/include/extern.h b/src/include/extern.h
index 17f7df8abd2..80a203e9857 100644
--- a/src/include/extern.h
+++ b/src/include/extern.h
@@ -223,6 +223,7 @@ extern int __wt_page_inmem(WT_SESSION_IMPL *session,
WT_PAGE *parent,
WT_REF *parent_ref,
WT_PAGE_HEADER *dsk,
+ size_t *inmem_sizep,
WT_PAGE **pagep);
extern int __wt_page_modify_init(WT_SESSION_IMPL *session, WT_PAGE *page);
extern int __wt_cache_read(WT_SESSION_IMPL *session,