ConcurrentModificationException window when MetaDataRepository cache updated
Signed-off-by: Will Dazey <dazeydev.3@gmail.com>
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 c1c0ca7..94c1fb6 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
@@ -1648,14 +1648,21 @@
* 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;