mirror of
https://github.com/httprunner/httprunner.git
synced 2026-05-12 02:21:29 +08:00
fix: broadcast to all rendezvous at once when spawn done
Change-Id: Ic04bc2f56aa40c2af42a1fdb3c261a10e8346033
This commit is contained in:
17
boomer.go
17
boomer.go
@@ -26,6 +26,7 @@ type HRPBoomer struct {
|
||||
plugins []common.Plugin // each task has its own plugin process
|
||||
pluginsMutex *sync.RWMutex // avoid data race
|
||||
debug bool
|
||||
once sync.Once
|
||||
}
|
||||
|
||||
// SetDebug configures whether to log HTTP request and response content.
|
||||
@@ -57,7 +58,7 @@ func (b *HRPBoomer) Run(testcases ...ITestCase) {
|
||||
panic(err)
|
||||
}
|
||||
rendezvousList := initRendezvous(testcase, int64(b.GetSpawnCount()))
|
||||
task := b.convertBoomerTask(testcase)
|
||||
task := b.convertBoomerTask(testcase, rendezvousList)
|
||||
taskSlice = append(taskSlice, task)
|
||||
waitRendezvous(rendezvousList)
|
||||
}
|
||||
@@ -74,7 +75,7 @@ func (b *HRPBoomer) Quit() {
|
||||
b.Boomer.Quit()
|
||||
}
|
||||
|
||||
func (b *HRPBoomer) convertBoomerTask(testcase *TestCase) *boomer.Task {
|
||||
func (b *HRPBoomer) convertBoomerTask(testcase *TestCase, rendezvousList []*Rendezvous) *boomer.Task {
|
||||
hrpRunner := NewRunner(nil).SetDebug(b.debug)
|
||||
config := testcase.Config
|
||||
|
||||
@@ -86,6 +87,14 @@ func (b *HRPBoomer) convertBoomerTask(testcase *TestCase) *boomer.Task {
|
||||
b.pluginsMutex.Unlock()
|
||||
}
|
||||
|
||||
// broadcast to all rendezvous at once when spawn done
|
||||
go func() {
|
||||
<-b.GetSpawnDoneChan()
|
||||
for _, rendezvous := range rendezvousList {
|
||||
rendezvous.setSpawnDone()
|
||||
}
|
||||
}()
|
||||
|
||||
return &boomer.Task{
|
||||
Name: config.Name,
|
||||
Weight: config.Weight,
|
||||
@@ -149,10 +158,6 @@ func (b *HRPBoomer) convertBoomerTask(testcase *TestCase) *boomer.Task {
|
||||
} else if stepData.StepType == stepTypeRendezvous {
|
||||
// rendezvous
|
||||
// TODO: implement rendezvous in boomer
|
||||
rendezvous := step.ToStruct().Rendezvous
|
||||
if !rendezvous.isSpawnDone() && b.IsSpawnDone() {
|
||||
rendezvous.setSpawnDone()
|
||||
}
|
||||
} else {
|
||||
// request or testcase step
|
||||
b.RecordSuccess(step.Type(), step.Name(), stepData.Elapsed, stepData.ContentSize)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
## v0.6.1 (2022-02-11)
|
||||
|
||||
- fix: assertion function errors and json number parse rule
|
||||
- fix: broadcast to all rendezvous at once when spawn done
|
||||
|
||||
## v0.6.0 (2022-02-08)
|
||||
|
||||
|
||||
@@ -128,8 +128,8 @@ func (b *Boomer) Quit() {
|
||||
b.localRunner.stop()
|
||||
}
|
||||
|
||||
func (b *Boomer) IsSpawnDone() bool {
|
||||
return b.localRunner.isSpawnDone
|
||||
func (b *Boomer) GetSpawnDoneChan() chan struct{} {
|
||||
return b.localRunner.spawnDone
|
||||
}
|
||||
|
||||
func (b *Boomer) GetSpawnCount() int {
|
||||
|
||||
@@ -63,7 +63,7 @@ type runner struct {
|
||||
spawnCount int // target clients to spawn
|
||||
spawnRate float64
|
||||
loop *Loop // specify running cycles
|
||||
isSpawnDone bool
|
||||
spawnDone chan struct{}
|
||||
|
||||
outputs []Output
|
||||
}
|
||||
@@ -194,7 +194,7 @@ func (r *localRunner) spawnWorkers(spawnCount int, spawnRate float64, quit chan
|
||||
}
|
||||
}
|
||||
|
||||
r.isSpawnDone = true
|
||||
close(r.spawnDone)
|
||||
if spawnCompleteFunc != nil {
|
||||
spawnCompleteFunc()
|
||||
}
|
||||
@@ -256,6 +256,7 @@ func newLocalRunner(spawnCount int, spawnRate float64) *localRunner {
|
||||
spawnCount: spawnCount,
|
||||
stats: newRequestStats(),
|
||||
outputs: make([]Output, 0),
|
||||
spawnDone: make(chan struct{}),
|
||||
},
|
||||
stopChan: make(chan bool),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user