summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Bostic <keith@wiredtiger.com>2013-03-07 12:00:00 -0500
committerKeith Bostic <keith@wiredtiger.com>2013-03-07 12:00:00 -0500
commitfa4118cf53d73da4b9e3652a575cf9d624aaf63c (patch)
tree937a11ed21a2f7c833ff4cc74479990061817e28
parente2852e75a327baac9c8975638da59bf06107797b (diff)
downloadmongo-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.c3
-rw-r--r--src/btree/bt_page.c2
-rw-r--r--src/btree/bt_slvg.c9
-rw-r--r--src/btree/rec_merge.c4
-rw-r--r--src/btree/rec_write.c19
-rw-r--r--src/btree/row_key.c22
-rw-r--r--src/include/extern.h8
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,