juicedata/juicefs · error

invalid range %q: end must be greater than start

Error message

invalid range %q: end must be greater than start

What it means

parseRanges requires end > start for every range; if end <= start it returns 'invalid range %q: end must be greater than start'. Zero-length or inverted ranges are rejected because they select no bytes.

Source

Thrown at pkg/vfs/fill.go:238

}

func parseRanges(spec string) ([]ByteRange, error) {
	var ranges []ByteRange
	for _, part := range strings.Split(spec, ";") {
		sep := strings.IndexByte(part, '-')
		if sep < 0 {
			return nil, fmt.Errorf("invalid range %q", part)
		}
		start, err := strconv.ParseUint(part[:sep], 10, 64)
		if err != nil {
			return nil, fmt.Errorf("invalid range %q: %w", part, err)
		}
		end, err := strconv.ParseUint(part[sep+1:], 10, 64)
		if err != nil {
			return nil, fmt.Errorf("invalid range %q: %w", part, err)
		}
		if end <= start {
			return nil, fmt.Errorf("invalid range %q: end must be greater than start", part)
		}
		ranges = append(ranges, ByteRange{Start: start, End: end})
	}
	sort.Slice(ranges, func(i, j int) bool { return ranges[i].Start < ranges[j].Start })
	merged := ranges[:0]
	for _, r := range ranges {
		if n := len(merged); n > 0 && r.Start <= merged[n-1].End {
			if r.End > merged[n-1].End {
				merged[n-1].End = r.End
			}
			continue
		}
		merged = append(merged, r)
	}
	return merged, nil
}

func (c *CacheFiller) resolve(ctx meta.Context, p string, inode *Ino, attr *Attr) syscall.Errno {

View on GitHub (pinned to c9a67b23e8)

Solutions

  1. Ensure every range satisfies end > start
  2. Swap start/end if accidentally reversed
  3. Remove empty ranges from the spec

Example fix

// before
"100-100"
// after
"100-200"
Defensive patterns

Strategy: validation

Validate before calling

s, _ := strconv.ParseUint(a, 10, 64); e, _ := strconv.ParseUint(b, 10, 64)
if e <= s { return fmt.Errorf("range %s-%s invalid", a, b) }

Try / catch

if _, err := parseRanges(spec); err != nil { return fmt.Errorf("fill spec: %w", err) }

Prevention

When it happens

Trigger: Specs like '100-100' or '200-100' passed to the fill target parser.

Common situations: Off-by-one mistakes when computing offsets; swapped start/end after editing; empty ranges generated programmatically.

Related errors


AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06). Data as JSON: /api/errors/e600b7fcd58a88d0. Report an issue: GitHub.