juicedata/juicefs · error
delete delayed slice %d affected %d rows
Error message
delete delayed slice %d affected %d rows
What it means
Returned inside the delayed-slice cleanup transaction when deleting the delslices row affects an unexpected number of rows (not 0 or 1). A non-unit affected count means concurrent cleanup raced in an unexpected way, so the txn aborts to keep refcounts consistent.
Source
Thrown at pkg/meta/sql.go:4087
m.decodeDelayedSlices(del.Slices, &ss)
clean, err := scan(ss, del.Deleted)
if err != nil {
return err
}
if !clean {
return nil
}
// Deleting the delayed row claims cleanup; rollback restores it on failure.
affected, err := tx.Delete(&delslices{Id: del.Id})
if err != nil {
return errors.Wrapf(err, "claim delayed slice %d", del.Id)
}
if affected == 0 {
return nil
}
if affected != 1 {
return fmt.Errorf("delete delayed slice %d affected %d rows", del.Id, affected)
}
for _, s := range ss {
if _, e := tx.Exec(m.sqlConv("update chunk_ref set refs=refs-1 where chunkid=? AND size=?"), s.Id, s.Size); e != nil {
return e
}
}
m.genLog(ctx, tx, time.Now().UnixNano(), "CLEANUP_TRASH_SLICES(%d,%d)", del.Id, del.Deleted)
claimed = true
return nil
})
if err != nil {
return err
}
if claimed {
for _, s := range ss {
var ref = sliceRef{Id: s.Id}
err := m.simpleTxn(ctx, func(tx *xorm.Session) error {
ok, err := tx.Get(&ref)View on GitHub (pinned to c9a67b23e8)
Solutions
- Retry; the competing cleanup usually completes and the row disappears
- Recurring occurrences: check for multiple GC instances running against the same volume
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at pkg/meta/sql.go:4087 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/08cf72e86e3d0dc9.
Report an issue: GitHub.