eth/protocols/snap, internal/testlog: fix dataraces (#29301)

pull/29304/head
Martin HS 8 months ago committed by GitHub
parent 8f7fbdfedc
commit 04bf1c802f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 5
      eth/protocols/snap/sync_test.go
  2. 19
      internal/testlog/testlog.go

@ -1873,8 +1873,9 @@ func verifyTrie(scheme string, db ethdb.KeyValueStore, root common.Hash, t *test
// TestSyncAccountPerformance tests how efficient the snap algo is at minimizing // TestSyncAccountPerformance tests how efficient the snap algo is at minimizing
// state healing // state healing
func TestSyncAccountPerformance(t *testing.T) { func TestSyncAccountPerformance(t *testing.T) {
t.Parallel() // These tests must not run in parallel: they modify the
// global var accountConcurrency
// t.Parallel()
testSyncAccountPerformance(t, rawdb.HashScheme) testSyncAccountPerformance(t, rawdb.HashScheme)
testSyncAccountPerformance(t, rawdb.PathScheme) testSyncAccountPerformance(t, rawdb.PathScheme)
} }

@ -47,9 +47,12 @@ type bufHandler struct {
buf []slog.Record buf []slog.Record
attrs []slog.Attr attrs []slog.Attr
level slog.Level level slog.Level
mu sync.Mutex
} }
func (h *bufHandler) Handle(_ context.Context, r slog.Record) error { func (h *bufHandler) Handle(_ context.Context, r slog.Record) error {
h.mu.Lock()
defer h.mu.Unlock()
h.buf = append(h.buf, r) h.buf = append(h.buf, r)
return nil return nil
} }
@ -59,12 +62,14 @@ func (h *bufHandler) Enabled(_ context.Context, lvl slog.Level) bool {
} }
func (h *bufHandler) WithAttrs(attrs []slog.Attr) slog.Handler { func (h *bufHandler) WithAttrs(attrs []slog.Attr) slog.Handler {
h.mu.Lock()
defer h.mu.Unlock()
records := make([]slog.Record, len(h.buf)) records := make([]slog.Record, len(h.buf))
copy(records[:], h.buf[:]) copy(records[:], h.buf[:])
return &bufHandler{ return &bufHandler{
records, buf: records,
append(h.attrs, attrs...), attrs: append(h.attrs, attrs...),
h.level, level: h.level,
} }
} }
@ -75,9 +80,9 @@ func (h *bufHandler) WithGroup(_ string) slog.Handler {
// Logger returns a logger which logs to the unit test log of t. // Logger returns a logger which logs to the unit test log of t.
func Logger(t *testing.T, level slog.Level) log.Logger { func Logger(t *testing.T, level slog.Level) log.Logger {
handler := bufHandler{ handler := bufHandler{
[]slog.Record{}, buf: []slog.Record{},
[]slog.Attr{}, attrs: []slog.Attr{},
level, level: level,
} }
return &logger{ return &logger{
t: t, t: t,
@ -200,6 +205,8 @@ func (h *bufHandler) terminalFormat(r slog.Record) string {
// flush writes all buffered messages and clears the buffer. // flush writes all buffered messages and clears the buffer.
func (l *logger) flush() { func (l *logger) flush() {
l.t.Helper() l.t.Helper()
l.h.mu.Lock()
defer l.h.mu.Unlock()
for _, r := range l.h.buf { for _, r := range l.h.buf {
l.t.Logf("%s", l.h.terminalFormat(r)) l.t.Logf("%s", l.h.terminalFormat(r))
} }

Loading…
Cancel
Save