-
Type:
Task
-
Resolution: Unresolved
-
Priority:
Major - P3
-
None
-
Affects Version/s: None
-
Component/s: Cache and Eviction, Observability
-
None
-
Storage Engines - Transactions
-
220.199
-
SE Transactions - 2026-09-25
-
3
We have an assert in wt_evict
WT_ASSERT(session,
closing || !F_ISSET(ref, WT_REF_FLAG_INTERNAL) ||
F_ISSET(session->dhandle, WT_DHANDLE_DEAD) ||
!__wt_gen_active(session, WT_GEN_SPLIT, page->pg_intl_split_gen));
That asserts that we don't evict an accessible internal page with an active split generation. Violating it means every child WT_REF is freed from under any thread still walking that index.
We have seen crashes where __wt_evict → an unmapped address. Checking this field may be able to diagnose whether a bad free caused the invalid address access.
Convert the assert to use the existing eviction_check category:
WT_ASSERT_OPTIONAL(session, WT_DIAGNOSTIC_EVICTION_CHECK, <existing predicate>,
"Evicting an accessible internal page with an active split generation");
So the check can be toggled on a release build via extra_diagnostics=[eviction_check].