tom

Merge remote-tracking branch 'origin/master'

...@@ -30,6 +30,10 @@ public final class SimpleNettyClient { ...@@ -30,6 +30,10 @@ public final class SimpleNettyClient {
30 System.exit(0); 30 System.exit(0);
31 } 31 }
32 public static void startStandalone(String... args) throws Exception { 32 public static void startStandalone(String... args) throws Exception {
33 + String host = args.length > 0 ? args[0] : "localhost";
34 + int port = args.length > 1 ? Integer.parseInt(args[1]) : 8081;
35 + int warmup = args.length > 2 ? Integer.parseInt(args[2]) : 1000;
36 + int iterations = args.length > 3 ? Integer.parseInt(args[3]) : 50 * 100000;
33 NettyMessagingService messaging = new TestNettyMessagingService(9081); 37 NettyMessagingService messaging = new TestNettyMessagingService(9081);
34 MetricsManager metrics = new MetricsManager(); 38 MetricsManager metrics = new MetricsManager();
35 messaging.activate(); 39 messaging.activate();
...@@ -37,28 +41,26 @@ public final class SimpleNettyClient { ...@@ -37,28 +41,26 @@ public final class SimpleNettyClient {
37 MetricsFeature feature = new MetricsFeature("latency"); 41 MetricsFeature feature = new MetricsFeature("latency");
38 MetricsComponent component = metrics.registerComponent("NettyMessaging"); 42 MetricsComponent component = metrics.registerComponent("NettyMessaging");
39 43
40 - final int warmup = 10000;
41 for (int i = 0; i < warmup; i++) { 44 for (int i = 0; i < warmup; i++) {
42 - messaging.sendAsync(new Endpoint("localhost", 8081), "simple", "Hello World".getBytes()); 45 + messaging.sendAsync(new Endpoint(host, port), "simple", "Hello World".getBytes());
43 Response response = messaging 46 Response response = messaging
44 - .sendAndReceive(new Endpoint("localhost", 8081), "echo", 47 + .sendAndReceive(new Endpoint(host, port), "echo",
45 "Hello World".getBytes()); 48 "Hello World".getBytes());
46 } 49 }
47 50
48 Timer sendAsyncTimer = metrics.createTimer(component, feature, "AsyncSender"); 51 Timer sendAsyncTimer = metrics.createTimer(component, feature, "AsyncSender");
49 - Timer sendAndReceiveTimer = metrics.createTimer(component, feature, "SendAndReceive");
50 52
51 - final int iterations = 10000000;
52 for (int i = 0; i < iterations; i++) { 53 for (int i = 0; i < iterations; i++) {
53 Timer.Context context = sendAsyncTimer.time(); 54 Timer.Context context = sendAsyncTimer.time();
54 - messaging.sendAsync(new Endpoint("localhost", 8081), "simple", "Hello World".getBytes()); 55 + messaging.sendAsync(new Endpoint(host, port), "simple", "Hello World".getBytes());
55 context.stop(); 56 context.stop();
56 } 57 }
57 58
59 + Timer sendAndReceiveTimer = metrics.createTimer(component, feature, "SendAndReceive");
58 for (int i = 0; i < iterations; i++) { 60 for (int i = 0; i < iterations; i++) {
59 Timer.Context context = sendAndReceiveTimer.time(); 61 Timer.Context context = sendAndReceiveTimer.time();
60 Response response = messaging 62 Response response = messaging
61 - .sendAndReceive(new Endpoint("localhost", 8081), "echo", 63 + .sendAndReceive(new Endpoint(host, port), "echo",
62 "Hello World".getBytes()); 64 "Hello World".getBytes());
63 // System.out.println("Got back:" + new String(response.get(2, TimeUnit.SECONDS))); 65 // System.out.println("Got back:" + new String(response.get(2, TimeUnit.SECONDS)));
64 context.stop(); 66 context.stop();
......
...@@ -14,30 +14,26 @@ import org.onlab.onos.cli.AbstractShellCommand; ...@@ -14,30 +14,26 @@ import org.onlab.onos.cli.AbstractShellCommand;
14 public class SimpleNettyClientCommand extends AbstractShellCommand { 14 public class SimpleNettyClientCommand extends AbstractShellCommand {
15 15
16 //FIXME: replace these arguments with proper ones needed for the test. 16 //FIXME: replace these arguments with proper ones needed for the test.
17 - @Argument(index = 0, name = "serverIp", description = "Server IP address", 17 + @Argument(index = 0, name = "hostname", description = "Server Hostname",
18 required = false, multiValued = false) 18 required = false, multiValued = false)
19 - String serverIp = "127.0.0.1"; 19 + String host = "localhost";
20 20
21 - @Argument(index = 1, name = "workers", description = "IO workers", 21 + @Argument(index = 3, name = "port", description = "Port",
22 required = false, multiValued = false) 22 required = false, multiValued = false)
23 - String workers = "6"; 23 + String port = "8081";
24 24
25 - @Argument(index = 2, name = "messageCount", description = "Message count", 25 + @Argument(index = 1, name = "warmupCount", description = "Warm-up count",
26 - required = false, multiValued = false)
27 - String messageCount = "1000000";
28 -
29 - @Argument(index = 3, name = "messageLength", description = "Message length (bytes)",
30 required = false, multiValued = false) 26 required = false, multiValued = false)
31 - String messageLength = "128"; 27 + String warmup = "10000";
32 28
33 - @Argument(index = 4, name = "timeoutSecs", description = "Test timeout (seconds)", 29 + @Argument(index = 2, name = "messageCount", description = "Message count",
34 required = false, multiValued = false) 30 required = false, multiValued = false)
35 - String timeoutSecs = "60"; 31 + String messageCount = "5000000";
36 32
37 @Override 33 @Override
38 protected void execute() { 34 protected void execute() {
39 try { 35 try {
40 - startStandalone(new String[]{serverIp, workers, messageCount, messageLength, timeoutSecs}); 36 + startStandalone(new String[]{host, port, warmup, messageCount});
41 } catch (Exception e) { 37 } catch (Exception e) {
42 error("Unable to start client %s", e); 38 error("Unable to start client %s", e);
43 } 39 }
......
...@@ -42,6 +42,7 @@ import org.onlab.onos.store.common.impl.MastershipBasedTimestamp; ...@@ -42,6 +42,7 @@ import org.onlab.onos.store.common.impl.MastershipBasedTimestamp;
42 import org.onlab.onos.store.common.impl.Timestamped; 42 import org.onlab.onos.store.common.impl.Timestamped;
43 import org.onlab.onos.store.serializers.KryoPoolUtil; 43 import org.onlab.onos.store.serializers.KryoPoolUtil;
44 import org.onlab.onos.store.serializers.KryoSerializer; 44 import org.onlab.onos.store.serializers.KryoSerializer;
45 +import org.onlab.onos.store.serializers.MastershipBasedTimestampSerializer;
45 import org.onlab.util.KryoPool; 46 import org.onlab.util.KryoPool;
46 import org.onlab.util.NewConcurrentHashMap; 47 import org.onlab.util.NewConcurrentHashMap;
47 import org.slf4j.Logger; 48 import org.slf4j.Logger;
...@@ -117,11 +118,11 @@ public class GossipDeviceStore ...@@ -117,11 +118,11 @@ public class GossipDeviceStore
117 protected void setupKryoPool() { 118 protected void setupKryoPool() {
118 serializerPool = KryoPool.newBuilder() 119 serializerPool = KryoPool.newBuilder()
119 .register(KryoPoolUtil.API) 120 .register(KryoPoolUtil.API)
120 - .register(InternalDeviceEvent.class) 121 + .register(InternalDeviceEvent.class, new InternalDeviceEventSerializer())
121 - .register(InternalPortEvent.class) 122 + .register(InternalPortEvent.class, new InternalPortEventSerializer())
122 - .register(InternalPortStatusEvent.class) 123 + .register(InternalPortStatusEvent.class, new InternalPortStatusEventSerializer())
123 .register(Timestamped.class) 124 .register(Timestamped.class)
124 - .register(MastershipBasedTimestamp.class) 125 + .register(MastershipBasedTimestamp.class, new MastershipBasedTimestampSerializer())
125 .build() 126 .build()
126 .populate(1); 127 .populate(1);
127 } 128 }
......
1 +package org.onlab.onos.store.device.impl;
2 +
3 +import org.onlab.onos.net.DeviceId;
4 +import org.onlab.onos.net.device.DeviceDescription;
5 +import org.onlab.onos.net.provider.ProviderId;
6 +import org.onlab.onos.store.common.impl.Timestamped;
7 +
8 +import com.esotericsoftware.kryo.Kryo;
9 +import com.esotericsoftware.kryo.Serializer;
10 +import com.esotericsoftware.kryo.io.Input;
11 +import com.esotericsoftware.kryo.io.Output;
12 +
13 +/**
14 + * Kryo Serializer for {@link InternalDeviceEvent}.
15 + */
16 +public class InternalDeviceEventSerializer extends Serializer<InternalDeviceEvent> {
17 +
18 + /**
19 + * Creates a serializer for {@link InternalDeviceEvent}.
20 + */
21 + public InternalDeviceEventSerializer() {
22 + // does not accept null
23 + super(false);
24 + }
25 +
26 + @Override
27 + public void write(Kryo kryo, Output output, InternalDeviceEvent event) {
28 + kryo.writeClassAndObject(output, event.providerId());
29 + kryo.writeClassAndObject(output, event.deviceId());
30 + kryo.writeClassAndObject(output, event.deviceDescription());
31 + }
32 +
33 + @Override
34 + public InternalDeviceEvent read(Kryo kryo, Input input,
35 + Class<InternalDeviceEvent> type) {
36 + ProviderId providerId = (ProviderId) kryo.readClassAndObject(input);
37 + DeviceId deviceId = (DeviceId) kryo.readClassAndObject(input);
38 + Timestamped<DeviceDescription> deviceDescription = (Timestamped<DeviceDescription>) kryo.readClassAndObject(input);
39 +
40 + return new InternalDeviceEvent(providerId, deviceId, deviceDescription);
41 + }
42 +}
1 +package org.onlab.onos.store.device.impl;
2 +
3 +import java.util.List;
4 +
5 +import org.onlab.onos.net.DeviceId;
6 +import org.onlab.onos.net.device.DeviceDescription;
7 +import org.onlab.onos.net.device.PortDescription;
8 +import org.onlab.onos.net.provider.ProviderId;
9 +import org.onlab.onos.store.common.impl.Timestamped;
10 +
11 +import com.esotericsoftware.kryo.Kryo;
12 +import com.esotericsoftware.kryo.Serializer;
13 +import com.esotericsoftware.kryo.io.Input;
14 +import com.esotericsoftware.kryo.io.Output;
15 +
16 +/**
17 + * Kryo Serializer for {@link InternalPortEvent}.
18 + */
19 +public class InternalPortEventSerializer extends Serializer<InternalPortEvent> {
20 +
21 + /**
22 + * Creates a serializer for {@link InternalPortEvent}.
23 + */
24 + public InternalPortEventSerializer() {
25 + // does not accept null
26 + super(false);
27 + }
28 +
29 + @Override
30 + public void write(Kryo kryo, Output output, InternalPortEvent event) {
31 + kryo.writeClassAndObject(output, event.providerId());
32 + kryo.writeClassAndObject(output, event.deviceId());
33 + kryo.writeClassAndObject(output, event.portDescriptions());
34 + }
35 +
36 + @Override
37 + public InternalPortEvent read(Kryo kryo, Input input,
38 + Class<InternalPortEvent> type) {
39 + ProviderId providerId = (ProviderId) kryo.readClassAndObject(input);
40 + DeviceId deviceId = (DeviceId) kryo.readClassAndObject(input);
41 + Timestamped<List<PortDescription>> portDescriptions = (Timestamped<List<PortDescription>>) kryo.readClassAndObject(input);
42 +
43 + return new InternalPortEvent(providerId, deviceId, portDescriptions);
44 + }
45 +}
1 +package org.onlab.onos.store.device.impl;
2 +
3 +import org.onlab.onos.net.DeviceId;
4 +import org.onlab.onos.net.device.PortDescription;
5 +import org.onlab.onos.net.provider.ProviderId;
6 +import org.onlab.onos.store.common.impl.Timestamped;
7 +
8 +import com.esotericsoftware.kryo.Kryo;
9 +import com.esotericsoftware.kryo.Serializer;
10 +import com.esotericsoftware.kryo.io.Input;
11 +import com.esotericsoftware.kryo.io.Output;
12 +
13 +/**
14 + * Kryo Serializer for {@link InternalPortStatusEvent}.
15 + */
16 +public class InternalPortStatusEventSerializer extends Serializer<InternalPortStatusEvent> {
17 +
18 + /**
19 + * Creates a serializer for {@link InternalPortStatusEvent}.
20 + */
21 + public InternalPortStatusEventSerializer() {
22 + // does not accept null
23 + super(false);
24 + }
25 +
26 + @Override
27 + public void write(Kryo kryo, Output output, InternalPortStatusEvent event) {
28 + kryo.writeClassAndObject(output, event.providerId());
29 + kryo.writeClassAndObject(output, event.deviceId());
30 + kryo.writeClassAndObject(output, event.portDescription());
31 + }
32 +
33 + @Override
34 + public InternalPortStatusEvent read(Kryo kryo, Input input,
35 + Class<InternalPortStatusEvent> type) {
36 + ProviderId providerId = (ProviderId) kryo.readClassAndObject(input);
37 + DeviceId deviceId = (DeviceId) kryo.readClassAndObject(input);
38 + Timestamped<PortDescription> portDescription = (Timestamped<PortDescription>) kryo.readClassAndObject(input);
39 +
40 + return new InternalPortStatusEvent(providerId, deviceId, portDescription);
41 + }
42 +}