Mar 25, 4-5 AM (10)
Mar 25, 5-6 AM (5)
Mar 25, 6-7 AM (7)
Mar 25, 7-8 AM (14)
Mar 25, 8-9 AM (22)
Mar 25, 9-10 AM (48)
Mar 25, 10-11 AM (28)
Mar 25, 11-12 PM (36)
Mar 25, 12-1 PM (86)
Mar 25, 1-2 PM (29)
Mar 25, 2-3 PM (28)
Mar 25, 3-4 PM (65)
Mar 25, 4-5 PM (30)
Mar 25, 5-6 PM (16)
Mar 25, 6-7 PM (37)
Mar 25, 7-8 PM (10)
Mar 25, 8-9 PM (9)
Mar 25, 9-10 PM (6)
Mar 25, 10-11 PM (25)
Mar 25, 11-12 AM (16)
Mar 26, 12-1 AM (3)
Mar 26, 1-2 AM (9)
Mar 26, 2-3 AM (21)
Mar 26, 3-4 AM (10)
Mar 26, 4-5 AM (1)
Mar 26, 5-6 AM (14)
Mar 26, 6-7 AM (4)
Mar 26, 7-8 AM (8)
Mar 26, 8-9 AM (18)
Mar 26, 9-10 AM (33)
Mar 26, 10-11 AM (21)
Mar 26, 11-12 PM (34)
Mar 26, 12-1 PM (33)
Mar 26, 1-2 PM (77)
Mar 26, 2-3 PM (46)
Mar 26, 3-4 PM (51)
Mar 26, 4-5 PM (40)
Mar 26, 5-6 PM (19)
Mar 26, 6-7 PM (19)
Mar 26, 7-8 PM (15)
Mar 26, 8-9 PM (9)
Mar 26, 9-10 PM (17)
Mar 26, 10-11 PM (38)
Mar 26, 11-12 AM (11)
Mar 27, 12-1 AM (3)
Mar 27, 1-2 AM (1)
Mar 27, 2-3 AM (26)
Mar 27, 3-4 AM (12)
Mar 27, 4-5 AM (6)
Mar 27, 5-6 AM (3)
Mar 27, 6-7 AM (10)
Mar 27, 7-8 AM (18)
Mar 27, 8-9 AM (38)
Mar 27, 9-10 AM (26)
Mar 27, 10-11 AM (38)
Mar 27, 11-12 PM (26)
Mar 27, 12-1 PM (57)
Mar 27, 1-2 PM (31)
Mar 27, 2-3 PM (60)
Mar 27, 3-4 PM (40)
Mar 27, 4-5 PM (20)
Mar 27, 5-6 PM (30)
Mar 27, 6-7 PM (29)
Mar 27, 7-8 PM (15)
Mar 27, 8-9 PM (17)
Mar 27, 9-10 PM (13)
Mar 27, 10-11 PM (24)
Mar 27, 11-12 AM (17)
Mar 28, 12-1 AM (2)
Mar 28, 1-2 AM (2)
Mar 28, 2-3 AM (12)
Mar 28, 3-4 AM (1)
Mar 28, 4-5 AM (2)
Mar 28, 5-6 AM (1)
Mar 28, 6-7 AM (0)
Mar 28, 7-8 AM (2)
Mar 28, 8-9 AM (7)
Mar 28, 9-10 AM (7)
Mar 28, 10-11 AM (7)
Mar 28, 11-12 PM (7)
Mar 28, 12-1 PM (4)
Mar 28, 1-2 PM (5)
Mar 28, 2-3 PM (12)
Mar 28, 3-4 PM (3)
Mar 28, 4-5 PM (5)
Mar 28, 5-6 PM (5)
Mar 28, 6-7 PM (0)
Mar 28, 7-8 PM (2)
Mar 28, 8-9 PM (0)
Mar 28, 9-10 PM (1)
Mar 28, 10-11 PM (21)
Mar 28, 11-12 AM (21)
Mar 29, 12-1 AM (2)
Mar 29, 1-2 AM (6)
Mar 29, 2-3 AM (6)
Mar 29, 3-4 AM (6)
Mar 29, 4-5 AM (3)
Mar 29, 5-6 AM (5)
Mar 29, 6-7 AM (0)
Mar 29, 7-8 AM (0)
Mar 29, 8-9 AM (13)
Mar 29, 9-10 AM (0)
Mar 29, 10-11 AM (0)
Mar 29, 11-12 PM (2)
Mar 29, 12-1 PM (13)
Mar 29, 1-2 PM (2)
Mar 29, 2-3 PM (2)
Mar 29, 3-4 PM (4)
Mar 29, 4-5 PM (6)
Mar 29, 5-6 PM (8)
Mar 29, 6-7 PM (9)
Mar 29, 7-8 PM (6)
Mar 29, 8-9 PM (4)
Mar 29, 9-10 PM (10)
Mar 29, 10-11 PM (24)
Mar 29, 11-12 AM (17)
Mar 30, 12-1 AM (5)
Mar 30, 1-2 AM (5)
Mar 30, 2-3 AM (7)
Mar 30, 3-4 AM (7)
Mar 30, 4-5 AM (3)
Mar 30, 5-6 AM (12)
Mar 30, 6-7 AM (3)
Mar 30, 7-8 AM (36)
Mar 30, 8-9 AM (27)
Mar 30, 9-10 AM (10)
Mar 30, 10-11 AM (67)
Mar 30, 11-12 PM (47)
Mar 30, 12-1 PM (30)
Mar 30, 1-2 PM (39)
Mar 30, 2-3 PM (63)
Mar 30, 3-4 PM (33)
Mar 30, 4-5 PM (20)
Mar 30, 5-6 PM (41)
Mar 30, 6-7 PM (17)
Mar 30, 7-8 PM (18)
Mar 30, 8-9 PM (13)
Mar 30, 9-10 PM (28)
Mar 30, 10-11 PM (44)
Mar 30, 11-12 AM (28)
Mar 31, 12-1 AM (16)
Mar 31, 1-2 AM (5)
Mar 31, 2-3 AM (15)
Mar 31, 3-4 AM (6)
Mar 31, 4-5 AM (4)
Mar 31, 5-6 AM (7)
Mar 31, 6-7 AM (12)
Mar 31, 7-8 AM (43)
Mar 31, 8-9 AM (47)
Mar 31, 9-10 AM (30)
Mar 31, 10-11 AM (36)
Mar 31, 11-12 PM (29)
Mar 31, 12-1 PM (38)
Mar 31, 1-2 PM (33)
Mar 31, 2-3 PM (51)
Mar 31, 3-4 PM (31)
Mar 31, 4-5 PM (47)
Mar 31, 5-6 PM (39)
Mar 31, 6-7 PM (36)
Mar 31, 7-8 PM (16)
Mar 31, 8-9 PM (13)
Mar 31, 9-10 PM (9)
Mar 31, 10-11 PM (24)
Mar 31, 11-12 AM (15)
Apr 01, 12-1 AM (1)
Apr 01, 1-2 AM (1)
Apr 01, 2-3 AM (8)
Apr 01, 3-4 AM (4)
Apr 01, 4-5 AM (1)
3,135 commits this week Mar 25, 2026 - Apr 01, 2026
fix(ledger): prevent chainsync pipeline deadlock after reader exit
Two fixes for goroutine deadlocks that silently killed the chainsync
pipeline, causing nodes to stop advancing with no error output.

1. Close result channel on reader exit: ledgerReadChain() could exit
   on errors (chain reconcile failure, block decode, nil iterator)
   without closing resultCh. The consumer blocked forever on the
   channel read. Add defer close(resultCh) so the consumer always
   unblocks and the caller can create a fresh reader.

2. Preserve done channel for cached batches: when an epoch rollover
   split a batch, the next loop iteration reset currentReadResultDone
   to nil before consuming the cached remainder. The reader goroutine
   blocked forever waiting for its done channel to close. Move the
   nil reset inside the else branch so it only runs when reading
   fresh from the channel.

Signed-off-by: wcatz <[email protected]>
Signed-off-by: wcatz <[email protected]>