thanos-io/thanos · error
get range part
Error message
get range part %v
What it means
Wraps BucketReader.GetRange inside the parallel index-header part download: reading one byte range of the index file from object storage failed while assembling the header's parts concurrently. The failing part index is included to locate which goroutine's fetch failed.
Solutions
- Retry the read; ranged reads can fail transiently
- Check object store availability and limits
- Reduce parallelism if hitting rate limits
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at pkg/block/indexheader/parallel_bucket.go:76 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/8e171a811256139e.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/block/indexheader/parallel_bucket.go:76
// Partial partition
l = length - (int64(partId) * b.partitionSize)
}
partOff := o
partLength := l
part, err := b.createPart(partFilePrefix, partId, int(partLength))
if err != nil {
return nil, err
}
parts = append(parts, part)
// Assign partId to another variable to avoid modifying
// `partId` concurrently in multiple goroutines.
idx := partId
g.Go(func() error {
rc, err := b.BucketReader.GetRange(gctx, name, partOff, partLength)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("get range part %v", idx))
}
defer runutil.CloseWithErrCapture(&err, rc, "close object")
if _, err := io.Copy(part, rc); err != nil {
return errors.Wrap(err, fmt.Sprintf("get range part %v", idx))
}
return part.Flush()
})
partId += 1
}
if err := g.Wait(); err != nil {
return nil, err
}
return newPartMerger(parts), nil
}
func (b *parallelBucketReader) createPart(partFilePrefix string, partId int, size int) (Part, error) {
if b.tmpDir == "" {View on GitHub (pinned to 35b8b99117)