summaryrefslogtreecommitdiff
path: root/src/btree/bt_delete.c
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@mongodb.com>2015-12-02 22:00:52 +1100
committerMichael Cahill <michael.cahill@mongodb.com>2015-12-02 22:00:52 +1100
commit27d0cbdf8046565dba6902f4e6ee93b2642f0d19 (patch)
tree11db010e007a2025cafd08590fea43eff6efa199 /src/btree/bt_delete.c
parent0bc4f8f2dc7b51a86d6e8c120f48264af1e500af (diff)
parent38369aebcf7da942929a3c27f72495e8dbe3e2d3 (diff)
downloadmongodb-3.0.8.tar.gz
Merge pull request #2354 from wiredtiger/server_21553_30backportmongodb-3.0.8
SERVER-21553 3.0 backport
Diffstat (limited to 'src/btree/bt_delete.c')
-rw-r--r--src/btree/bt_delete.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/btree/bt_delete.c b/src/btree/bt_delete.c
index 7313e31267f..e19085830bd 100644
--- a/src/btree/bt_delete.c
+++ b/src/btree/bt_delete.c
@@ -250,6 +250,18 @@ __wt_delete_page_skip(WT_SESSION_IMPL *session, WT_REF *ref, bool visible_all)
__wt_txn_visible_all(session, ref->page_del->txnid) :
__wt_txn_visible(session, ref->page_del->txnid));
+ /*
+ * The page_del structure can be freed as soon as the delete is stable:
+ * it is only read when the ref state is WT_REF_DELETED. It is worth
+ * checking every time we come through because once this is freed, we
+ * no longer need synchronization to check the ref.
+ */
+ if (skip && ref->page_del != NULL && (visible_all ||
+ __wt_txn_visible_all(session, ref->page_del->txnid))) {
+ __wt_free(session, ref->page_del->update_list);
+ __wt_free(session, ref->page_del);
+ }
+
WT_PUBLISH(ref->state, WT_REF_DELETED);
return (skip);
}