1 4 package com.tctest.performance.servlets; 5 6 import java.io.IOException ; 7 import java.io.PrintWriter ; 8 import java.util.LinkedList ; 9 import java.util.List ; 10 import java.util.Random ; 11 12 import javax.servlet.http.HttpServlet ; 13 import javax.servlet.http.HttpServletRequest ; 14 import javax.servlet.http.HttpServletResponse ; 15 import javax.servlet.http.HttpSession ; 16 17 public class LongRunningTestServlet extends HttpServlet { 18 19 protected void doGet(HttpServletRequest req, HttpServletResponse res) { 20 try { 21 doGet0(req, res); 22 } catch (Throwable t) { 23 t.printStackTrace(); 24 throw new RuntimeException (t.getMessage()); 25 } 26 } 27 28 private void doGet0(HttpServletRequest req, HttpServletResponse res) throws IOException { 29 Random random = new Random (); 30 31 String action = req.getParameter("action"); 32 33 if ("create".equals(action)) { 34 doCreate(req, res, random); 35 } else if ("mutate".equals(action)) { 36 doMutate(req, res, random); 37 } else if ("add".equals(action)) { 38 doAdd(req, res, random); 39 } else if ("remove".equals(action)) { 40 doRemove(req, res, random); 41 } else if ("invalidate".equals(action)) { 42 doInvalidate(req, res, random); 43 } else { 44 throw new AssertionError ("unknown action: " + action); 45 } 46 47 createGarbageAndConsumeCPU(random); 48 49 res.setStatus(HttpServletResponse.SC_OK); 50 PrintWriter writer = res.getWriter(); 51 writer.println("OK"); 52 } 53 54 private void createGarbageAndConsumeCPU(Random random) { 55 List list = new LinkedList (); 56 57 for (int i = 0; i < 512; i++) { 58 list.add(String.valueOf(System.currentTimeMillis())); 59 } 60 61 int hc = Math.abs(list.hashCode()); 62 hc = hc == Integer.MIN_VALUE ? 0 : hc; 63 64 double d = 0; 65 while ((hc % 10000) != 0) { 66 d += hc; 67 d = Math.sqrt(d); 68 hc--; 69 } 70 71 if (d == random.nextDouble()) { 72 System.err.println("Really?"); 73 } 74 75 } 76 77 private void doRemove(HttpServletRequest req, HttpServletResponse res, Random random) { 78 HttpSession session = getSession(req, false); 79 80 String [] attrs = session.getValueNames(); 81 if (attrs.length == 0) { return; } 82 83 String attr = attrs[random.nextInt(attrs.length)]; 84 session.removeAttribute(attr); 85 } 86 87 private void doInvalidate(HttpServletRequest req, HttpServletResponse res, Random random) { 88 HttpSession session = getSession(req, false); 89 session.invalidate(); 90 } 91 92 private void doAdd(HttpServletRequest req, HttpServletResponse res, Random random) { 93 HttpSession session = getSession(req, false); 94 session.setAttribute("add" + System.currentTimeMillis(), makeGraph(random)); 95 } 96 97 private void doMutate(HttpServletRequest req, HttpServletResponse res, Random random) { 98 HttpSession session = getSession(req, false); 99 100 String [] attrs = session.getValueNames(); 101 if (attrs.length == 0) { return; } 102 103 String attr = attrs[random.nextInt(attrs.length)]; 104 DataObject obj = (DataObject) session.getAttribute(attr); 105 obj.mutate(random); 106 107 session.setAttribute(attr, obj); 109 } 110 111 private void doCreate(HttpServletRequest req, HttpServletResponse res, Random random) { 112 HttpSession session = getSession(req, true); 113 114 Integer idle = Integer.valueOf(req.getParameter("idle")); 115 session.setMaxInactiveInterval(idle.intValue()); 116 117 int numAttrs = random.nextInt(5); 118 for (int i = 0; i < numAttrs; i++) { 119 session.setAttribute("create" + i, makeGraph(random)); 120 } 121 } 122 123 static DataObject makeGraph(Random random) { 124 return makeGraph(random, random.nextInt(100) + 1); 125 } 126 127 static HttpSession getSession(HttpServletRequest req, boolean expectedNewValue) { 128 HttpSession session = req.getSession(true); 129 boolean isNew = session.isNew(); 130 if (expectedNewValue != isNew) { throw new AssertionError ("session.isNew() has incorrect value: " + isNew 131 + " for requested ID " + req.getRequestedSessionId()); } 132 return session; 133 } 134 135 static DataObject makeGraph(Random random, int maxNodes) { 136 int num = random.nextInt(maxNodes) + 1; 137 DataObject root = new DataObject(); 138 for (int i = 0; i < num; i++) { 139 root.expand(random); 140 } 141 return root; 142 } 143 144 private static class DataObject { 145 private int f1; 146 private int f2; 147 private int f3; 148 private int f4; 149 150 private DataObject ref1; 151 private DataObject ref2; 152 153 private void mutateLocal() { 154 f1++; 155 f2++; 156 f3++; 157 f4++; 158 } 159 160 void mutate(Random random) { 161 mutateLocal(); 162 163 if (random.nextBoolean()) { 164 if (ref1 != null) { 165 ref1.mutate(random); 166 } 167 } else { 168 if (ref2 != null) { 169 ref2.mutate(random); 170 } 171 } 172 } 173 174 void expand(Random random) { 175 if (ref1 == null && ref2 == null) { 176 ref1 = new DataObject(); 177 return; 178 } 179 180 if (ref1 == null) { 181 if (random.nextBoolean()) { 182 ref2.expand(random); 183 } else { 184 ref1 = new DataObject(); 185 } 186 return; 187 } 188 189 if (ref2 == null) { 190 if (random.nextBoolean()) { 191 ref1.expand(random); 192 } else { 193 ref2 = new DataObject(); 194 } 195 return; 196 } 197 198 if (random.nextBoolean()) { 199 ref1.expand(random); 200 } else { 201 ref2.expand(random); 202 } 203 } 204 } 205 206 } 207 | Popular Tags |