diff --git a/source/java/org/alfresco/repo/model/filefolder/loader/AbstractLoaderThread.java b/source/java/org/alfresco/repo/model/filefolder/loader/AbstractLoaderThread.java index b00fb240ce..0a637b878c 100644 --- a/source/java/org/alfresco/repo/model/filefolder/loader/AbstractLoaderThread.java +++ b/source/java/org/alfresco/repo/model/filefolder/loader/AbstractLoaderThread.java @@ -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); } - /** - *
- * name, average, - *- * - * @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); } + /** + *
+ * NAME+36\tCOUNT \tTIME \tAVERAGE TIME \tPER SECOND \tDESCRIPTION + *+ */ 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); + } + + /** + *
+ * NAME+36\tCOUNT \tTOTAL TIME \tAVERAGE TIME \tPER SECOND \tDESCRIPTION + *+ * + * @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(); } /** diff --git a/source/java/org/alfresco/repo/model/filefolder/loader/FileFolderRemoteLoader.java b/source/java/org/alfresco/repo/model/filefolder/loader/FileFolderRemoteLoader.java index 351dce2281..01904c1448 100644 --- a/source/java/org/alfresco/repo/model/filefolder/loader/FileFolderRemoteLoader.java +++ b/source/java/org/alfresco/repo/model/filefolder/loader/FileFolderRemoteLoader.java @@ -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 { diff --git a/source/java/org/alfresco/repo/model/filefolder/loader/LoaderListFoldersThread.java b/source/java/org/alfresco/repo/model/filefolder/loader/LoaderListFoldersThread.java index 4974837a5f..1c161c14b3 100644 --- a/source/java/org/alfresco/repo/model/filefolder/loader/LoaderListFoldersThread.java +++ b/source/java/org/alfresco/repo/model/filefolder/loader/LoaderListFoldersThread.java @@ -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); } /** diff --git a/source/java/org/alfresco/repo/model/filefolder/loader/LoaderSession.java b/source/java/org/alfresco/repo/model/filefolder/loader/LoaderSession.java index 9137d82159..5b6898f4e3 100644 --- a/source/java/org/alfresco/repo/model/filefolder/loader/LoaderSession.java +++ b/source/java/org/alfresco/repo/model/filefolder/loader/LoaderSession.java @@ -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