[ 
https://issues.apache.org/jira/browse/NIFI-6654?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Otto Fowler updated NIFI-6654:
------------------------------
    Comment: was deleted

(was: If you use a second instance of the fields array, instead of re-using the 
same array this test passes.


{code:java}
 @Test
    public void testSchemaCompareSelfRef() {
        // Set up first schema
        final SimpleRecordSchema personSchema = new 
SimpleRecordSchema(SchemaIdentifier.EMPTY);
        final List<RecordField> personFields = new ArrayList<>();
        personFields.add(new RecordField("name", 
RecordFieldType.STRING.getDataType()));
        personFields.add(new RecordField("address", 
RecordFieldType.STRING.getDataType()));
        personFields.add(new RecordField("SIN", 
RecordFieldType.STRING.getDataType()));
        personFields.add(new RecordField("PersonalData", 
RecordFieldType.RECORD.getRecordDataType(personSchema)));
        personSchema.setFields(personFields);
        // Set up second schema. Must be completely separate set of objects 
otherwise overloaded comparison
        // operators (particularly that from the SimpleRecordSchema class) will 
not be called.
        SimpleRecordSchema secondSchema = new 
SimpleRecordSchema(SchemaIdentifier.EMPTY);
        //personFields.clear();
        final List<RecordField> personFields2 = new ArrayList<>();
        personFields2.add(new RecordField("name", 
RecordFieldType.STRING.getDataType()));
        personFields2.add(new RecordField("address", 
RecordFieldType.STRING.getDataType()));
        personFields2.add(new RecordField("SIN", 
RecordFieldType.STRING.getDataType()));
        personFields2.add(new RecordField("PersonalData", 
RecordFieldType.RECORD.getRecordDataType(secondSchema)));
        secondSchema.setFields(personFields);
        assertTrue(personSchema.equals(secondSchema));
    }
{code})

> Stack overflow with self referencing avro schema
> ------------------------------------------------
>
>                 Key: NIFI-6654
>                 URL: https://issues.apache.org/jira/browse/NIFI-6654
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Core Framework
>    Affects Versions: 1.9.2
>            Reporter: Ron Chittaro
>            Priority: Major
>
> We (and our customers, thus why I marked this a blocker as we cannot proceed 
> with 1.9.2 and in some cases product depolyment at all) have run into a stack 
> overflow exception with the 'UpdateRecord' processor when upgrading from Nifi 
> 1.7 to 1.9.2. I did some digging and it happens when:
>  * A schema comparison operation is performed, AND
>  * the schema in question is self referential
> I was a bit confused initially as I found that a unit test case for this 
> already existed and was passing when I checked out and built 1.9.2. The test 
> case is:
> {quote}testHashCodeAndEqualsWithSelfReferencingSchema() from 
> TestSimpleRecordSchema.java located in: 
> nifi\nifi-commons\nifi-record\src\test\java\org\apache\nifi\serialization
> {quote}
> However, if you dig a bit into this test case it is passing because the two 
> schemas being compared contain the same memory references for the fields 
> within them, thus comparisons do not exercise completely the underlying 
> equals() operators of the objects contained in the schema. See bold below:
> {quote}final SimpleRecordSchema schema = new 
> SimpleRecordSchema(SchemaIdentifier.EMPTY);
> final List<RecordField> personFields = new ArrayList<>();
>  personFields.add(new RecordField("name", 
> RecordFieldType.STRING.getDataType()));
>  personFields.add(new RecordField("sibling", 
> RecordFieldType.RECORD.getRecordDataType(schema)));
> *schema.setFields(personFields);*
> schema.hashCode();
>  assertTrue(schema.equals(schema));
> final SimpleRecordSchema secondSchema = new 
> SimpleRecordSchema(SchemaIdentifier.EMPTY);
>  *secondSchema.setFields(personFields);*
>  assertTrue(schema.equals(secondSchema));
>  assertTrue(secondSchema.equals(schema));
> {quote}
>  
> To reproduce the stack overflow I wrote the following test cases which I 
> believe behaves more like it would in the 'UpdateProcessor' (or anywhere else 
> a schema comparison is happening) where the schema object and all objects 
> within are completely different memory references.
>  
> @Test
> public void testSchemaCompareSelfRef() {
>  // Set up first schema
>  final SimpleRecordSchema personSchema = new 
> SimpleRecordSchema(SchemaIdentifier.EMPTY);
>  final List<RecordField> personFields = new ArrayList<>();
>  personFields.add(new RecordField("name", 
> RecordFieldType.STRING.getDataType()));
>  personFields.add(new RecordField("address", 
> RecordFieldType.STRING.getDataType()));
>  personFields.add(new RecordField("SIN", 
> RecordFieldType.STRING.getDataType()));
>  personFields.add(new RecordField("PersonalData", 
> RecordFieldType.RECORD.getRecordDataType(personSchema)));
>  personSchema.setFields(personFields);
>  // Set up second schema. Must be completely separate set of objects 
> otherwise overloaded comparison
>  // operators (particularly that from the SimpleRecordSchema class) will not 
> be called.
>  SimpleRecordSchema secondSchema = new 
> SimpleRecordSchema(SchemaIdentifier.EMPTY);
>  personFields.clear();
>  personFields.add(new RecordField("name", 
> RecordFieldType.STRING.getDataType()));
>  personFields.add(new RecordField("address", 
> RecordFieldType.STRING.getDataType()));
>  personFields.add(new RecordField("SIN", 
> RecordFieldType.STRING.getDataType()));
>  personFields.add(new RecordField("PersonalData", 
> RecordFieldType.RECORD.getRecordDataType(secondSchema)));
>  secondSchema.setFields(personFields);
>  assertTrue(personSchema.equals(secondSchema));
> }
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to