Closed
Description
MyeongHyeonLee opened DATACMNS-1735 and commented
Occasionally ConcurrentModificationException occurs.
Caused by: java.util.ConcurrentModificationException: nullCaused by: java.util.ConcurrentModificationException: null at java.base/java.util.ArrayList.sort(ArrayList.java:1751) at org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(AnnotationAwareOrderComparator.java:111) at org.springframework.data.mapping.callback.EntityCallbackDiscoverer$CallbackRetriever.getEntityCallbacks(EntityCallbackDiscoverer.java:388) at org.springframework.data.mapping.callback.EntityCallbackDiscoverer.getEntityCallbacks(EntityCallbackDiscoverer.java:142) at org.springframework.data.mapping.callback.DefaultEntityCallbacks.callback(DefaultEntityCallbacks.java:83) at org.springframework.data.jdbc.core.JdbcAggregateTemplate.triggerBeforeSave(JdbcAggregateTemplate.java:414) at org.springframework.data.jdbc.core.JdbcAggregateTemplate.store(JdbcAggregateTemplate.java:335) at org.springframework.data.jdbc.core.JdbcAggregateTemplate.update(JdbcAggregateTemplate.java:183)
In a concurrency situation, I think it's a clear() and sort() conflict below.
if (cachedEntityCallbacks.size() != entityCallbacks.size()) {
cachedEntityCallbacks.clear();
cachedEntityCallbacks.addAll(entityCallbacks);
AnnotationAwareOrderComparator.sort(cachedEntityCallbacks);
}
It seems necessary to defend against concurrency situations.
Affects: 2.3 GA (Neumann)
Referenced from: pull request #446
Backported to: 2.3.1 (Neumann SR1)