Skip to content

Commit 8f95af4

Browse files
committed
fix vu creation races and atomic ratelimit deref
1 parent 70bd176 commit 8f95af4

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

wasp/wasp.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ type Generator struct {
257257
dataCancel context.CancelFunc
258258
gun Gun
259259
vu VirtualUser
260+
vusMu *sync.Mutex
260261
vus []VirtualUser
261262
ResponsesChan chan *Response
262263
Responses *Responses
@@ -320,6 +321,7 @@ func NewGenerator(cfg *Config) (*Generator, error) {
320321
dataCancel: dataCancel,
321322
gun: cfg.Gun,
322323
vu: cfg.VU,
324+
vusMu: &sync.Mutex{},
323325
Responses: NewResponses(rch),
324326
ResponsesChan: rch,
325327
labels: ls,
@@ -379,7 +381,9 @@ func (g *Generator) runExecuteLoop() {
379381
for i := 0; i < int(vus); i++ {
380382
inst := g.vu.Clone(g)
381383
g.runVU(inst)
384+
g.vusMu.Lock()
382385
g.vus = append(g.vus, inst)
386+
g.vusMu.Unlock()
383387
}
384388
}
385389
}
@@ -510,14 +514,18 @@ func (g *Generator) processSegment() bool {
510514
}
511515
if oldVUs > g.currentSegment.From {
512516
for i := 0; i < vusToSpawn; i++ {
517+
g.vusMu.Lock()
513518
g.vus[i].Stop(g)
519+
g.vusMu.Unlock()
514520
}
515521
g.vus = g.vus[vusToSpawn:]
516522
} else {
517523
for i := 0; i < vusToSpawn; i++ {
518524
inst := g.vu.Clone(g)
519525
g.runVU(inst)
526+
g.vusMu.Lock()
520527
g.vus = append(g.vus, inst)
528+
g.vusMu.Unlock()
521529
}
522530
}
523531
}
@@ -624,8 +632,10 @@ func (g *Generator) pacedCall() {
624632
if !g.Stats().RunStarted.Load() {
625633
return
626634
}
627-
l := *g.rl.Load()
628-
l.Take()
635+
if g.rl.Load() == nil {
636+
return
637+
}
638+
(*g.rl.Load()).Take()
629639
if g.stats.RunPaused.Load() {
630640
return
631641
}

wasp/wasp_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ func TestSmokeCustomUnitPrecision(t *testing.T) {
475475
_, failed := gen.Run(true)
476476
require.Equal(t, false, failed)
477477
stats := gen.Stats()
478-
require.GreaterOrEqual(t, stats.Success.Load(), int64(4970))
478+
require.GreaterOrEqual(t, stats.Success.Load(), int64(4950))
479479
require.LessOrEqual(t, stats.Success.Load(), int64(5010))
480480
require.Equal(t, stats.Failed.Load(), int64(0))
481481
require.Equal(t, stats.CallTimeout.Load(), int64(0))

0 commit comments

Comments
 (0)