diff --git a/internal/config/query.go b/internal/config/query.go index bdc2668e..ec4cccf4 100644 --- a/internal/config/query.go +++ b/internal/config/query.go @@ -63,20 +63,23 @@ func (cfg *Config) VerifyNewAgent(host string, ca agent.PEMPair, client agent.PE return 0, gperr.New("agent already exists") } - var agentCfg agent.AgentConfig + agentCfg := new(agent.AgentConfig) agentCfg.Addr = host err := agentCfg.InitWithCerts(cfg.task.Context(), ca.Cert, client.Cert, client.Key) if err != nil { return 0, gperr.Wrap(err, "failed to start agent") } - agent.Agents.Add(&agentCfg) + // must add it first to let LoadRoutes() reference from it + agent.Agents.Add(agentCfg) - provider := provider.NewAgentProvider(&agentCfg) + provider := provider.NewAgentProvider(agentCfg) if err := cfg.errIfExists(provider); err != nil { + agent.Agents.Del(agentCfg) return 0, err } err = provider.LoadRoutes() if err != nil { + agent.Agents.Del(agentCfg) return 0, gperr.Wrap(err, "failed to load routes") } return provider.NumRoutes(), nil diff --git a/internal/utils/pool/pool.go b/internal/utils/pool/pool.go index 9421ac44..69f67cda 100644 --- a/internal/utils/pool/pool.go +++ b/internal/utils/pool/pool.go @@ -26,6 +26,10 @@ func (p Pool[T]) Add(obj T) { p.m.Store(obj.Key(), obj) } +func (p Pool[T]) Del(obj T) { + p.m.Delete(obj.Key()) +} + func (p Pool[T]) Get(key string) (T, bool) { return p.m.Load(key) }