{"record":{"id":"a415fd3ab83669bb","repo":"juicedata/juicefs","slug":"get-slices-of-inode-d-index-d-error-d","errorCode":null,"errorMessage":"get slices of inode %d index %d error: %d","messagePattern":"get slices of inode (.+?) index (.+?) error: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/vfs/fill.go","lineNumber":402,"sourceCode":"\t\titer.err = iter.ctx.Err()\n\t\treturn false\n\t}\n\n\tfor iter.nextSliceIndex >= uint64(len(iter.slices)) {\n\t\t// Skip chunks that don't overlap any range.\n\t\tfor iter.nextChunkIndex < iter.chunkCnt &&\n\t\t\t!iter.overlapsRange(uint64(iter.nextChunkIndex)*meta.ChunkSize, uint64(iter.nextChunkIndex+1)*meta.ChunkSize) {\n\t\t\titer.nextChunkIndex++\n\t\t}\n\t\tif iter.nextChunkIndex >= iter.chunkCnt {\n\t\t\treturn false\n\t\t}\n\n\t\titer.slices = nil\n\t\titer.nextSliceIndex = 0\n\t\titer.sliceOffset = 0\n\t\tif st := iter.mClient.Read(iter.ctx, iter.ino, iter.nextChunkIndex, &iter.slices); st != 0 {\n\t\t\titer.err = fmt.Errorf(\"get slices of inode %d index %d error: %d\", iter.ino, iter.nextChunkIndex, st)\n\t\t\tlogger.Error(iter.err)\n\t\t\treturn false\n\t\t}\n\t\titer.nextChunkIndex++\n\t}\n\n\treturn true\n}\n\n// next returns the next slice of the current chunk together with the parts of\n// its object that must be processed.\nfunc (iter *sliceIterator) next() (meta.Slice, []chunk.Range) {\n\ts := iter.slices[iter.nextSliceIndex]\n\titer.nextSliceIndex++\n\tsliceStart := uint64(iter.nextChunkIndex-1)*meta.ChunkSize + iter.sliceOffset\n\titer.sliceOffset += uint64(s.Len)\n\tif s.Id == 0 || s.Len == 0 {\n\t\treturn s, nil","sourceCodeStart":384,"sourceCodeEnd":420,"githubUrl":"https://github.com/juicedata/juicefs/blob/c9a67b23e8e08ec23ec331aa6f1675e2319e921c/pkg/vfs/fill.go#L384-L420","documentation":"During cache-fill iteration, hasNext fetches the slice list for a chunk via meta Read; a non-zero status code produces 'get slices of inode %d index %d error: %d' with the raw metadata status. This aborts iteration for that file, meaning the fill/collection cannot read the chunk's slices.","triggerScenarios":"Iterate/collectSliceIDs/collectParts walking a file's chunks when the metadata engine returns an error status for Read(ino, chunkIndex) — e.g. chunk index beyond file length metadata, engine connectivity failure, or deleted inode mid-iteration.","commonSituations":"File truncated/deleted while prefill iteration is running; Redis/SQL engine unavailable or timing out; corrupted chunk index entries.","solutions":["Check metadata engine health and connectivity (the status code hints at the engine error)","Re-run the fill after the file settles if it was deleted/truncated concurrently","Verify inode/chunk index consistency, e.g. via juicefs info or gc","Inspect engine logs for the corresponding status code"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// verify file still exists before iterating\nif st, err := fs.Stat(path); err != nil || st.Ino == 0 { skip }","typeGuard":null,"tryCatchPattern":"if !iter.Next() && iter.Err() != nil { log.Warnf(\"fill iteration aborted: %v\", iter.Err()) } // re-run later","preventionTips":["Avoid deleting/truncating files during cache-fill operations","Monitor metadata engine health before long fills","Re-run failed fills; treat per-file failures as non-fatal"],"tags":["metadata","iteration","cache"],"backgroundTag":"metadata-read-failed","analyzedSha":"c9a67b23e8e08ec23ec331aa6f1675e2319e921c","analyzedAt":"2026-09-06T17:55:48.476Z","contentChangedAt":"2026-09-06T17:55:48.476Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}