Yevhen Cherkes created AVRO-3027: ------------------------------------ Summary: .net consumer Backward compatibility issue. Key: AVRO-3027 URL: https://issues.apache.org/jira/browse/AVRO-3027 Project: Apache Avro Issue Type: Bug Components: csharp Affects Versions: 1.10.1 Environment: .Net core 3.1
Reporter: Yevhen Cherkes Attachments: CompatibilityTests.zip We are facing the following exception during the consuming messages: {code} No matching schema for {"type":"record","name":"InnerType1","namespace":"com.mycorp.mynamespace","fields":[ {"name":"value","type":"string"} ]} in {"type":["null",{"type":"record","name":"InnerType2","namespace":"com.mycorp.mynamespace","fields":[ {"name":"value","type":"string"} ]}]} at Avro.Generic.DefaultReader.findBranch(UnionSchema us, Schema s) at Avro.Generic.DefaultReader.ReadUnion(Object reuse, UnionSchema writerSchema, Schema readerSchema, Decoder d) at Avro.Generic.DefaultReader.Read(Object reuse, Schema writerSchema, Schema readerSchema, Decoder d) at Avro.Specific.SpecificDefaultReader.ReadRecord(Object reuse, RecordSchema writerSchema, Schema readerSchema, Decoder dec) {code} We have 2 versions of the schema on a topic: Schema v1: {code:json} { "fields": [ { "name": "InnerComplexValue", "type": [ "null", { "fields": [ { "name": "value", "type": "string" } ], "name": "InnerType1", "namespace": "com.mycorp.mynamespace", "type": "record" } ] } ], "name": "RootType", "namespace": "com.mycorp.mynamespace", "type": "record" } {code} Schema v2: {code:json} { "fields": [ { "name": "InnerComplexValue", "type": [ "null", { "fields": [ { "name": "value", "type": "string" } ], "name": "InnerType2", "namespace": "com.mycorp.mynamespace", "type": "record" } ] } ], "name": "RootType", "namespace": "com.mycorp.mynamespace", "type": "record" } {code} InnerType1 -> InnerType2 is the only change. The schema for a topic is configured with Backward compatibility. An updated version of a Schema saved with no errors. Then we generated a specific record RootType with avrogen tool. Reproduction code: {code:c#} var base64 = "AhR0ZXN0IHZhbHVl"; using var stream = new MemoryStream(Convert.FromBase64String(base64)); var schema_v1 = Schema.Parse("{\"type\":\"record\",\"name\":\"RootType\",\"namespace\":\"com.mycorp.mynamespace\",\"fields\":" + "[{\"name\":\"InnerComplexValue\",\"type\":[\"null\",{\"type\":\"record\",\"name\":\"InnerType1\"" + ",\"fields\":[{\"name\":\"value\",\"type\":\"string\"}]}]}]}"); var schema_v2 = Schema.Parse("{\"type\":\"record\",\"name\":\"RootType\",\"namespace\":\"com.mycorp.mynamespace\",\"fields\":" + "[{\"name\":\"InnerComplexValue\",\"type\":[\"null\",{\"type\":\"record\",\"name\":\"InnerType2\"" + ",\"fields\":[{\"name\":\"value\",\"type\":\"string\"}]}]}]}"); var specificRecord = Deserialize<RootType>(stream, schema_v1, schema_v2); {code} Method Deserialize was taken from the [SpecificTests.cs#L408-L417|https://github.com/apache/avro/blob/master/lang/csharp/src/apache/test/Specific/SpecificTests.cs#L408-L417] *Java*-based consumers work with no issues for this particular case. -- This message was sent by Atlassian Jira (v8.3.4#803005)