Workaround for ONOS-1198
- check before unlocking to avoid Exception
- mark field referenced from multiple threads
Change-Id: I4da8450811aa69b9cc02a5e24178e7293d056aea
diff --git a/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/HazelcastLeadershipService.java b/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/HazelcastLeadershipService.java
index ef651cb..f75cd48 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/HazelcastLeadershipService.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/HazelcastLeadershipService.java
@@ -18,6 +18,7 @@
import com.google.common.collect.Maps;
import com.hazelcast.config.TopicConfig;
import com.hazelcast.core.IAtomicLong;
+import com.hazelcast.core.ILock;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
@@ -50,7 +51,6 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-import java.util.concurrent.locks.Lock;
import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkArgument;
@@ -247,8 +247,8 @@
// higher if the mastership has changed any times.
private long myLastLeaderTerm = NO_TERM;
- private NodeId leader;
- private Lock leaderLock;
+ private volatile NodeId leader;
+ private ILock leaderLock;
private Future<?> getLockFuture;
private Future<?> periodicProcessingFuture;
@@ -427,6 +427,8 @@
long delta = System.currentTimeMillis() -
lastLeadershipUpdateMs;
if (delta > LEADERSHIP_REMOTE_TIMEOUT_MS) {
+ log.debug("Topic {} leader {} booted due to heartbeat timeout",
+ topicName, leader);
leadershipEvent = new LeadershipEvent(
LeadershipEvent.Type.LEADER_BOOTED,
new Leadership(topicName, leader, myLastLeaderTerm));
@@ -519,7 +521,9 @@
clusterService.getLocalNode().id(),
LEADERSHIP_EVENT_MESSAGE_SUBJECT,
SERIALIZER.encode(leadershipEvent)));
- leaderLock.unlock();
+ if (leaderLock.isLockedByCurrentThread()) {
+ leaderLock.unlock();
+ }
}
}
}