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

  1. Retry the read; ranged reads can fail transiently
  2. Check object store availability and limits
  3. 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)