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)