@@ -157,13 +157,13 @@ func (s *ServerHandler) ReportTask(c context.Context, r *pb.TaskResult) (*pb.Rec
157157
158158 if cr .PushSuccessful && r .GetSuccessful () {
159159 message := fmt .Sprintf ("[%s]\n 任务名称: %s\n 执行设备: %s (ID:%d)\n 开始时间: %s\n 结束时间: %s\n 执行结果: 成功" ,
160- singleton .Localizer .MustLocalize (& i18n.LocalizeConfig {
161- MessageID : "ScheduledTaskExecutedSuccessfully" ,
162- }),
163- cr .Name ,
164- singleton .ServerList [clientID ].Name , clientID ,
165- startTime .Format ("2006-01-02 15:04:05" ),
166- endTime .Format ("2006-01-02 15:04:05" ))
160+ singleton .Localizer .MustLocalize (& i18n.LocalizeConfig {
161+ MessageID : "ScheduledTaskExecutedSuccessfully" ,
162+ }),
163+ cr .Name ,
164+ singleton .ServerList [clientID ].Name , clientID ,
165+ startTime .Format ("2006-01-02 15:04:05" ),
166+ endTime .Format ("2006-01-02 15:04:05" ))
167167
168168 singleton .SafeSendNotification (cr .NotificationTag , message , nil , & curServer )
169169 }
@@ -459,17 +459,17 @@ func (s *ServerHandler) processServerStateWithoutLock(clientID uint64, serverCop
459459
460460 // 准备数据库更新数据
461461 dbUpdates := make (map [string ]interface {})
462-
462+
463463 // 第一阶段:读取必要数据(短暂持读锁)
464464 var needDBQuery bool
465465 var dbCumulativeIn , dbCumulativeOut uint64
466-
466+
467467 singleton .ServerLock .RLock ()
468468 if server , exists := singleton .ServerList [clientID ]; exists {
469469 needDBQuery = isFirstReport && (server .CumulativeNetInTransfer == 0 && server .CumulativeNetOutTransfer == 0 )
470470 }
471471 singleton .ServerLock .RUnlock ()
472-
472+
473473 // 第二阶段:数据库查询(在锁外执行)
474474 if needDBQuery && singleton .DB != nil {
475475 var dbServer model.Server
@@ -698,18 +698,15 @@ func (s *ServerHandler) ReportSystemInfo(c context.Context, r *pb.Host) (*pb.Rec
698698 return nil , err
699699 }
700700 host := model .PB2Host (r )
701- singleton .ServerLock .RLock ()
702- defer singleton .ServerLock .RUnlock ()
703-
704- // 检查并更新DDNS - 修复:添加锁保护
701+ // 只在需要时短暂读取当前服务器的只读快照,避免重复加锁
705702 singleton .ServerLock .RLock ()
706703 server := singleton .ServerList [clientID ]
707704 if server == nil {
708705 singleton .ServerLock .RUnlock ()
709706 return & pb.Receipt {Proced : true }, nil
710707 }
711708 enableDDNS := server .EnableDDNS
712- ddnsProfiles := server .DDNSProfiles
709+ ddnsProfiles := append ([] uint64 ( nil ), server .DDNSProfiles ... )
713710 serverName := server .Name
714711 var serverHostIP string
715712 if server .Host != nil {
@@ -823,7 +820,7 @@ func (s *ServerHandler) ReportSystemInfo(c context.Context, r *pb.Host) (*pb.Rec
823820 host .CountryCode = singleton .ServerList [clientID ].Host .CountryCode
824821 }
825822
826- // 保存完整Host信息到数据库,用于重启后恢复
823+ // 保存完整Host信息到数据库,用于重启后恢复(在锁外序列化)
827824 hostJSON , err := utils .Json .Marshal (host )
828825 if err == nil {
829826 // 根据数据库类型选择不同的保存方式
@@ -849,7 +846,12 @@ func (s *ServerHandler) ReportSystemInfo(c context.Context, r *pb.Host) (*pb.Rec
849846 }
850847 }
851848
852- singleton .ServerList [clientID ].Host = & host
849+ // 最后一次快速写入 Host 指针
850+ singleton .ServerLock .Lock ()
851+ if s := singleton .ServerList [clientID ]; s != nil {
852+ s .Host = & host
853+ }
854+ singleton .ServerLock .Unlock ()
853855 return & pb.Receipt {Proced : true }, nil
854856}
855857
@@ -914,12 +916,8 @@ func updateTrafficDisplay(serverID uint64, inTransfer, outTransfer uint64) {
914916// checkAndResetCycleTraffic 检查并重置周期流量
915917// 根据AlertRule中定义的transfer_all_cycle规则重置累计流量
916918func checkAndResetCycleTraffic (clientID uint64 ) {
917- // 紧急修复:同时锁定AlertsLock和ServerLock,防止并发读写冲突
919+ // 读取规则使用读锁;仅在需要修改服务器状态时获取写锁,缩短锁定范围
918920 singleton .AlertsLock .RLock ()
919- defer singleton .AlertsLock .RUnlock ()
920-
921- singleton .ServerLock .RLock ()
922- defer singleton .ServerLock .RUnlock ()
923921
924922 // 遍历所有启用的事件规则
925923 for _ , alert := range singleton .Alerts {
@@ -964,7 +962,9 @@ func checkAndResetCycleTraffic(clientID uint64) {
964962 currentCycleEnd := transferRule .GetTransferDurationEnd ()
965963
966964 // 检查周期是否已经发生变化(新周期开始)
965+ singleton .ServerLock .RLock ()
967966 server := singleton .ServerList [clientID ]
967+ singleton .ServerLock .RUnlock ()
968968 lastResetTime := time.Time {}
969969
970970 // 从CycleTransferStats获取上次重置时间的记录
@@ -991,6 +991,12 @@ func checkAndResetCycleTraffic(clientID uint64) {
991991
992992 if needReset {
993993 // 重置累计流量
994+ singleton .ServerLock .Lock ()
995+ server = singleton .ServerList [clientID ]
996+ if server == nil {
997+ singleton .ServerLock .Unlock ()
998+ break
999+ }
9941000 oldInTransfer := server .CumulativeNetInTransfer
9951001 oldOutTransfer := server .CumulativeNetOutTransfer
9961002
@@ -1000,6 +1006,7 @@ func checkAndResetCycleTraffic(clientID uint64) {
10001006 // 重置基准点
10011007 server .PrevTransferInSnapshot = 0
10021008 server .PrevTransferOutSnapshot = 0
1009+ singleton .ServerLock .Unlock ()
10031010
10041011 // 周期流量重置完成,静默处理
10051012
0 commit comments