mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-09-01 16:01:55 +03:00
Make DRS optional
This commit is contained in:
@@ -29,6 +29,8 @@ type Ganger struct {
|
||||
scoutRaidEach time.Duration
|
||||
scoutRaidRepeats int
|
||||
|
||||
drs bool
|
||||
|
||||
stats *Stats
|
||||
durations []time.Duration
|
||||
|
||||
@@ -107,7 +109,7 @@ func (g *Ganger) run() {
|
||||
g.wg.Go(func() {
|
||||
select {
|
||||
case <-g.ctx.Done():
|
||||
case updatedStatsChan <- NewStats(durations):
|
||||
case updatedStatsChan <- NewStats(durations, g.drs):
|
||||
}
|
||||
})
|
||||
case stats := <-updatedStatsChan:
|
||||
@@ -152,6 +154,7 @@ func NewGanger(
|
||||
scoutEach time.Duration,
|
||||
scoutRepeats int,
|
||||
urls []string,
|
||||
drs bool,
|
||||
) *Ganger {
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
|
||||
@@ -169,9 +172,11 @@ func NewGanger(
|
||||
logger: logger,
|
||||
scoutRaidEach: scoutEach,
|
||||
scoutRaidRepeats: scoutRepeats,
|
||||
drs: drs,
|
||||
stats: &Stats{
|
||||
k: StatsDefaultK,
|
||||
lambda: StatsDefaultLambda,
|
||||
drs: drs,
|
||||
},
|
||||
scout: NewScout(network, urls),
|
||||
connRequests: make(chan gangerConnRequest),
|
||||
|
||||
@@ -29,7 +29,7 @@ func (suite *GangerTestSuite) SetupTest() {
|
||||
On("WarningError", mock.AnythingOfType("string"), mock.Anything).
|
||||
Maybe()
|
||||
|
||||
suite.g = NewGanger(suite.ctx, suite.network, suite.log, time.Hour, 1, suite.urls)
|
||||
suite.g = NewGanger(suite.ctx, suite.network, suite.log, time.Hour, 1, suite.urls, true)
|
||||
suite.g.Run()
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ const (
|
||||
// Please see Stats description
|
||||
// https://blog.cloudflare.com/optimizing-tls-over-tcp-to-reduce-latency/
|
||||
// https://github.com/cloudflare/sslconfig/blob/master/patches/nginx__dynamic_tls_records.patch
|
||||
TLSRecordSizeStart = 1369
|
||||
TLSRecordSizeAccel = 4229
|
||||
TLSRecordSizeStart = 1450
|
||||
TLSRecordSizeAccel = 4096
|
||||
TLSRecordSizeMax = 16384 - tls.SizeHeader
|
||||
|
||||
TLSCounterAccelAfter = 40
|
||||
|
||||
@@ -17,6 +17,9 @@ const (
|
||||
// these values are taken from ok.ru. measured from moscow site.
|
||||
StatsDefaultK = 0.37846373895785335
|
||||
StatsDefaultLambda = 1.73177086015485
|
||||
|
||||
// how many bytes should we drift
|
||||
DRSNoise = 100
|
||||
)
|
||||
|
||||
// Stats is responsible for generating values that are distributed according
|
||||
@@ -66,6 +69,9 @@ type Stats struct {
|
||||
k float64
|
||||
// https://en.wikipedia.org/wiki/Scale_parameter
|
||||
lambda float64
|
||||
|
||||
// Dynamic Record Sizing
|
||||
drs bool
|
||||
}
|
||||
|
||||
func (d *Stats) Delay() time.Duration {
|
||||
@@ -84,20 +90,24 @@ func (d *Stats) Size() int {
|
||||
d.sizeCounter = 0
|
||||
}
|
||||
|
||||
if !d.drs {
|
||||
return TLSRecordSizeMax
|
||||
}
|
||||
|
||||
d.sizeLastRequested = time.Now()
|
||||
d.sizeCounter++
|
||||
|
||||
switch {
|
||||
case d.sizeCounter <= TLSCounterAccelAfter:
|
||||
return TLSRecordSizeStart
|
||||
return TLSRecordSizeStart - rand.IntN(DRSNoise)
|
||||
case d.sizeCounter <= TLSCounterMaxAfter:
|
||||
return TLSRecordSizeAccel
|
||||
return TLSRecordSizeAccel - rand.IntN(DRSNoise)
|
||||
}
|
||||
|
||||
return TLSRecordSizeMax
|
||||
}
|
||||
|
||||
func NewStats(durations []time.Duration) *Stats {
|
||||
func NewStats(durations []time.Duration, drs bool) *Stats {
|
||||
n := float64(len(durations))
|
||||
|
||||
// in milliseconds
|
||||
@@ -150,5 +160,6 @@ func NewStats(durations []time.Duration) *Stats {
|
||||
return &Stats{
|
||||
k: k,
|
||||
lambda: lambda,
|
||||
drs: drs,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ func (suite *StatsTestSuite) TestNewStatsRecoverParameters() {
|
||||
knownLambda := 100.0
|
||||
|
||||
samples := suite.GenWeibull(knownK, knownLambda, 5000, 42)
|
||||
stats := NewStats(samples)
|
||||
stats := NewStats(samples, true)
|
||||
|
||||
suite.InDelta(knownK, stats.k, 0.1)
|
||||
suite.InDelta(knownLambda, stats.lambda, 5.0)
|
||||
@@ -50,7 +50,7 @@ func (suite *StatsTestSuite) TestNewStatsExponentialCase() {
|
||||
knownLambda := 50.0
|
||||
|
||||
samples := suite.GenWeibull(knownK, knownLambda, 5000, 123)
|
||||
stats := NewStats(samples)
|
||||
stats := NewStats(samples, true)
|
||||
|
||||
suite.InDelta(knownK, stats.k, 0.1)
|
||||
suite.InDelta(knownLambda, stats.lambda, 5.0)
|
||||
@@ -64,7 +64,7 @@ func (suite *StatsTestSuite) TestNewStatsSmallK() {
|
||||
knownLambda := 100.0
|
||||
|
||||
samples := suite.GenWeibull(knownK, knownLambda, 10000, 99)
|
||||
stats := NewStats(samples)
|
||||
stats := NewStats(samples, true)
|
||||
|
||||
suite.InDelta(knownK, stats.k, 0.05)
|
||||
suite.InDelta(knownLambda, stats.lambda, 5.0)
|
||||
@@ -76,7 +76,7 @@ func (suite *StatsTestSuite) TestNewStatsLargeK() {
|
||||
knownLambda := 200.0
|
||||
|
||||
samples := suite.GenWeibull(knownK, knownLambda, 5000, 77)
|
||||
stats := NewStats(samples)
|
||||
stats := NewStats(samples, true)
|
||||
|
||||
suite.InDelta(knownK, stats.k, 0.3)
|
||||
suite.InDelta(knownLambda, stats.lambda, 5.0)
|
||||
@@ -121,7 +121,7 @@ func (suite *StatsTestSuite) TestNewStatsRoundTrip() {
|
||||
knownLambda := 80.0
|
||||
|
||||
samples := suite.GenWeibull(knownK, knownLambda, 5000, 555)
|
||||
stats := NewStats(samples)
|
||||
stats := NewStats(samples, true)
|
||||
|
||||
n := 50000
|
||||
sum := 0.0
|
||||
@@ -138,16 +138,17 @@ func (suite *StatsTestSuite) TestNewStatsRoundTrip() {
|
||||
}
|
||||
|
||||
func (suite *StatsTestSuite) TestSizeStartPhase() {
|
||||
stats := &Stats{k: 1.0, lambda: 1.0}
|
||||
stats := &Stats{k: 1.0, lambda: 1.0, drs: true}
|
||||
|
||||
for range TLSCounterAccelAfter {
|
||||
size := stats.Size()
|
||||
suite.Equal(TLSRecordSizeStart, size)
|
||||
suite.GreaterOrEqual(size, TLSRecordSizeStart-DRSNoise)
|
||||
suite.LessOrEqual(size, TLSRecordSizeStart)
|
||||
}
|
||||
}
|
||||
|
||||
func (suite *StatsTestSuite) TestSizeAccelPhase() {
|
||||
stats := &Stats{k: 1.0, lambda: 1.0}
|
||||
stats := &Stats{k: 1.0, lambda: 1.0, drs: true}
|
||||
|
||||
for range TLSCounterAccelAfter {
|
||||
stats.Size()
|
||||
@@ -155,12 +156,13 @@ func (suite *StatsTestSuite) TestSizeAccelPhase() {
|
||||
|
||||
for range TLSCounterMaxAfter - TLSCounterAccelAfter {
|
||||
size := stats.Size()
|
||||
suite.Equal(TLSRecordSizeAccel, size)
|
||||
suite.GreaterOrEqual(size, TLSRecordSizeAccel-DRSNoise)
|
||||
suite.LessOrEqual(size, TLSRecordSizeAccel)
|
||||
}
|
||||
}
|
||||
|
||||
func (suite *StatsTestSuite) TestSizeMaxPhase() {
|
||||
stats := &Stats{k: 1.0, lambda: 1.0}
|
||||
stats := &Stats{k: 1.0, lambda: 1.0, drs: true}
|
||||
|
||||
for range TLSCounterMaxAfter {
|
||||
stats.Size()
|
||||
@@ -173,7 +175,7 @@ func (suite *StatsTestSuite) TestSizeMaxPhase() {
|
||||
}
|
||||
|
||||
func (suite *StatsTestSuite) TestSizeResetsAfterInactivity() {
|
||||
stats := &Stats{k: 1.0, lambda: 1.0}
|
||||
stats := &Stats{k: 1.0, lambda: 1.0, drs: true}
|
||||
|
||||
// Advance past start phase.
|
||||
for range TLSCounterMaxAfter {
|
||||
@@ -185,7 +187,30 @@ func (suite *StatsTestSuite) TestSizeResetsAfterInactivity() {
|
||||
// Simulate inactivity by backdating sizeLastRequested.
|
||||
stats.sizeLastRequested = time.Now().Add(-TLSRecordSizeResetAfter - time.Millisecond)
|
||||
|
||||
suite.Equal(TLSRecordSizeStart, stats.Size())
|
||||
size := stats.Size()
|
||||
suite.GreaterOrEqual(size, TLSRecordSizeStart-DRSNoise)
|
||||
suite.LessOrEqual(size, TLSRecordSizeStart)
|
||||
}
|
||||
|
||||
func (suite *StatsTestSuite) TestSizeNoDRSAlwaysMax() {
|
||||
stats := &Stats{k: 1.0, lambda: 1.0, drs: false}
|
||||
|
||||
for range TLSCounterMaxAfter + 20 {
|
||||
suite.Equal(TLSRecordSizeMax, stats.Size())
|
||||
}
|
||||
}
|
||||
|
||||
func (suite *StatsTestSuite) TestSizeNoDRSIgnoresCounter() {
|
||||
stats := &Stats{k: 1.0, lambda: 1.0, drs: false}
|
||||
|
||||
// Even after many calls, always returns max.
|
||||
for range 200 {
|
||||
suite.Equal(TLSRecordSizeMax, stats.Size())
|
||||
}
|
||||
|
||||
// Inactivity has no effect either.
|
||||
stats.sizeLastRequested = time.Now().Add(-TLSRecordSizeResetAfter - time.Millisecond)
|
||||
suite.Equal(TLSRecordSizeMax, stats.Size())
|
||||
}
|
||||
|
||||
func TestStats(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user