Showing
6 changed files
with
69 additions
and
16 deletions
... | @@ -298,7 +298,7 @@ public class IOLoopTestClient { | ... | @@ -298,7 +298,7 @@ public class IOLoopTestClient { |
298 | List<TestMessage> batch = Lists.newArrayListWithCapacity(size); | 298 | List<TestMessage> batch = Lists.newArrayListWithCapacity(size); |
299 | for (int i = 0; i < size; i++) { | 299 | for (int i = 0; i < size; i++) { |
300 | batch.add(new TestMessage(msgLength, currentTimeMillis(), 0, | 300 | batch.add(new TestMessage(msgLength, currentTimeMillis(), 0, |
301 | - this.stream.padding(msgLength))); | 301 | + stream.padding())); |
302 | } | 302 | } |
303 | acquire(size); | 303 | acquire(size); |
304 | stream.write(batch); | 304 | stream.write(batch); | ... | ... |
... | @@ -85,10 +85,12 @@ public class IOLoopTestServer { | ... | @@ -85,10 +85,12 @@ public class IOLoopTestServer { |
85 | IOLoopTestServer server = new IOLoopTestServer(ip, wc, ml, PORT); | 85 | IOLoopTestServer server = new IOLoopTestServer(ip, wc, ml, PORT); |
86 | server.start(); | 86 | server.start(); |
87 | 87 | ||
88 | - // Start pruning clients. | 88 | + // Start pruning clients and keep going until their number goes to 0. |
89 | - while (true) { | 89 | + int remaining = -1; |
90 | + while (remaining == -1 || remaining > 0) { | ||
90 | delay(PRUNE_FREQUENCY); | 91 | delay(PRUNE_FREQUENCY); |
91 | - server.prune(); | 92 | + int r = server.prune(); |
93 | + remaining = remaining == -1 && r == 0 ? remaining : r; | ||
92 | } | 94 | } |
93 | } | 95 | } |
94 | 96 | ||
... | @@ -161,11 +163,15 @@ public class IOLoopTestServer { | ... | @@ -161,11 +163,15 @@ public class IOLoopTestServer { |
161 | 163 | ||
162 | /** | 164 | /** |
163 | * Prunes the IO loops of stale message buffers. | 165 | * Prunes the IO loops of stale message buffers. |
166 | + * | ||
167 | + * @return number of remaining IO loops among all workers. | ||
164 | */ | 168 | */ |
165 | - public void prune() { | 169 | + public int prune() { |
170 | + int count = 0; | ||
166 | for (CustomIOLoop l : iloops) { | 171 | for (CustomIOLoop l : iloops) { |
167 | - l.pruneStaleStreams(); | 172 | + count += l.pruneStaleStreams(); |
168 | } | 173 | } |
174 | + return count; | ||
169 | } | 175 | } |
170 | 176 | ||
171 | // Get the next worker to which a client should be assigned | 177 | // Get the next worker to which a client should be assigned | ... | ... |
1 | package org.onlab.onos.foo; | 1 | package org.onlab.onos.foo; |
2 | 2 | ||
3 | +import org.apache.karaf.shell.commands.Argument; | ||
3 | import org.apache.karaf.shell.commands.Command; | 4 | import org.apache.karaf.shell.commands.Command; |
4 | import org.onlab.onos.cli.AbstractShellCommand; | 5 | import org.onlab.onos.cli.AbstractShellCommand; |
5 | 6 | ||
... | @@ -12,12 +13,32 @@ import static org.onlab.onos.foo.IOLoopTestClient.startStandalone; | ... | @@ -12,12 +13,32 @@ import static org.onlab.onos.foo.IOLoopTestClient.startStandalone; |
12 | description = "Starts the test IO loop client") | 13 | description = "Starts the test IO loop client") |
13 | public class TestIOClientCommand extends AbstractShellCommand { | 14 | public class TestIOClientCommand extends AbstractShellCommand { |
14 | 15 | ||
16 | + @Argument(index = 0, name = "serverIp", description = "Server IP address", | ||
17 | + required = false, multiValued = false) | ||
18 | + String serverIp = "127.0.0.1"; | ||
19 | + | ||
20 | + @Argument(index = 1, name = "workers", description = "IO workers", | ||
21 | + required = false, multiValued = false) | ||
22 | + String workers = "6"; | ||
23 | + | ||
24 | + @Argument(index = 2, name = "messageCount", description = "Message count", | ||
25 | + required = false, multiValued = false) | ||
26 | + String messageCount = "10000000"; | ||
27 | + | ||
28 | + @Argument(index = 3, name = "messageLength", description = "Message length (bytes)", | ||
29 | + required = false, multiValued = false) | ||
30 | + String messageLength = "128"; | ||
31 | + | ||
32 | + @Argument(index = 4, name = "timeoutSecs", description = "Test timeout (seconds)", | ||
33 | + required = false, multiValued = false) | ||
34 | + String timeoutSecs = "30"; | ||
35 | + | ||
15 | @Override | 36 | @Override |
16 | protected void execute() { | 37 | protected void execute() { |
17 | try { | 38 | try { |
18 | - startStandalone(new String[]{}); | 39 | + startStandalone(new String[]{serverIp, workers, messageCount, messageLength, timeoutSecs}); |
19 | } catch (Exception e) { | 40 | } catch (Exception e) { |
20 | - error("Unable to start server %s", e); | 41 | + error("Unable to start client %s", e); |
21 | } | 42 | } |
22 | } | 43 | } |
23 | 44 | ... | ... |
1 | package org.onlab.onos.foo; | 1 | package org.onlab.onos.foo; |
2 | 2 | ||
3 | +import org.apache.karaf.shell.commands.Argument; | ||
3 | import org.apache.karaf.shell.commands.Command; | 4 | import org.apache.karaf.shell.commands.Command; |
4 | import org.onlab.onos.cli.AbstractShellCommand; | 5 | import org.onlab.onos.cli.AbstractShellCommand; |
5 | 6 | ||
6 | import static org.onlab.onos.foo.IOLoopTestServer.startStandalone; | 7 | import static org.onlab.onos.foo.IOLoopTestServer.startStandalone; |
7 | 8 | ||
8 | - | ||
9 | /** | 9 | /** |
10 | * Starts the test IO loop server. | 10 | * Starts the test IO loop server. |
11 | */ | 11 | */ |
... | @@ -13,10 +13,22 @@ import static org.onlab.onos.foo.IOLoopTestServer.startStandalone; | ... | @@ -13,10 +13,22 @@ import static org.onlab.onos.foo.IOLoopTestServer.startStandalone; |
13 | description = "Starts the test IO loop server") | 13 | description = "Starts the test IO loop server") |
14 | public class TestIOServerCommand extends AbstractShellCommand { | 14 | public class TestIOServerCommand extends AbstractShellCommand { |
15 | 15 | ||
16 | + @Argument(index = 0, name = "serverIp", description = "Server IP address", | ||
17 | + required = false, multiValued = false) | ||
18 | + String serverIp = "127.0.0.1"; | ||
19 | + | ||
20 | + @Argument(index = 1, name = "workers", description = "IO workers", | ||
21 | + required = false, multiValued = false) | ||
22 | + String workers = "6"; | ||
23 | + | ||
24 | + @Argument(index = 2, name = "messageLength", description = "Message length (bytes)", | ||
25 | + required = false, multiValued = false) | ||
26 | + String messageLength = "128"; | ||
27 | + | ||
16 | @Override | 28 | @Override |
17 | protected void execute() { | 29 | protected void execute() { |
18 | try { | 30 | try { |
19 | - startStandalone(new String[]{}); | 31 | + startStandalone(new String[]{serverIp, workers, messageLength}); |
20 | } catch (Exception e) { | 32 | } catch (Exception e) { |
21 | error("Unable to start server %s", e); | 33 | error("Unable to start server %s", e); |
22 | } | 34 | } | ... | ... |
... | @@ -6,6 +6,7 @@ import org.onlab.nio.MessageStream; | ... | @@ -6,6 +6,7 @@ import org.onlab.nio.MessageStream; |
6 | import java.nio.ByteBuffer; | 6 | import java.nio.ByteBuffer; |
7 | import java.nio.channels.ByteChannel; | 7 | import java.nio.channels.ByteChannel; |
8 | 8 | ||
9 | +import static com.google.common.base.Preconditions.checkArgument; | ||
9 | import static com.google.common.base.Preconditions.checkState; | 10 | import static com.google.common.base.Preconditions.checkState; |
10 | 11 | ||
11 | /** | 12 | /** |
... | @@ -19,12 +20,18 @@ public class TestMessageStream extends MessageStream<TestMessage> { | ... | @@ -19,12 +20,18 @@ public class TestMessageStream extends MessageStream<TestMessage> { |
19 | private static final int META_LENGTH = 40; | 20 | private static final int META_LENGTH = 40; |
20 | 21 | ||
21 | private final int length; | 22 | private final int length; |
23 | + private boolean isStrict = true; | ||
22 | 24 | ||
23 | public TestMessageStream(int length, ByteChannel ch, IOLoop<TestMessage, ?> loop) { | 25 | public TestMessageStream(int length, ByteChannel ch, IOLoop<TestMessage, ?> loop) { |
24 | super(loop, ch, 64 * 1024, 500); | 26 | super(loop, ch, 64 * 1024, 500); |
27 | + checkArgument(length >= META_LENGTH, "Length must be greater than header length of 40"); | ||
25 | this.length = length; | 28 | this.length = length; |
26 | } | 29 | } |
27 | 30 | ||
31 | + void setNonStrict() { | ||
32 | + isStrict = false; | ||
33 | + } | ||
34 | + | ||
28 | @Override | 35 | @Override |
29 | protected TestMessage read(ByteBuffer rb) { | 36 | protected TestMessage read(ByteBuffer rb) { |
30 | if (rb.remaining() < length) { | 37 | if (rb.remaining() < length) { |
... | @@ -32,16 +39,20 @@ public class TestMessageStream extends MessageStream<TestMessage> { | ... | @@ -32,16 +39,20 @@ public class TestMessageStream extends MessageStream<TestMessage> { |
32 | } | 39 | } |
33 | 40 | ||
34 | long startTag = rb.getLong(); | 41 | long startTag = rb.getLong(); |
35 | - checkState(startTag == START_TAG, "Incorrect message start"); | 42 | + if (isStrict) { |
43 | + checkState(startTag == START_TAG, "Incorrect message start"); | ||
44 | + } | ||
36 | 45 | ||
37 | long size = rb.getLong(); | 46 | long size = rb.getLong(); |
38 | long requestorTime = rb.getLong(); | 47 | long requestorTime = rb.getLong(); |
39 | long responderTime = rb.getLong(); | 48 | long responderTime = rb.getLong(); |
40 | - byte[] padding = padding(length); | 49 | + byte[] padding = padding(); |
41 | rb.get(padding); | 50 | rb.get(padding); |
42 | 51 | ||
43 | long endTag = rb.getLong(); | 52 | long endTag = rb.getLong(); |
44 | - checkState(endTag == END_TAG, "Incorrect message end"); | 53 | + if (isStrict) { |
54 | + checkState(endTag == END_TAG, "Incorrect message end"); | ||
55 | + } | ||
45 | 56 | ||
46 | return new TestMessage((int) size, requestorTime, responderTime, padding); | 57 | return new TestMessage((int) size, requestorTime, responderTime, padding); |
47 | } | 58 | } |
... | @@ -60,7 +71,7 @@ public class TestMessageStream extends MessageStream<TestMessage> { | ... | @@ -60,7 +71,7 @@ public class TestMessageStream extends MessageStream<TestMessage> { |
60 | wb.putLong(END_TAG); | 71 | wb.putLong(END_TAG); |
61 | } | 72 | } |
62 | 73 | ||
63 | - public byte[] padding(int msgLength) { | 74 | + public byte[] padding() { |
64 | - return new byte[msgLength - META_LENGTH]; | 75 | + return new byte[length - META_LENGTH]; |
65 | } | 76 | } |
66 | } | 77 | } | ... | ... |
... | @@ -259,13 +259,16 @@ public abstract class IOLoop<M extends Message, S extends MessageStream<M>> | ... | @@ -259,13 +259,16 @@ public abstract class IOLoop<M extends Message, S extends MessageStream<M>> |
259 | 259 | ||
260 | /** | 260 | /** |
261 | * Prunes the registered streams by discarding any stale ones. | 261 | * Prunes the registered streams by discarding any stale ones. |
262 | + * | ||
263 | + * @return number of remaining streams | ||
262 | */ | 264 | */ |
263 | - public synchronized void pruneStaleStreams() { | 265 | + public synchronized int pruneStaleStreams() { |
264 | for (MessageStream<M> stream : streams) { | 266 | for (MessageStream<M> stream : streams) { |
265 | if (stream.isStale()) { | 267 | if (stream.isStale()) { |
266 | stream.close(); | 268 | stream.close(); |
267 | } | 269 | } |
268 | } | 270 | } |
271 | + return streams.size(); | ||
269 | } | 272 | } |
270 | 273 | ||
271 | } | 274 | } | ... | ... |
-
Please register or login to post a comment