Conditionally update Cache
Change-Id: I97b4e537c15110b8962d585421cd4f4a14a82841
diff --git a/core/store/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java b/core/store/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java
index d73dd9e..71cb5b1 100644
--- a/core/store/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java
+++ b/core/store/src/main/java/org/onlab/onos/store/device/impl/DistributedDeviceStore.java
@@ -73,6 +73,7 @@
private IMap<byte[], byte[]> rawDevicePorts;
private LoadingCache<DeviceId, Optional<Map<PortNumber, Port>>> devicePorts;
+ @Override
@Activate
public void activate() {
super.activate();
@@ -361,5 +362,4 @@
}
// TODO cache serialized DeviceID if we suffer from serialization cost
-
}
diff --git a/core/store/src/main/java/org/onlab/onos/store/impl/AbstractDistributedStore.java b/core/store/src/main/java/org/onlab/onos/store/impl/AbstractDistributedStore.java
index bca585d..2d0fb07 100644
--- a/core/store/src/main/java/org/onlab/onos/store/impl/AbstractDistributedStore.java
+++ b/core/store/src/main/java/org/onlab/onos/store/impl/AbstractDistributedStore.java
@@ -6,6 +6,7 @@
import com.hazelcast.core.EntryEvent;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.MapEvent;
+
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
@@ -86,8 +87,12 @@
@Override
public void entryUpdated(EntryEvent<byte[], byte[]> event) {
- cache.put(storeService.<K>deserialize(event.getKey()),
- Optional.of(storeService.<V>deserialize(event.getValue())));
+ K key = storeService.<K>deserialize(event.getKey());
+ final V oldVal = storeService.<V>deserialize(event.getOldValue());
+ Optional<V> oldValue = Optional.fromNullable(oldVal);
+ final V newVal = storeService.<V>deserialize(event.getValue());
+ Optional<V> newValue = Optional.of(newVal);
+ cache.asMap().replace(key, oldValue, newValue);
}
@Override
@@ -97,7 +102,10 @@
@Override
public void entryAdded(EntryEvent<byte[], byte[]> event) {
- entryUpdated(event);
+ K key = storeService.<K>deserialize(event.getKey());
+ final V newVal = storeService.<V>deserialize(event.getValue());
+ Optional<V> newValue = Optional.of(newVal);
+ cache.asMap().putIfAbsent(key, newValue);
}
}