ConcurrentModificationException happen for findAllById in arangodb-spring-data with concurrent workers

21 views Asked by At

When I try to build up an java app to retrieve data from ArangoDB based on ArangoDB-spring-data library, there was always an exception happen ConcurrentModificationException when calling SimpleArangoRepository.findAllById with concurrent workers, why? Does this meet expectations? Then what's the best practice to call the findAllById in a concurrent environment?

The detailed call process is as follows: //The goal is to find whether the given items are already existing in the database or not. and this check would be called by multiple workers with different IDs.

List existingTiles = new ArrayList<>();
tileRepo.findAllById(tileIds.stream().map(String::valueOf).toList()).forEach(existingTiles::add);

The call stack for the exception is as following:

java.util.ConcurrentModificationException
at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1229)
at com.arangodb.springframework.core.mapping.DefaultArangoPersistentEntity.findAnnotations(DefaultArangoPersistentEntity.java:269)
at com.arangodb.springframework.core.mapping.DefaultArangoPersistentEntity.getIndexes(DefaultArangoPersistentEntity.java:242)
at com.arangodb.springframework.core.mapping.DefaultArangoPersistentEntity.getPersistentIndexes(DefaultArangoPersistentEntity.java:210)
at com.arangodb.springframework.core.template.ArangoTemplate.ensureCollectionIndexes(ArangoTemplate.java:166)
at com.arangodb.springframework.core.template.ArangoTemplate._collection(ArangoTemplate.java:159)
at com.arangodb.springframework.core.template.ArangoTemplate._collection(ArangoTemplate.java:139)
at com.arangodb.springframework.core.template.ArangoTemplate._collection(ArangoTemplate.java:132)
at com.arangodb.springframework.core.template.ArangoTemplate.findAll(ArangoTemplate.java:484)
at com.arangodb.springframework.repository.SimpleArangoRepository.findAllById(SimpleArangoRepository.java:135)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
0

There are 0 answers