diff options
author | Cecylia Bocovich <cohosh@torproject.org> | 2023-10-28 13:35:06 -0400 |
---|---|---|
committer | Cecylia Bocovich <cohosh@torproject.org> | 2023-10-30 12:42:45 -0400 |
commit | 83a7422fe61546fd05c1a71d62f9a384f9f9e374 (patch) | |
tree | 3805010245735878eec57b61820f919254e35072 | |
parent | 939062c7dd31d80292015fff4b4c13234c85f6ba (diff) | |
download | snowflake-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.go | 23 |
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" } |