summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@wiredtiger.com>2013-03-26 16:26:10 +1100
committerMichael Cahill <michael.cahill@wiredtiger.com>2013-03-26 16:26:10 +1100
commit3aa9940846b7b66875770884844cc1121ed24f1b (patch)
tree8e55cb9df304e3eb2db59e0e9342764027ba1d35
parented3d9ff846284efff48f36b954f8e42ae73ce4ac (diff)
downloadmongo-3aa9940846b7b66875770884844cc1121ed24f1b.tar.gz
Fix a leak in eviction detected by valgrind.
832,394 (518,080 direct, 314,314 indirect) bytes in 32,380 blocks are definitely lost in loss record 61 of 61 at 0x4A06B6F: calloc (vg_replace_malloc.c:593) by 0x413A0D: __wt_calloc (os_alloc.c:38) by 0x436131: __wt_rec_evict (rec_evict.c:207) by 0x4235DE: __evict_page (bt_evict.c:511) by 0x42428E: __wt_evict_lru_page (bt_evict.c:1235) by 0x42506A: __wt_cache_evict_server (bt_evict.c:870) by 0x3E39407D14: start_thread (pthread_create.c:308) by 0x3E38CF246C: clone (clone.S:114)
-rw-r--r--src/btree/rec_write.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/btree/rec_write.c b/src/btree/rec_write.c
index a7056365cad..a01aa35883e 100644
--- a/src/btree/rec_write.c
+++ b/src/btree/rec_write.c
@@ -835,6 +835,10 @@ __rec_child_deleted(WT_SESSION_IMPL *session,
__wt_get_addr(page, ref, &addr, &size);
WT_RET(bm->free(bm, session, addr, size));
+ if (__wt_off_page(page, ref->addr)) {
+ __wt_free(session, ((WT_ADDR *)ref->addr)->addr);
+ __wt_free(session, ref->addr);
+ }
ref->addr = NULL;
}
@@ -3772,6 +3776,11 @@ __rec_write_wrapup(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_PAGE *page)
*/
__wt_get_addr(page->parent, ref, &addr, &size);
WT_RET(bm->free(bm, session, addr, size));
+ if (__wt_off_page(page->parent, ref->addr)) {
+ __wt_free(
+ session, ((WT_ADDR *)ref->addr)->addr);
+ __wt_free(session, ref->addr);
+ }
ref->addr = NULL;
}
break;