Mercurial > hg > blitz_condensed
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 } |