diff options
author | Keith Bostic <keith@wiredtiger.com> | 2013-03-07 12:00:00 -0500 |
---|---|---|
committer | Keith Bostic <keith@wiredtiger.com> | 2013-03-07 12:00:00 -0500 |
commit | fa4118cf53d73da4b9e3652a575cf9d624aaf63c (patch) | |
tree | 937a11ed21a2f7c833ff4cc74479990061817e28 | |
parent | e2852e75a327baac9c8975638da59bf06107797b (diff) | |
download | mongo-fa4118cf53d73da4b9e3652a575cf9d624aaf63c.tar.gz |
Include newly created split-merge page WT_ADDR and WT_IKEY structures in
the page's memory footprint.
-rw-r--r-- | src/btree/bt_handle.c | 3 | ||||
-rw-r--r-- | src/btree/bt_page.c | 2 | ||||
-rw-r--r-- | src/btree/bt_slvg.c | 9 | ||||
-rw-r--r-- | src/btree/rec_merge.c | 4 | ||||
-rw-r--r-- | src/btree/rec_write.c | 19 | ||||
-rw-r--r-- | src/btree/row_key.c | 22 | ||||
-rw-r--r-- | src/include/extern.h | 8 |
7 files changed, 47 insertions, 20 deletions
diff --git a/src/btree/bt_handle.c b/src/btree/bt_handle.c index 00f9e11ef2f..77f7f253f8d 100644 --- a/src/btree/bt_handle.c +++ b/src/btree/bt_handle.c @@ -398,7 +398,8 @@ __btree_tree_open_empty(WT_SESSION_IMPL *session, int creation) WT_ERR(__wt_btree_leaf_create(session, root, ref, &leaf)); ref->addr = NULL; ref->state = WT_REF_MEM; - WT_ERR(__wt_row_ikey_alloc(session, 0, "", 1, &ref->u.key)); + WT_ERR( + __wt_row_ikey_incr(session, leaf, 0, "", 1, &ref->u.key)); break; WT_ILLEGAL_VALUE_ERR(session); } diff --git a/src/btree/bt_page.c b/src/btree/bt_page.c index 7fd50be3a4a..95970289cd8 100644 --- a/src/btree/bt_page.c +++ b/src/btree/bt_page.c @@ -453,7 +453,7 @@ __inmem_row_int(WT_SESSION_IMPL *session, WT_PAGE *page, size_t *inmem_sizep) * for reconciliation, the row-store reconciliation function * depends on keys always be instantiated. */ - WT_ERR(__wt_row_ikey_alloc(session, + WT_ERR(__wt_row_ikey(session, WT_PAGE_DISK_OFFSET(page, cell), current->data, current->size, &ref->u.key)); *inmem_sizep += sizeof(WT_IKEY) + current->size; diff --git a/src/btree/bt_slvg.c b/src/btree/bt_slvg.c index ca3419d57f1..44f274c1720 100644 --- a/src/btree/bt_slvg.c +++ b/src/btree/bt_slvg.c @@ -1706,9 +1706,8 @@ __slvg_row_build_internal( WT_ERR(__slvg_row_build_leaf( session, trk, page, ref, ss)); } else - WT_ERR(__wt_row_ikey_alloc(session, 0, - trk->row_start.data, - trk->row_start.size, + WT_ERR(__wt_row_ikey_incr(session, page, 0, + trk->row_start.data, trk->row_start.size, &ref->u.key)); ++ref; } @@ -1829,8 +1828,8 @@ __slvg_row_build_leaf(WT_SESSION_IMPL *session, */ rip = page->u.row.d + skip_start; WT_ERR(__wt_row_key(session, page, rip, key, 0)); - WT_ERR( - __wt_row_ikey_alloc(session, 0, key->data, key->size, &ref->u.key)); + WT_ERR(__wt_row_ikey_incr( + session, page, 0, key->data, key->size, &ref->u.key)); /* * Discard backing overflow pages for any items being discarded that diff --git a/src/btree/rec_merge.c b/src/btree/rec_merge.c index da9252d585f..86142ccf1a8 100644 --- a/src/btree/rec_merge.c +++ b/src/btree/rec_merge.c @@ -245,8 +245,8 @@ __merge_promote_key(WT_SESSION_IMPL *session, WT_REF *ref) child_ref = &page->u.intl.t[0]; ikey = child_ref->u.key; WT_ASSERT(session, ikey != NULL); - return (__wt_row_ikey_alloc( - session, 0, WT_IKEY_DATA(ikey), ikey->size, &ref->u.key)); + return (__wt_row_ikey_incr(session, + page, 0, WT_IKEY_DATA(ikey), ikey->size, &ref->u.key)); WT_ILLEGAL_VALUE(session); } diff --git a/src/btree/rec_write.c b/src/btree/rec_write.c index 987726d8dd2..bb59f6e3d71 100644 --- a/src/btree/rec_write.c +++ b/src/btree/rec_write.c @@ -3978,11 +3978,11 @@ __rec_write_wrapup_err(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_PAGE *page) } /* - * __rec_split_merge_create -- + * __rec_split_merge_new -- * Create a split-merge page. */ static int -__rec_split_merge_create(WT_SESSION_IMPL *session, +__rec_split_merge_new(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_PAGE *orig, WT_PAGE **pagep, uint8_t type) { WT_PAGE *page; @@ -4043,11 +4043,11 @@ __rec_split_row( WT_IKEY *ikey; WT_PAGE *page; WT_REF *ref; + size_t size; uint32_t i; /* Allocate a split-merge page. */ - WT_ERR( - __rec_split_merge_create(session, r, orig, &page, WT_PAGE_ROW_INT)); + WT_ERR(__rec_split_merge_new(session, r, orig, &page, WT_PAGE_ROW_INT)); /* * The "parent" key for each split chunk is the first key on the chunk, @@ -4094,6 +4094,7 @@ __rec_split_row( } /* Enter each split child page into the new internal page. */ + size = 0; for (ref = page->u.intl.t, bnd = r->bnd, i = 0; i < r->bnd_next; ++ref, ++bnd, ++i) { WT_ERR(__wt_calloc(session, 1, sizeof(WT_ADDR), &addr)); @@ -4101,11 +4102,14 @@ __rec_split_row( bnd->addr.addr = NULL; ref->page = NULL; - WT_ERR(__wt_row_ikey_alloc(session, 0, + WT_ERR(__wt_row_ikey(session, 0, bnd->key.data, bnd->key.size, &ref->u.key)); + size += sizeof(WT_IKEY) + bnd->key.size; ref->addr = addr; ref->state = WT_REF_DISK; } + __wt_cache_page_inmem_incr( + session, page, r->bnd_next * sizeof(WT_ADDR) + size); *splitp = page; return (0); @@ -4131,8 +4135,7 @@ __rec_split_col( uint32_t i; /* Allocate a split-merge page. */ - WT_ERR( - __rec_split_merge_create(session, r, orig, &page, WT_PAGE_COL_INT)); + WT_ERR(__rec_split_merge_new(session, r, orig, &page, WT_PAGE_COL_INT)); /* Enter each split child page into the new internal page. */ for (ref = page->u.intl.t, @@ -4146,6 +4149,8 @@ __rec_split_col( ref->addr = addr; ref->state = WT_REF_DISK; } + __wt_cache_page_inmem_incr( + session, page, r->bnd_next * sizeof(WT_ADDR)); *splitp = page; return (0); diff --git a/src/btree/row_key.c b/src/btree/row_key.c index bcebbfafe5d..75dc2f1ca75 100644 --- a/src/btree/row_key.c +++ b/src/btree/row_key.c @@ -309,7 +309,7 @@ next: switch (direction) { /* If still needed, instantiate the key. */ key = WT_ROW_KEY_COPY(rip_arg); if (!__wt_off_page(page, key)) { - WT_ERR(__wt_row_ikey_alloc(session, + WT_ERR(__wt_row_ikey(session, WT_PAGE_DISK_OFFSET(page, key), retb->data, retb->size, &ikey)); @@ -380,11 +380,27 @@ __wt_row_value(WT_PAGE *page, WT_ROW *rip) } /* - * __wt_row_ikey_alloc -- + * __wt_row_ikey_incr -- + * Instantiate a key in a WT_IKEY structure and increment the page's + * memory footprint. + */ +int +__wt_row_ikey_incr(WT_SESSION_IMPL *session, WT_PAGE *page, + uint32_t cell_offset, const void *key, uint32_t size, void *ikeyp) +{ + WT_RET(__wt_row_ikey(session, cell_offset, key, size, ikeyp)); + + __wt_cache_page_inmem_incr(session, page, sizeof(WT_IKEY) + size); + + return (0); +} + +/* + * __wt_row_ikey -- * Instantiate a key in a WT_IKEY structure. */ int -__wt_row_ikey_alloc(WT_SESSION_IMPL *session, +__wt_row_ikey(WT_SESSION_IMPL *session, uint32_t cell_offset, const void *key, uint32_t size, void *ikeyp) { WT_IKEY *ikey; diff --git a/src/include/extern.h b/src/include/extern.h index 6d250c4a2f4..f09a6c7c165 100644 --- a/src/include/extern.h +++ b/src/include/extern.h @@ -401,7 +401,13 @@ extern int __wt_row_key_copy( WT_SESSION_IMPL *session, WT_ROW *rip_arg, WT_ITEM *retb); extern WT_CELL *__wt_row_value(WT_PAGE *page, WT_ROW *rip); -extern int __wt_row_ikey_alloc(WT_SESSION_IMPL *session, +extern int __wt_row_ikey_incr(WT_SESSION_IMPL *session, + WT_PAGE *page, + uint32_t cell_offset, + const void *key, + uint32_t size, + void *ikeyp); +extern int __wt_row_ikey(WT_SESSION_IMPL *session, uint32_t cell_offset, const void *key, uint32_t size, |