diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapState.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapState.java
index 48fd4a2..4ed3a72 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapState.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapState.java
@@ -259,36 +259,41 @@
      * @return update result
      */
     protected MapEntryUpdateResult<String, byte[]> updateAndGet(Commit<? extends UpdateAndGet> commit) {
-        MapEntryUpdateResult.Status updateStatus = validate(commit.operation());
-        String key = commit.operation().key();
-        MapEntryValue oldCommitValue = mapEntries.get(commit.operation().key());
-        Versioned<byte[]> oldMapValue = toVersioned(oldCommitValue);
+        try {
+            MapEntryUpdateResult.Status updateStatus = validate(commit.operation());
+            String key = commit.operation().key();
+            MapEntryValue oldCommitValue = mapEntries.get(commit.operation().key());
+            Versioned<byte[]> oldMapValue = toVersioned(oldCommitValue);
 
-        if (updateStatus != MapEntryUpdateResult.Status.OK) {
-            commit.close();
-            return new MapEntryUpdateResult<>(updateStatus, "", key,
-                    oldMapValue, oldMapValue);
-        }
+            if (updateStatus != MapEntryUpdateResult.Status.OK) {
+                commit.close();
+                return new MapEntryUpdateResult<>(updateStatus, "", key,
+                        oldMapValue, oldMapValue);
+            }
 
-        byte[] newValue = commit.operation().value();
-        long newVersion = versionCounter.incrementAndGet();
-        Versioned<byte[]> newMapValue = newValue == null ? null
-                : new Versioned<>(newValue, newVersion);
+            byte[] newValue = commit.operation().value();
+            long newVersion = versionCounter.incrementAndGet();
+            Versioned<byte[]> newMapValue = newValue == null ? null
+                    : new Versioned<>(newValue, newVersion);
 
-        MapEvent.Type updateType = newValue == null ? REMOVE
-                : oldCommitValue == null ? INSERT : UPDATE;
-        if (updateType == REMOVE || updateType == UPDATE) {
-            mapEntries.remove(key);
-            oldCommitValue.discard();
+            MapEvent.Type updateType = newValue == null ? REMOVE
+                    : oldCommitValue == null ? INSERT : UPDATE;
+            if (updateType == REMOVE || updateType == UPDATE) {
+                mapEntries.remove(key);
+                oldCommitValue.discard();
+            }
+            if (updateType == INSERT || updateType == UPDATE) {
+                mapEntries.put(key, new NonTransactionalCommit(newVersion, commit));
+            } else {
+                commit.close();
+            }
+            publish(Lists.newArrayList(new MapEvent<>("", key, newMapValue, oldMapValue)));
+            return new MapEntryUpdateResult<>(updateStatus, "", key, oldMapValue,
+                    newMapValue);
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         }
-        if (updateType == INSERT || updateType == UPDATE) {
-            mapEntries.put(key, new NonTransactionalCommit(newVersion, commit));
-        } else {
-            commit.close();
-        }
-        publish(Lists.newArrayList(new MapEvent<>("", key, newMapValue, oldMapValue)));
-        return new MapEntryUpdateResult<>(updateStatus, "", key, oldMapValue,
-                newMapValue);
     }
 
     /**
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorState.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorState.java
index 6281672..33414e7 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorState.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixLeaderElectorState.java
@@ -60,6 +60,7 @@
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
+import com.google.common.base.Throwables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
@@ -172,6 +173,9 @@
                 notifyLeadershipChange(oldLeadership, newLeadership);
             }
             return newLeadership;
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         } finally {
             commit.close();
         }
@@ -191,6 +195,9 @@
             if (!Objects.equal(oldLeadership, newLeadership)) {
                 notifyLeadershipChange(oldLeadership, newLeadership);
             }
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         } finally {
             commit.close();
         }
@@ -215,6 +222,9 @@
             return (electionState != null &&
                     electionState.leader() != null &&
                     commit.operation().nodeId().equals(electionState.leader().nodeId()));
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         } finally {
             commit.close();
         }
@@ -239,6 +249,9 @@
                 notifyLeadershipChange(oldLeadership, newLeadership);
             }
             return true;
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         } finally {
             commit.close();
         }
@@ -262,6 +275,9 @@
                 }
             });
             notifyLeadershipChanges(changes);
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         } finally {
             commit.close();
         }
@@ -276,6 +292,9 @@
         String topic = commit.operation().topic();
         try {
             return leadership(topic);
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         } finally {
             commit.close();
         }
@@ -293,6 +312,9 @@
                 Leader leader = leadership(e.getKey()).leader();
                 return leader != null && leader.nodeId().equals(nodeId);
             }).keySet());
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         } finally {
             commit.close();
         }
@@ -308,6 +330,9 @@
         try {
             result.putAll(Maps.transformEntries(elections, (k, v) -> leadership(k)));
             return result;
+        } catch (Exception e) {
+            log.error("State machine operation failed", e);
+            throw Throwables.propagate(e);
         } finally {
             commit.close();
         }
