refactor(esi_sso.go): parallelize esi token processing and deduplicate tokens to improve performance

This commit is contained in:
2025-08-09 20:11:34 +02:00
parent e1e961ebea
commit a584bc9c55

View File

@@ -618,22 +618,40 @@ func (s *ESISSO) PostRouteForAll(destID int64, viaIDs []int64) error {
if s.db == nil { return errors.New("db not initialised") } if s.db == nil { return errors.New("db not initialised") }
var tokens []ESIToken var tokens []ESIToken
if err := s.db.Find(&tokens).Error; err != nil { return err } if err := s.db.Find(&tokens).Error; err != nil { return err }
// Deduplicate by CharacterID
uniq := make(map[int64]ESIToken, len(tokens))
for _, t := range tokens {
uniq[t.CharacterID] = t
}
uniqueTokens := make([]ESIToken, 0, len(uniq))
for _, t := range uniq { uniqueTokens = append(uniqueTokens, t) }
var mu sync.Mutex
var firstErr error var firstErr error
for i := range tokens { var wg sync.WaitGroup
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) // Run per-character in parallel
tok, err := s.ensureAccessTokenFor(ctx, &tokens[i]) for i := range uniqueTokens {
wg.Add(1)
go func(t ESIToken) {
defer wg.Done()
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
tok, err := s.ensureAccessTokenFor(ctx, &t)
cancel() cancel()
if err != nil { if firstErr == nil { firstErr = err }; continue } if err != nil {
// Determine sequence: clear with first element (via if any, else dest) mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return
}
// Post sequence for this character
if len(viaIDs) > 0 { if len(viaIDs) > 0 {
if err := s.postWaypointWithToken(tok, viaIDs[0], true, false); err != nil && firstErr == nil { firstErr = err } if err := s.postWaypointWithToken(tok, viaIDs[0], true, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return }
for _, id := range viaIDs[1:] { for _, id := range viaIDs[1:] {
if err := s.postWaypointWithToken(tok, id, false, false); err != nil && firstErr == nil { firstErr = err } if err := s.postWaypointWithToken(tok, id, false, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return }
} }
if err := s.postWaypointWithToken(tok, destID, false, false); err != nil && firstErr == nil { firstErr = err } if err := s.postWaypointWithToken(tok, destID, false, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return }
} else { } else {
if err := s.postWaypointWithToken(tok, destID, true, false); err != nil && firstErr == nil { firstErr = err } if err := s.postWaypointWithToken(tok, destID, true, false); err != nil { mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return }
} }
}(uniqueTokens[i])
} }
wg.Wait()
return firstErr return firstErr
} }