Correctly persists the old value in TestConsistentMap by deep cloning the entry

In addition, inject TestApplicationId into DistributedMeterStore serializer when running MeterManagerTest

Change-Id: I8dcb4b2953a8d7e0fa1e5d765c859cde31d7633b
This commit is contained in:
Charles Chan 2017-11-22 13:55:41 -08:00 committed by Charles Chan
parent 84229f7a4a
commit 593acf90c8
4 changed files with 44 additions and 14 deletions

View File

@ -42,11 +42,13 @@ public final class TestConsistentMap<K, V> extends ConsistentMapAdapter<K, V> {
private final Map<K, Versioned<V>> map; private final Map<K, Versioned<V>> map;
private final String mapName; private final String mapName;
private final AtomicLong counter = new AtomicLong(0); private final AtomicLong counter = new AtomicLong(0);
private final Serializer serializer;
private TestConsistentMap(String mapName) { private TestConsistentMap(String mapName, Serializer serializer) {
map = new HashMap<>(); map = new HashMap<>();
listeners = new LinkedList<>(); listeners = new LinkedList<>();
this.mapName = mapName; this.mapName = mapName;
this.serializer = serializer;
} }
private Versioned<V> version(V v) { private Versioned<V> version(V v) {
@ -111,7 +113,7 @@ public final class TestConsistentMap<K, V> extends ConsistentMapAdapter<K, V> {
AtomicReference<Versioned<V>> previousValue = new AtomicReference<>(); AtomicReference<Versioned<V>> previousValue = new AtomicReference<>();
Versioned<V> result = map.compute(key, (k, v) -> { Versioned<V> result = map.compute(key, (k, v) -> {
updated.set(true); updated.set(true);
previousValue.set(v); previousValue.set(serializer.decode(serializer.encode(v)));
return version(remappingFunction.apply(k, Versioned.valueOrNull(v))); return version(remappingFunction.apply(k, Versioned.valueOrNull(v)));
}); });
if (updated.get()) { if (updated.get()) {
@ -127,7 +129,7 @@ public final class TestConsistentMap<K, V> extends ConsistentMapAdapter<K, V> {
Versioned<V> result = map.compute(key, (k, v) -> { Versioned<V> result = map.compute(key, (k, v) -> {
if (v != null) { if (v != null) {
updated.set(true); updated.set(true);
previousValue.set(v); previousValue.set(serializer.decode(serializer.encode(v)));
return version(remappingFunction.apply(k, v.value())); return version(remappingFunction.apply(k, v.value()));
} }
return v; return v;
@ -145,7 +147,7 @@ public final class TestConsistentMap<K, V> extends ConsistentMapAdapter<K, V> {
AtomicReference<Versioned<V>> previousValue = new AtomicReference<>(); AtomicReference<Versioned<V>> previousValue = new AtomicReference<>();
Versioned<V> result = map.compute(key, (k, v) -> { Versioned<V> result = map.compute(key, (k, v) -> {
if (condition.test(Versioned.valueOrNull(v))) { if (condition.test(Versioned.valueOrNull(v))) {
previousValue.set(v); previousValue.set(serializer.decode(serializer.encode(v)));
updated.set(true); updated.set(true);
return version(remappingFunction.apply(k, Versioned.valueOrNull(v))); return version(remappingFunction.apply(k, Versioned.valueOrNull(v)));
} }
@ -296,7 +298,7 @@ public final class TestConsistentMap<K, V> extends ConsistentMapAdapter<K, V> {
@Override @Override
public ConsistentMap<K, V> build() { public ConsistentMap<K, V> build() {
return new TestConsistentMap<>(name()); return new TestConsistentMap<>(name(), serializer());
} }
@Override @Override

View File

@ -17,6 +17,7 @@ package org.onosproject.net.meter.impl;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@ -24,6 +25,8 @@ import org.junit.Test;
import org.onlab.junit.TestTools; import org.onlab.junit.TestTools;
import org.onlab.junit.TestUtils; import org.onlab.junit.TestUtils;
import org.onlab.packet.IpAddress; import org.onlab.packet.IpAddress;
import org.onlab.util.KryoNamespace;
import org.onosproject.TestApplicationId;
import org.onosproject.cfg.ComponentConfigAdapter; import org.onosproject.cfg.ComponentConfigAdapter;
import org.onosproject.cluster.ClusterServiceAdapter; import org.onosproject.cluster.ClusterServiceAdapter;
import org.onosproject.cluster.ControllerNode; import org.onosproject.cluster.ControllerNode;
@ -65,6 +68,7 @@ import org.onosproject.net.meter.MeterService;
import org.onosproject.net.meter.MeterState; import org.onosproject.net.meter.MeterState;
import org.onosproject.net.provider.AbstractProvider; import org.onosproject.net.provider.AbstractProvider;
import org.onosproject.net.provider.ProviderId; import org.onosproject.net.provider.ProviderId;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.TestStorageService; import org.onosproject.store.service.TestStorageService;
import java.util.Collections; import java.util.Collections;
@ -224,6 +228,13 @@ public class MeterManagerTest {
TestUtils.setField(meterStore, "clusterService", new TestClusterService()); TestUtils.setField(meterStore, "clusterService", new TestClusterService());
TestUtils.setField(meterStore, "mastershipService", new TestMastershipService()); TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
TestUtils.setField(meterStore, "driverService", driverService); TestUtils.setField(meterStore, "driverService", driverService);
// Inject TestApplicationId into the DistributedMeterStore serializer
KryoNamespace.Builder testKryoBuilder = TestUtils.getField(meterStore, "APP_KRYO_BUILDER");
testKryoBuilder.register(TestApplicationId.class);
Serializer testSerializer = Serializer.using(Lists.newArrayList(testKryoBuilder.build()));
TestUtils.setField(meterStore, "serializer", testSerializer);
// Activate the store // Activate the store
meterStore.activate(); meterStore.activate();
// Init step for the manager // Init step for the manager

View File

@ -16,6 +16,7 @@
package org.onosproject.incubator.store.meter.impl; package org.onosproject.incubator.store.meter.impl;
import com.google.common.collect.Collections2; import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.apache.commons.lang.math.RandomUtils; import org.apache.commons.lang.math.RandomUtils;
@ -25,6 +26,7 @@ import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service; import org.apache.felix.scr.annotations.Service;
import org.onlab.util.KryoNamespace;
import org.onosproject.cluster.ClusterService; import org.onosproject.cluster.ClusterService;
import org.onosproject.cluster.NodeId; import org.onosproject.cluster.NodeId;
import org.onosproject.mastership.MastershipService; import org.onosproject.mastership.MastershipService;
@ -90,6 +92,18 @@ public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreD
private static final String AVAILABLEMETERIDSTORE = "onos-meters-available-store"; private static final String AVAILABLEMETERIDSTORE = "onos-meters-available-store";
private static final String METERIDSTORE = "onos-meters-id-store"; private static final String METERIDSTORE = "onos-meters-id-store";
private static final KryoNamespace.Builder APP_KRYO_BUILDER = KryoNamespace.newBuilder()
.register(KryoNamespaces.API)
.register(MeterKey.class)
.register(MeterData.class)
.register(DefaultMeter.class)
.register(DefaultBand.class)
.register(Band.Type.class)
.register(MeterState.class)
.register(Meter.Unit.class);
private Serializer serializer = Serializer.using(Lists.newArrayList(APP_KRYO_BUILDER.build()));
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
private StorageService storageService; private StorageService storageService;
@ -140,15 +154,7 @@ public class DistributedMeterStore extends AbstractStore<MeterEvent, MeterStoreD
meters = storageService.<MeterKey, MeterData>consistentMapBuilder() meters = storageService.<MeterKey, MeterData>consistentMapBuilder()
.withName(METERSTORE) .withName(METERSTORE)
.withSerializer(Serializer.using(KryoNamespaces.API, .withSerializer(serializer).build();
MeterKey.class,
MeterData.class,
DefaultMeter.class,
DefaultBand.class,
Band.Type.class,
MeterState.class,
Meter.Unit.class,
MeterFailReason.class)).build();
meters.addListener(mapListener); meters.addListener(mapListener);

View File

@ -16,12 +16,15 @@
package org.onosproject.incubator.store.meter.impl; package org.onosproject.incubator.store.meter.impl;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.onlab.junit.TestUtils; import org.onlab.junit.TestUtils;
import org.onlab.packet.IpAddress; import org.onlab.packet.IpAddress;
import org.onlab.util.KryoNamespace;
import org.onosproject.TestApplicationId;
import org.onosproject.cluster.ClusterServiceAdapter; import org.onosproject.cluster.ClusterServiceAdapter;
import org.onosproject.cluster.ControllerNode; import org.onosproject.cluster.ControllerNode;
import org.onosproject.cluster.DefaultControllerNode; import org.onosproject.cluster.DefaultControllerNode;
@ -44,6 +47,7 @@ import org.onosproject.net.meter.MeterFeaturesKey;
import org.onosproject.net.meter.MeterId; import org.onosproject.net.meter.MeterId;
import org.onosproject.net.meter.MeterKey; import org.onosproject.net.meter.MeterKey;
import org.onosproject.net.meter.MeterState; import org.onosproject.net.meter.MeterState;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.TestStorageService; import org.onosproject.store.service.TestStorageService;
import java.util.Collections; import java.util.Collections;
@ -125,6 +129,13 @@ public class DistributedMeterStoreTest {
TestUtils.setField(meterStore, "clusterService", new TestClusterService()); TestUtils.setField(meterStore, "clusterService", new TestClusterService());
TestUtils.setField(meterStore, "mastershipService", new TestMastershipService()); TestUtils.setField(meterStore, "mastershipService", new TestMastershipService());
TestUtils.setField(meterStore, "driverService", new TestDriverService()); TestUtils.setField(meterStore, "driverService", new TestDriverService());
// Inject TestApplicationId into the DistributedMeterStore serializer
KryoNamespace.Builder testKryoBuilder = TestUtils.getField(meterStore, "APP_KRYO_BUILDER");
testKryoBuilder.register(TestApplicationId.class);
Serializer testSerializer = Serializer.using(Lists.newArrayList(testKryoBuilder.build()));
TestUtils.setField(meterStore, "serializer", testSerializer);
// Activate the store // Activate the store
meterStore.activate(); meterStore.activate();
} }