You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "ASF subversion and git services (Jira)" <ji...@apache.org> on 2022/01/07 13:32:00 UTC

[jira] [Commented] (AVRO-3240) Schema deserialization is not backwards compatible

    [ https://issues.apache.org/jira/browse/AVRO-3240?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17470617#comment-17470617 ] 

ASF subversion and git services commented on AVRO-3240:
-------------------------------------------------------

Commit 7584320142768612bc7a58242231a476404bbceb in avro's branch refs/heads/master from Ultrabug
[ https://gitbox.apache.org/repos/asf?p=avro.git;h=7584320 ]

AVRO-3240: fix deserializer schema backward compatibility (#1379)

* AVRO-3240: fix decoding schema when reaching the end of the reader

* AVRO-3240: add from_avro_datum test for reader EOF

* AVRO-3240: add reader eof handling to Schema::String

> Schema deserialization is not backwards compatible
> --------------------------------------------------
>
>                 Key: AVRO-3240
>                 URL: https://issues.apache.org/jira/browse/AVRO-3240
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: rust
>            Reporter: Ultrabug
>            Priority: Critical
>              Labels: pull-request-available
>          Time Spent: 2h 40m
>  Remaining Estimate: 0h
>
> Hello,
>  
> When providing your own schema to `from_avro_datum`, the deserialization is not backward compatible with messages containing a previous schema even if the schemas are created to be backward compatible.
> This is due to the `decode_variable` function in `utils` returning `Error::ReadVariableIntegerBytes` when the reader object is smaller than expected when reading a message with previous schema version (which is indeed smaller) and trying to decode it with a backward compatible schema.
> I have fixed the issue locally with the following patch which I will submit as a PR
>  
> ```
> diff --git a/lang/rust/src/util.rs b/lang/rust/src/util.rs
> index f9daf285..3538399e 100644
> --- a/lang/rust/src/util.rs
> +++ b/lang/rust/src/util.rs
> @@ -96,7 +96,7 @@ fn decode_variable<R: Read>(reader: &mut R) -> AvroResult<u64> {
>  }
>  reader
>  .read_exact(&mut buf[..])
> - .map_err(Error::ReadVariableIntegerBytes)?;
> + .or(Ok(()))?; // return nullable to support avro schemas backward compatibility
>  i |= (u64::from(buf[0] & 0x7F)) << (j * 7);
>  if (buf[0] >> 7) == 0 {
>  break;
> ```



--
This message was sent by Atlassian Jira
(v8.20.1#820001)