Notifier spins without backoff when the Start context ends by deadline
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 62/100
Piste de recherche
Commence dans internal/notifier/notifier.go, au niveau de la boucle de reconnexion qui appelle n.listenAndWait(ctx) et vérifie errors.Is(err, context.Canceled). Le correctif consiste à arrêter la boucle lorsque ctx.Err() n'est pas nil, et à vérifier les autres sorties context.Canceled dans le même fichier. C'est terminé lorsqu'un context qui atteint sa deadline met fin à Start sans journaux répétés Error running listener, ce que montre un test utilisant un context.WithTimeout court.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
If the context passed to Client.Start ends by deadline rather than cancellation, the notifier's reconnect loop spins with no backoff and logs Error running listener (will attempt reconnect after backoff) hundreds of thousands of times per second, forever.
Where
internal/notifier/notifier.go (v0.47.0, and unchanged on master at 2f6b27e):
for attempt := 0; ; attempt++ {
if err := n.listenAndWait(ctx); err != nil {
if errors.Is(err, context.Canceled) {
break
}
sleepDuration := serviceutil.ExponentialBackoff(attempt, serviceutil.MaxAttemptsBeforeResetDefault)
n.Logger.ErrorContext(ctx, n.Name+": Error running listener (will attempt reconnect after backoff)", ...)
...
serviceutil.CancellableSleep(ctx, sleepDuration)
}
}
Once ctx is done with context.DeadlineExceeded, listenAndWait fails immediately, the context.Canceled check doesn't match, and CancellableSleep returns immediately because ctx is already done. The loop never exits and never sleeps.
Reproduction
- Create a client against a healthy Postgres.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second), thenclient.Start(ctx).- Wait past the deadline.
We measured 379,487 Error running listener lines in the 2 seconds after the deadline, and 0 when the same context is cancelled instead. Left running, it wrote a ~476 GB log in about 6 hours before we found it.
Suggested fix
Exit the loop when the context is done for any reason, e.g. if ctx.Err() != nil { break } (or check context.DeadlineExceeded too). The other errors.Is(err, context.Canceled) exits in the notifier may deserve the same treatment.
Workaround
Start River on a context that can only end by cancellation, e.g. runCtx, cancel := context.WithCancel(context.WithoutCancel(ctx)); context.AfterFunc(ctx, cancel).
- Langage dominant
- Go
- Étoiles
- 5.8k
- Forks
- 188
- Merge moyen
- 22 h 47 min
- PR mergées (30 j)
- 90
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de riverqueue/river
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
riverqueue/river#1454 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 52/100
riverqueue/river#1411 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Remote JobCancel() can be silently lost while the notifier is reconnecting (no durable-poll fallback)Peut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 45/100
riverqueue/river#1358 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
River job stuck at runningOuverte
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
riverqueue/river#1258 · 7 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 45/100
riverqueue/river#1225 · 14 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de riverqueue/river
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
SocialGouv/iterion#2369 ·
Les mainteneurs répondent en général sous 1 jour
-
area/ci bug priority/p3
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
📖 docs: Docker Compose quick start doesn't mention editing the project values in src/hive.yamlOuvertedocumentation help wanted needs-triage
Difficulté 1/5 1-3 heures Accessibilité débutants 75/100
hivecommons/hive#11606 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
[docs] `/docs/identity-security/usage/alerts/`: docs reference a date that has already passedOuvertedocumentation
Difficulté 1/5 Moins d'une heure Accessibilité débutants 85/100
gravitational/teleport#69869 ·
-
category:agent
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
LanternOps/breeze#8493 ·
Les mainteneurs répondent en général sous 1 jour