prashant sharma created AVRO-4078:
-------------------------------------

             Summary: RecursiveUpdate error when calling 
                 Key: AVRO-4078
                 URL: https://issues.apache.org/jira/browse/AVRO-4078
             Project: Apache Avro
          Issue Type: Bug
    Affects Versions: 1.11.3
         Environment: local testing using junit
            Reporter: prashant sharma


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. 
 



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

Reply via email to