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

Nandor Kollar commented on AVRO-2485:
-------------------------------------

[~wisegas] I don't know any location for the release schedule, actually 
releases are made on a more or less ad-hoc manner, based on community 
consensus, and it also depends when someone has time to create the release 
artifacts and kick off the process. I'd recommend you to either/both subscribe 
to dev and users group to get updates about the release process, or watch the 
relevant release Jira: AVRO-2476.

> ClassCastException on Nullable Map Value Schemas with Backward Compatible 
> Changes (Field Addition)
> --------------------------------------------------------------------------------------------------
>
>                 Key: AVRO-2485
>                 URL: https://issues.apache.org/jira/browse/AVRO-2485
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.9.0
>         Environment: Operating System: Mac OS 10.13.6
> JDK version: 1.8_172
> JUnit version: 4.12
>            Reporter: Sage Pierce
>            Priority: Critical
>
> In one of our Java applications, upon upgrading from 
> {{org.apache.avro:avro:1.8.2}} to {{org.apache.avro:avro:1.9.0}}, we are 
> seeing deserialization failures with the following exception:
> {code:java}
> java.lang.ClassCastException: org.apache.avro.Resolver$ReaderUnion cannot be 
> cast to org.apache.avro.Resolver$Container
>       at 
> org.apache.avro.io.parsing.ResolvingGrammarGenerator.generate(ResolvingGrammarGenerator.java:99)
>       at 
> org.apache.avro.io.parsing.ResolvingGrammarGenerator.generate(ResolvingGrammarGenerator.java:110)
>       at 
> org.apache.avro.io.parsing.ResolvingGrammarGenerator.generate(ResolvingGrammarGenerator.java:141)
>       at 
> org.apache.avro.io.parsing.ResolvingGrammarGenerator.generate(ResolvingGrammarGenerator.java:65)
>       at org.apache.avro.io.ResolvingDecoder.resolve(ResolvingDecoder.java:85)
>       at org.apache.avro.io.ResolvingDecoder.<init>(ResolvingDecoder.java:50)
>       at 
> org.apache.avro.io.DecoderFactory.resolvingDecoder(DecoderFactory.java:297)
>       at 
> org.apache.avro.generic.GenericDatumReader.getResolver(GenericDatumReader.java:128)
>       at 
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)
> {code}
> Further inspection of the stack trace and problematic data shows the issue 
> lies with nullable (unioned) Map Schemas, whose values are complex types, and 
> those types having backward compatible changes between the Writer and Reader 
> Schemas. The following test exposes the issue:
> {code:java|title=AvroUpgradeTest.java}
> import java.io.ByteArrayOutputStream;
> import java.util.Collections;
> import org.apache.avro.Schema;
> import org.apache.avro.io.DecoderFactory;
> import org.apache.avro.io.EncoderFactory;
> import org.apache.avro.reflect.ReflectData;
> import org.apache.avro.reflect.ReflectDatumWriter;
> import org.junit.Test;
> import static org.junit.Assert.assertEquals;
> public class AvroUpgradeTest {
>     @Test
>     public void 
> nullableMapWithBackwardCompatibleValueChangesCanBeDeserialized() throws 
> Exception {
>     TestDataWithNullableMap data = new TestDataWithNullableMap();
>     data.setMap(Collections.singletonMap("KEY", TestData.create()));
>     Schema writerSchema = 
> ReflectData.get().getSchema(TestDataWithNullableMap.class);
>     Schema readerMapSchema = 
> Schema.createMap(Schema.createRecord(TestData.class.getName(), null, null, 
> false,
>         Collections.singletonList(new Schema.Field("data1", 
> Schema.create(Schema.Type.STRING), null, Object.class.cast(null)))));
>     Schema readerSchema = 
> Schema.createRecord(TestDataWithNullableMap.class.getName(), null, null, 
> false,
>         Collections.singletonList(new Schema.Field("map", 
> ReflectData.makeNullable(readerMapSchema), null, Object.class.cast(null))));
>     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
>     new ReflectDatumWriter<>(writerSchema, ReflectData.get()).write(data, 
> EncoderFactory.get().directBinaryEncoder(outputStream, null));
>     byte[] serialized = outputStream.toByteArray();
>     TestDataWithNullableMap deserialized = new 
> ReflectDecoderAvroDeserializer.ReflectDecoderDatumReader<TestDataWithNullableMap>(writerSchema,
>  readerSchema, ReflectData.get())
>         .read(null, DecoderFactory.get().binaryDecoder(serialized, 0, 
> serialized.length, null));
>     assertEquals(data.getMap().get("KEY").getData1(), 
> deserialized.getMap().get("KEY").getData1());
>     }
> }
> {code}
> Note: I'm having to do a some manual Schema generation to force the 
> appearance of the Writer's Schema making a (backward compatible) field 
> addition.
> Relevant POJOs are as follows:
> {code:java|title=TestDataWithNullableMap.java}
> import java.util.Map;
> import org.apache.avro.reflect.Nullable;
> public class TestDataWithNullableMap {
>     @Nullable
>     private Map<String, TestData> map;
>     public Map<String, TestData> getMap() {
>         return map;
>     }
>     public void setMap(Map<String, TestData> map) {
>         this.map = map;
>     }
> }
> {code}
> —
> {code:java|title=TestData.java}
> public class TestData {
>     private String data1;
>     private String data2;
>     public static TestData create() {
>         TestData data = new TestData();
>         data.setData1("DATA 1");
>         data.setData2("DATA 2");
>         return data;
>     }
>     public String getData1() {
>         return data1;
>     }
>     public void setData1(String data1) {
>         this.data1 = data1;
>     }
>     public String getData2() {
>         return data2;
>     }
>     public void setData2(String data2) {
>         this.data2 = data2;
>     }
> }
> {code}
>  
> The preceding test succeeds with Avro 1.8.2, but fails on Avro 1.9.0 with the 
> mentioned Exception.



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Reply via email to