mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-17 02:11:38 +02:00
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:
parent
84229f7a4a
commit
593acf90c8
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user