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() {