From 91a2d4d6e1c0039f6b442c8c97b1aa809e09e33b Mon Sep 17 00:00:00 2001 From: Ophestra Date: Mon, 30 Mar 2026 23:49:16 +0900 Subject: internal/uevent: integrate error handling in event loop There are many subtleties when recovering from errors in the event loop, and coldboot requires internals to drain the receive buffer as synthetic uevents are being arranged. Signed-off-by: Ophestra --- internal/uevent/uevent_test.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'internal/uevent/uevent_test.go') diff --git a/internal/uevent/uevent_test.go b/internal/uevent/uevent_test.go index 9b986ff3..6420eea1 100644 --- a/internal/uevent/uevent_test.go +++ b/internal/uevent/uevent_test.go @@ -10,6 +10,7 @@ import ( "testing" "time" + "hakurei.app/fhs" "hakurei.app/internal/uevent" ) @@ -155,13 +156,23 @@ func TestDialConsume(t *testing.T) { ctx, cancel := context.WithCancel(t.Context()) defer cancel() + consume := func(c *uevent.Conn, ctx context.Context) error { + return c.Consume(ctx, fhs.Sys, events, false, func(path string) { + t.Log("coldboot visited", path) + }, func(err error) bool { + t.Log(err) + _, ok := err.(uevent.NeedsColdboot) + return !ok + }, nil) + } + wg.Go(func() { - if err = c.Consume(ctx, events); err != context.Canceled { + if err = consume(c, ctx); err != context.Canceled { panic(err) } }) wg.Go(func() { - if err0 = c0.Consume(ctx, events); err0 != context.Canceled { + if err0 = consume(c0, ctx); err0 != context.Canceled { panic(err0) } }) @@ -185,11 +196,11 @@ func TestDialConsume(t *testing.T) { exclExit := make(chan struct{}) wg.Go(func() { defer func() { exclExit <- struct{}{} }() - errs[0] = c.Consume(ctx, events) + errs[0] = consume(c, ctx) }) wg.Go(func() { defer func() { exclExit <- struct{}{} }() - errs[1] = c.Consume(ctx, events) + errs[1] = consume(c, ctx) }) <-exclExit cancel() -- cgit v1.3.1