commit 60dfb0dc19a4e8b2848e93c94cc10d068ff4e4d5 Author: David A. Holland Date: Tue Nov 23 20:08:06 2021 -0500 Expedient fix for rts + fast-delete diff --git a/src/txn/txn_rollback_to_stable.c b/src/txn/txn_rollback_to_stable.c index 61e6214aa..192249d65 100644 --- a/src/txn/txn_rollback_to_stable.c +++ b/src/txn/txn_rollback_to_stable.c @@ -1266,6 +1266,20 @@ __wt_rts_page_skip(WT_SESSION_IMPL *session, WT_REF *ref, void *context, bool *s return (0); } +/* + * __wt_rts_page_skip_leaf -- + * Wrapper to skip all leaves. + */ +static int +__wt_rts_page_skip_leaf(WT_SESSION_IMPL *session, WT_REF *ref, void *context, bool *skipp) +{ + if (!F_ISSET(ref, WT_REF_FLAG_INTERNAL)) { + *skipp = true; + return (0); + } + return (__wt_rts_page_skip(session, ref, context, skipp)); +} + /* * __rollback_to_stable_btree_walk -- * Called for each open handle - choose to either skip or wipe the commits @@ -1276,15 +1290,21 @@ __rollback_to_stable_btree_walk(WT_SESSION_IMPL *session, wt_timestamp_t rollbac WT_DECL_RET; WT_REF *ref; - /* Walk the tree, marking commits aborted where appropriate. */ + /* Walk the tree, reattaching fast-deleted leaves in internal pages first. */ ref = NULL; - while ((ret = __wt_tree_walk_custom_skip(session, &ref, __wt_rts_page_skip, &rollback_timestamp, - WT_READ_NO_EVICT | WT_READ_WONT_NEED)) == 0 && + while ((ret = __wt_tree_walk_custom_skip(session, &ref, __wt_rts_page_skip_leaf, + &rollback_timestamp, WT_READ_NO_EVICT | WT_READ_WONT_NEED)) == 0 && ref != NULL) if (F_ISSET(ref, WT_REF_FLAG_INTERNAL)) WT_WITH_PAGE_INDEX( session, ret = __rollback_abort_fast_truncate(session, ref, rollback_timestamp)); - else + + /* Walk the tree, marking commits aborted where appropriate. */ + ref = NULL; + while ((ret = __wt_tree_walk_custom_skip(session, &ref, __wt_rts_page_skip, &rollback_timestamp, + WT_READ_NO_EVICT | WT_READ_WONT_NEED)) == 0 && + ref != NULL) + if (!F_ISSET(ref, WT_REF_FLAG_INTERNAL)) WT_RET(__rollback_abort_updates(session, ref, rollback_timestamp)); return (ret);