This is an automated email from the ASF dual-hosted git repository.
dazeydev pushed a commit to branch 2.2.x
in repository https://gitbox.apache.org/repos/asf/openjpa.git
The following commit(s) were added to refs/heads/2.2.x by this push:
new a68a0f1 ConcurrentModificationException window when
MetaDataRepository cache updated
a68a0f1 is described below
commit a68a0f1d6884201b8f12e3f021154ec46694882f
Author: Will Dazey <[email protected]>
AuthorDate: Thu Oct 24 11:40:24 2019 -0500
ConcurrentModificationException window when MetaDataRepository cache updated
Signed-off-by: Will Dazey <[email protected]>
---
.../org/apache/openjpa/meta/MetaDataRepository.java | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git
a/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
b/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
index 3c1884f..6dcb8de 100644
---
a/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
+++
b/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataRepository.java
@@ -1629,14 +1629,21 @@ public class MetaDataRepository implements
PCRegistry.RegisterClassListener, Con
* before other threads attempt to call this method
*/
synchronized Class<?>[] processRegisteredClasses(ClassLoader envLoader) {
- if (_registered.isEmpty()) {
- return EMPTY_CLASSES;
- }
- // copy into new collection to avoid concurrent mod errors on reentrant
- // registrations
- Class<?>[] reg = _registered.toArray(new Class[_registered.size()]);
- _registered.clear();
+ Class<?>[] reg;
+ /*Synchronize `_registered` cache to block
MetaDataRepository.register() from adding
+ * to the cache while we copy, causing a
ConcurrentModificationException
+ */
+ synchronized (_registered) {
+ if (_registered.isEmpty()) {
+ return EMPTY_CLASSES;
+ }
+
+ // copy into new collection to avoid concurrent mod errors on
reentrant
+ // registrations
+ reg = _registered.toArray(new Class[_registered.size()]);
+ _registered.clear();
+ }
Collection<String> pcNames = getPersistentTypeNames(false, envLoader);
Collection<Class<?>> failed = null;