As part of rollback to stable operation, we create an update and appended it to the update list to abort the on-disk newer updates than the stable timestamp. There exists a function __upd_alloc_tombstone and it can be refactored as attached change to reduce the code duplication.
*** ../include/txn.i Wed Feb 12 00:35:45 2020 --- - Wed Feb 12 01:19:14 2020 *************** *** 756,776 **** } /* ! * __upd_alloc_tombstone -- ! * Allocate a tombstone update at a given transaction id and timestamp. */ static inline int ! __upd_alloc_tombstone( ! WT_SESSION_IMPL *session, WT_UPDATE **updp, uint64_t txnid, wt_timestamp_t start_ts) { ! size_t size; ! WT_RET(__wt_update_alloc(session, NULL, updp, &size, WT_UPDATE_TOMBSTONE)); ! (*updp)->txnid = txnid; ! /* FIXME: Reevaluate this as part of PM-1524. */ ! (*updp)->durable_ts = (*updp)->start_ts = start_ts; ! F_SET(*updp, WT_UPDATE_RESTORED_FROM_DISK); ! return (0); } /* --- 756,779 ---- } /* ! * __wt_upd_alloc_tombstone -- ! * Allocate a tombstone update with default values. */ static inline int ! __wt_upd_alloc_tombstone(WT_SESSION_IMPL *session, WT_UPDATE **updp) { ! size_t notused; ! /* ! * The underlying allocation code clears memory, which is the equivalent of setting: ! * ! * WT_UPDATE.txnid = WT_TXN_NONE; ! * WT_UPDATE.durable_ts = WT_TS_NONE; ! * WT_UPDATE.start_ts = WT_TS_NONE; ! * WT_UPDATE.prepare_state = WT_PREPARE_INIT; ! * WT_UPDATE.flags = 0; ! */ ! return (__wt_update_alloc(session, NULL, updp, ¬used, WT_UPDATE_TOMBSTONE)); } /* *************** *** 825,834 **** return (0); /* If there is no ondisk value, there can't be anything in the history store either. */ ! if (cbt->ref->page->dsk == NULL || cbt->slot == UINT32_MAX) { ! WT_RET(__upd_alloc_tombstone(session, updp, WT_TXN_NONE, WT_TS_NONE)); ! return (0); ! } buf.data = NULL; buf.size = 0; --- 828,835 ---- return (0); /* If there is no ondisk value, there can't be anything in the history store either. */ ! if (cbt->ref->page->dsk == NULL || cbt->slot == UINT32_MAX) ! return (__wt_upd_alloc_tombstone(session, updp)); buf.data = NULL; buf.size = 0; *************** *** 855,861 **** */ if (stop.txnid != WT_TXN_MAX && stop.timestamp != WT_TS_MAX && !WT_IS_HS(S2BT(session)) && __wt_txn_visible(session, stop.txnid, stop.timestamp)) { ! WT_RET(__upd_alloc_tombstone(session, updp, stop.txnid, stop.timestamp)); return (0); } --- 856,867 ---- */ if (stop.txnid != WT_TXN_MAX && stop.timestamp != WT_TS_MAX && !WT_IS_HS(S2BT(session)) && __wt_txn_visible(session, stop.txnid, stop.timestamp)) { ! WT_RET(__wt_upd_alloc_tombstone(session, updp)); ! ! (*updp)->txnid = stop.txnid; ! /* FIXME: Reevaluate this as part of PM-1524. */ ! (*updp)->durable_ts = (*updp)->start_ts = stop.timestamp; ! F_SET(*updp, WT_UPDATE_RESTORED_FROM_DISK); return (0); }