vectordotdev/vector · error

Failed to get entry for dir

Error message

Failed to get entry for dir: {input_path:?}

What it means

While iterating a directory listing, each fs::read_dir entry Result is unwrapped; a failed entry (e.g. the Dirent could not be read) panics with 'Failed to get entry for dir: <path>'. This is distinct from a failure to open the directory itself.

Solutions

  1. Re-run the tool once the directory is no longer being modified concurrently
  2. Exclude directories that race with cleanup (run the converter on a snapshot/copy)
  3. Check filesystem health (dmesg / fsck) if errors repeat on local disks
  4. Patch to push the entry error into the errors Vec and continue with remaining entries

Example fix

// before
.unwrap_or_else(|_| panic!("Failed to get entry for dir: {input_path:?}"))
// after
let entry = match entry {
    Ok(e) => e,
    Err(err) => {
        errors.push(format!("Bad entry in {input_path:?}: {err}"));
        continue;
    }
};
Defensive patterns

Strategy: retry

Type guard

fn safe_entries(p: &std::path::Path) -> Vec<std::fs::DirEntry> {
    fs::read_dir(p).map(|rd| rd.flatten().collect()).unwrap_or_default()
}

Try / catch

match result {
    Ok(v) => v,
    Err(e) if e.kind() == io::ErrorKind::NotFound => continue, // entry vanished mid-walk
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: A directory entry becomes unreadable between read_dir and iteration — the file is deleted or renamed concurrently, or an I/O error occurs while reading the entry metadata from the filesystem.

Common situations: Concurrent modification of the directory while the converter walks it (build/clean jobs running in parallel), flaky network filesystems (NFS) returning stale entries, or exceeding fd/inotify-related limits on very large directories.

Understand the failure class

Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.

Related errors


AI-assisted analysis of vectordotdev/vector@bdb87aeaa4 (2026-09-16). Data as JSON: /api/errors/2e89bbed2236841b. Report an issue: GitHub.

Appendix: source

Thrown at src/convert_config.rs:158

    {
        println!("Wrote result to {output_path:?}.");
    }
    Ok(())
}

fn walk_dir_and_convert(
    input_path: &Path,
    output_dir: &Path,
    output_format: Format,
) -> Result<(), Vec<String>> {
    let mut errors = Vec::new();

    if input_path.is_dir() {
        for entry in fs::read_dir(input_path)
            .unwrap_or_else(|_| panic!("Failed to read dir: {input_path:?}"))
        {
            let entry_path = entry
                .unwrap_or_else(|_| panic!("Failed to get entry for dir: {input_path:?}"))
                .path();
            let new_output_dir = if entry_path.is_dir() {
                let last_component = entry_path
                    .file_name()
                    .unwrap_or_else(|| panic!("Failed to get file_name for {entry_path:?}"));
                let new_dir = output_dir.join(last_component);

                if !new_dir.exists() {
                    fs::create_dir_all(&new_dir)
                        .unwrap_or_else(|_| panic!("Failed to create output dir: {new_dir:?}"));
                }
                new_dir
            } else {
                output_dir.to_path_buf()
            };

            if let Err(new_errors) = walk_dir_and_convert(
                &input_path.join(&entry_path),

View on GitHub (pinned to bdb87aeaa4)