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();
+                        }
                     }
                 }
             }