翻核心的生命周期处理时,我看到两处值得修:心跳超时会直接调用 os.Exit,上传任务结束后,进度 map 里的数据也一直没有收掉。正常上传一次看不出来,退出和长时间运行时就可能有影响。
心跳超时别直接杀进程
心跳服务包在 Gin 里,跑在 http.Server 上。以前超时就 os.Exit,正在写的请求和日志都断在半路。现在先调 Shutdown,让 HTTP 服务自己收完再退。os 的引用也就用不上了,一并移掉,构建不再报警。
进度 map 会一直涨
上传任务结束或者被取消后,进度 map 里的条目一直留着,跑久了内存里全是过期数据。加了个定时清理,任务收尾后 5 分钟把对应进度删掉。
断了一次心跳做验证,日志里出现 “shutting down…”,HTTP 端口也跟着关掉。跑一次上传,完成时能查到进度,等 5 分钟再查是空的。核心和客户端的构建也重新跑了一遍。
还有几处没补。心跳如果在上传中途超时,后台 goroutine 的取消处理还不够细;进度清理的 5 分钟是写死的,跑一阵再看要不要调;心跳超时和上传进度生命周期都还没有自动化回归。