Moved the verbose option onto the individual thread declarations e.g.

session.name=TEST
  session.folderProfile=1, 10, 10, 10, 10, 10
  session.rmiUrls=rmi://localhost:50500/
  session.sourceDir=c:/temp
  session.storeIdentifiers=TEST-01, TEST-02, TEST-03, TEST-04, TEST-05
  
  test.load.upload.fast=2, 0, 10000, 6, true
  test.load.totals.basic=1, 15000, 0, 0, true
Neatened up the output to be fixed width.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6814 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley 2007-09-18 15:21:20 +00:00
parent 9d40827835
commit 989a9b0a50
6 changed files with 104 additions and 74 deletions

View File

@ -44,6 +44,7 @@ public abstract class AbstractLoaderThread extends Thread
protected final long testPeriod;
protected final long testTotal;
protected final long testLoadDepth;
protected final boolean verbose;
private AtomicBoolean mustStop;
private Random random;
@ -51,14 +52,14 @@ public abstract class AbstractLoaderThread extends Thread
// Statistics
private int statCount;
private double statTotalMs;
private double statAverageMs;
public AbstractLoaderThread(
LoaderSession session,
String loaderName,
long testPeriod,
long testTotal,
long testLoadDepth)
long testLoadDepth,
boolean verbose)
{
super(LoaderSession.THREAD_GROUP, "LoaderThread-" + loaderName);
@ -67,13 +68,13 @@ public abstract class AbstractLoaderThread extends Thread
this.testPeriod = testPeriod;
this.testTotal = testTotal < 1 ? Integer.MAX_VALUE : testTotal;
this.testLoadDepth = testLoadDepth;
this.verbose = verbose;
this.mustStop = new AtomicBoolean(false);
this.random = new Random();
this.statCount = 0;
this.statTotalMs = 0.0D;
this.statAverageMs = 0.0D;
}
/**
@ -84,23 +85,6 @@ public abstract class AbstractLoaderThread extends Thread
mustStop.set(true);
}
/**
* <pre>
* name, average,
* </pre>
*
* @return Returns the summary of the results, in the same format as the verbose output
*/
public String getSummary()
{
// Summarize the results
StringBuilder sb = new StringBuilder();
sb.append(loaderName).append("\t")
.append(String.format("%5.1f", statAverageMs)).append("\t")
.append("");
return sb.toString();
}
@Override
public void run()
{
@ -161,18 +145,54 @@ public abstract class AbstractLoaderThread extends Thread
double delta = ((double)(endTime - startTime) / 1000.0 / 1000.0);
// Now recalculate the average
statTotalMs += delta;
statAverageMs = (statTotalMs / (double)statCount);
}
/**
* <pre>
* NAME+36\tCOUNT \tTIME \tAVERAGE TIME \tPER SECOND \tDESCRIPTION
* </pre>
*/
private void logVerbose(long startTime, long endTime, String msg)
{
double delta = ((double)(endTime - startTime) / 1000.0 / 1000.0 );
double delta = ((double)(endTime - startTime) / 1000.0 / 1000.0 / 1000.0);
double statTotalSec = statTotalMs / 1000.0;
double statPerSec = statCount / statTotalSec;
double statAveSec = statTotalSec / statCount;
// Summarize the results
StringBuilder sb = new StringBuilder();
sb.append(loaderName).append("\t")
.append(String.format("%5.1f", delta)).append("\t")
.append(msg);
session.logVerbose(sb.toString());
sb
.append(String.format("%40s", loaderName)).append("\t")
.append(String.format("%15.0f", (float)statCount)).append("\t")
.append(String.format("%15.3f", delta)).append("\t")
.append(String.format("%15.3f", statPerSec)).append("\t")
.append(String.format("%15.3f", statAveSec)).append("\t")
.append(msg);
session.logVerbose(sb.toString(), verbose);
}
/**
* <pre>
* NAME+36\tCOUNT \tTOTAL TIME \tAVERAGE TIME \tPER SECOND \tDESCRIPTION
* </pre>
*
* @return Returns the summary of the results
*/
public String getSummary()
{
double statTotalSec = statTotalMs / 1000.0;
double statPerSec = statCount / statTotalSec;
double statAveSec = statTotalSec / statCount;
// Summarize the results
StringBuilder sb = new StringBuilder();
sb
.append(String.format("%40s", loaderName)).append("\t")
.append(String.format("%15.0f", (float)statCount)).append("\t")
.append(String.format("%15.3f", statTotalSec)).append("\t")
.append(String.format("%15.3f", statPerSec)).append("\t")
.append(String.format("%15.3f", statAveSec)).append("\t")
.append("");
return sb.toString();
}
/**

View File

@ -77,17 +77,24 @@ public class FileFolderRemoteLoader
// Log the initial summaries
String summary = session.getSummary();
session.logVerbose(summary);
session.logVerbose(summary, true);
session.logSummary(summary);
session.logError(summary);
// Header the outputs
session.logVerbose(LoaderSession.getLineEnding(), true);
session.logVerbose(COLUMNS_VERBOSE, true);
session.logSummary(LoaderSession.getLineEnding());
session.logSummary("NAME\tTIME\tDESCRIPTION");
session.logVerbose(LoaderSession.getLineEnding());
session.logVerbose("NAME\tTIME\tDESCRIPTION");
session.logSummary(COLUMNS_SUMMARY);
}
private static final String COLUMNS_VERBOSE =
String.format("%40s\t%15s\t%15s\t%15s\t%15s\t%15s",
"NAME", "COUNT", "TIME", "AVERAGE TIME", "PER SECOND", "DESCRIPTION");
private static final String COLUMNS_SUMMARY =
String.format("%40s\t%15s\t%15s\t%15s\t%15s\t%15s",
"NAME", "COUNT", "TOTAL TIME", "AVERAGE TIME", "PER SECOND", "DESCRIPTION");
public synchronized void start()
{
if (session == null || threads == null)
@ -134,6 +141,7 @@ public class FileFolderRemoteLoader
public void dumpThreadSummaries()
{
System.out.println("");
System.out.println(COLUMNS_SUMMARY);
// Dump each thread's summary
for (AbstractLoaderThread thread : threads)
{
@ -143,7 +151,6 @@ public class FileFolderRemoteLoader
}
public static final String PROP_SESSION_NAME = "session.name";
public static final String PROP_SESSION_VERBOSE = "session.verbose";
public static final String PROP_SESSION_SOURCE_DIR = "session.sourceDir";
public static final String PROP_SESSION_STORE_IDENTIFIERS = "session.storeIdentifiers";
public static final String PROP_SESSION_RMI_URLS = "session.rmiUrls";
@ -158,10 +165,6 @@ public class FileFolderRemoteLoader
String name = properties.getProperty(PROP_SESSION_NAME);
FileFolderRemoteLoader.checkProperty(PROP_SESSION_STORE_IDENTIFIERS, name);
// Verbose
String verboseStr = properties.getProperty(PROP_SESSION_VERBOSE);
boolean verbose = verboseStr == null ? false : Boolean.parseBoolean(verboseStr);
// Source files
String sourceDirStr = properties.getProperty(PROP_SESSION_SOURCE_DIR);
File sourceDir = new File(sourceDirStr);
@ -222,7 +225,6 @@ public class FileFolderRemoteLoader
name,
rmiUrls,
storeRefs,
verbose,
sourceDir,
folderProfiles);
@ -263,23 +265,41 @@ public class FileFolderRemoteLoader
String valuesStr = properties.getProperty(propertyName);
FileFolderRemoteLoader.checkProperty(propertyName, valuesStr);
// Parse it into the well-known values
long[] values = new long[] {1, 0, -1, 1};
String[] strValues = new String[] {"1", "0", "0", "1", "false"};
int index = 0;
StringTokenizer tokenizer = new StringTokenizer(valuesStr, ",");
while (tokenizer.hasMoreTokens())
{
String value = tokenizer.nextToken().trim();
values[index] = Integer.parseInt(value);
if (value.length() > 0)
{
strValues[index] = value;
}
index++;
if (index >= values.length)
if (index >= strValues.length)
{
break;
}
}
long testCount = values[0];
long testPeriod = values[1];
long testTotal = values[2];
long testDepth = values[3];
long testCount = 1L;
long testPeriod = 0L;
long testTotal = 0L;
long testDepth = 1L;
boolean testVerbose = false;
try
{
testCount = Long.parseLong(strValues[0]);
testPeriod = Long.parseLong(strValues[1]);
testTotal = Long.parseLong(strValues[2]);
testDepth = Long.parseLong(strValues[3]);
testVerbose = Boolean.parseBoolean(strValues[4]);
}
catch (Throwable e)
{
throw new LoaderClientException(
"Unable to parse the loader configuration for '" + name + "'. " + LoaderSession.getLineEnding() +
"The correct format is [threadCount], [period(ms)], [total], [folder depth], [verbose]");
}
// Construct
for (int i = 0; i < testCount; i++)
@ -287,15 +307,15 @@ public class FileFolderRemoteLoader
AbstractLoaderThread thread = null;
if (type.equals("upload"))
{
thread = new LoaderUploadThread(session, name, testPeriod, testTotal, testDepth);
thread = new LoaderUploadThread(session, name, testPeriod, testTotal, testDepth, testVerbose);
}
else if (type.equals("totals"))
{
thread = new LoaderTotalsThread(session, name, testPeriod, testTotal, testDepth);
thread = new LoaderTotalsThread(session, name, testPeriod, testTotal, testDepth, testVerbose);
}
else if (type.equals("listFolders"))
{
thread = new LoaderListFoldersThread(session, name, testPeriod, testTotal, testDepth);
thread = new LoaderListFoldersThread(session, name, testPeriod, testTotal, testDepth, testVerbose);
}
else
{

View File

@ -44,9 +44,10 @@ public class LoaderListFoldersThread extends AbstractLoaderThread
String loaderName,
long testPeriod,
long testTotal,
long testLoadDepth)
long testLoadDepth,
boolean verbose)
{
super(session, loaderName, testPeriod, testTotal, testLoadDepth);
super(session, loaderName, testPeriod, testTotal, testLoadDepth, verbose);
}
/**

View File

@ -29,6 +29,7 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
@ -57,7 +58,6 @@ public class LoaderSession
private String name;
private Set<String> rmiUrls;
private Set<StoreRef> storeRefs;
private boolean verbose;
private File outputFile;
private File sourceDir;
private int[] folderProfiles;
@ -68,6 +68,7 @@ public class LoaderSession
private OutputStream outVerbose;
private OutputStream outSummary;
private OutputStream outError;
private long startTime;
/**
*
@ -78,7 +79,6 @@ public class LoaderSession
String name,
Set<String> rmiUrls,
Set<StoreRef> storeRefs,
boolean verbose,
File sourceDir,
int[] folderProfiles)
{
@ -87,7 +87,6 @@ public class LoaderSession
this.name = name;
this.rmiUrls = rmiUrls;
this.storeRefs = storeRefs;
this.verbose = verbose;
this.sourceDir = sourceDir;
this.folderProfiles = folderProfiles;
}
@ -161,6 +160,9 @@ public class LoaderSession
outVerbose = new BufferedOutputStream(new FileOutputStream(fileVerbose));
outSummary = new BufferedOutputStream(new FileOutputStream(fileSummary));
outError = new BufferedOutputStream(new FileOutputStream(fileError));
// Record the start time
startTime = System.currentTimeMillis();
}
public synchronized void close()
@ -345,25 +347,10 @@ public class LoaderSession
public static String getLineEnding()
{
try
{
if (File.separatorChar == '/')
{
// It's unix
return "\n";
}
else
{
return "\r\n";
}
}
catch (Throwable e)
{
return "\n";
}
return System.getProperty("line.separator", "\n");
}
public synchronized void logVerbose(String msg)
public synchronized void logVerbose(String msg, boolean verbose)
{
if (!verbose || outVerbose == null)
{
@ -452,8 +439,8 @@ public class LoaderSession
sb.append("Session name: ").append(name).append(getLineEnding())
.append("RMI URLS: ").append(rmiUrls).append(getLineEnding())
.append("Store References: ").append(storeRefs).append(getLineEnding())
.append("Verbose: ").append(Boolean.toString(verbose)).append(getLineEnding())
.append("Folder Profiles: ").append(folderProfilesAsList);
.append("Folder Profiles: ").append(folderProfilesAsList)
.append("Start Time: ").append(new Date(startTime));
return sb.toString();
}
}

View File

@ -40,9 +40,10 @@ public class LoaderTotalsThread extends AbstractLoaderThread
String loaderName,
long testPeriod,
long testTotal,
long testLoadDepth)
long testLoadDepth,
boolean verbose)
{
super(session, loaderName, testPeriod, testTotal, testLoadDepth);
super(session, loaderName, testPeriod, testTotal, testLoadDepth, verbose);
}
/**

View File

@ -63,9 +63,10 @@ public class LoaderUploadThread extends AbstractLoaderThread
String loaderName,
long testPeriod,
long testTotal,
long testLoadDepth)
long testLoadDepth,
boolean verbose)
{
super(session, loaderName, testPeriod, testTotal, testLoadDepth);
super(session, loaderName, testPeriod, testTotal, testLoadDepth, verbose);
}
/**