Details
Description
In a patch build, we hit an assert in the following code.
#ifdef HAVE_DIAGNOSTIC
|
__wt_hs_upd_time_window(hs_cursor, &hs_tw);
|
WT_ASSERT(session, hs_tw->start_txn == WT_TXN_NONE || hs_tw->start_txn == delete_upd->txnid);
|
WT_ASSERT(session, hs_tw->start_ts == WT_TS_NONE || hs_tw->start_ts == delete_upd->start_ts);
|
WT_ASSERT(session,
|
hs_tw->durable_start_ts == WT_TS_NONE || hs_tw->durable_start_ts == delete_upd->durable_ts);
|
if (delete_tombstone != NULL) { |
WT_ASSERT(session, hs_tw->stop_txn == delete_tombstone->txnid);
|
WT_ASSERT(session, hs_tw->stop_ts == delete_tombstone->start_ts);
|
WT_ASSERT(session, hs_tw->durable_stop_ts == delete_tombstone->durable_ts);
|
} else |
WT_ASSERT(session, !WT_TIME_WINDOW_HAS_STOP(hs_tw)); (<-----------------We hit the assert here and crash) |
#endif
|
|
WT_ERR(hs_cursor->remove(hs_cursor));
|
In the production build, we will continue and remove an update that should not be removed from the history store.
It is caused by not clearing the WT_UPDATE_TO_DELETE_FROM_HS flag in the following code in rollback to stable.
/* |
* Clear the history store flag for the first stable update. Otherwise, it will not be
|
* moved to history store again.
|
*/
|
if (stable_upd != NULL) |
F_CLR(stable_upd, WT_UPDATE_HS);
|
if (tombstone != NULL) |
F_CLR(tombstone, WT_UPDATE_HS);
|