Skip to content

Commit a54b3c4

Browse files
authored
Merge pull request #249 from setlog/feature-log-limit
Feature log limit
2 parents 8895197 + b9810a7 commit a54b3c4

File tree

5 files changed

+78
-17
lines changed

5 files changed

+78
-17
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
* Update dependencies to recent versions: gopsutils, testify, gojsonschema, logrus, prometheus/client_golang, go_ieproxy, fatih/color, golang/x/sys, golang/x/net
1111
* Do not hide the download speed label, even if the speed is zero.
1212
* The download-speed label now shows a 3 second average.
13+
* The same download-related log messages will now be printed at most 5 times (with information about this limit in the last message).
1314
* `hasher` will no longer blindly overwrite an existing bundleinfo.json but instead error out.
1415
* `hasher` will now exit with an error when the `pathToHash` has no files to hash.
1516
### Features

cmd/launcher/gui/gui_progress_handler.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77

88
"net/http"
99

10-
log "github.com/sirupsen/logrus"
10+
"github.com/setlog/trivrost/pkg/logging"
1111
)
1212

1313
// Implements fetching.DownloadProgressHandler
@@ -16,10 +16,11 @@ type GuiDownloadProgressHandler struct {
1616
progressAccumulator uint64
1717
ongoingProgressBuckets []uint64
1818
problemUrl string
19+
log *logging.LogLimiter
1920
}
2021

2122
func NewGuiDownloadProgressHandler(bucketCount int) *GuiDownloadProgressHandler {
22-
return &GuiDownloadProgressHandler{progressMutex: &sync.RWMutex{}, ongoingProgressBuckets: make([]uint64, bucketCount)}
23+
return &GuiDownloadProgressHandler{progressMutex: &sync.RWMutex{}, ongoingProgressBuckets: make([]uint64, bucketCount), log: logging.NewLogLimiter(5)}
2324
}
2425

2526
func (handler *GuiDownloadProgressHandler) ResetProgress() {
@@ -61,15 +62,15 @@ func (handler *GuiDownloadProgressHandler) HandleFinishDownload(fromURL string,
6162
}
6263

6364
func (handler *GuiDownloadProgressHandler) HandleFailDownload(fromURL string, workerId int, err error) {
64-
log.Errorf("GET %s failed: %v", fromURL, err)
65+
handler.log.Errorf("GET %s failed: %v", fromURL, err)
6566
handler.progressMutex.Lock()
6667
defer handler.progressMutex.Unlock()
6768
handler.problemUrl = fromURL
6869
NotifyProblem("Security error", false)
6970
}
7071

7172
func (handler *GuiDownloadProgressHandler) HandleHttpGetError(fromURL string, err error) {
72-
log.Warnf("GET %s could not start: %v", fromURL, err)
73+
handler.log.Warnf("GET %s could not start: %v", fromURL, err)
7374
handler.progressMutex.Lock()
7475
defer handler.progressMutex.Unlock()
7576
handler.problemUrl = fromURL
@@ -84,15 +85,15 @@ func (handler *GuiDownloadProgressHandler) HandleHttpGetError(fromURL string, er
8485
}
8586

8687
func (handler *GuiDownloadProgressHandler) HandleBadHttpResponse(fromURL string, code int) {
87-
log.Warnf("GET %s, error %d: %s", fromURL, code, http.StatusText(code))
88+
handler.log.Warnf("GET %s, error %d: %s", fromURL, code, http.StatusText(code))
8889
handler.progressMutex.Lock()
8990
defer handler.progressMutex.Unlock()
9091
handler.problemUrl = fromURL
9192
NotifyProblem(fmt.Sprintf("HTTP Status %d", code), false)
9293
}
9394

9495
func (handler *GuiDownloadProgressHandler) HandleReadError(fromURL string, err error, receivedByteCount int64) {
95-
log.Warnf("GET %s interrupted after receiving %d bytes: %v.", fromURL, receivedByteCount, err)
96+
handler.log.Warnf("GET %s interrupted after receiving %d bytes: %v.", fromURL, receivedByteCount, err)
9697
handler.progressMutex.Lock()
9798
defer handler.progressMutex.Unlock()
9899
handler.problemUrl = fromURL

pkg/fetching/download.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ type Download struct {
7272
firstByteIndex int64
7373
lastByteIndex int64
7474

75-
client *http.Client
76-
request *http.Request
77-
cancelRequest context.CancelFunc
78-
cooldownTime time.Time
79-
cooldownStacks int
75+
client *http.Client
76+
request *http.Request
77+
cancelRequest context.CancelFunc
78+
cooldownTime time.Time
79+
cooldownIndex int
8080

8181
response *http.Response
8282
responseReader io.Reader
@@ -261,7 +261,7 @@ func (dl *Download) cleanUp() {
261261

262262
func (dl *Download) waitCooldown() {
263263
now := time.Now()
264-
if dl.cooldownStacks > 0 && dl.cooldownTime.After(now) {
264+
if dl.cooldownIndex > 0 && dl.cooldownTime.After(now) {
265265
select {
266266
case <-time.NewTimer(dl.cooldownTime.Sub(now)).C:
267267
case <-dl.ctx.Done():
@@ -272,8 +272,7 @@ func (dl *Download) waitCooldown() {
272272

273273
func (dl *Download) inscribeCooldown() {
274274
cooldownIntervalOptions := []time.Duration{1, 1, 2, 3, 5, 8, 13}
275-
cooldownOptionIndex := intMin(dl.cooldownStacks, len(cooldownIntervalOptions)-1)
276-
cooldownDuration := time.Second * cooldownIntervalOptions[cooldownOptionIndex]
275+
cooldownDuration := time.Second * cooldownIntervalOptions[dl.cooldownIndex]
277276

278277
p := make([]byte, 1)
279278
_, err := rand.Read(p)
@@ -285,11 +284,11 @@ func (dl *Download) inscribeCooldown() {
285284
}
286285

287286
dl.cooldownTime = time.Now().Add(cooldownDuration)
288-
dl.cooldownStacks++
287+
dl.cooldownIndex = intMin(dl.cooldownIndex+1, len(cooldownIntervalOptions)-1)
289288
}
290289

291290
func (dl *Download) resetCooldown() {
292-
dl.cooldownStacks = 0
291+
dl.cooldownIndex = 0
293292
}
294293

295294
func intMin(a, b int) int {

pkg/fetching/helpers.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
"time"
1313

1414
"github.com/mattn/go-ieproxy"
15-
log "github.com/sirupsen/logrus"
15+
"github.com/setlog/trivrost/pkg/logging"
1616
)
1717

1818
func MakeClient() *http.Client {
@@ -35,6 +35,7 @@ func MakeClient() *http.Client {
3535

3636
func GetProxyLoggingFunc() func(req *http.Request) (*url.URL, error) {
3737
proxyFunc := ieproxy.GetProxyFunc()
38+
log := logging.NewLogLimiter(5)
3839
return func(req *http.Request) (*url.URL, error) {
3940
proxyURL, err := proxyFunc(req)
4041
if err != nil {

pkg/logging/log_limiter.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package logging
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
"sync/atomic"
7+
8+
log "github.com/sirupsen/logrus"
9+
)
10+
11+
type LogLimiter struct {
12+
limit int64
13+
seenMessages *sync.Map
14+
}
15+
16+
func NewLogLimiter(limit int) *LogLimiter {
17+
return &LogLimiter{limit: int64(limit), seenMessages: &sync.Map{}}
18+
}
19+
20+
func (l *LogLimiter) Logf(level log.Level, format string, args ...interface{}) {
21+
l.Log(level, fmt.Sprintf(format, args...))
22+
}
23+
24+
func (l *LogLimiter) Log(level log.Level, message string) {
25+
var seenCount int64 = 0
26+
seenCountP, _ := l.seenMessages.LoadOrStore(message, &seenCount)
27+
seenCount = atomic.AddInt64(seenCountP.(*int64), 1)
28+
if seenCount <= l.limit {
29+
if seenCount == l.limit {
30+
log.StandardLogger().Logf(level, "%v (Last log of this message due to excess)", message)
31+
} else {
32+
log.StandardLogger().Log(level, message)
33+
}
34+
}
35+
}
36+
37+
func (l *LogLimiter) Infof(format string, args ...interface{}) {
38+
l.Logf(log.InfoLevel, format, args...)
39+
}
40+
41+
func (l *LogLimiter) Info(message string) {
42+
l.Log(log.InfoLevel, message)
43+
}
44+
45+
func (l *LogLimiter) Warnf(format string, args ...interface{}) {
46+
l.Logf(log.WarnLevel, format, args...)
47+
}
48+
49+
func (l *LogLimiter) Warn(message string) {
50+
l.Log(log.WarnLevel, message)
51+
}
52+
53+
func (l *LogLimiter) Errorf(format string, args ...interface{}) {
54+
l.Logf(log.ErrorLevel, format, args...)
55+
}
56+
57+
func (l *LogLimiter) Error(message string) {
58+
l.Log(log.ErrorLevel, message)
59+
}

0 commit comments

Comments
 (0)