Skip to content

Commit 8fe08cf

Browse files
committed
Update.
1 parent 2212086 commit 8fe08cf

File tree

2 files changed

+40
-35
lines changed

2 files changed

+40
-35
lines changed

cmd/dashboard/controller/common_page.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -416,22 +416,21 @@ func (cp *commonPage) network(c *gin.Context) {
416416
servers = make([]*model.Server, 0)
417417
}
418418

419+
// 性能优化:使用map进行O(1)查找,避免双重循环
420+
monitorServerMap := make(map[uint64]bool)
421+
for _, serverID := range serverIdsWithMonitor {
422+
monitorServerMap[serverID] = true
423+
}
424+
419425
if authorized {
420426
// 有权限的用户可以访问所有服务器
421427
if singleton.SortedServerList != nil {
422428
for _, server := range singleton.SortedServerList {
423429
// 确保服务器不为nil
424430
if server != nil {
425431
// 如果serverIdsWithMonitor为空或包含当前服务器ID,则添加
426-
if len(serverIdsWithMonitor) == 0 {
432+
if len(serverIdsWithMonitor) == 0 || monitorServerMap[server.ID] {
427433
servers = append(servers, server)
428-
} else {
429-
for _, monitorServerID := range serverIdsWithMonitor {
430-
if server.ID == monitorServerID {
431-
servers = append(servers, server)
432-
break
433-
}
434-
}
435434
}
436435
}
437436
}
@@ -445,15 +444,8 @@ func (cp *commonPage) network(c *gin.Context) {
445444
// 确保服务器不为nil
446445
if server != nil {
447446
// 如果serverIdsWithMonitor为空或包含当前服务器ID,则添加
448-
if len(serverIdsWithMonitor) == 0 {
447+
if len(serverIdsWithMonitor) == 0 || monitorServerMap[server.ID] {
449448
servers = append(servers, server)
450-
} else {
451-
for _, monitorServerID := range serverIdsWithMonitor {
452-
if server.ID == monitorServerID {
453-
servers = append(servers, server)
454-
break
455-
}
456-
}
457449
}
458450
}
459451
}

cmd/dashboard/main.go

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -197,36 +197,49 @@ func main() {
197197
// 等待所有任务完成
198198
done := make(chan struct{})
199199
go func() {
200+
defer close(done)
200201
log.Println("程序正在优雅关闭,保存所有数据...")
201202

202-
// 保存流量数据
203-
singleton.RecordTransferHourlyUsage()
204-
singleton.SaveAllTrafficToDB()
205-
206-
// 保存所有数据到数据库(BadgerDB模式下特别重要)
207-
singleton.SaveAllDataToDB()
208-
209-
// 清理Goroutine池,防止内存泄漏
210-
singleton.CleanupGoroutinePools()
203+
// 1. 首先停止所有定时任务,防止新的goroutine产生
204+
if singleton.Cron != nil {
205+
singleton.Cron.Stop()
206+
log.Println("定时任务已停止")
207+
}
211208

212-
// 关闭所有WebSocket连接
213-
singleton.ServerLock.RLock()
209+
// 2. 关闭所有WebSocket连接,防止新的连接
210+
singleton.ServerLock.Lock()
214211
for _, server := range singleton.ServerList {
215-
if server != nil && server.TaskClose != nil {
216-
select {
217-
case server.TaskClose <- fmt.Errorf("server shutting down"):
218-
default:
212+
if server != nil && server.TaskCloseLock != nil {
213+
server.TaskCloseLock.Lock()
214+
if server.TaskClose != nil {
215+
select {
216+
case server.TaskClose <- fmt.Errorf("server shutting down"):
217+
default:
218+
}
219+
// 不要在这里close,让RequestTask自己处理
220+
server.TaskClose = nil
219221
}
220-
close(server.TaskClose)
222+
server.TaskStream = nil
223+
server.TaskCloseLock.Unlock()
221224
}
222225
}
223-
singleton.ServerLock.RUnlock()
226+
singleton.ServerLock.Unlock()
227+
log.Println("所有服务器连接已关闭")
228+
229+
// 3. 清理Goroutine池,防止内存泄漏
230+
singleton.CleanupGoroutinePools()
231+
232+
// 4. 保存流量数据
233+
singleton.RecordTransferHourlyUsage()
234+
singleton.SaveAllTrafficToDB()
235+
236+
// 5. 保存所有数据到数据库(BadgerDB模式下特别重要)
237+
singleton.SaveAllDataToDB()
224238

225-
// 关闭HTTP服务器
239+
// 6. 关闭HTTP服务器
226240
srv.Shutdown(c)
227241

228242
log.Println("所有数据已保存,程序关闭完成")
229-
close(done)
230243
}()
231244

232245
// 设置超时

0 commit comments

Comments
 (0)