diff --git a/mtglib/internal/doppel/scout_conn_collected.go b/mtglib/internal/doppel/scout_conn_collected.go index cdcfbeb..5a4de92 100644 --- a/mtglib/internal/doppel/scout_conn_collected.go +++ b/mtglib/internal/doppel/scout_conn_collected.go @@ -1,6 +1,7 @@ package doppel import ( + "slices" "sync" "time" ) @@ -43,8 +44,7 @@ func (s *ScoutConnCollected) MarkWrite() { // Snapshot returns a copy of the collected data and the write index. func (s *ScoutConnCollected) Snapshot() ([]ScoutConnResult, int) { s.mu.Lock() - snapshot := make([]ScoutConnResult, len(s.data)) - copy(snapshot, s.data) + snapshot := slices.Clone(s.data) writeIndex := s.writeIndex s.mu.Unlock() diff --git a/mtglib/internal/doppel/scout_conn_collected_test.go b/mtglib/internal/doppel/scout_conn_collected_test.go index fad45dd..e49f6bd 100644 --- a/mtglib/internal/doppel/scout_conn_collected_test.go +++ b/mtglib/internal/doppel/scout_conn_collected_test.go @@ -68,8 +68,8 @@ func (suite *ScoutConnCollectedTestSuite) TestConcurrentAddSnapshot() { defer wg.Done() for i := 0; i < 1000; i++ { - data, _ := collected.Snapshot() - _ = len(data) + // call Snapshot concurrently to exercise the lock under -race + collected.Snapshot() //nolint:errcheck } }()