@@ -971,72 +971,101 @@ func checkAndResetCycleTraffic(clientID uint64) {
971971
972972 currentCycleStart := transferRule .GetTransferDurationStart ()
973973 currentCycleEnd := transferRule .GetTransferDurationEnd ()
974+ singleton .AlertsLock .RUnlock ()
974975
975- // 读取上次重置参考时间(仍在读锁下,随后立即释放)
976- lastResetTime := time.Time {}
977- hasNextUpdate := false
978- if stats , exists := singleton .AlertsCycleTransferStatsStore [matchingAlert .ID ]; exists && stats != nil {
979- if nu , has := stats .NextUpdate [clientID ]; has {
980- hasNextUpdate = true
981- // 如果NextUpdate在当前周期开始之前,说明是上个周期的记录,可以作为重置参考
982- if nu .Before (currentCycleStart ) {
983- lastResetTime = nu
984- }
985- }
976+ // 2) 读取服务器的上次重置时间(从持久化字段)
977+ singleton .ServerLock .RLock ()
978+ server := singleton .ServerList [clientID ]
979+ if server == nil {
980+ singleton .ServerLock .RUnlock ()
981+ return
986982 }
987- singleton .AlertsLock .RUnlock ()
983+ lastResetTime := server .LastTrafficResetTime
984+ singleton .ServerLock .RUnlock ()
988985
989- // 2 ) 判断是否需要重置(锁外计算)
986+ // 3 ) 判断是否需要重置(锁外计算)
990987 needReset := false
991988 now := time .Now ()
992989
993- // 重置条件:有NextUpdate记录且lastResetTime在当前周期之前
994- if hasNextUpdate && now .After (currentCycleStart ) && ! lastResetTime .IsZero () && lastResetTime .Before (currentCycleStart ) {
990+ // 重置条件:上次重置时间在当前周期开始之前
991+ // 如果LastTrafficResetTime为零值(从未重置过),则初始化为当前周期起点
992+ if lastResetTime .IsZero () {
993+ // 首次检测,将重置时间初始化为当前周期起点,避免启动时误触发
994+ singleton .ServerLock .Lock ()
995+ if svr := singleton .ServerList [clientID ]; svr != nil {
996+ svr .LastTrafficResetTime = currentCycleStart
997+ log .Printf ("[周期流量初始化] 服务器ID=%d 初始化重置时间为当前周期起点: %s" ,
998+ clientID , currentCycleStart .Format ("2006-01-02 15:04:05" ))
999+
1000+ // 持久化到数据库
1001+ if singleton .Conf .DatabaseType == "badger" {
1002+ if db .DB != nil {
1003+ serverOps := db .NewServerOps (db .DB )
1004+ if dbServer , err := serverOps .GetServer (clientID ); err == nil && dbServer != nil {
1005+ dbServer .LastTrafficResetTime = currentCycleStart
1006+ _ = serverOps .SaveServer (dbServer )
1007+ }
1008+ }
1009+ } else if singleton .DB != nil {
1010+ _ = singleton .DB .Model (& model.Server {}).Where ("id = ?" , clientID ).
1011+ Update ("last_traffic_reset_time" , currentCycleStart ).Error
1012+ }
1013+ }
1014+ singleton .ServerLock .Unlock ()
1015+ return
1016+ }
1017+
1018+ // 检查是否需要重置:上次重置在当前周期之前
1019+ if lastResetTime .Before (currentCycleStart ) && now .After (currentCycleStart ) {
9951020 needReset = true
1021+ log .Printf ("[周期流量重置] 服务器ID=%d 触发重置: 上次重置时间=%s 在当前周期 %s 之前" ,
1022+ clientID , lastResetTime .Format ("2006-01-02 15:04:05" ), currentCycleStart .Format ("2006-01-02 15:04:05" ))
9961023 }
9971024
9981025 if ! needReset {
9991026 return
10001027 }
10011028
1002- // 3 ) 重置累计流量(写锁仅包裹修改内存状态)
1029+ // 4 ) 重置累计流量(写锁仅包裹修改内存状态)
10031030 singleton .ServerLock .Lock ()
1004- server := singleton .ServerList [clientID ]
1005- if server == nil {
1031+ resetServer := singleton .ServerList [clientID ]
1032+ if resetServer == nil {
10061033 singleton .ServerLock .Unlock ()
10071034 return
10081035 }
1009- oldInTransfer := server .CumulativeNetInTransfer
1010- oldOutTransfer := server .CumulativeNetOutTransfer
1011- serverName := server .Name
1036+ oldInTransfer := resetServer .CumulativeNetInTransfer
1037+ oldOutTransfer := resetServer .CumulativeNetOutTransfer
1038+ serverName := resetServer .Name
10121039 serverIP := ""
1013- if server .Host != nil {
1014- serverIP = server .Host .IP
1040+ if resetServer .Host != nil {
1041+ serverIP = resetServer .Host .IP
10151042 }
10161043
1017- server .CumulativeNetInTransfer = 0
1018- server .CumulativeNetOutTransfer = 0
1019- server .PrevTransferInSnapshot = 0
1020- server .PrevTransferOutSnapshot = 0
1044+ resetServer .CumulativeNetInTransfer = 0
1045+ resetServer .CumulativeNetOutTransfer = 0
1046+ resetServer .PrevTransferInSnapshot = 0
1047+ resetServer .PrevTransferOutSnapshot = 0
1048+ resetServer .LastTrafficResetTime = now // 更新重置时间
10211049 singleton .ServerLock .Unlock ()
10221050
1023- // 4 ) 持久化到数据库(锁外)
1051+ // 5 ) 持久化到数据库(锁外)
10241052 if singleton .Conf .DatabaseType == "badger" {
10251053 if db .DB != nil {
10261054 serverOps := db .NewServerOps (db .DB )
10271055 if dbServer , err := serverOps .GetServer (clientID ); err == nil && dbServer != nil {
10281056 dbServer .CumulativeNetInTransfer = 0
10291057 dbServer .CumulativeNetOutTransfer = 0
1058+ dbServer .LastTrafficResetTime = now
10301059 _ = serverOps .SaveServer (dbServer ) // 静默处理错误,避免打扰热路径
10311060 }
10321061 }
10331062 } else {
10341063 if singleton .DB != nil {
1035- _ = singleton .DB .Exec ("UPDATE servers SET cumulative_net_in_transfer = 0, cumulative_net_out_transfer = 0 WHERE id = ?" , clientID ).Error
1064+ _ = singleton .DB .Exec ("UPDATE servers SET cumulative_net_in_transfer = 0, cumulative_net_out_transfer = 0, last_traffic_reset_time = ? WHERE id = ?" , now , clientID ).Error
10361065 }
10371066 }
10381067
1039- // 5 ) 更新周期统计存储(需要写锁)
1068+ // 6 ) 更新周期统计存储(需要写锁)
10401069 singleton .AlertsLock .Lock ()
10411070 if stats , exists := singleton .AlertsCycleTransferStatsStore [matchingAlert .ID ]; exists && stats != nil {
10421071 if stats .NextUpdate == nil {
@@ -1052,7 +1081,7 @@ func checkAndResetCycleTraffic(clientID uint64) {
10521081 }
10531082 singleton .AlertsLock .Unlock ()
10541083
1055- // 6 ) 发送通知(锁外)
1084+ // 7 ) 发送通知(锁外)
10561085 formatTraffic := func (bytes uint64 ) string {
10571086 const unit = 1024
10581087 if bytes < unit {
0 commit comments