Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

StringSchema.hashCode inconsistent across executions #505

Open
elrodro83 opened this issue Feb 27, 2024 · 3 comments
Open

StringSchema.hashCode inconsistent across executions #505

elrodro83 opened this issue Feb 27, 2024 · 3 comments

Comments

@elrodro83
Copy link

This seems to happen because formatValidator is a lambda (https://github.com/everit-org/json-schema/blob/master/core/src/main/java/org/everit/json/schema/FormatValidator.java#L2), and lambdas d not have a fixed hashCode.

This is causing different runs to sort subschemas of a CombinedSchema differently, after this change: 81f0b2f#diff-66627cee53cd6d5d44872a44ab6dac6906bdf991afa3433ada63cbdea1466f63R177

erosb added a commit that referenced this issue Apr 7, 2024
@erosb
Copy link
Contributor

erosb commented Apr 7, 2024

Hello @elrodro83 I pushed a fix in this commit: 5436bb7

Does it work for you? Do you need a release urgently?

@elrodro83
Copy link
Author

Hi!

I retested and am still having failures even with this fix. The change seems to fix the equals method, but the problem i am having is getting inconsitent sorting of elements, because the lib is using a HashSet, which sots its elements according to its hashCode.

@brianmaresca
Copy link

brianmaresca commented Apr 16, 2024

possibly related. SchemaLoader.load() is giving inconsistent behavior. the issue seems to be isolated to 1.14.4, i wasn't able to reproduce in 1.14.3.

to reproduce, i just ran this simple test:

while (true) {
  SchemaLoader.load(json);
}

which will eventually cause this:

java.lang.IllegalArgumentException: Comparison method violates its general contract!
	at java.base/java.util.TimSort.mergeHi(Unknown Source)
	at java.base/java.util.TimSort.mergeAt(Unknown Source)
	at java.base/java.util.TimSort.mergeForceCollapse(Unknown Source)
	at java.base/java.util.TimSort.sort(Unknown Source)
	at java.base/java.util.Arrays.sort(Unknown Source)
	at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
	at org.everit.json.schema.CombinedSchema.sortByCombinedFirst(CombinedSchema.java:187)
	at org.everit.json.schema.CombinedSchema.<init>(CombinedSchema.java:171)
	at org.everit.json.schema.CombinedSchema$Builder.build(CombinedSchema.java:30)
	at org.everit.json.schema.CombinedSchema$Builder.build(CombinedSchema.java:20)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:399)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:462)
	at org.everit.json.schema.loader.SchemaLoader.loadChild(SchemaLoader.java:466)
	at org.everit.json.schema.loader.ArraySchemaLoader.lambda$load$2(ArraySchemaLoader.java:49)
	at org.everit.json.schema.loader.JsonValue$VoidMultiplexer.lambda$new$0(JsonValue.java:60)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.JsonValue$VoidMultiplexerWithSchemaPredicate.requireAny(JsonValue.java:89)
	at org.everit.json.schema.loader.JsonValue$VoidMultiplexerWithSchemaPredicate.requireAny(JsonValue.java:75)
	at org.everit.json.schema.loader.ArraySchemaLoader.lambda$load$4(ArraySchemaLoader.java:51)
	at java.base/java.util.Optional.ifPresent(Unknown Source)
	at org.everit.json.schema.loader.ArraySchemaLoader.load(ArraySchemaLoader.java:48)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.buildArraySchema(SchemaExtractor.java:144)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.loadForExplicitType(SchemaExtractor.java:281)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.extract(SchemaExtractor.java:253)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.extract(SchemaExtractor.java:114)
	at org.everit.json.schema.loader.SchemaLoader.runSchemaExtractors(SchemaLoader.java:424)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:388)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:462)
	at org.everit.json.schema.loader.SchemaLoader.loadChild(SchemaLoader.java:466)
	at org.everit.json.schema.loader.ObjectSchemaLoader.addPropertySchemaDefinition(ObjectSchemaLoader.java:70)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$populatePropertySchemas$9(ObjectSchemaLoader.java:64)
	at org.everit.json.schema.loader.JsonObject.iterateOnEntry(JsonObject.java:84)
	at org.everit.json.schema.loader.JsonObject.lambda$forEach$1(JsonObject.java:79)
	at java.base/java.util.HashMap$EntrySet.forEach(Unknown Source)
	at org.everit.json.schema.loader.JsonObject.forEach(JsonObject.java:79)
	at org.everit.json.schema.loader.ObjectSchemaLoader.populatePropertySchemas(ObjectSchemaLoader.java:61)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$load$0(ObjectSchemaLoader.java:32)
	at java.base/java.util.Optional.ifPresent(Unknown Source)
	at org.everit.json.schema.loader.ObjectSchemaLoader.load(ObjectSchemaLoader.java:32)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.buildObjectSchema(SchemaExtractor.java:139)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.loadForExplicitType(SchemaExtractor.java:283)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.extract(SchemaExtractor.java:253)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.extract(SchemaExtractor.java:114)
	at org.everit.json.schema.loader.SchemaLoader.runSchemaExtractors(SchemaLoader.java:424)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:388)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:462)
	at org.everit.json.schema.loader.SchemaLoader.loadChild(SchemaLoader.java:466)
	at org.everit.json.schema.loader.ArraySchemaLoader.lambda$load$2(ArraySchemaLoader.java:49)
	at org.everit.json.schema.loader.JsonValue$VoidMultiplexer.lambda$new$0(JsonValue.java:60)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.JsonValue$VoidMultiplexerWithSchemaPredicate.requireAny(JsonValue.java:89)
	at org.everit.json.schema.loader.JsonValue$VoidMultiplexerWithSchemaPredicate.requireAny(JsonValue.java:75)
	at org.everit.json.schema.loader.ArraySchemaLoader.lambda$load$4(ArraySchemaLoader.java:51)
	at java.base/java.util.Optional.ifPresent(Unknown Source)
	at org.everit.json.schema.loader.ArraySchemaLoader.load(ArraySchemaLoader.java:48)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.buildArraySchema(SchemaExtractor.java:144)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.loadForExplicitType(SchemaExtractor.java:281)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.extract(SchemaExtractor.java:253)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.extract(SchemaExtractor.java:114)
	at org.everit.json.schema.loader.SchemaLoader.runSchemaExtractors(SchemaLoader.java:424)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:388)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:462)
	at org.everit.json.schema.loader.SchemaLoader.loadChild(SchemaLoader.java:466)
	at org.everit.json.schema.loader.ObjectSchemaLoader.addPropertySchemaDefinition(ObjectSchemaLoader.java:70)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$populatePropertySchemas$9(ObjectSchemaLoader.java:64)
	at org.everit.json.schema.loader.JsonObject.iterateOnEntry(JsonObject.java:84)
	at org.everit.json.schema.loader.JsonObject.lambda$forEach$1(JsonObject.java:79)
	at java.base/java.util.HashMap$EntrySet.forEach(Unknown Source)
	at org.everit.json.schema.loader.JsonObject.forEach(JsonObject.java:79)
	at org.everit.json.schema.loader.ObjectSchemaLoader.populatePropertySchemas(ObjectSchemaLoader.java:61)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$load$0(ObjectSchemaLoader.java:32)
	at java.base/java.util.Optional.ifPresent(Unknown Source)
	at org.everit.json.schema.loader.ObjectSchemaLoader.load(ObjectSchemaLoader.java:32)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.buildObjectSchema(SchemaExtractor.java:139)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.loadForExplicitType(SchemaExtractor.java:283)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.extract(SchemaExtractor.java:253)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.extract(SchemaExtractor.java:114)
	at org.everit.json.schema.loader.SchemaLoader.runSchemaExtractors(SchemaLoader.java:424)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:388)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:47)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:462)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:308)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:291)

my json object is quite large and complex, which might be exacerbating the issue. but with the same exact json, i am certain i'm only seeing this in 1.14.4. i also tried 5436bb7 - same thing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants