comparison src/org/dancres/blitz/remote/nio/StressClient.java @ 0:3dc0c5604566

Initial checkin of blitz 2.0 fcs - no installer yet.
author Dan Creswell <dan.creswell@gmail.com>
date Sat, 21 Mar 2009 11:00:06 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:3dc0c5604566
1 package org.dancres.blitz.remote.nio;
2
3 import java.io.IOException;
4 import java.util.Random;
5 import java.rmi.RMISecurityManager;
6 import java.net.InetSocketAddress;
7
8 import net.jini.core.lease.Lease;
9 import net.jini.core.entry.Entry;
10 import net.jini.space.JavaSpace;
11
12 import org.dancres.blitz.remote.test.DummyEntry;
13 import org.dancres.blitz.mangler.EntryMangler;
14
15 /**
16 */
17 public class StressClient {
18 private Invoker _invoker;
19 private static Stresser[] _beaters;
20
21 StressClient(InetSocketAddress anAddr) throws IOException {
22 _invoker = new Invoker(anAddr, true);
23 }
24
25 void test(boolean doLoad, int aNumBeaters, int aPoolSize, int aPause,
26 boolean isDebug) {
27 try {
28 if (doLoad) {
29 System.out.println("Filling:");
30 for (int i = 0; i < aPoolSize; i++) {
31 System.out.print(".");
32 Integer myValue = new Integer(i);
33
34 Entry myEntry =
35 new DummyEntry(myValue.toString());
36
37 _invoker.write(EntryMangler.getMangler().mangle(myEntry),
38 null, Lease.FOREVER);
39 }
40 System.out.println();
41 }
42
43 Random myRNG = new Random();
44 _beaters = new Stresser[aNumBeaters];
45
46 for (int i = 0; i < aNumBeaters; i++) {
47 _beaters[i] = new Stresser(_invoker, aPoolSize,
48 aPause, isDebug);
49
50 Thread myThread = new Thread(_beaters[i]);
51 myThread.setName(Integer.toString(i));
52 myThread.start();
53
54 try {
55 Thread.sleep((long) myRNG.nextInt(500));
56 } catch (InterruptedException anIE) {
57 }
58 }
59
60 } catch (Exception anE) {
61 System.err.println("Rdv error");
62 anE.printStackTrace(System.err);
63 System.exit(0);
64 }
65 }
66
67 public void run() {
68 }
69
70 private static class Watcher extends Thread {
71 private Stresser[] theBeaters;
72
73 Watcher(Stresser[] aBeaters) {
74 theBeaters = aBeaters;
75 setDaemon(true);
76 }
77
78 public void run() {
79 while (true) {
80 try {
81 Thread.sleep(60 * 1000);
82 } catch (InterruptedException anIE) {
83 System.err.println("Awoken early!");
84 }
85
86 for (int i = 0; i < theBeaters.length; i++) {
87 System.out.println("Beater: " + i + "," + theBeaters[i].getStats());
88 }
89 }
90 }
91 }
92
93 private class Stresser implements Runnable {
94 private Invoker _invoker;
95 private Random theRNG = new Random();
96 private int thePoolSize;
97 private long thePause;
98 private boolean isDebug;
99
100 /*
101 Statistics gathered up by Watcher
102 */
103 private long theTxns;
104
105 Stresser(Invoker anInvoker, int aPoolSize,
106 long aPause, boolean debug) {
107 _invoker = anInvoker;
108 thePoolSize = aPoolSize;
109 thePause = aPause;
110 isDebug = debug;
111 }
112
113 String getStats() {
114 StringBuffer myStats = new StringBuffer();
115
116 synchronized(this) {
117 myStats.append(" Txns:");
118 myStats.append(Long.toString(theTxns));
119 theTxns = 0;
120 }
121
122 return myStats.toString();
123 }
124
125 /**
126 @todo Should test the take for != null and only write in that case.
127 */
128 public void run() {
129 long myNextTxnId = 0;
130
131 while(true) {
132 try {
133 Integer myValue =
134 new Integer(theRNG.nextInt(thePoolSize));
135
136 Entry myTemplate = new DummyEntry(myValue.toString());
137
138 Entry myResult = take(myTemplate, thePause);
139
140 if (myResult != null)
141 _invoker.write(EntryMangler.getMangler().mangle(myTemplate)
142 , null, Lease.FOREVER);
143
144 synchronized(this) {
145 ++theTxns;
146 }
147
148 if (isDebug) {
149 synchronized(System.out) {
150 System.out.print(getId() + "W");
151 }
152 }
153 } catch (Throwable aThrowable) {
154 System.err.println("Stresser got exception");
155 aThrowable.printStackTrace(System.err);
156 break;
157 }
158 }
159 }
160
161 private Entry take(Entry aTemplate,
162 long aTimeout)
163 throws Exception {
164
165 Entry myResult = _invoker.take(EntryMangler.getMangler().mangle(aTemplate),
166 null, aTimeout);
167
168 if (isDebug) {
169 synchronized(System.out) {
170 if (myResult != null) {
171 System.out.print(getId() + "T");
172 } else {
173 System.out.print(getId() + "|**|");
174 }
175 }
176 }
177 return myResult;
178 }
179
180 private String getId() {
181 return Thread.currentThread().getName();
182 }
183 }
184
185 public static void main(String anArgs[]) {
186 if (anArgs.length != 5) {
187 System.err.println("Usage: Stress <addr> <port> <threads> <pool_size> <timeout>");
188 System.exit(-1);
189 }
190
191 try {
192 System.setSecurityManager(new RMISecurityManager());
193 new StressClient(new InetSocketAddress(anArgs[0],
194 Integer.parseInt(anArgs[1]))).test(Boolean.getBoolean("load"),
195 Integer.parseInt(anArgs[2]),
196 Integer.parseInt(anArgs[3]),
197 Integer.parseInt(anArgs[4]),
198 Boolean.getBoolean("debug"));
199
200 new Watcher(_beaters).start();
201 } catch (Exception anE) {
202 System.err.println("Stress failed");
203 anE.printStackTrace(System.err);
204 }
205 }
206 }