You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@avro.apache.org by "prashant sharma (Jira)" <ji...@apache.org> on 2024/10/15 17:11:00 UTC

[jira] [Updated] (AVRO-4078) RecursiveUpdate error when calling

     [ 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)