fix: stop stale request retries

This commit is contained in:
2026-06-18 20:25:30 +02:00
committed by Milas Holsting
parent aed61b8b61
commit 9e0f2231b5
5 changed files with 50 additions and 5 deletions

View File

@@ -2,7 +2,6 @@ package rate
import (
"context"
"fmt"
"sync"
"time"
)
@@ -19,6 +18,12 @@ func NewLimiter(interval time.Duration) *Limiter {
// Wait enforces minimum spacing between upstream Jikan requests.
func (l *Limiter) Wait(ctx context.Context) error {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
waitUntil := l.reserve(time.Now())
if waitUntil.IsZero() {
return nil
@@ -31,7 +36,8 @@ func (l *Limiter) Wait(ctx context.Context) error {
case <-timer.C:
return nil
case <-ctx.Done():
return fmt.Errorf("request canceled while waiting for rate limit: %w", ctx.Err())
l.release(waitUntil)
return ctx.Err()
}
}
@@ -48,3 +54,13 @@ func (l *Limiter) reserve(now time.Time) time.Time {
l.nextReqTime = l.nextReqTime.Add(l.interval)
return waitUntil
}
func (l *Limiter) release(waitUntil time.Time) {
l.mu.Lock()
defer l.mu.Unlock()
reservationEnd := waitUntil.Add(l.interval)
if l.nextReqTime.Equal(reservationEnd) {
l.nextReqTime = waitUntil
}
}