mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-10-07 14:49:59 +00:00
Improve traffic totals
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user