From 62a66fc99b79a2a6468bc5451a91f32eb0daaeea Mon Sep 17 00:00:00 2001 From: Eran Levy Date: Wed, 3 Jan 2018 15:26:13 +0200 Subject: [PATCH 1/2] fix ConcurrentModificationException caused by changing set during iteration --- .../java/org/apache/openjpa/kernel/BrokerImpl.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java index 27e2161ebc..cec760564e 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java @@ -2149,8 +2149,16 @@ protected void flush(int reason) { // dependents _flags |= FLAG_DEREFDELETING; if (flush && _derefCache != null && !_derefCache.isEmpty()) { - for (Iterator itr = _derefCache.iterator(); itr.hasNext();) - deleteDeref(itr.next()); + Set statesMarkedForDelete = new HashSet<>(); + // mark for delete all elements in deref, otherwise in some situations it + // throws ConcurrentModificationException + statesMarkedForDelete.addAll(_derefCache); + if(statesMarkedForDelete.size()>0) { + for (StateManagerImpl state: statesMarkedForDelete) { + deleteDeref(state); + } + } + flushAdditions(transactional, reason); } From 4c9e52dcea9698529c8eec333dffcb8e08a644f0 Mon Sep 17 00:00:00 2001 From: Eran Levy Date: Wed, 3 Jan 2018 17:32:53 +0200 Subject: [PATCH 2/2] remove unnecessary if statement --- .../main/java/org/apache/openjpa/kernel/BrokerImpl.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java index cec760564e..e429fce18f 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java @@ -2153,12 +2153,10 @@ protected void flush(int reason) { // mark for delete all elements in deref, otherwise in some situations it // throws ConcurrentModificationException statesMarkedForDelete.addAll(_derefCache); - if(statesMarkedForDelete.size()>0) { - for (StateManagerImpl state: statesMarkedForDelete) { - deleteDeref(state); - } + for (StateManagerImpl state: statesMarkedForDelete) { + deleteDeref(state); } - + flushAdditions(transactional, reason); }