Skip to content

Commit 52fe2fb

Browse files
committed
Update.
1 parent de1b106 commit 52fe2fb

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

service/rpc/server.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,14 @@ func (s *ServerHandler) RequestTask(h *pb.Host, stream pb.ServerService_RequestT
115115
singleton.ServerList[clientID].TaskCloseLock.Unlock()
116116
singleton.ServerLock.RUnlock()
117117

118+
// 创建一个带超时的上下文
119+
ctx, cancel := context.WithTimeout(stream.Context(), 30*time.Minute)
120+
defer cancel()
121+
118122
// 监听连接状态,当连接断开时自动清理
119123
go func() {
120124
select {
121-
case <-stream.Context().Done():
125+
case <-ctx.Done():
122126
// 连接断开时清理资源
123127
singleton.ServerLock.RLock()
124128
if singleton.ServerList[clientID] != nil {
@@ -134,7 +138,7 @@ func (s *ServerHandler) RequestTask(h *pb.Host, stream pb.ServerService_RequestT
134138

135139
// 安全地发送关闭信号,使用非阻塞发送
136140
select {
137-
case closeCh <- stream.Context().Err():
141+
case closeCh <- ctx.Err():
138142
case <-done: // 如果主goroutine已经退出,停止发送
139143
return
140144
default:
@@ -146,11 +150,9 @@ func (s *ServerHandler) RequestTask(h *pb.Host, stream pb.ServerService_RequestT
146150
}
147151
}()
148152

149-
// 设置超时防止无限等待
150-
ctx, cancel := context.WithTimeout(stream.Context(), 30*time.Minute)
151-
defer cancel()
152153
defer close(done) // 确保监控goroutine被通知停止
153154

155+
// 等待连接关闭或超时
154156
select {
155157
case err := <-closeCh:
156158
return err

service/singleton/server.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package singleton
22

33
import (
4+
"fmt"
45
"log"
56
"sort"
67
"sync"
@@ -206,10 +207,30 @@ func CleanupServerState() {
206207
server.LastStateBeforeOffline = nil
207208
server.TaskStream = nil
208209
if server.TaskClose != nil {
210+
// 安全关闭通道
211+
select {
212+
case server.TaskClose <- fmt.Errorf("server state cleanup"):
213+
default:
214+
}
209215
close(server.TaskClose)
210216
server.TaskClose = nil
211217
}
212218
}
219+
220+
// 清理长时间未活动的连接
221+
if server.IsOnline && now.Sub(server.LastActive) > 5*time.Minute {
222+
server.TaskCloseLock.Lock()
223+
if server.TaskClose != nil {
224+
select {
225+
case server.TaskClose <- fmt.Errorf("connection timeout"):
226+
default:
227+
}
228+
close(server.TaskClose)
229+
server.TaskClose = nil
230+
}
231+
server.TaskStream = nil
232+
server.TaskCloseLock.Unlock()
233+
}
213234
}
214235
}
215236

service/singleton/singleton.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package singleton
33
import (
44
"fmt"
55
"log"
6+
"runtime"
67
"time"
78

89
"github.com/patrickmn/go-cache"
@@ -66,6 +67,19 @@ func LoadSingleton() {
6667
Cron.AddFunc("0 */10 * * * *", func() {
6768
CleanMonitorHistory()
6869
Cache.DeleteExpired()
70+
CleanupServerState() // 添加服务器状态清理
71+
SaveAllTrafficToDB() // 保存流量数据到数据库
72+
})
73+
74+
// 添加内存使用监控任务,每5分钟执行一次
75+
Cron.AddFunc("0 */5 * * * *", func() {
76+
var m runtime.MemStats
77+
runtime.ReadMemStats(&m)
78+
if m.Alloc > 500*1024*1024 { // 如果内存使用超过500MB
79+
log.Printf("内存使用警告: %v MB", m.Alloc/1024/1024)
80+
// 触发GC
81+
runtime.GC()
82+
}
6983
})
7084
}
7185

0 commit comments

Comments
 (0)