diff --git a/p2p/discover/v4_lookup_test.go b/p2p/discover/v4_lookup_test.go index 70bd7056fb..29a9dd6645 100644 --- a/p2p/discover/v4_lookup_test.go +++ b/p2p/discover/v4_lookup_test.go @@ -21,6 +21,7 @@ import ( "fmt" "net/netip" "slices" + "sync" "testing" "github.com/ethereum/go-ethereum/crypto" @@ -67,7 +68,11 @@ func TestUDPv4_Lookup(t *testing.T) { func TestUDPv4_LookupIterator(t *testing.T) { t.Parallel() test := newUDPTest(t) - defer test.close() + var wg sync.WaitGroup + defer func() { + test.close() + wg.Wait() + }() // Seed table with initial nodes. bootnodes := make([]*enode.Node, len(lookupTestnet.dists[256])) @@ -75,7 +80,11 @@ func TestUDPv4_LookupIterator(t *testing.T) { bootnodes[i] = lookupTestnet.node(256, i) } fillTable(test.table, bootnodes, true) - go serveTestnet(test, lookupTestnet) + wg.Add(1) + go func() { + serveTestnet(test, lookupTestnet) + wg.Done() + }() // Create the iterator and collect the nodes it yields. iter := test.udp.RandomNodes() @@ -102,7 +111,11 @@ func TestUDPv4_LookupIterator(t *testing.T) { func TestUDPv4_LookupIteratorClose(t *testing.T) { t.Parallel() test := newUDPTest(t) - defer test.close() + var wg sync.WaitGroup + defer func() { + test.close() + wg.Wait() + }() // Seed table with initial nodes. bootnodes := make([]*enode.Node, len(lookupTestnet.dists[256])) @@ -110,7 +123,12 @@ func TestUDPv4_LookupIteratorClose(t *testing.T) { bootnodes[i] = lookupTestnet.node(256, i) } fillTable(test.table, bootnodes, true) - go serveTestnet(test, lookupTestnet) + + wg.Add(1) + go func() { + serveTestnet(test, lookupTestnet) + wg.Done() + }() it := test.udp.RandomNodes() if ok := it.Next(); !ok || it.Node() == nil { diff --git a/p2p/enode/nodedb.go b/p2p/enode/nodedb.go index 1f31c98d22..51e554e68a 100644 --- a/p2p/enode/nodedb.go +++ b/p2p/enode/nodedb.go @@ -496,6 +496,10 @@ func nextNode(it iterator.Iterator) *Node { // Close flushes and closes the database files. func (db *DB) Close() { - close(db.quit) + select { + case <-db.quit: // already closed + default: + close(db.quit) + } db.lvl.Close() }