mirror of
https://github.com/mmahdium/TGSS.git
synced 2026-08-17 02:54:30 +03:30
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:
@@ -55,9 +55,9 @@ func RegisterRoutes(params RouterParams) {
|
|||||||
// TODO: add gin level cache (look for higher limit)
|
// TODO: add gin level cache (look for higher limit)
|
||||||
// TODO: image endpoint + hash and expiry
|
// TODO: image endpoint + hash and expiry
|
||||||
authStatCtx, cancel := context.WithTimeout(context.Background(), config.AuthStatusTimeout)
|
authStatCtx, cancel := context.WithTimeout(context.Background(), config.AuthStatusTimeout)
|
||||||
defer cancel()
|
|
||||||
|
|
||||||
authStat, err := params.TgService.AuthStatus(authStatCtx)
|
authStat, err := params.TgService.AuthStatus(authStatCtx)
|
||||||
|
cancel()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
params.Logger.Fatal("Unable to get auth state from telegram", zap.Error(err))
|
params.Logger.Fatal("Unable to get auth state from telegram", zap.Error(err))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,21 +55,36 @@ func (r *RateLimiter) CleanupRateLimiter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RegisterCleanup(lc fx.Lifecycle, logger *zap.Logger, r *RateLimiter) {
|
func RegisterCleanup(lc fx.Lifecycle, logger *zap.Logger, r *RateLimiter) {
|
||||||
|
var ticker *time.Ticker
|
||||||
|
var stopChan chan struct{}
|
||||||
|
|
||||||
lc.Append(fx.Hook{
|
lc.Append(fx.Hook{
|
||||||
OnStart: func(ctx context.Context) error {
|
OnStart: func(ctx context.Context) error {
|
||||||
logger.Info("Starting rate limiter cleanup task", zap.Duration("interval", 30*time.Minute))
|
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() {
|
go func() {
|
||||||
for range ticker.C {
|
for {
|
||||||
logger.Info("Running rate limiter cleanup")
|
select {
|
||||||
r.CleanupRateLimiter()
|
case <-ticker.C:
|
||||||
logger.Info("Rate limiter cleanup completed")
|
logger.Info("Running rate limiter cleanup")
|
||||||
|
r.CleanupRateLimiter()
|
||||||
|
logger.Info("Rate limiter cleanup completed")
|
||||||
|
case <-stopChan:
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
OnStop: func(ctx context.Context) error {
|
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
|
return nil
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user