Skip to content

Commit 767eb23

Browse files
the-dev-zclaude
andcommitted
fix(api): remove trader from memory map after deletion
## Problem After deleting a trader, the competition API still returns the deleted trader because: - Database deletion succeeds - But TraderManager.traders map still contains the trader - GetCompetitionData() iterates over tm.traders map (includes deleted ones) ## Solution Add RemoveTrader() method to TraderManager: - Stop the trader if running - Remove from traders map - Simplified version (no competitionCache, z-dev doesn't have it) ## Changes - Add manager/trader_manager.go::RemoveTrader() - Update api/server.go::handleDeleteTrader() to call RemoveTrader() ## Comparison with PR NoFxAiOS#622 - PR NoFxAiOS#622: Full version with competitionCache clearing - Ours: Simplified for z-dev (no competitionCache yet) - Both solve the same core problem - Ours is compatible with current z-dev architecture ## Related - Inspired by PR NoFxAiOS#622 @songzhihui - Complements frontend fix (commit 685f248) - Frontend: instant UI updates - Backend: correct data source 🤖 Generated with Claude Code Co-Authored-By: Claude <[email protected]>
1 parent 685f248 commit 767eb23

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

api/server.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -616,13 +616,10 @@ func (s *Server) handleDeleteTrader(c *gin.Context) {
616616
return
617617
}
618618

619-
// 如果交易员正在运行,先停止它
620-
if trader, err := s.traderManager.GetTrader(traderID); err == nil {
621-
status := trader.GetStatus()
622-
if isRunning, ok := status["is_running"].(bool); ok && isRunning {
623-
trader.Stop()
624-
log.Printf("⏹ 已停止运行中的交易员: %s", traderID)
625-
}
619+
// 从 TraderManager 中移除交易员(会自动停止运行中的交易员)
620+
if err := s.traderManager.RemoveTrader(traderID); err != nil {
621+
log.Printf("⚠️ 从管理器中移除交易员失败: %v", err)
622+
// 不影响返回结果,因为数据库删除已成功
626623
}
627624

628625
log.Printf("✓ 交易员已删除: %s", traderID)

manager/trader_manager.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,31 @@ func (tm *TraderManager) GetTraderIDs() []string {
437437
return ids
438438
}
439439

440+
// RemoveTrader 从管理器中移除交易员
441+
func (tm *TraderManager) RemoveTrader(traderID string) error {
442+
tm.mu.Lock()
443+
defer tm.mu.Unlock()
444+
445+
// 检查交易员是否存在
446+
trader, exists := tm.traders[traderID]
447+
if !exists {
448+
return fmt.Errorf("交易员不存在: %s", traderID)
449+
}
450+
451+
// 如果交易员正在运行,先停止它
452+
status := trader.GetStatus()
453+
if isRunning, ok := status["is_running"].(bool); ok && isRunning {
454+
trader.Stop()
455+
log.Printf("⏹ 已停止运行中的交易员: %s", traderID)
456+
}
457+
458+
// 从 map 中删除
459+
delete(tm.traders, traderID)
460+
log.Printf("✓ 已从管理器中移除交易员: %s", traderID)
461+
462+
return nil
463+
}
464+
440465
// StartAll 启动所有trader
441466
func (tm *TraderManager) StartAll() {
442467
tm.mu.RLock()

0 commit comments

Comments
 (0)