@@ -62,6 +62,13 @@ func DispatchTask(serviceSentinelDispatchBus <-chan model.Monitor) {
6262 round := 0
6363 endIndex := workedServerIndex
6464 singleton .SortedServerLock .RLock ()
65+
66+ // 安全检查:确保SortedServerList不为空
67+ if len (singleton .SortedServerList ) == 0 {
68+ singleton .SortedServerLock .RUnlock ()
69+ continue
70+ }
71+
6572 // 如果已经轮了一整圈又轮到自己,没有合适机器去请求,跳出循环
6673 for round < 1 || workedServerIndex < endIndex {
6774 // 如果到了圈尾,再回到圈头,圈数加一,游标重置
@@ -70,29 +77,50 @@ func DispatchTask(serviceSentinelDispatchBus <-chan model.Monitor) {
7077 round ++
7178 continue
7279 }
80+
81+ // 安全检查:确保服务器不为nil
82+ currentServer := singleton .SortedServerList [workedServerIndex ]
83+ if currentServer == nil {
84+ workedServerIndex ++
85+ continue
86+ }
87+
7388 // 如果服务器不在线,跳过这个服务器
74- if singleton . SortedServerList [ workedServerIndex ] .TaskStream == nil {
89+ if currentServer .TaskStream == nil {
7590 workedServerIndex ++
7691 continue
7792 }
93+
94+ // 安全检查:确保SkipServers不为nil
95+ skipServers := task .SkipServers
96+ if skipServers == nil {
97+ skipServers = make (map [uint64 ]bool )
98+ }
99+
78100 // 如果此任务不可使用此服务器请求,跳过这个服务器(有些 IPv6 only 开了 NAT64 的机器请求 IPv4 总会出问题)
79- if (task .Cover == model .MonitorCoverAll && task . SkipServers [ singleton . SortedServerList [ workedServerIndex ] .ID ]) ||
80- (task .Cover == model .MonitorCoverIgnoreAll && ! task . SkipServers [ singleton . SortedServerList [ workedServerIndex ] .ID ]) {
101+ if (task .Cover == model .MonitorCoverAll && skipServers [ currentServer .ID ]) ||
102+ (task .Cover == model .MonitorCoverIgnoreAll && ! skipServers [ currentServer .ID ]) {
81103 workedServerIndex ++
82104 continue
83105 }
84- if task .Cover == model .MonitorCoverIgnoreAll && task .SkipServers [singleton .SortedServerList [workedServerIndex ].ID ] {
85- singleton .SortedServerList [workedServerIndex ].TaskStream .Send (task .PB ())
106+ if task .Cover == model .MonitorCoverIgnoreAll && skipServers [currentServer .ID ] {
107+ if err := currentServer .TaskStream .Send (task .PB ()); err != nil {
108+ log .Printf ("DispatchTask: 发送任务到服务器 %d 失败: %v" , currentServer .ID , err )
109+ }
86110 workedServerIndex ++
87111 continue
88112 }
89- if task .Cover == model .MonitorCoverAll && ! task .SkipServers [singleton .SortedServerList [workedServerIndex ].ID ] {
90- singleton .SortedServerList [workedServerIndex ].TaskStream .Send (task .PB ())
113+ if task .Cover == model .MonitorCoverAll && ! skipServers [currentServer .ID ] {
114+ if err := currentServer .TaskStream .Send (task .PB ()); err != nil {
115+ log .Printf ("DispatchTask: 发送任务到服务器 %d 失败: %v" , currentServer .ID , err )
116+ }
91117 workedServerIndex ++
92118 continue
93119 }
94120 // 找到合适机器执行任务,跳出循环
95- singleton .SortedServerList [workedServerIndex ].TaskStream .Send (task .PB ())
121+ if err := currentServer .TaskStream .Send (task .PB ()); err != nil {
122+ log .Printf ("DispatchTask: 发送任务到服务器 %d 失败: %v" , currentServer .ID , err )
123+ }
96124 workedServerIndex ++
97125 break
98126 }
0 commit comments