修复数据竞争问题

This commit is contained in:
bjdgyc 2022-09-19 16:56:44 +08:00
parent 49db8ccff8
commit 11feb6d4a5
2 changed files with 14 additions and 6 deletions

View File

@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"strconv" "strconv"
"sync"
"time" "time"
"github.com/bjdgyc/anylink/base" "github.com/bjdgyc/anylink/base"
@ -20,6 +21,7 @@ type StatsInfo struct {
RealtimeData map[string]*list.List RealtimeData map[string]*list.List
Actions []string Actions []string
Scopes []string Scopes []string
mux sync.Mutex
} }
type ScopeDetail struct { type ScopeDetail struct {
@ -65,6 +67,9 @@ func (s *StatsInfo) ValidScope(scope string) bool {
// 设置实时统计数据 // 设置实时统计数据
func (s *StatsInfo) SetRealTime(action string, val interface{}) { func (s *StatsInfo) SetRealTime(action string, val interface{}) {
s.mux.Lock()
defer s.mux.Unlock()
if s.RealtimeData[action].Len() >= RealTimeMaxSize { if s.RealtimeData[action].Len() >= RealTimeMaxSize {
ele := s.RealtimeData[action].Front() ele := s.RealtimeData[action].Front()
s.RealtimeData[action].Remove(ele) s.RealtimeData[action].Remove(ele)
@ -74,6 +79,9 @@ func (s *StatsInfo) SetRealTime(action string, val interface{}) {
// 获取实时统计数据 // 获取实时统计数据
func (s *StatsInfo) GetRealTime(action string) (res []interface{}) { func (s *StatsInfo) GetRealTime(action string) (res []interface{}) {
s.mux.Lock()
defer s.mux.Unlock()
for e := s.RealtimeData[action].Front(); e != nil; e = e.Next() { for e := s.RealtimeData[action].Front(); e != nil; e = e.Next() {
res = append(res, e.Value) res = append(res, e.Value)
} }
@ -81,7 +89,7 @@ func (s *StatsInfo) GetRealTime(action string) (res []interface{}) {
} }
// 保存数据至数据库 // 保存数据至数据库
func (s *StatsInfo) SaveStatsInfo(so *StatsOnline, sn *StatsNetwork, sc *StatsCpu, sm *StatsMem) { func (s *StatsInfo) SaveStatsInfo(so StatsOnline, sn StatsNetwork, sc StatsCpu, sm StatsMem) {
if so.Num != 0 { if so.Num != 0 {
_ = Add(so) _ = Add(so)
} }

View File

@ -52,15 +52,15 @@ func saveStatsInfo() {
tNow := time.Now() tNow := time.Now()
// online // online
numData, _ := json.Marshal(numGroups) numData, _ := json.Marshal(numGroups)
so := &dbdata.StatsOnline{Num: onlineNum, NumGroups: string(numData), CreatedAt: tNow} so := dbdata.StatsOnline{Num: onlineNum, NumGroups: string(numData), CreatedAt: tNow}
// network // network
upData, _ := json.Marshal(upGroups) upData, _ := json.Marshal(upGroups)
downData, _ := json.Marshal(downGroups) downData, _ := json.Marshal(downGroups)
sn := &dbdata.StatsNetwork{Up: up, Down: down, UpGroups: string(upData), DownGroups: string(downData), CreatedAt: tNow} sn := dbdata.StatsNetwork{Up: up, Down: down, UpGroups: string(upData), DownGroups: string(downData), CreatedAt: tNow}
// cpu // cpu
sc := &dbdata.StatsCpu{Percent: getCpuPercent(), CreatedAt: tNow} sc := dbdata.StatsCpu{Percent: getCpuPercent(), CreatedAt: tNow}
// mem // mem
sm := &dbdata.StatsMem{Percent: getMemPercent(), CreatedAt: tNow} sm := dbdata.StatsMem{Percent: getMemPercent(), CreatedAt: tNow}
count++ count++
// 是否保存至数据库 // 是否保存至数据库
save := count*StatsCycleSec >= AddCycleSec save := count*StatsCycleSec >= AddCycleSec
@ -74,7 +74,7 @@ func saveStatsInfo() {
}() }()
} }
func setStatsData(save bool, so *dbdata.StatsOnline, sn *dbdata.StatsNetwork, sc *dbdata.StatsCpu, sm *dbdata.StatsMem) { func setStatsData(save bool, so dbdata.StatsOnline, sn dbdata.StatsNetwork, sc dbdata.StatsCpu, sm dbdata.StatsMem) {
// 实时数据 // 实时数据
dbdata.StatsInfoIns.SetRealTime("online", so) dbdata.StatsInfoIns.SetRealTime("online", so)
dbdata.StatsInfoIns.SetRealTime("network", sn) dbdata.StatsInfoIns.SetRealTime("network", sn)