You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Doug Cutting (JIRA)" <ji...@apache.org> on 2010/10/29 01:23:19 UTC

[jira] Resolved: (AVRO-685) Certain recursive schemas can prevent Schema.RecordSchema.hashCode() and .equals() from returning

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

Doug Cutting resolved AVRO-685.
-------------------------------

       Resolution: Fixed
    Fix Version/s: 1.5.0
         Assignee: Richard Ahrens
     Hadoop Flags: [Reviewed]

I just committed this.  Thanks, Richard!

> Certain recursive schemas can prevent Schema.RecordSchema.hashCode() and .equals() from returning
> -------------------------------------------------------------------------------------------------
>
>                 Key: AVRO-685
>                 URL: https://issues.apache.org/jira/browse/AVRO-685
>             Project: Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.4.1
>         Environment: all
>            Reporter: Richard Ahrens
>            Assignee: Richard Ahrens
>            Priority: Critical
>             Fix For: 1.5.0
>
>         Attachments: AVRO-685.patch, Schema.patch, test.avpr
>
>
> I am creating a protocol in memory by building up Schema objects, then writing the avpr file to disk and running SpecificCompiler against it to generate Java sources.  My protocol file causes SpecificCompiler to hang.  Running in the debugger, I can see a long stack trace emanating from SpecificCompiler.enqueue() (see debugger stack trace at end of this text).  What appears to be happening is that Schema.RecordSchema.hashCode() is removing itself from the SEEN_HASHCODE map prematurely; schemas with circular references in multiple fields are added and removed from SEEN_HASHCODE causing the code to bounce around between fields without ever unwinding to the root object.
> Attached is a patch that fixes the problem.  If this patch is accepted, I'd like to request an incremental release as this is a showstopper for us.  I've also attached a sample avpr file that reproduces the issue.
> Debugger stack trace referenced above:
> org.apache.avro.specific.SpecificCompiler at localhost:3273	
> 	Thread [main] (Suspended)	
> 		System.identityHashCode(Object) line: not available [native method]	
> 		IdentityHashMap<K,V>.hash(Object, int) line: 284	
> 		IdentityHashMap<K,V>.put(K, V) line: 412	
> 		Schema$RecordSchema.hashCode() line: 601	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$ArraySchema.hashCode() line: 703	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$UnionSchema.hashCode() line: 781	
> 		Schema$ArraySchema.hashCode() line: 703	
> 		Schema$Field.hashCode() line: 421	
> 		Schema$LockableArrayList<E>(AbstractList<E>).hashCode() line: 527	
> 		Schema$RecordSchema.hashCode() line: 602	
> 		HashMap<K,V>.getEntry(Object) line: 344	
> 		HashMap<K,V>.containsKey(Object) line: 335	
> 		HashSet<E>.contains(Object) line: 184	
> 		SpecificCompiler.enqueue(Schema) line: 134	
> 		SpecificCompiler.<init>(Protocol) line: 70	
> 		SpecificCompiler.compileProtocol(File, File) line: 114	
> 		SpecificCompiler.main(String[]) line: 399	

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.