pola-rs/polars · error

failed to write the last newline

Error message

failed to write the last newline

What it means

After writing the JSON body, `generate` writes a trailing newline with `writeln!` and expects success. This panics if the write to the file fails, most commonly due to an I/O error on the output file handle.

Solutions

  1. Free disk space and re-run `generate`.
  2. Verify the output file was not truncated; regenerate it after fixing storage.
  3. Retry on a different, local filesystem if using network storage.
Defensive patterns

Strategy: retry

Validate before calling

free_mb=$(df -m --output=avail . | tail -1)
[ "$free_mb" -gt 100 ] || { echo "insufficient disk space" >&2; exit 1; }

Prevention

When it happens

Trigger: Disk becoming full between the JSON write and the newline write, or the file descriptor entering an error state (e.g. removed file, I/O error on the underlying device).

Common situations: Nearly-full disks in CI containers; flaky network-mounted volumes where a prior large write consumed the last available space.

Understand the failure class

Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.

Related errors


AI-assisted analysis of pola-rs/polars@fe841f959e (2026-09-18). Data as JSON: /api/errors/d8dd1a913e885c42. Report an issue: GitHub.

Appendix: source

Thrown at crates/polars-plan/src/bin/dsl-schema.rs:79

            },
            "check-hashes" => {
                check_hashes(path.unwrap_or(DEFAULT_HASHES_PATH.to_owned()));
            },
            unknown => {
                panic!("unknown command: `{unknown}`");
            },
        }
    }

    /// Serializes the current DSL schema into a file at the given path.
    ///
    /// Any existing file at the path is overwritten.
    fn generate(path: impl AsRef<Path>) {
        let schema = DslPlan::dsl_schema();

        let mut file = File::create(path).expect("failed to open the schema file for writing");
        serde_json::to_writer_pretty(&mut file, &schema).expect("failed to serialize the schema");
        writeln!(&mut file).expect("failed to write the last newline");
        file.flush().expect("failed to flush the schema file");
    }

    /// Outputs the current DSL schema hashes into a file at the given path.
    ///
    /// Any existing file at the path is overwritten.
    fn update_hashes(path: impl AsRef<Path>) {
        std::fs::write(path, current_schema_hashes())
            .expect("failed to write the schema into the file");
        eprintln!("the DSL schema file was updated");
    }

    /// Checks that the current schema hashes match the schema hashes in the file.
    fn check_hashes(path: impl AsRef<Path>) {
        let file_hashes =
            std::fs::read_to_string(path).expect("failed to read the schema hashes from the file");
        let expected = current_schema_hashes();
        if file_hashes != expected {

View on GitHub (pinned to fe841f959e)