Skip to content

Commit 4940ef8

Browse files
authored
perf: remove unncessary goroutine pileup of skippeer workers (#4993)
1 parent 0752977 commit 4940ef8

File tree

4 files changed

+50
-11
lines changed

4 files changed

+50
-11
lines changed

pkg/pushsync/pushsync.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func New(
144144
metrics: newMetrics(),
145145
tracer: tracer,
146146
signer: signer,
147-
errSkip: skippeers.NewList(),
147+
errSkip: skippeers.NewList(time.Minute),
148148
warmupPeriod: time.Now().Add(warmupTime),
149149
shallowReceiptTolerance: shallowReceiptTolerance,
150150
}
@@ -387,7 +387,7 @@ func (ps *PushSync) pushToClosest(ctx context.Context, ch swarm.Chunk, origin bo
387387
return nil, fmt.Errorf("pushsync: storage radius: %w", err)
388388
}
389389

390-
skip := skippeers.NewList()
390+
skip := skippeers.NewList(0)
391391
defer skip.Close()
392392

393393
for sentErrorsLeft > 0 {

pkg/retrieval/retrieval.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func New(
104104
metrics: newMetrics(),
105105
tracer: tracer,
106106
caching: forwarderCaching,
107-
errSkip: skippeers.NewList(),
107+
errSkip: skippeers.NewList(time.Minute),
108108
}
109109
}
110110

@@ -158,7 +158,7 @@ func (s *Service) RetrieveChunk(ctx context.Context, chunkAddr, sourcePeerAddr s
158158

159159
v, _, err := s.singleflight.Do(ctx, flightRoute, func(ctx context.Context) (swarm.Chunk, error) {
160160

161-
skip := skippeers.NewList()
161+
skip := skippeers.NewList(0)
162162
defer skip.Close()
163163

164164
var preemptiveTicker <-chan time.Time

pkg/skippeers/skippeers.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,26 @@ type List struct {
2525
wg sync.WaitGroup
2626
}
2727

28-
func NewList() *List {
28+
func NewList(workerWakeUpDur time.Duration) *List {
2929
l := &List{
3030
skip: make(map[string]map[string]int64),
3131
durC: make(chan time.Duration),
3232
quit: make(chan struct{}),
3333
}
3434

35-
l.wg.Add(1)
36-
go l.worker()
35+
if workerWakeUpDur > 0 {
36+
l.wg.Add(1)
37+
go l.worker(workerWakeUpDur)
38+
}
3739

3840
return l
3941
}
4042

41-
func (l *List) worker() {
43+
func (l *List) worker(d time.Duration) {
4244

4345
defer l.wg.Done()
4446

45-
ticker := time.NewTicker(time.Minute)
47+
ticker := time.NewTicker(d)
4648
defer ticker.Stop()
4749

4850
for {

pkg/skippeers/skippeers_test.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
func TestPruneExpiresAfter(t *testing.T) {
1616
t.Parallel()
1717

18-
skipList := skippeers.NewList()
18+
skipList := skippeers.NewList(0)
1919
t.Cleanup(func() { skipList.Close() })
2020

2121
chunk := swarm.RandAddress(t)
@@ -58,7 +58,7 @@ func TestPruneExpiresAfter(t *testing.T) {
5858
func TestPeerWait(t *testing.T) {
5959
t.Parallel()
6060

61-
skipList := skippeers.NewList()
61+
skipList := skippeers.NewList(0)
6262
t.Cleanup(func() { skipList.Close() })
6363

6464
chunk1 := swarm.RandAddress(t)
@@ -105,3 +105,40 @@ func TestPeerWait(t *testing.T) {
105105
t.Fatal("entry should be pruned")
106106
}
107107
}
108+
109+
func TestPruneWorker(t *testing.T) {
110+
t.Parallel()
111+
112+
chunk1 := swarm.RandAddress(t)
113+
chunk2 := swarm.RandAddress(t)
114+
peer1 := swarm.RandAddress(t)
115+
peer2 := swarm.RandAddress(t)
116+
117+
skipList := skippeers.NewList(time.Millisecond * 500)
118+
t.Cleanup(func() { skipList.Close() })
119+
120+
skipList.Add(chunk1, peer1, time.Second)
121+
if !swarm.ContainsAddress(skipList.ChunkPeers(chunk1), peer1) {
122+
t.Fatal("peer should be in skiplist")
123+
}
124+
125+
skipList.Add(chunk2, peer1, time.Second)
126+
if !swarm.ContainsAddress(skipList.ChunkPeers(chunk2), peer1) {
127+
t.Fatal("peer should be in skiplist")
128+
}
129+
130+
skipList.Add(chunk2, peer2, time.Minute)
131+
if !swarm.ContainsAddress(skipList.ChunkPeers(chunk2), peer1) {
132+
t.Fatal("peer should be in skiplist")
133+
}
134+
135+
time.Sleep(time.Millisecond * 1600)
136+
137+
if len(skipList.ChunkPeers(chunk1)) != 0 {
138+
t.Fatal("entry should be pruned")
139+
}
140+
141+
if len(skipList.ChunkPeers(chunk2)) != 1 || !swarm.ContainsAddress(skipList.ChunkPeers(chunk2), peer2) {
142+
t.Fatal("peer2 should be in skiplist")
143+
}
144+
}

0 commit comments

Comments
 (0)