[
https://issues.apache.org/jira/browse/AVRO-685?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12925565#action_12925565
]
Doug Cutting commented on AVRO-685:
-----------------------------------
Thanks for finding this!
I can't yet see how this can happen, yet it does with the protocol you provide.
I'm trying to create a minimal example. Does anyone have an intuition?
> 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
> Priority: Critical
> Attachments: 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.