From b76c7e48cc47e8428721d7da7f664d4f40e58853 Mon Sep 17 00:00:00 2001 From: "Abdulazez A." Date: Sun, 17 May 2026 04:43:12 +0000 Subject: [PATCH] fix: Check command deadlocks on corrupted DB with page cycles When a database has a corrupt page structure with cycles (e.g., a branch page referencing an ancestor), recursivelyCheckPage enters infinite recursion, causing Check() to never complete. Fix: detect cycles by checking if the page ID is already in the reachable set before recursing. If already reachable, report the cycle and return. Fixes #877 --- tx_check.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tx_check.go b/tx_check.go index a1e9b33cf..9144f242e 100644 --- a/tx_check.go +++ b/tx_check.go @@ -90,6 +90,10 @@ func (tx *Tx) check(cfg checkConfig, ch chan error) { func (tx *Tx) recursivelyCheckPage(pageId common.Pgid, reachable map[common.Pgid]*common.Page, freed map[common.Pgid]bool, kvStringer KVStringer, ch chan error) { + if _, already := reachable[pageId]; already { + ch <- fmt.Errorf("page %d: cycle detected (already reachable)", int(pageId)) + return + } tx.checkInvariantProperties(pageId, reachable, freed, kvStringer, ch) tx.recursivelyCheckBucketInPage(pageId, reachable, freed, kvStringer, ch) }