diff --git a/main.go b/main.go index f1c3f32..dc2d784 100644 --- a/main.go +++ b/main.go @@ -61,7 +61,7 @@ func (m UploadManager) Upload() (int, error) { } } -func (m UploadManager) SetUpload(upload int) error { +func (m UploadManager) SetUpload(upload int) (int, error) { m.clearTC() args := []string{"qdisc", "add", "dev", conf.UploadInterface, "root", "cake", "bandwidth", fmt.Sprintf("%dMbit", upload)} args = append(args, strings.Split(conf.CakeOptions, " ")...) @@ -70,9 +70,9 @@ func (m UploadManager) SetUpload(upload int) error { out, err := tcCmd.CombinedOutput() if err != nil { log.Debugf("[TC] executing %s failed with: %v (%s)", tcCmd.String(), err, out) - return err + return 0, err } - return nil + return upload, nil } func (m UploadManager) clearTC() { @@ -132,7 +132,7 @@ func (m UploadManager) pingWorker() error { if stats.AvgRtt.Milliseconds() >= conf.ThrottlePingThreshold { log.Infof("extended ping %s, adjusting upload TC %d->%d", stats.AvgRtt, up, up-conf.Bandwidth.Step) - err = m.SetUpload(up - conf.Bandwidth.Step) + up, err = m.SetUpload(up - conf.Bandwidth.Step) if err != nil { return err } @@ -147,11 +147,28 @@ func (m UploadManager) pingWorker() error { } if m.isBWInRange(up + conf.Bandwidth.Step) { log.Infof("Short ping %s, trying to increase upload TC %d->%d", stats.AvgRtt, up, up+conf.Bandwidth.Step) - err = m.SetUpload(up + conf.Bandwidth.Step) + up, err = m.SetUpload(up + conf.Bandwidth.Step) if err != nil { return err } m.LastOver = time.Now() + + stats, err = doPing(conf.Host, conf.ConformationPPP, time.Second) + if err != nil { + log.Warningf("ping to %s failed: %v", conf.Host, err) + time.Sleep(time.Duration(conf.Interval) * time.Minute) + continue + } + + if stats.AvgRtt.Milliseconds() >= conf.ThrottlePingThreshold { + log.Infof("increase failed with %s ping, reverting to %d", stats.AvgRtt, up-conf.Bandwidth.Step) + _, err = m.SetUpload(up - conf.Bandwidth.Step) + if err != nil { + return err + } + } else { + log.Infof("Extended ping %s seems stable", stats.AvgRtt) + } } } time.Sleep(time.Duration(conf.Interval) * time.Minute)