juicedata/juicefs · error
list chunk prefixes made no progress
Error message
list chunk prefixes made no progress
What it means
Returned by walkGcChunkObjectPrefixes during garbage collection when paginated listing of chunk object prefixes keeps returning the same first key across pages — the marker/token is not advancing, so continuing would loop forever. It aborts the prefix walk to avoid an infinite GC scan, typically caused by an object store returning inconsistent listing markers.
Source
Thrown at cmd/gc.go:545
func walkGcChunkObjectPrefixes(ctx context.Context, blob object.ObjectStorage, prefix string, depth int, allowFallback bool, fn func(string) error) error {
seenPrefixes := make(map[string]struct{})
var marker, token string
firstPage := true
for {
objs, hasMore, nextToken, err := blob.List(ctx, prefix, marker, token, "/", gcObjectListBatch, true)
if err != nil {
if allowFallback && firstPage {
logger.Warnf("can't find chunk prefixes: %s, list chunks using single thread", err)
return fn("")
}
return err
}
firstPage = false
if len(objs) > 0 && marker != "" && objs[0].Key() == marker {
objs = objs[1:]
}
if hasMore && len(objs) == 0 && nextToken == token {
return errors.New("list chunk prefixes made no progress")
}
for _, obj := range objs {
if obj == nil || obj.Key() == "" {
continue
}
key := obj.Key()
if key == prefix {
marker = key
continue
}
if obj.IsDir() {
if _, ok := seenPrefixes[key]; !ok {
seenPrefixes[key] = struct{}{}
if depth == 1 {
if err := fn(key); err != nil {
return err
}
} else {View on GitHub (pinned to c9a67b23e8)
Solutions
- Re-run gc; transient listing inconsistency on the object store often resolves itself
- Check the object storage backend for replication lag or listing API issues
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at cmd/gc.go:545 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06).
Data as JSON: /api/errors/c535130cb851be64.
Report an issue: GitHub.