This is an automated email from the ASF dual-hosted git repository.

heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git


The following commit(s) were added to refs/heads/master by this push:
     new e9e4852f0c catch and recover on rare CME
e9e4852f0c is described below

commit e9e4852f0cd36383815baff1e6b3c620ff265835
Author: Alex Heneveld <[email protected]>
AuthorDate: Tue Jun 4 00:23:39 2024 +0100

    catch and recover on rare CME
---
 .../util/core/task/CrossTaskThreadLocalStack.java       | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git 
a/core/src/main/java/org/apache/brooklyn/util/core/task/CrossTaskThreadLocalStack.java
 
b/core/src/main/java/org/apache/brooklyn/util/core/task/CrossTaskThreadLocalStack.java
index 8421395d73..c83b6f967b 100644
--- 
a/core/src/main/java/org/apache/brooklyn/util/core/task/CrossTaskThreadLocalStack.java
+++ 
b/core/src/main/java/org/apache/brooklyn/util/core/task/CrossTaskThreadLocalStack.java
@@ -19,15 +19,20 @@
 package org.apache.brooklyn.util.core.task;
 
 import java.util.Collection;
+import java.util.ConcurrentModificationException;
 import java.util.WeakHashMap;
 import java.util.stream.Stream;
 
 import com.google.common.collect.Streams;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.util.collections.ThreadLocalStack;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class CrossTaskThreadLocalStack<T> extends ThreadLocalStack<T> {
 
+    private static final Logger log = 
LoggerFactory.getLogger(CrossTaskThreadLocalStack.class);
+
     public CrossTaskThreadLocalStack(boolean acceptDuplicates) {
         super(acceptDuplicates);
     }
@@ -52,7 +57,17 @@ public class CrossTaskThreadLocalStack<T> extends 
ThreadLocalStack<T> {
         return getCopyReversed(Thread.currentThread());
     }
     protected Collection<T> getCopyReversed(Thread t) {
-        synchronized (backingOverride) { return copyReversed(get(t)); }
+        int retries = 0;
+        while (true) {
+            try {
+                synchronized (backingOverride) {return copyReversed(get(t));}
+            } catch (ConcurrentModificationException cme) {
+                // can happen as the collections within the map are not 
synchronized. simply retry.
+                // unusual if it loops
+                if (retries++ >= 10) throw cme;
+                log.debug("CME checking cross-thread local stack; retrying (#" 
+ retries + "): " + cme);
+            }
+        }
     }
 
     public Stream<T> stream() {

Reply via email to