summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCecylia Bocovich <cohosh@torproject.org>2023-10-28 13:35:06 -0400
committerCecylia Bocovich <cohosh@torproject.org>2023-10-30 12:42:45 -0400
commit83a7422fe61546fd05c1a71d62f9a384f9f9e374 (patch)
tree3805010245735878eec57b61820f919254e35072
parent939062c7dd31d80292015fff4b4c13234c85f6ba (diff)
downloadsnowflake-83a7422fe61546fd05c1a71d62f9a384f9f9e374.tar.gz
snowflake-83a7422fe61546fd05c1a71d62f9a384f9f9e374.zip
Zero bytesSyncLogger stats after reading them
This also makes the call to GetStat() more thread safe.
-rw-r--r--proxy/lib/util.go23
1 files changed, 19 insertions, 4 deletions
diff --git a/proxy/lib/util.go b/proxy/lib/util.go
index bb678d8..fcb301f 100644
--- a/proxy/lib/util.go
+++ b/proxy/lib/util.go
@@ -27,16 +27,22 @@ func (b bytesNullLogger) GetStat() (in int64, out int64) { return -1, -1 }
// occuring at reasonable intervals.
type bytesSyncLogger struct {
outboundChan, inboundChan chan int64
- outbound, inbound int64
+ statsChan chan bytesLoggerStats
+ stats bytesLoggerStats
outEvents, inEvents int
start time.Time
}
+type bytesLoggerStats struct {
+ outbound, inbound int64
+}
+
// newBytesSyncLogger returns a new bytesSyncLogger and starts it loggin.
func newBytesSyncLogger() *bytesSyncLogger {
b := &bytesSyncLogger{
outboundChan: make(chan int64, 5),
inboundChan: make(chan int64, 5),
+ statsChan: make(chan bytesLoggerStats),
}
go b.log()
b.start = time.Now()
@@ -47,11 +53,16 @@ func (b *bytesSyncLogger) log() {
for {
select {
case amount := <-b.outboundChan:
- b.outbound += amount
+ b.stats.outbound += amount
b.outEvents++
case amount := <-b.inboundChan:
- b.inbound += amount
+ b.stats.inbound += amount
b.inEvents++
+ case b.statsChan <- b.stats:
+ b.stats.inbound = 0
+ b.stats.outbound = 0
+ b.inEvents = 0
+ b.outEvents = 0
}
}
}
@@ -66,6 +77,10 @@ func (b *bytesSyncLogger) AddInbound(amount int64) {
b.inboundChan <- amount
}
-func (b *bytesSyncLogger) GetStat() (in int64, out int64) { return b.inbound, b.outbound }
+// GetStat returns the current inbound and outbound stats from the logger and then zeros the counts
+func (b *bytesSyncLogger) GetStat() (in int64, out int64) {
+ stats := <-b.statsChan
+ return stats.inbound, stats.outbound
+}
func formatTraffic(amount int64) (value int64, unit string) { return amount / 1000, "KB" }