修复数据竞争问题

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"
"fmt"
"strconv"
"sync"
"time"
"github.com/bjdgyc/anylink/base"
@ -20,6 +21,7 @@ type StatsInfo struct {
RealtimeData map[string]*list.List
Actions []string
Scopes []string
mux sync.Mutex
}
type ScopeDetail struct {
@ -65,6 +67,9 @@ func (s *StatsInfo) ValidScope(scope string) bool {
// 设置实时统计数据
func (s *StatsInfo) SetRealTime(action string, val interface{}) {
s.mux.Lock()
defer s.mux.Unlock()
if s.RealtimeData[action].Len() >= RealTimeMaxSize {
ele := s.RealtimeData[action].Front()
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{}) {
s.mux.Lock()
defer s.mux.Unlock()
for e := s.RealtimeData[action].Front(); e != nil; e = e.Next() {
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 {
_ = Add(so)
}

View File

@ -52,15 +52,15 @@ func saveStatsInfo() {
tNow := time.Now()
// online
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
upData, _ := json.Marshal(upGroups)
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
sc := &dbdata.StatsCpu{Percent: getCpuPercent(), CreatedAt: tNow}
sc := dbdata.StatsCpu{Percent: getCpuPercent(), CreatedAt: tNow}
// mem
sm := &dbdata.StatsMem{Percent: getMemPercent(), CreatedAt: tNow}
sm := dbdata.StatsMem{Percent: getMemPercent(), CreatedAt: tNow}
count++
// 是否保存至数据库
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("network", sn)