fix: rate limiter ticker leak and context cancellation bug

- Stop ticker and signal goroutine exit in RegisterCleanup OnStop hook
- Call cancel() explicitly after AuthStatus instead of defer to prevent premature context cancellation
- Use consistent logger parameter in OnStop hook

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
2026-03-11 16:18:18 +03:30
co-authored by Qwen-Coder
parent a053d577ef
commit 5a37903a72
2 changed files with 23 additions and 8 deletions
+2 -2
View File
@@ -55,9 +55,9 @@ func RegisterRoutes(params RouterParams) {
// TODO: add gin level cache (look for higher limit)
// TODO: image endpoint + hash and expiry
authStatCtx, cancel := context.WithTimeout(context.Background(), config.AuthStatusTimeout)
defer cancel()
authStat, err := params.TgService.AuthStatus(authStatCtx)
cancel()
if err != nil {
params.Logger.Fatal("Unable to get auth state from telegram", zap.Error(err))
}
+21 -6
View File
@@ -55,21 +55,36 @@ func (r *RateLimiter) CleanupRateLimiter() {
}
func RegisterCleanup(lc fx.Lifecycle, logger *zap.Logger, r *RateLimiter) {
var ticker *time.Ticker
var stopChan chan struct{}
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
logger.Info("Starting rate limiter cleanup task", zap.Duration("interval", 30*time.Minute))
ticker := time.NewTicker(30 * time.Minute)
ticker = time.NewTicker(30 * time.Minute)
stopChan = make(chan struct{})
go func() {
for range ticker.C {
logger.Info("Running rate limiter cleanup")
r.CleanupRateLimiter()
logger.Info("Rate limiter cleanup completed")
for {
select {
case <-ticker.C:
logger.Info("Running rate limiter cleanup")
r.CleanupRateLimiter()
logger.Info("Rate limiter cleanup completed")
case <-stopChan:
return
}
}
}()
return nil
},
OnStop: func(ctx context.Context) error {
r.logger.Info("Stopping rate limiter cleanup task")
logger.Info("Stopping rate limiter cleanup task")
if ticker != nil {
ticker.Stop()
}
if stopChan != nil {
close(stopChan)
}
return nil
},
})