You are viewing a plain text version of this content. The canonical link for it is here.
Posted to olio-commits@incubator.apache.org by sh...@apache.org on 2009/10/21 21:50:05 UTC

svn commit: r828229 - in /incubator/olio/workload/rails/trunk: bin/dbloader.sh deploy/config.xhtml deploy/run.xml src/org/apache/olio/workload/driver/UIDriver.java

Author: shanti
Date: Wed Oct 21 21:50:04 2009
New Revision: 828229

URL: http://svn.apache.org/viewvc?rev=828229&view=rev
Log:
Final fixes for OLIO-84, OLIO-113. In sync with Faban 1.0RC2. 

Modified:
    incubator/olio/workload/rails/trunk/bin/dbloader.sh
    incubator/olio/workload/rails/trunk/deploy/config.xhtml
    incubator/olio/workload/rails/trunk/deploy/run.xml
    incubator/olio/workload/rails/trunk/src/org/apache/olio/workload/driver/UIDriver.java

Modified: incubator/olio/workload/rails/trunk/bin/dbloader.sh
URL: http://svn.apache.org/viewvc/incubator/olio/workload/rails/trunk/bin/dbloader.sh?rev=828229&r1=828228&r2=828229&view=diff
==============================================================================
--- incubator/olio/workload/rails/trunk/bin/dbloader.sh (original)
+++ incubator/olio/workload/rails/trunk/bin/dbloader.sh Wed Oct 21 21:50:04 2009
@@ -44,9 +44,10 @@
 
 B=$BENCH_HOME/lib
 L=$FABAN_HOME/lib
-CLASSPATH=$B/mysql-connector-java-5.0.6-bin.jar:$B/json.jar:$B/OlioDriver.jar:\
-$L/commons-httpclient-2.0.1.jar:$L/fabancommon.jar:$L/commons-logging.jar:\
-$L/fabandriver.jar:$L/fabanagents.jar
+# Pickup the latest MySQL jar in case there are multiple ones
+MYSQL_JAR=`ls -r $B/mysql-connector*.jar | head -1`
+CLASSPATH=$MYSQL_JAR:$B/OlioDriver.jar:\
+$L/fabancommon.jar:$L/commons-logging.jar:$L/fabandriver.jar:$L/fabanagents.jar
 export CLASSPATH
 
 $JAVA_HOME/bin/java -server org.apache.olio.workload.loader.LoadController com.mysql.jdbc.Driver \

Modified: incubator/olio/workload/rails/trunk/deploy/config.xhtml
URL: http://svn.apache.org/viewvc/incubator/olio/workload/rails/trunk/deploy/config.xhtml?rev=828229&r1=828228&r2=828229&view=diff
==============================================================================
--- incubator/olio/workload/rails/trunk/deploy/config.xhtml (original)
+++ incubator/olio/workload/rails/trunk/deploy/config.xhtml Wed Oct 21 21:50:04 2009
@@ -111,6 +111,7 @@
                     <xforms:bind id="bind-load-scale" xforms:nodeset="scale" xforms:type="positiveInteger"/>
                     <!-- addition here -->
                     <xforms:bind id='bind-dbserver-service' xforms:nodeset='fh:service'>
+                        <xforms:bind id="bind-dbserver-service-tools" xforms:nodeset="fh:tools" />
                       <xforms:bind id='bind-dbserver-service-config' xforms:nodeset='fh:config'>
                         <xforms:bind id="bind-db-homePath" xforms:nodeset="serverHome" />
                         <xforms:bind id="bind-db-confPath" xforms:nodeset="confPath" />
@@ -180,13 +181,14 @@
                     <dbDriver>JDBC driver class name</dbDriver>
                     <connectURL>JDBC connection URL</connectURL>
                     <reloadDB>Reload Database</reloadDB>
+                    <dbTools>DB Service Tools</dbTools>
                     <reloadMedia>Reload Images</reloadMedia>
-                    <dbHomePath>Path for Database Home</dbHomePath>
+                    <dbHomePath>Database Home</dbHomePath>
                     <serverType>Server Type</serverType>
-                    <serverCmdPath>Server command</serverCmdPath>
-                    <serverConfPath>Server config file</serverConfPath>
-                    <serverLogsDir>Server logs directory</serverLogsDir>
-                    <serverPidsDir>Server pids directory</serverPidsDir>
+                    <serverCmdPath>Server Command</serverCmdPath>
+                    <serverConfPath>Server Config File</serverConfPath>
+                    <serverLogsDir>Server Logs Directory</serverLogsDir>
+                    <serverPidsDir>Server Pids Directory</serverPidsDir>
 					<rakePath>Path to rake</rakePath>
 					<getAccLog>Get Access Log ? </getAccLog>
 					<appDir>Application home directory</appDir>
@@ -202,8 +204,9 @@
                     <hostPorts>Host:Port Pairs</hostPorts>
                     <port>Port</port>
                     <cacheHostPorts>Memcached Hosts:Ports</cacheHostPorts>
-                    <cacheBinPath>Memcached bin Directory</cacheBinPath>
+                    <cacheBinPath>Path to memcached command</cacheBinPath>
                     <serverMemSize>Memcached Max Memory(MB)</serverMemSize>
+                    <cacheTools>MemcachedService Tools</cacheTools>
                     <pathConfig>URL Path Configurations</pathConfig>
                     <java>Java</java>
                     <php>PHP</php>
@@ -548,8 +551,13 @@
                         </xforms:input>
                          <xforms:input id="input-db-confPath" xforms:bind="bind-db-confPath">
                             <xforms:label xforms:model="benchmark-labels" xforms:ref="/labels/dbConfPath"/>
-                            <xforms:hint>Enter DB conf file directory</xforms:hint>
-                            <xforms:help>Enter DB conf file directory (e.g /etc)</xforms:help>
+                            <xforms:hint>Enter the path to the DB config file</xforms:hint>
+                            <xforms:help>Enter the path to the DB config file</xforms:help>
+                        </xforms:input>
+                        <xforms:input id="input-db-service-tools" xforms:bind="bind-dbserver-service-tools">
+                            <xforms:label xforms:model="benchmark-labels" xforms:ref="/labels/dbTools"/>
+                            <xforms:hint>Enter the DB-specific tools to run</xforms:hint>
+                            <xforms:help>Enter the DB-specific tools to run</xforms:help>
                         </xforms:input>
                     </xforms:group>
                     <xforms:group id="group-dataStorage">
@@ -617,6 +625,11 @@
                             <xforms:hint>Enter the max. size in MB of the cache</xforms:hint>
                             <xforms:help>Enter the max. size in MB of the cache</xforms:help>
                         </xforms:input>
+                        <xforms:input id="input-cacheServers-service-tools" xforms:bind="bind-cacheServers-service-tools">
+                            <xforms:label xforms:model="benchmark-labels" xforms:ref="/labels/cacheTools"/>
+                            <xforms:hint>Enter the memcached-specific tools to run</xforms:hint>
+                            <xforms:help>Enter the memcached-specific tools to run</xforms:help>
+                        </xforms:input>
                     </xforms:group>
                 </xforms:case>
             </xforms:switch>

Modified: incubator/olio/workload/rails/trunk/deploy/run.xml
URL: http://svn.apache.org/viewvc/incubator/olio/workload/rails/trunk/deploy/run.xml?rev=828229&r1=828228&r2=828229&view=diff
==============================================================================
--- incubator/olio/workload/rails/trunk/deploy/run.xml (original)
+++ incubator/olio/workload/rails/trunk/deploy/run.xml Wed Oct 21 21:50:04 2009
@@ -38,8 +38,8 @@
         <fa:scale>50</fa:scale>
         
         <fa:runControl>
-            <fa:rampUp>10</fa:rampUp>
-            <fa:steadyState>600</fa:steadyState>
+            <fa:rampUp>30</fa:rampUp>
+            <fa:steadyState>300</fa:steadyState>
             <fa:rampDown>10</fa:rampDown>
             <fa:variableLoad>false</fa:variableLoad>
             <fa:variableLoadFile>/faban/load.txt</fa:variableLoadFile>
@@ -49,7 +49,7 @@
         
         <audit>false</audit>
         <threadStart>            
-            <delay>10</delay>            
+            <delay>100</delay>
             <simultaneous>false</simultaneous>            
             <parallel>false</parallel>
         </threadStart>
@@ -138,7 +138,7 @@
             <fh:tools>Mysqlstats</fh:tools>
             <fh:restart>false</fh:restart>
             <fh:config>
-                <serverHome>/opt/coolstack/mysql</serverHome>
+                <serverHome>/var/mysql</serverHome>
                 <user>olio</user>
                 <password>olio</password>
                 <confPath>/etc/my.cnf</confPath>

Modified: incubator/olio/workload/rails/trunk/src/org/apache/olio/workload/driver/UIDriver.java
URL: http://svn.apache.org/viewvc/incubator/olio/workload/rails/trunk/src/org/apache/olio/workload/driver/UIDriver.java?rev=828229&r1=828228&r2=828229&view=diff
==============================================================================
--- incubator/olio/workload/rails/trunk/src/org/apache/olio/workload/driver/UIDriver.java (original)
+++ incubator/olio/workload/rails/trunk/src/org/apache/olio/workload/driver/UIDriver.java Wed Oct 21 21:50:04 2009
@@ -25,9 +25,6 @@
 import org.apache.olio.workload.util.RandomUtil;
 import org.apache.olio.workload.util.ScaleFactors;
 import org.apache.olio.workload.util.UserName;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpStatus;
 
 import javax.xml.xpath.XPathExpressionException;
 import java.io.File;
@@ -36,10 +33,8 @@
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.logging.Logger;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.HttpStatus;
 import org.apache.commons.httpclient.methods.multipart.FilePart;
-import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
 import org.apache.commons.httpclient.methods.multipart.Part;
 import org.apache.commons.httpclient.methods.multipart.StringPart;
 
@@ -287,7 +282,6 @@
     private String tagCloudURL;
     private StringBuilder tags = new StringBuilder();
     private LinkedHashSet<Integer> tagSet = new LinkedHashSet<Integer>(7);
-    private HttpClient httpClient;
 
     public UIDriver() throws XPathExpressionException {
         ctx = DriverContext.getContext();
@@ -399,12 +393,6 @@
 		String ifmod = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z").format(BASE_DATE);
 		cachedHeaders.put("If-Modified-Since", ifmod);
         isCached = cached();
-        /**
-        httpClient = new HttpClient();
-        httpClient.setConnectionTimeout(5000);
-         */
-        httpClient = ((ApacheHC3Transport) http).getHttpClient();
-        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
     }
 
     @BenchmarkOperation(name = "HomePage",
@@ -436,10 +424,9 @@
     }
 
     @BenchmarkOperation(name = "Login",
-    max90th = 1,
-    timing = Timing.MANUAL)
+                        max90th = 1,
+                        timing = Timing.AUTO)
     public void doLogin() throws IOException, Exception {
-        httpClient = new HttpClient();
         logger.finer("In doLogin");
         int randomId = 0; //use as password
         username = null;
@@ -451,16 +438,11 @@
         randomId = selectUserID();
         username = UserName.getUserName(randomId);
         logger.finer("Logging in as " + username + ", " + randomId);
-        PostMethod loginPost = constructLoginPost(randomId);
-		//loginPost.setFollowRedirects(true);
-
-        ctx.recordTime();
-
-        httpClient.executeMethod(loginPost);
+        String loginPost = constructLoginPost(randomId);
 
-        ctx.recordTime();
+        StringBuilder response = http.fetchURL(loginURL, loginPost);
 
-        int loginIdx = loginPost.getResponseBodyAsString().indexOf("Login:");
+        int loginIdx = response.indexOf("Login:");
         if (loginIdx != -1) {
             throw new Exception(" Found login prompt at index " + loginIdx);
         }
@@ -470,13 +452,12 @@
     }
 
     @BenchmarkOperation(name = "Logout",
-    max90th = 1,
-    timing = Timing.AUTO)
+                        max90th = 1,
+                        timing = Timing.AUTO)
     public void doLogout() throws IOException {
         if (isLoggedOn) {
             logger.finer("Logging off = " + isLoggedOn);
-            GetMethod logout = new GetMethod(logoutURL);
-            httpClient.executeMethod(logout);
+            http.readURL(logoutURL);
             cachedURLs.clear();
             isCached = cached();
             isLoggedOn = false;
@@ -510,7 +491,7 @@
     @BenchmarkOperation(
         name = "AddEvent",
         max90th = 4,
-        timing = Timing.MANUAL)
+        timing = Timing.AUTO)
     @NegativeExponential(
         cycleType = CycleType.CYCLETIME,
         cycleMean = 5000,
@@ -523,12 +504,7 @@
             throw new IOException("User not logged when trying to add an event");
         }
 
-        ctx.recordTime();
-        loadStatics(addEventStatics);
-
-        GetMethod eventForm = new GetMethod(addEventURL);
-
-        ArrayList<Part> params = new ArrayList();
+        ArrayList<Part> params = new ArrayList<Part>();
         String[] parameters = prepareEvent();
         if (parameters[0] == null || parameters[0].length() == 0) {
             logger.warning("Socialevent title is null!");
@@ -559,12 +535,13 @@
         params.add(new NullContentTypePart("address[country]", addressArr[5]));
 
         params.add(new FilePart("event_image", eventImg, "image/jpeg", null));
-        params.add(new FilePart("event_document", eventPdf, "application/pdf", null));
+        params.add(new FilePart("event_document", eventPdf, "application/pdf",
+                   null));
         params.add(new NullContentTypePart("commit", "Create"));
 
         // GET the new event form within a user session
-        httpClient.executeMethod(eventForm);
-        String responseBuffer = eventForm.getResponseBodyAsString();
+        StringBuilder responseBuffer = http.fetchURL(addEventURL);
+        loadStatics(addEventStatics);
         if (responseBuffer.length() == 0) {
             throw new IOException("Received empty response");
         }
@@ -575,22 +552,30 @@
             params.add(new NullContentTypePart("authenticity_token", token));
         }
 
-        Part[] parts = new Part[params.size()];
-        parts = params.toArray(parts);
-        PostMethod post = new PostMethod(addEventResultURL);
-        post.setRequestEntity(
-                new MultipartRequestEntity(parts, post.getParams()));
-
-        doMultiPartPost(post, "Event was successfully created.");
-
+        StringBuilder response = ((ApacheHC3Transport) http).
+                                 fetchURL(addEventResultURL, params);
+        
+        int status = http.getResponseCode();
+        String[] locationHeader = http.getResponseHeader("location");
 
-        ctx.recordTime();
+		if (locationHeader != null) {
+			logger.fine("redirectLocation is " + locationHeader[0]);
+			response = http.fetchURL(locationHeader[0]);
+        } else if (status != HttpStatus.SC_OK) {
+            throw new IOException("Multipart post did not work, returned " +
+                                  "status code: " + status);
+        }
+        String message = "Event was successfully created.";
+        if (response.indexOf(message) == -1) {
+            throw new Exception("Could not find success message '" + message +
+                                " in result body");
+        }
         ++driverMetrics.addEventTotal;
     }
 
     @BenchmarkOperation(name = "AddPerson",
-    max90th = 3,
-    timing = Timing.MANUAL)
+        max90th = 3,
+        timing = Timing.AUTO)
     @NegativeExponential(
         cycleType = CycleType.CYCLETIME,
         cycleMean = 5000,
@@ -603,10 +588,6 @@
             doLogout();
         }
 
-        ctx.recordTime(); // Start critical section
-        http.readURL(addPersonURL);
-        loadStatics(addPersonStatics);
-
         String[] parameters = preparePerson();
         ArrayList<Part> params = new ArrayList();
         // Debug
@@ -619,7 +600,8 @@
         http.readURL(checkNameURL, "name=" + parameters[0]);
 
         params.add(new NullContentTypePart("user[password]", parameters[1]));
-        params.add(new NullContentTypePart("user[password_confirmation]", parameters[1]));
+        params.add(new NullContentTypePart("user[password_confirmation]",
+                                                            parameters[1]));
         params.add(new NullContentTypePart("user[firstname]", parameters[2]));
         params.add(new NullContentTypePart("user[lastname]", parameters[3]));
         params.add(new NullContentTypePart("user[email]", parameters[4]));
@@ -634,17 +616,31 @@
         params.add(new NullContentTypePart("user[timezone]", parameters[7]));
         params.add(new NullContentTypePart("user[summary]", parameters[6]));
         params.add(new FilePart("user_image", personImg, "image/jpeg", null));
-        Part[] parts = new Part[params.size()];
-        parts = params.toArray(parts);
-        PostMethod post = new PostMethod(addPersonResultURL);
-        post.setRequestEntity(
-                new MultipartRequestEntity(parts, post.getParams()));
-        doMultiPartPost(post, "Succeeded in creating user.");
 
-        ctx.recordTime();
+        http.readURL(addPersonURL);
+        loadStatics(addPersonStatics);
+        StringBuilder response = ((ApacheHC3Transport)http).
+                                 fetchURL(addPersonResultURL, params);
+        
+        int status = http.getResponseCode();
+        String[] locationHeader = http.getResponseHeader("location");
+
+		if (locationHeader != null) {
+			logger.fine("redirectLocation is " + locationHeader[0]);
+			response = http.fetchURL(locationHeader[0]);
+        } else if (status != HttpStatus.SC_OK) {
+            throw new IOException("Multipart post did not work, returned " +
+                                  "status code: " + status);
+        }
+        String message = "Succeeded in creating user.";
+        if (response.indexOf(message) == -1) {
+            throw new Exception("Could not find success message '" + message +
+                    " in result body");
+        }
         ++driverMetrics.addPersonTotal;
     }
 
+
     @BenchmarkOperation(name = "EventDetail",
     max90th = 2,
     timing = Timing.AUTO)
@@ -692,27 +688,24 @@
 
     @BenchmarkOperation(name = "PersonDetail",
     max90th = 2,
-    timing = Timing.MANUAL)
+    timing = Timing.AUTO)
     public void doPersonDetail() throws IOException {
         logger.finer("doPersonDetail");
         StringBuilder buffer = new StringBuilder(fileServiceURL.length() + 20);
         //buffer.append(fileServiceURL).append("file=p");
 
-        ctx.recordTime();
         // Shanti: No need to be logged on to see user
         /**
         if (isLoggedOn) {
          **/
         int id = random.random(1, ScaleFactors.users);
-        GetMethod personDetailGet = new GetMethod(personDetailURL + id);
-        httpClient.executeMethod(personDetailGet);
-        StringBuilder responseBuffer = new StringBuilder(personDetailGet.getResponseBodyAsString());
-        if (responseBuffer.length() == 0) {
+        StringBuilder response = http.fetchURL(personDetailURL + id);
+        if (response.length() == 0) {
             throw new IOException("Received empty response");
         }
-        Set<String> images = parseImages(responseBuffer);
+        Set<String> images = parseImages(response);
         loadImages(images);
-        String event = RandomUtil.randomEvent(random, responseBuffer);
+        String event = RandomUtil.randomEvent(random, response);
         if (event != null) {
             selectedEvent = event;
         }
@@ -725,23 +718,22 @@
         http.fetchURL(homepageURL);
         }
          ***/
-        ctx.recordTime();
     }
 
     public void doAddAttendee() throws Exception {
         //can only add yourself (one attendee) to party
         // Need to add header that will request js instead of
         // html. This will prevent the redirect.
-        PostMethod attendeePost = new PostMethod(addAttendeeURL +
-                selectedEvent + "/attend");
-        Header header = new Header("Accept", "text/javascript");
-        attendeePost.setRequestHeader(header);
-        int status = httpClient.executeMethod(attendeePost);
+        HashMap<String, String> header = new HashMap<String, String>(1);
+        header.put("Accept", "text/javascript");
+		// Need to send only post request, get doesn't work. So send null post.
+        StringBuilder response = http.fetchURL(addAttendeeURL +
+                selectedEvent + "/attend", "", header);
+        int status = http.getResponseCode();
         if (status != HttpStatus.SC_OK) {
             throw new Exception("Add attendee returned: " + status);
         }
-        String buffer = attendeePost.getResponseBodyAsString();
-        if (buffer.indexOf("You are attending") == -1) {
+        if (response.indexOf("You are attending") == -1) {
             logger.warning("Add attendee failed, possible race condition");
         // throw new Exception("Add attendee failed, could not find: You are attending");
         }
@@ -795,7 +787,8 @@
         return urlSet;
     }
 
-    private String parseAuthToken(String responseBuffer) throws IOException {
+    private String parseAuthToken(StringBuilder responseBuffer)
+            throws IOException {
 
         int idx = responseBuffer.indexOf("authenticity_token");
 
@@ -908,57 +901,14 @@
         return returnList;
     }
 
-    private PostMethod constructLoginPost(int randomId) {
-        /***
-        ArrayList<Part> loginparams = new ArrayList();
-        loginparams.add(new NullContentTypePart("users[username]", username));
-        loginparams.add(new NullContentTypePart("users[password]", String.valueOf(randomId)));
-        loginparams.add(new NullContentTypePart("submit", "Login"));
-         ***/
-        PostMethod loginPost = new PostMethod(loginURL);
+    private String constructLoginPost(int randomId) {
+        StringBuilder postString = new StringBuilder();
+        postString.append("users[username]=").append(username);
+        postString.append("&users[password]=").append(randomId);
+        postString.append("&submit=").append("Login");
 
-        // loginPost.setFollowRedirects(true);
-        loginPost.addParameter("users[username]", username);
-        loginPost.addParameter("users[password]", String.valueOf(randomId));
-        loginPost.addParameter("submit", "Login");
+        return postString.toString();
 
-        return loginPost;
-
-    }
-
-    public void doMultiPartPost(PostMethod post, String message)
-            throws Exception {
-        logger.finer("In doMultiPartPost()");
-
-        if (httpClient == null) {
-            logger.warning("HttpClient is null, this shouldn't happen");
-            HttpClient httpClient = ((ApacheHC3Transport) http).getHttpClient();
-            httpClient.getHttpConnectionManager().getParams().
-                    setConnectionTimeout(5000);
-        }
-
-        int status = httpClient.executeMethod(post);
-		Header locationHeader = post.getResponseHeader("location");
-		if (locationHeader != null) {
-			/*********
-            // Manually follow redirect
-            // GetMethod get = new GetMethod(post.getResponseHeader("Location").getValue());
-            httpClient.executeMethod(get);
-            String buffer = get.getResponseBodyAsString();
-            int idx = buffer.indexOf(message);
-            if (idx == -1) {
-                throw new Exception("Could not find success message '" + message + "' in result body");
-            }
-			*********/
-			logger.fine("locationHeader is not null");
-			String redirectLocation = locationHeader.getValue();
-			// Release the connection after we get location
-			post.releaseConnection();
-			logger.fine("redirectLocation is " + redirectLocation);
-			http.fetchURL(redirectLocation);
-        } else if (status != HttpStatus.SC_OK) {
-            throw new IOException("Multipart post did not work, returned status code: " + status);
-        }
     }
 
     public String[] prepareEvent() {
@@ -1152,11 +1102,12 @@
             cnt = r.getOpsCountSteady("TagSearch");
             el[5] = new Element();
             el[5].description = "Average images on Tag Search Results";
-            el[5].target = "&gt;= 3.6";
+            //el[5].target = "&gt;= 3.6";
+            el[5].target = "&gt;= 0";
             if (cnt > 0) {
                 double avgImgs = tagSearchImages / (double) cnt;
                 el[5].result = String.format("%.2f", avgImgs);
-                if (avgImgs >= 3.6d) {
+                if (avgImgs >= 0) {
                     el[5].passed = Boolean.TRUE;
                 } else {
                     el[5].passed = Boolean.FALSE;