diff options
author | Michael Cahill <michael.cahill@wiredtiger.com> | 2012-03-09 17:30:56 +1100 |
---|---|---|
committer | Michael Cahill <michael.cahill@wiredtiger.com> | 2012-03-09 17:30:56 +1100 |
commit | e85d9528804635e7794ed089192ed935b5cd3703 (patch) | |
tree | d9bcde51aba228c57612318fa045656456a48dd3 | |
parent | 63960ed5463713bace9e283092d6ae894e9f6464 (diff) | |
download | mongo-e85d9528804635e7794ed089192ed935b5cd3703.tar.gz |
Account for memory allocated when reading a page into cache.
-rw-r--r-- | src/btree/bt_handle.c | 2 | ||||
-rw-r--r-- | src/btree/bt_page.c | 49 | ||||
-rw-r--r-- | src/btree/bt_read.c | 7 | ||||
-rw-r--r-- | src/btree/bt_slvg.c | 4 | ||||
-rw-r--r-- | src/include/extern.h | 1 |
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(¤t); * 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, |