fix(gateway): qualify concurrent fair allocation
This commit is contained in:
@@ -1507,30 +1507,49 @@ func runQualificationFleetStage(t *testing.T, fleet *qualificationFleet, profile
|
||||
}
|
||||
end := time.Now().Add(duration)
|
||||
payload := qualificationPayload(profile)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
deliveries := make([]qualificationFlowDelivery, 0, int(duration/time.Millisecond))
|
||||
var sequence uint32
|
||||
for time.Now().Before(end) {
|
||||
for _, path := range fleet.paths {
|
||||
if !time.Now().Before(end) {
|
||||
break
|
||||
var wait sync.WaitGroup
|
||||
var mu sync.Mutex
|
||||
var firstErr error
|
||||
for flowIndex, path := range fleet.paths {
|
||||
wait.Add(1)
|
||||
go func(flowIndex int, path *qualificationPath) {
|
||||
defer wait.Done()
|
||||
var sequence uint32
|
||||
for time.Now().Before(end) && ctx.Err() == nil {
|
||||
current := append([]byte(nil), payload...)
|
||||
binary.BigEndian.PutUint32(current[len(current)-4:], uint32(flowIndex)<<24|sequence)
|
||||
sequence++
|
||||
trace, _, err := path.traverse(t, current)
|
||||
if err == nil && (!trace.NativeUDPIngress || !trace.ApolloRecovered || !trace.ProductionQueue ||
|
||||
!trace.ProductionMediaLoop || !trace.ProductionPacer || !trace.VerseQUIC ||
|
||||
!trace.PublicClientDecode || !trace.PayloadPreserved) {
|
||||
err = errors.New("fairness traffic bypassed production gateway traversal")
|
||||
}
|
||||
if err != nil {
|
||||
mu.Lock()
|
||||
if firstErr == nil {
|
||||
firstErr = err
|
||||
cancel()
|
||||
}
|
||||
mu.Unlock()
|
||||
return
|
||||
}
|
||||
mu.Lock()
|
||||
deliveries = append(deliveries, qualificationFlowDelivery{
|
||||
at: time.Now(), flow: path.flow, bytes: int64(len(current) + frameHeaderSize),
|
||||
})
|
||||
mu.Unlock()
|
||||
}
|
||||
current := append([]byte(nil), payload...)
|
||||
binary.BigEndian.PutUint32(current[len(current)-4:], sequence)
|
||||
sequence++
|
||||
trace, _, err := path.traverse(t, current)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !trace.NativeUDPIngress || !trace.ApolloRecovered || !trace.ProductionQueue ||
|
||||
!trace.ProductionMediaLoop || !trace.ProductionPacer || !trace.VerseQUIC ||
|
||||
!trace.PublicClientDecode || !trace.PayloadPreserved {
|
||||
return nil, errors.New("fairness traffic bypassed production gateway traversal")
|
||||
}
|
||||
deliveries = append(deliveries, qualificationFlowDelivery{
|
||||
at: time.Now(), flow: path.flow, bytes: int64(len(current) + frameHeaderSize),
|
||||
})
|
||||
}
|
||||
}(flowIndex, path)
|
||||
}
|
||||
wait.Wait()
|
||||
if firstErr != nil {
|
||||
return nil, firstErr
|
||||
}
|
||||
sort.Slice(deliveries, func(first, second int) bool { return deliveries[first].at.Before(deliveries[second].at) })
|
||||
return deliveries, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user