refactor(esi_sso.go): parallelize esi token processing and deduplicate tokens to improve performance
This commit is contained in:
36
esi_sso.go
36
esi_sso.go
@@ -618,22 +618,40 @@ func (s *ESISSO) PostRouteForAll(destID int64, viaIDs []int64) error {
|
||||
if s.db == nil { return errors.New("db not initialised") }
|
||||
var tokens []ESIToken
|
||||
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
|
||||
for i := range tokens {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
tok, err := s.ensureAccessTokenFor(ctx, &tokens[i])
|
||||
var wg sync.WaitGroup
|
||||
// Run per-character in parallel
|
||||
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()
|
||||
if err != nil { if firstErr == nil { firstErr = err }; continue }
|
||||
// Determine sequence: clear with first element (via if any, else dest)
|
||||
if err != nil {
|
||||
mu.Lock(); if firstErr == nil { firstErr = err }; mu.Unlock(); return
|
||||
}
|
||||
// Post sequence for this character
|
||||
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:] {
|
||||
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 {
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user