Bryan Bende created NIFI-4030:
---------------------------------

             Summary: Avro Schema with default values can cause NPE
                 Key: NIFI-4030
                 URL: https://issues.apache.org/jira/browse/NIFI-4030
             Project: Apache NiFi
          Issue Type: Bug
    Affects Versions: 1.2.0, 1.3.0
            Reporter: Bryan Bende
            Priority: Minor
         Attachments: Convert_Avro_Short_to_Full.xml

While coming up with an example to convert between Avro schemas, I ran into the 
following scenario...

I created two schemas like the following:

{code}
{
  "name": "shortSchema",
  "namespace": "nifi",
  "type": "record",
  "fields": [
    { "name": "a", "type": "string" },
    { "name": "b", "type": "string" }
  ]
}
{code}

{code}
{
  "name": "fullSchema",
  "namespace": "nifi",
  "type": "record",
  "fields": [
    { "name": "c", "type": "string", "default" : "default value for field c" },
    { "name": "d", "type": "string", "default" : "default value for field d" },
    { "name": "a", "type": "string" },
    { "name": "b", "type": "string" }
  ]
}
{code}

Then I created a flow with a ConvertRecord processor that read a flow file 
which had Avro created with the shortSchema, and used a writer configured to 
write with the fullSchema.

This produced the following exception, even though the fullSchema has default 
values for additional fields:
{code}
ERROR [Timer-Driven Process Thread-1] o.a.n.processors.standard.ConvertRecord 
ConvertRecord[id=ec373b3a-5704-1c6b-f501-0977a332d513] Failed to process 
StandardFlowFileRecord[uuid=a8e604a9-1e15-4b9b-a4b7-fdbd441d3f2a,claim=StandardContentClaim
 [resourceClaim=StandardResourceClaim[id=1496842800576-10, container=default, 
section=10], offset=40141, length=196],offset=0,name=128518448076937,size=196]: 
org.apache.avro.file.DataFileWriter$AppendWriteException: 
java.lang.NullPointerException: null of string in field c of nifi.fullSchema
org.apache.avro.file.DataFileWriter$AppendWriteException: 
java.lang.NullPointerException: null of string in field c of nifi.fullSchema
        at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:308)
        at 
org.apache.nifi.avro.WriteAvroResultWithSchema.writeRecord(WriteAvroResultWithSchema.java:59)
        at 
org.apache.nifi.serialization.AbstractRecordSetWriter.write(AbstractRecordSetWriter.java:59)
        at 
org.apache.nifi.processors.standard.AbstractRecordProcessor$1.process(AbstractRecordProcessor.java:130)
        at 
org.apache.nifi.controller.repository.StandardProcessSession.write(StandardProcessSession.java:2785)
        at 
org.apache.nifi.processors.standard.AbstractRecordProcessor.onTrigger(AbstractRecordProcessor.java:118)
        at 
org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
        at 
org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1120)
        at 
org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:147)
        at 
org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(ContinuallyRunProcessorTask.java:47)
        at 
org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:132)
        at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at 
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: null of string in field c of 
nifi.fullSchema
        at 
org.apache.avro.generic.GenericDatumWriter.npe(GenericDatumWriter.java:132)
        at 
org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:126)
        at 
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:73)
        at 
org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:60)
        at org.apache.avro.file.DataFileWriter.append(DataFileWriter.java:302)
        ... 17 common frames omitted
Caused by: java.lang.NullPointerException: null
{code}

I worked around this by changing the type of the new fields from "string" to 
["null", "string"] and then Avro seems to fill in the default value.

We should be able to work around this and give the default value to Avro before 
it gets to the point of a NPE.

Template attached.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to