Hi,

I'm trying to define a union schema which is backward compatible.

This is similar to the example in

http://apache-avro.679487.n3.nabble.com/Avro-union-compatibility-mode-enhancement-proposal-td4034377.html

I have the original schema as below


  record BaseOrg {
>     long orgId;
>   }
>   record Org {
>     long orgId;
>     string name;
>   }
>   record Address {
>      string city;
>      string state;
>   }
>   record ExtendedOrg {
>     long orgId;
>     string name;
>     string industry;
>   }


    union {
>       null,
>       BaseOrg,
>       Org,
>       ExtendedOrg
>     }  org=null;


This is just some example code (I could have added some of the fields to
the original org )

Now I have evolved  this  schema to

>
>     union {
>       null,
>       BaseOrg,
>       Org,
>       ExtendedOrg
>       ,ExtendedOrg2
>     }  org=null;
>   record ExtendedOrg2 {
>     long orgId;
>     string name;
>     boolean active;
>     string geography;
>     string industry;
>   }


I have a consumer with the old schema and a producer with the new schema

I saw in the JIRA
https://issues.apache.org/jira/browse/AVRO-1590?focusedCommentId=14150780&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-14150780

considering this I would imagine when a producer sets the "ExtendedOrg2"
branch in the producer, The consumer who doesn't understand that should
match to either of BaseOr, Org, ExtendedOrg. But I get the below exception

java.lang.ArrayIndexOutOfBoundsException: 4
> at org.apache.avro.io.parsing.Symbol$Alternative.getSymbol(Symbol.java:460)
> at org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:283)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:178)
> at
> org.apache.avro.specific.SpecificDatumReader.readField(SpecificDatumReader.java:136)
> at
> org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:237)
> at
> org.apache.avro.specific.SpecificDatumReader.readRecord(SpecificDatumReader.java:123)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:170)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:144)
> at com.five9.dataservices.avro.AgentReader.toEvent(AgentReader.java:101)
> at com.five9.dataservices.avro.AgentReader.read(AgentReader.java:83)
> at com.five9.dataservices.avro.AgentReader.main(AgentReader.java:59)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498)
> at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:282)
> at java.lang.Thread.run(Thread.java:748)


I would like to know if I understand the JIRA comments wrong or if
something's wrong with my schema

Thanks
Kishore

Reply via email to