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)