Improve traffic totals

This commit is contained in:
世界
2026-08-30 17:41:46 +08:00
parent 08986ad405
commit 6d431a2c43
2 changed files with 34 additions and 28 deletions
+28 -8
View File
@@ -2,7 +2,6 @@ package trafficcontrol
import (
"sync"
"sync/atomic"
"time"
"github.com/sagernet/sing-box/adapter"
@@ -36,13 +35,13 @@ var (
)
type Manager struct {
outbound adapter.OutboundManager
uploadTotal atomic.Int64
downloadTotal atomic.Int64
outbound adapter.OutboundManager
connections compatible.Map[uuid.UUID, Tracker]
closedConnectionsAccess sync.Mutex
closedConnections list.List[TrackerMetadata]
closedUploadTotal int64
closedDownloadTotal int64
eventSubscriber *observable.Subscriber[ConnectionEvent]
eventObserver *observable.Observer[ConnectionEvent]
@@ -98,16 +97,19 @@ func (m *Manager) join(tracker Tracker) {
func (m *Manager) leave(tracker Tracker) {
metadata := tracker.Metadata()
closedAt := time.Now()
m.closedConnectionsAccess.Lock()
_, loaded := m.connections.LoadAndDelete(metadata.ID)
if !loaded {
m.closedConnectionsAccess.Unlock()
return
}
closedAt := time.Now()
metadata.ClosedAt = closedAt
metadataCopy := *metadata
m.closedConnectionsAccess.Lock()
if m.closedConnections.Len() >= closedConnectionsLimit {
m.closedConnections.PopFront()
evicted := m.closedConnections.PopFront()
m.closedUploadTotal += evicted.Upload.Load()
m.closedDownloadTotal += evicted.Download.Load()
}
m.closedConnections.PushBack(metadataCopy)
m.closedConnectionsAccess.Unlock()
@@ -120,7 +122,21 @@ func (m *Manager) leave(tracker Tracker) {
}
func (m *Manager) Total() (uplinkTotal int64, downlinkTotal int64) {
return m.uploadTotal.Load(), m.downloadTotal.Load()
m.closedConnectionsAccess.Lock()
defer m.closedConnectionsAccess.Unlock()
uplinkTotal = m.closedUploadTotal
downlinkTotal = m.closedDownloadTotal
for element := m.closedConnections.Front(); element != nil; element = element.Next() {
uplinkTotal += element.Value.Upload.Load()
downlinkTotal += element.Value.Download.Load()
}
m.connections.Range(func(_ uuid.UUID, tracker Tracker) bool {
metadata := tracker.Metadata()
uplinkTotal += metadata.Upload.Load()
downlinkTotal += metadata.Download.Load()
return true
})
return
}
func (m *Manager) ConnectionsLen() int {
@@ -168,5 +184,9 @@ func (m *Manager) CloseAllConnections() {
func (m *Manager) Clear() {
m.closedConnectionsAccess.Lock()
defer m.closedConnectionsAccess.Unlock()
for element := m.closedConnections.Front(); element != nil; element = element.Next() {
m.closedUploadTotal += element.Value.Upload.Load()
m.closedDownloadTotal += element.Value.Download.Load()
}
m.closedConnections.Init()
}