Thanks Prajwal

I tried what you suggested but i still get the same error.



On Mon, Feb 1, 2016 at 2:05 PM, Prajwal Tuladhar <p...@infynyxx.com> wrote:

> Hi,
>
> I think your usage of default for field "agentType" is invalid here.
>
> When generating code from invalid schema, it tends to fail:
>
> [INFO]
>> [INFO] --- avro-maven-plugin:1.7.6-cdh5.4.4:schema (default) @ test-app
>> ---
>> [WARNING] Avro: Invalid default for field agentType: "APP_AGENT" not a
>> ["null","string"]
>
>
> Try:
>
> {
>>  "namespace": "xx.xxxx.xxxxx.xxxxx",
>>  "type": "record",
>>  "name": "MyPayLoad",
>>  "fields": [
>>      {"name": "filed1",  "type": "string"},
>>      {"name": "filed2",     "type": "long"},
>>      {"name": "filed3",  "type": "boolean"},
>>      {
>>           "name" : "metrics",
>>           "type":
>>           {
>>              "type" : "array",
>>              "items":
>>              {
>>                  "name": "MyRecord",
>>                  "type": "record",
>>                  "fields" :
>>                      [
>>                        {"name": "min", "type": "long"},
>>                        {"name": "max", "type": "long"},
>>                        {"name": "sum", "type": "long"},
>>                        {"name": "count", "type": "long"}
>>                      ]
>>              }
>>           }
>>      },
>>      {"name": "agentType",  "type": ["null", "string"], "default": null}
>>   ]
>> }
>
>
>
>
>
> On Mon, Feb 1, 2016 at 8:31 PM, Raghvendra Singh <rsi...@appdynamics.com>
> wrote:
>
>>
>>
>> down votefavorite
>> <http://stackoverflow.com/questions/34733604/avro-schema-doesnt-honor-backward-compatibilty#>
>>
>> I have this avro schema
>>
>> {
>>  "namespace": "xx.xxxx.xxxxx.xxxxx",
>>  "type": "record",
>>  "name": "MyPayLoad",
>>  "fields": [
>>      {"name": "filed1",  "type": "string"},
>>      {"name": "filed2",     "type": "long"},
>>      {"name": "filed3",  "type": "boolean"},
>>      {
>>           "name" : "metrics",
>>           "type":
>>           {
>>              "type" : "array",
>>              "items":
>>              {
>>                  "name": "MyRecord",
>>                  "type": "record",
>>                  "fields" :
>>                      [
>>                        {"name": "min", "type": "long"},
>>                        {"name": "max", "type": "long"},
>>                        {"name": "sum", "type": "long"},
>>                        {"name": "count", "type": "long"}
>>                      ]
>>              }
>>           }
>>      }
>>   ]}
>>
>> Here is the code which we use to parse the data
>>
>> public static final MyPayLoad parseBinaryPayload(byte[] payload) {
>>         DatumReader<MyPayLoad> payloadReader = new 
>> SpecificDatumReader<>(MyPayLoad.class);
>>         Decoder decoder = DecoderFactory.get().binaryDecoder(payload, null);
>>         MyPayLoad myPayLoad = null;
>>         try {
>>             myPayLoad = payloadReader.read(null, decoder);
>>         } catch (IOException e) {
>>             logger.log(Level.SEVERE, e.getMessage(), e);
>>         }
>>
>>         return myPayLoad;
>>     }
>>
>> Now i want to add one more field int the schema so the schema looks like
>> below
>>
>>  {
>>  "namespace": "xx.xxxx.xxxxx.xxxxx",
>>  "type": "record",
>>  "name": "MyPayLoad",
>>  "fields": [
>>      {"name": "filed1",  "type": "string"},
>>      {"name": "filed2",     "type": "long"},
>>      {"name": "filed3",  "type": "boolean"},
>>      {
>>           "name" : "metrics",
>>           "type":
>>           {
>>              "type" : "array",
>>              "items":
>>              {
>>                  "name": "MyRecord",
>>                  "type": "record",
>>                  "fields" :
>>                      [
>>                        {"name": "min", "type": "long"},
>>                        {"name": "max", "type": "long"},
>>                        {"name": "sum", "type": "long"},
>>                        {"name": "count", "type": "long"}
>>                      ]
>>              }
>>           }
>>      }
>>      {"name": "agentType",  "type": ["null", "string"], "default": 
>> "APP_AGENT"}
>>   ]}
>>
>> Note the filed added and also the default is defined. The problem is that
>> if we receive the data which was written using the older schema i get this
>> error
>>
>> java.io.EOFException: null
>>     at org.apache.avro.io.BinaryDecoder.ensureBounds(BinaryDecoder.java:473) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:128) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at org.apache.avro.io.BinaryDecoder.readIndex(BinaryDecoder.java:423) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at 
>> org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:229) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at org.apache.avro.io.parsing.Parser.advance(Parser.java:88) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at 
>> org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:206) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at 
>> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:152) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at 
>> org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:177)
>>  ~[avro-1.7.4.jar:1.7.4]
>>     at 
>> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:148) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at 
>> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:139) 
>> ~[avro-1.7.4.jar:1.7.4]
>>     at 
>> com.appdynamics.blitz.shared.util.XXXXXXXXXXXXX.parseBinaryPayload(BlitzAvroSharedUtil.java:38)
>>  ~[blitz-shared.jar:na]
>>
>> What i understood from this
>> <https://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html>
>>  document
>> that this should have been backward compatible but somehow that doesn't
>> seem to be the case. Any idea what i am doing wrong?
>>
>
>
>
> --
> --
> Cheers,
> Praj
>

Reply via email to