[
https://issues.apache.org/jira/browse/AVRO-4063?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Martin Tzvetanov Grigorov resolved AVRO-4063.
---------------------------------------------
Fix Version/s: 0.18.0
Assignee: Martin Tzvetanov Grigorov
Resolution: Fixed
> [rust] `apache_avro::Writer::flush` does not call `std::io::Write::flush` on
> the inner writer
> ---------------------------------------------------------------------------------------------
>
> Key: AVRO-4063
> URL: https://issues.apache.org/jira/browse/AVRO-4063
> Project: Apache Avro
> Issue Type: Bug
> Components: rust
> Reporter: Jane Lewis
> Assignee: Martin Tzvetanov Grigorov
> Priority: Minor
> Fix For: 0.18.0
>
>
> The Rust documentation for {{apache_avro::Writer::flush}} describes the
> function as follows:
> {quote}Flush the content appended to a {{{}Writer{}}}. Call this function to
> make sure all the content has been written before releasing the
> {{{}Writer{}}}.
> {quote}
> However, this function does not actually guarantee that all the content will
> be written out after the {{flush()}} call, because it does not call
> {{std::io::Write::flush}} on the inner {{{}writer{}}}.
> This can be a problem when the inner writer uses its own buffer. Here's an
> example of how this can lead to misleading behavior:
>
> {code:java}
> fn main() {
> let buffered_writer =
> std::io::BufWriter::new(std::fs::File::create("test.avro").unwrap());
> let schema = apache_avro::Schema::parse_str(
> r#"
> {
> "type": "record",
> "name": "example_schema",
> "fields": [
> {"name": "example_field", "type": "string"}
> ]
> }
> "#,
> )
> .unwrap();
> let mut writer = apache_avro::Writer::new(&schema, buffered_writer);
> let mut record =
> apache_avro::types::Record::new(writer.schema()).unwrap();
> record.put("example_field", "value");
> writer.append(record).unwrap();
> writer.flush().unwrap();
> let test_file_contents = std::fs::read("test.avro").unwrap();
> assert_ne!(test_file_contents.len(), 0); // this will fail
> }
> {code}
> In this example, the internal {{BufWriter}} had not yet flushed its internal
> buffer after {{writer.flush().unwrap()}} was called. In fact, the buffer is
> only written out once {{writer}} is dropped.
> To fix this issue, I propose that {{.flush()}} should be called on the inner
> writer at the end of {{{}apache_avro::Writer::flush{}}}.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)