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") }
|
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
|
||||||
}
|
}
|
Reference in New Issue
Block a user