KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tctest > performance > http > load > webapp > LongRunningTest


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package com.tctest.performance.http.load.webapp;
5
6 import org.apache.commons.httpclient.HttpState;
7
8 import EDU.oswego.cs.dl.util.concurrent.LinkedQueue;
9
10 import com.tctest.performance.http.load.AbstractHttpLoadTest;
11 import com.tctest.performance.http.load.HttpClientAdapter;
12 import com.tctest.performance.http.load.SessionWorkItem;
13 import com.tctest.performance.http.load.WorkItem;
14
15 import java.util.IdentityHashMap JavaDoc;
16 import java.util.Map JavaDoc;
17 import java.util.Random JavaDoc;
18
19 public class LongRunningTest extends AbstractHttpLoadTest {
20
21   // 1 in this many will be either invalidated or abandoned
22
private static final int END_SESSION = 50;
23
24   // 1 in this many will be explicitly invalidated (versus simply abandoned)
25
private static final int INVALIDATE = 4;
26
27   // 1 in this many will add/remove (vs. mutate) session data
28
private static final int ADD_REMOVE = 20;
29
30   // session idle timeout
31
private static final int IDLE_SECONDS = 300;
32
33   private static final String JavaDoc SERVLET = "/perftest/LongRunningTestServlet";
34   private static final String JavaDoc CREATE_URL = SERVLET + "?action=create&idle=" + IDLE_SECONDS;
35   private static final String JavaDoc INVALIDATE_URL = SERVLET + "?action=invalidate";
36   private static final String JavaDoc ADD_URL = SERVLET + "?action=add";
37   private static final String JavaDoc REMOVE_URL = SERVLET + "?action=remove";
38   private static final String JavaDoc MUTATE_URL = SERVLET + "?action=mutate";
39
40   private final Random JavaDoc random = new Random JavaDoc();
41   private final Map JavaDoc needsCreate = new IdentityHashMap JavaDoc();
42   private final Sessions sessions = new Sessions();
43   private final int sessionsCount;
44
45   protected LongRunningTest(String JavaDoc[] args) {
46     super(args);
47
48     this.sessionsCount = testProperties.getSessionsCount();
49     final String JavaDoc[] hosts = testProperties.getHosts();
50     int hostCounter = 0;
51
52     for (int i = 0; i < sessionsCount; i++) {
53       HttpClientAdapter adapter = new HttpClientAdapter(new HttpState(), hosts[hostCounter]);
54       sessions.put(adapter);
55       hostCounter = (hostCounter + 1) % hosts.length;
56     }
57   }
58
59   protected WorkItem[] generateFinishWorkItems() {
60     return new WorkItem[] {};
61   }
62
63   protected WorkItem[] generateWarmUpWorkItems() {
64     WorkItem[] rv = new WorkItem[sessionsCount];
65     for (int i = 0; i < rv.length; i++) {
66       final WorkItem workItem = new Work(sessions.take(), CREATE_URL, false, Long.MAX_VALUE);
67       rv[i] = workItem;
68     }
69     return rv;
70   }
71
72   protected WorkItem generateWorkItem(long endtime) {
73     HttpClientAdapter adapter = sessions.take();
74     if (needsCreate.remove(adapter) != null) {
75       //
76
return new Work(adapter, CREATE_URL, true, endtime);
77     }
78
79     final WorkItem rv;
80     if (random.nextInt(END_SESSION) == 0) {
81       rv = endSession(adapter, endtime);
82     } else {
83       rv = regularAccess(adapter, endtime);
84     }
85
86     return rv;
87   }
88
89   private WorkItem regularAccess(HttpClientAdapter adapter, long endtime) {
90     int n = random.nextInt(ADD_REMOVE);
91     if (n == 0) {
92       if (random.nextBoolean()) {
93         return new Work(adapter, ADD_URL, true, endtime);
94       } else {
95         return new Work(adapter, REMOVE_URL, true, endtime);
96       }
97     } else {
98       return new Work(adapter, MUTATE_URL, true, endtime);
99     }
100   }
101
102   private WorkItem endSession(HttpClientAdapter adapter, long endtime) {
103     if (random.nextInt(INVALIDATE) == 0) {
104       HttpClientAdapter newAdapter = new HttpClientAdapter(new HttpState(), adapter.getHost());
105       needsCreate.put(newAdapter, newAdapter);
106       sessions.put(newAdapter);
107       return new Work(adapter, INVALIDATE_URL, true, endtime, false);
108     }
109
110     HttpClientAdapter newAdapter = new HttpClientAdapter(new HttpState(), adapter.getHost());
111     return new Work(newAdapter, CREATE_URL, true, endtime);
112   }
113
114   public static void main(String JavaDoc args[]) throws Exception JavaDoc {
115     new LongRunningTest(args).execute();
116   }
117
118   private class Work extends SessionWorkItem {
119
120     private final HttpClientAdapter clientAdapter;
121     private final boolean returnSession;
122
123     public Work(HttpClientAdapter clientAdapter, String JavaDoc urlPart, boolean gatherStatistic, long expire) {
124       this(clientAdapter, urlPart, gatherStatistic, expire, true);
125     }
126
127     public Work(HttpClientAdapter clientAdapter, String JavaDoc urlPart, boolean gatherStatistic, long expire,
128                 boolean returnSession) {
129       super(clientAdapter, urlPart, gatherStatistic, expire);
130       this.clientAdapter = clientAdapter;
131       this.returnSession = returnSession;
132     }
133
134     public void done() {
135       if (returnSession) {
136         sessions.put(clientAdapter);
137       }
138     }
139
140   }
141
142   private static class Sessions {
143     private final LinkedQueue availSessions = new LinkedQueue();
144
145     void put(HttpClientAdapter adapter) {
146       try {
147         availSessions.put(adapter);
148       } catch (InterruptedException JavaDoc e) {
149         throw new RuntimeException JavaDoc(e);
150       }
151     }
152
153     HttpClientAdapter take() {
154       try {
155         return (HttpClientAdapter) availSessions.take();
156       } catch (InterruptedException JavaDoc e) {
157         throw new RuntimeException JavaDoc(e);
158       }
159     }
160
161   }
162
163 }
164
Popular Tags