5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-26 15:21:37 +00:00

when dropping a queue, select one at random based on queue size in bytes

This commit is contained in:
Arceliar 2018-07-06 00:11:36 -05:00
parent 1a65c065d0
commit e6a47f705d

View File

@ -12,6 +12,7 @@ package yggdrasil
// A little annoying to do with constant changes from backpressure // A little annoying to do with constant changes from backpressure
import ( import (
"math/rand"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
@ -624,7 +625,13 @@ func (b *switch_buffers) cleanup(t *switchTable) {
const maxSize = 4 * 1048576 // Maximum 4 MB const maxSize = 4 * 1048576 // Maximum 4 MB
for b.size > maxSize { for b.size > maxSize {
// Drop a random queue // Drop a random queue
for streamID := range b.bufs { target := rand.Uint64() % b.size
var size uint64 // running total
for streamID, buf := range b.bufs {
size += buf.size
if size < target {
continue
}
remove(streamID) remove(streamID)
break break
} }