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

prashant sharma updated AVRO-4078:
----------------------------------
    Component/s: java
    Description: 
I think there is an issue in avro versions (1.10+) onwards caused by MapUtil 
class

([https://github.com/apache/avro/blob/main/lang/java/avro/src/main/java/org/apache/avro/util/MapUtil.java])
 
package com.tesco.identity.riskengine.blocking.ip
import org.apache.avro.Schema
import org.apache.avro.specific.SpecificData

import spock.lang.Specification
class DemoTest extends Specification {

public static final Schema IDENTIFICATION_SCHEMA$ = (new 
Schema.Parser()).parse("{\n" +
" \"type\": \"record\",\n" +
" \"namespace\": \"com.tesco.identity.auth.session\",\n" +
" \"name\": \"IdentificationResult\",\n" +
" \"fields\": [\n" +
"

{\n" + " \"name\": \"something\",\n" + " \"type\": \"string\"\n" + " }

\n" +
" ]\n" +
"}");

def "test class load"()

{ given: when: "specific data static method is called to load schema" 
SpecificData.get().getClass(IDENTIFICATION_SCHEMA$) then: "no exception is 
thrown" noExceptionThrown() }

}
 
This is the stacktrace
 
Expected no exception to be thrown, but got 
'java.lang.ExceptionInInitializerError'
 
at spock.lang.Specification.noExceptionThrown(Specification.java:118)
at com.tesco.identity.riskengine.blocking.ip.DemoTest.test class 
load(DemoTest.groovy:39)
Caused by: java.lang.ExceptionInInitializerError
at java.base/java.lang.Class.forName(Class.java:398)
at org.apache.avro.util.ClassUtils.forName(ClassUtils.java:95)
at org.apache.avro.util.ClassUtils.forName(ClassUtils.java:72)
at 
org.apache.avro.specific.SpecificData.lambda$getClass$2(SpecificData.java:259)
at 
java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
at org.apache.avro.util.MapUtil.computeIfAbsent(MapUtil.java:42)
at org.apache.avro.specific.SpecificData.getClass(SpecificData.java:257)
at com.tesco.identity.riskengine.blocking.ip.DemoTest.test class 
load(DemoTest.groovy:36)
Caused by: java.lang.IllegalStateException: Recursive update
at 
java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1760)
at org.apache.avro.util.MapUtil.computeIfAbsent(MapUtil.java:42)
at org.apache.avro.specific.SpecificData.getClass(SpecificData.java:257)
at org.apache.avro.specific.SpecificData.getForSchema(SpecificData.java:164)
at 
org.apache.avro.specific.SpecificDatumWriter.<init>(SpecificDatumWriter.java:47)
at 
com.tesco.identity.auth.session.IdentificationResult.<clinit>(IdentificationResult.java:881)
... 8 more
 
If I use avro version 1.9 (which doesn't have MapUtil) my test works.
 
 
P.S - we are migrating our services(that uses kafka and avro schema) from 1.9 
to 1.11.4 as there has been a critical vulnerability reported in avro 
([https://security.snyk.io/vuln/SNYK-JAVA-ORGAPACHEAVRO-8161188]) , But we 
can't do it as avro 1.11.* fails for us due to above issue. 
 

  was:
I think there is an issue in avro versions (1.10+) onwards caused by MapUtil 
class

([https://github.com/apache/avro/blob/main/lang/java/avro/src/main/java/org/apache/avro/util/MapUtil.java])
 
package com.tesco.identity.riskengine.blocking.ip

import com.github.javafaker.Faker
import com.tesco.identity.auth.session.AuthenticationResult
import com.tesco.identity.auth.session.IdentificationResult
import com.tesco.identity.auth.session.VerificationResult
import com.tesco.identity.riskengine.authentication.attempts.analyzer.Issuer
import 
com.tesco.identity.riskengine.authentication.attempts.analyzer.MaliciousIp
import com.tesco.identity.riskengine.blocking.ConfigModule
import com.tesco.identity.riskengine.blocking.activity.UserActivity
import com.tesco.identity.riskengine.blocking.activity.rest.HttpFacade
import com.tesco.identity.riskengine.kafka.test.tools.EventFinder
import com.tesco.identity.riskengine.kafka.test.tools.EventProducer
import com.typesafe.config.Config
import org.apache.avro.Schema
import org.apache.avro.specific.SpecificData
import spock.guice.UseModules
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Timeout
import spock.lang.Unroll

import javax.inject.Inject

import static java.time.Duration.ofSeconds
import static org.assertj.core.api.Assertions.assertThat
import static org.assertj.core.api.Assertions.catchThrowable

class DemoTest extends Specification {

public static final Schema IDENTIFICATION_SCHEMA$ = (new 
Schema.Parser()).parse("{\n" +
" \"type\": \"record\",\n" +
" \"namespace\": \"com.tesco.identity.auth.session\",\n" +
" \"name\": \"IdentificationResult\",\n" +
" \"fields\": [\n" +
" {\n" +
" \"name\": \"something\",\n" +
" \"type\": \"string\"\n" +
" }\n" +
" ]\n" +
"}");

def "test class load"() {
given:
when: "specific data static method is called to load schema"
SpecificData.get().getClass(IDENTIFICATION_SCHEMA$)

then: "no exception is thrown"
noExceptionThrown()
}

}
 
This is the stacktrace
 
Expected no exception to be thrown, but got 
'java.lang.ExceptionInInitializerError'
 
at spock.lang.Specification.noExceptionThrown(Specification.java:118)
at com.tesco.identity.riskengine.blocking.ip.DemoTest.test class 
load(DemoTest.groovy:39)
Caused by: java.lang.ExceptionInInitializerError
at java.base/java.lang.Class.forName(Class.java:398)
at org.apache.avro.util.ClassUtils.forName(ClassUtils.java:95)
at org.apache.avro.util.ClassUtils.forName(ClassUtils.java:72)
at 
org.apache.avro.specific.SpecificData.lambda$getClass$2(SpecificData.java:259)
at 
java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
at org.apache.avro.util.MapUtil.computeIfAbsent(MapUtil.java:42)
at org.apache.avro.specific.SpecificData.getClass(SpecificData.java:257)
at com.tesco.identity.riskengine.blocking.ip.DemoTest.test class 
load(DemoTest.groovy:36)
Caused by: java.lang.IllegalStateException: Recursive update
at 
java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1760)
at org.apache.avro.util.MapUtil.computeIfAbsent(MapUtil.java:42)
at org.apache.avro.specific.SpecificData.getClass(SpecificData.java:257)
at org.apache.avro.specific.SpecificData.getForSchema(SpecificData.java:164)
at 
org.apache.avro.specific.SpecificDatumWriter.<init>(SpecificDatumWriter.java:47)
at 
com.tesco.identity.auth.session.IdentificationResult.<clinit>(IdentificationResult.java:881)
... 8 more
 
If I use avro version 1.9 (which doesn't have MapUtil) my test works.
 
 
P.S - we are migrating our services(that uses kafka and avro schema) from 1.9 
to 1.11.4 as there has been a critical vulnerability reported in avro 
([https://security.snyk.io/vuln/SNYK-JAVA-ORGAPACHEAVRO-8161188]) , But we 
can't do it as avro 1.11.* fails for us due to above issue. 
 


> RecursiveUpdate error when calling 
> -----------------------------------
>
>                 Key: AVRO-4078
>                 URL: https://issues.apache.org/jira/browse/AVRO-4078
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.11.3
>         Environment: local testing using junit
>            Reporter: prashant sharma
>            Priority: Major
>
> I think there is an issue in avro versions (1.10+) onwards caused by MapUtil 
> class
> ([https://github.com/apache/avro/blob/main/lang/java/avro/src/main/java/org/apache/avro/util/MapUtil.java])
>  
> package com.tesco.identity.riskengine.blocking.ip
> import org.apache.avro.Schema
> import org.apache.avro.specific.SpecificData
> import spock.lang.Specification
> class DemoTest extends Specification {
> public static final Schema IDENTIFICATION_SCHEMA$ = (new 
> Schema.Parser()).parse("{\n" +
> " \"type\": \"record\",\n" +
> " \"namespace\": \"com.tesco.identity.auth.session\",\n" +
> " \"name\": \"IdentificationResult\",\n" +
> " \"fields\": [\n" +
> "
> {\n" + " \"name\": \"something\",\n" + " \"type\": \"string\"\n" + " }
> \n" +
> " ]\n" +
> "}");
> def "test class load"()
> { given: when: "specific data static method is called to load schema" 
> SpecificData.get().getClass(IDENTIFICATION_SCHEMA$) then: "no exception is 
> thrown" noExceptionThrown() }
> }
>  
> This is the stacktrace
>  
> Expected no exception to be thrown, but got 
> 'java.lang.ExceptionInInitializerError'
>  
> at spock.lang.Specification.noExceptionThrown(Specification.java:118)
> at com.tesco.identity.riskengine.blocking.ip.DemoTest.test class 
> load(DemoTest.groovy:39)
> Caused by: java.lang.ExceptionInInitializerError
> at java.base/java.lang.Class.forName(Class.java:398)
> at org.apache.avro.util.ClassUtils.forName(ClassUtils.java:95)
> at org.apache.avro.util.ClassUtils.forName(ClassUtils.java:72)
> at 
> org.apache.avro.specific.SpecificData.lambda$getClass$2(SpecificData.java:259)
> at 
> java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
> at org.apache.avro.util.MapUtil.computeIfAbsent(MapUtil.java:42)
> at org.apache.avro.specific.SpecificData.getClass(SpecificData.java:257)
> at com.tesco.identity.riskengine.blocking.ip.DemoTest.test class 
> load(DemoTest.groovy:36)
> Caused by: java.lang.IllegalStateException: Recursive update
> at 
> java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1760)
> at org.apache.avro.util.MapUtil.computeIfAbsent(MapUtil.java:42)
> at org.apache.avro.specific.SpecificData.getClass(SpecificData.java:257)
> at org.apache.avro.specific.SpecificData.getForSchema(SpecificData.java:164)
> at 
> org.apache.avro.specific.SpecificDatumWriter.<init>(SpecificDatumWriter.java:47)
> at 
> com.tesco.identity.auth.session.IdentificationResult.<clinit>(IdentificationResult.java:881)
> ... 8 more
>  
> If I use avro version 1.9 (which doesn't have MapUtil) my test works.
>  
>  
> P.S - we are migrating our services(that uses kafka and avro schema) from 1.9 
> to 1.11.4 as there has been a critical vulnerability reported in avro 
> ([https://security.snyk.io/vuln/SNYK-JAVA-ORGAPACHEAVRO-8161188]) , But we 
> can't do it as avro 1.11.* fails for us due to above issue. 
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to