1 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 ; 16 import java.util.Map ; 17 import java.util.Random ; 18 19 public class LongRunningTest extends AbstractHttpLoadTest { 20 21 private static final int END_SESSION = 50; 23 24 private static final int INVALIDATE = 4; 26 27 private static final int ADD_REMOVE = 20; 29 30 private static final int IDLE_SECONDS = 300; 32 33 private static final String SERVLET = "/perftest/LongRunningTestServlet"; 34 private static final String CREATE_URL = SERVLET + "?action=create&idle=" + IDLE_SECONDS; 35 private static final String INVALIDATE_URL = SERVLET + "?action=invalidate"; 36 private static final String ADD_URL = SERVLET + "?action=add"; 37 private static final String REMOVE_URL = SERVLET + "?action=remove"; 38 private static final String MUTATE_URL = SERVLET + "?action=mutate"; 39 40 private final Random random = new Random (); 41 private final Map needsCreate = new IdentityHashMap (); 42 private final Sessions sessions = new Sessions(); 43 private final int sessionsCount; 44 45 protected LongRunningTest(String [] args) { 46 super(args); 47 48 this.sessionsCount = testProperties.getSessionsCount(); 49 final String [] 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 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 args[]) throws Exception { 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 urlPart, boolean gatherStatistic, long expire) { 124 this(clientAdapter, urlPart, gatherStatistic, expire, true); 125 } 126 127 public Work(HttpClientAdapter clientAdapter, String 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 e) { 149 throw new RuntimeException (e); 150 } 151 } 152 153 HttpClientAdapter take() { 154 try { 155 return (HttpClientAdapter) availSessions.take(); 156 } catch (InterruptedException e) { 157 throw new RuntimeException (e); 158 } 159 } 160 161 } 162 163 } 164 | Popular Tags |