thanos-io/thanos · error
hashring has changed; server is not ready to receive…
Error message
hashring has changed; server is not ready to receive requests
What it means
Not an error object but a readiness message: when the hashring changes, the server is marked not-ready and this message is logged/probed while head flushing and reopening complete. It fires on every hashring update (unless Ketama with no flush needed).
Solutions
- Wait for flush/reopen to complete; readiness restores automatically
- During frequent hashring churn consider Ketama to reduce flushes
- Scale replication changes gradually
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at cmd/thanos/receive.go:763 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of thanos-io/thanos@35b8b99117 (2026-09-07).
Data as JSON: /api/errors/4022d11e54dff79e.
Report an issue: GitHub.
Appendix: source
Thrown at cmd/thanos/receive.go:763
select {
case <-cancel:
return nil
case _, ok := <-hashringChangedChan:
if !ok {
return nil
}
// When using Ketama as the hashring algorithm, there is no need to flush the TSDB head.
// If new receivers were added to the hashring, existing receivers will not need to
// ingest additional series.
// If receivers are removed from the hashring, existing receivers will only need
// to ingest a subset of the series that were assigned to the removed receivers.
// As a result, changing the hashring produces no churn, hence no need to force
// head compaction and upload.
flushHead := !initialized || hashringAlgorithm != receive.AlgorithmKetama
if flushHead {
msg := "hashring has changed; server is not ready to receive requests"
statusProber.NotReady(errors.New(msg))
level.Info(logger).Log("msg", msg)
level.Info(logger).Log("msg", "updating storage")
dbUpdatesStarted.Inc()
if err := dbs.Flush(); err != nil {
return errors.Wrap(err, "flushing storage")
}
if err := dbs.Open(); err != nil {
return errors.Wrap(err, "opening storage")
}
if upload {
uploadC <- struct{}{}
<-uploadDone
}
dbUpdatesCompleted.Inc()
statusProber.Ready()
level.Info(logger).Log("msg", "storage started, and server is ready to receive requests")
dbUpdatesCompleted.Inc()View on GitHub (pinned to 35b8b99117)