juicedata/juicefs · error
scan trash slices: %s
Error message
scan trash slices: %s
What it means
Wrapped error from `juicefs gc` when `scanTrashSlices` fails. This phase walks the trash directory in the metadata engine to account for (and optionally delete) slices that already sit in trash; a failure here aborts the whole GC run before block scanning starts. The underlying cause (metadata engine outage, interrupted scan, permission problem) is embedded in the message.
Source
Thrown at cmd/gc.go:209
} else {
logger.Errorf("compact all chunks: %s", st)
}
bar.Done()
spin.Done()
} else {
m.OnMsg(meta.CompactChunk, func(args ...interface{}) error {
return nil // ignore compaction
})
}
if delFlag {
if st := m.CleanupSlices(c); st != 0 {
logger.Fatalf("cleanup slices: %s", st)
}
}
stats := newGcStats(progress, extSortDir != "", delSpin, cleanedFileSpin)
if err := scanTrashSlices(c, m, stats, delFlag, edge); err != nil {
return errors.Errorf("scan trash slices: %s", err)
}
m.WaitDeleteSlices()
m.OnMsg(meta.DeleteSlice, func(args ...interface{}) error {
return errors.New("stop deleting slice")
})
var gcErr error
if extSortDir != "" {
gcErr = gcExternalSort(c, m, &chunkConf, blob, stats, extSortDir, threads, delFlag, maxMtime)
} else {
gcErr = gcInMemory(c, m, &chunkConf, blob, stats, threads, delFlag, maxMtime)
}
if gcErr == nil {
stats.finish(delFlag, compact)
}
return gcErr
}
View on GitHub (pinned to c9a67b23e8)
Solutions
- Check the wrapped root cause after 'scan trash slices:' and verify the metadata engine is reachable and healthy (redis-cli ping / DB connect test).
- Re-run `juicefs gc` once the metadata engine is stable; transient engine errors are the most common trigger.
- Reduce concurrency (`--threads`) if the engine is timing out under load.
- Verify client version matches the metadata engine version (mixed versions can fail scans); upgrade the client if needed.
- Enable `--debug` logging to capture the full engine error code.
Example fix
// before juicefs gc --threads 100 redis://prod:6379/1 // after (reduce load and retry after engine check) redis-cli -h prod ping juicefs gc --threads 8 redis://prod:6379/1
Defensive patterns
Strategy: retry
Validate before calling
// before gc: verify metadata engine reachability
if err := m.Shutdown(0); err == nil { /* placeholder */ }
// practical: run 'juicefs status $META_URL' and require exit code 0 Try / catch
// in Go wrapper around the CLI
out, err := exec.Command("juicefs", "gc", metaURL).CombinedOutput()
if err != nil && strings.Contains(string(out), "scan trash slices:") {
// inspect embedded engine error, back off and retry
} Prevention
- Monitor metadata engine health before maintenance windows
- Schedule GC during low-traffic periods
- Keep client and metadata engine versions aligned
- Use --threads sized to engine capacity
When it happens
Trigger: Running `juicefs gc` when the metadata engine (Redis/SQL/TiKV) errors while listing trash slices — e.g. engine restart mid-scan, connection drop, trash key iteration timeout, or an internal scan error returned by m.ScanTrash-like logic inside scanTrashSlices.
Common situations: Redis evicted keys or restarted during a long GC; PostgreSQL connection pool exhausted; network partition between the client and the metadata engine; running GC against a volume while another client holds conflicting locks; using an old client against a newer metadata layout.
Understand the failure class
Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.
Related errors
- produce meta records: %s
- scan slices: %s
- insert new session %d: %s
- remove dir stats
- remove user group quota
AI-assisted analysis of juicedata/juicefs@c9a67b23e8 (2026-09-06).
Data as JSON: /api/errors/9014305df99f30f1.
Report an issue: GitHub.