Files
dns-server/.trae/documents/修复_api_top-clients端点数据持久化问题.md
2025-11-28 17:59:13 +08:00

2.0 KiB
Raw Blame History

问题分析

通过代码分析,我发现/api/top-clients端点数据无法持久化的原因有两个

  1. 数据保存逻辑缺失:在saveStatsData方法中,虽然StatsData结构体包含了ClientStats字段,但没有将server.clientStats赋值给statsData.ClientStats

  2. 数据加载逻辑缺失:在loadStatsData方法中,虽然StatsData结构体包含了ClientStats字段,但没有将statsData.ClientStats赋值给server.clientStats

  3. 自动保存功能未启用startAutoSave方法没有在ServerStart方法中被调用,导致数据不会定期保存

修复计划

  1. 修改saveStatsData方法:添加保存ClientStats数据的逻辑
  2. 修改loadStatsData方法:添加加载ClientStats数据的逻辑
  3. Server.Start方法中调用startAutoSave:确保数据定期保存

修复步骤

步骤1修改saveStatsData方法

dns/server.go文件中,修改saveStatsData方法,添加保存ClientStats数据的逻辑:

// 复制客户端统计数据
s.clientStatsMutex.RLock()
statsData.ClientStats = make(map[string]*ClientStats)
for k, v := range s.clientStats {
    statsData.ClientStats[k] = v
}
s.clientStatsMutex.RUnlock()

步骤2修改loadStatsData方法

dns/server.go文件中,修改loadStatsData方法,添加加载ClientStats数据的逻辑:

s.clientStatsMutex.Lock()
if statsData.ClientStats != nil {
    s.clientStats = statsData.ClientStats
}
s.clientStatsMutex.Unlock()

步骤3Server.Start方法中调用startAutoSave

dns/server.go文件的Start方法中,添加调用startAutoSave的代码:

// 启动自动保存功能
go s.startAutoSave()

预期效果

修复后,/api/top-clients端点的数据将

  1. 在服务器启动时从文件加载
  2. 定期自动保存到文件
  3. 在服务器停止时最后保存一次

这样就能确保/api/top-clients端点的数据持久化不会因为服务器重启而丢失。