Various fixes for the benchmark loader client. This can now do the job of loading, but still needs a few tweaks to dump summary reports.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6784 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-09-14 11:16:05 +00:00
parent 6059a17375
commit 6a83f91a6b
4 changed files with 177 additions and 41 deletions

View File

@@ -24,6 +24,9 @@
*/
package org.alfresco.repo.model.filefolder.loader;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -43,6 +46,7 @@ public abstract class AbstractLoaderThread extends Thread
protected final int testLoadDepth;
private AtomicBoolean mustStop;
Random random;
public AbstractLoaderThread(
LoaderSession session,
@@ -60,6 +64,7 @@ public abstract class AbstractLoaderThread extends Thread
this.testLoadDepth = testLoadDepth;
this.mustStop = new AtomicBoolean(false);
this.random = new Random();
}
/**
@@ -75,8 +80,6 @@ public abstract class AbstractLoaderThread extends Thread
@Override
public void run()
{
Random random = new Random();
int testCount = 0;
while (!mustStop.get())
{
@@ -93,9 +96,11 @@ public abstract class AbstractLoaderThread extends Thread
NodeRef workingRootNodeRef = session.getWorkingRootNodeRefs().get(nodeIndex);
long startTime = System.currentTimeMillis();
doLoading(serverProxy, workingRootNodeRef);
String msg = doLoading(serverProxy, workingRootNodeRef);
long endTime = System.currentTimeMillis();
// Dump the specifics of the load
// Have we done this enough?
testCount++;
if (testCount > testTotal)
@@ -121,12 +126,45 @@ public abstract class AbstractLoaderThread extends Thread
}
}
private void dumpLoadSpecifics(long startTime, long endTime, String msg)
{
}
/**
* @param serverProxy the server to load
* @param workingRootNodeRef the root of the hierarchy to use
* @return a brief description of the loading
* @throws Exception any exception will be handled
*/
protected abstract void doLoading(
protected abstract String doLoading(
LoaderServerProxy serverProxy,
NodeRef workingRootNodeRef) throws Exception;
protected List<String> chooseFolderPath()
{
int[] folderProfiles = session.getFolderProfiles();
// We work through these until we get the required depth.
// The root node is ignored as it acts as the search root
List<String> path = new ArrayList<String>(testLoadDepth);
for (int i = 1; i < folderProfiles.length; i++)
{
int folderProfile = folderProfiles[i];
int randomFolderId = random.nextInt(folderProfile);
String name = String.format("folder-%05d", randomFolderId);
path.add(name);
}
return path;
}
protected File getFile() throws Exception
{
File[] files = session.getSourceFiles();
File file = files[random.nextInt(files.length)];
if (!file.exists() || file.isDirectory())
{
throw new LoaderClientException("Cannot find loading file: " + file);
}
return file;
}
}

View File

@@ -109,7 +109,7 @@ public class FileFolderRemoteLoader
for (AbstractLoaderThread thread : threads)
{
String summary = thread.getSummary();
session.logNormal(summary);
session.logSummary(summary);
}
}
@@ -178,6 +178,13 @@ public class FileFolderRemoteLoader
{
folderProfiles[i] = folderProfilesList.get(i);
}
if (folderProfiles.length == 0 || folderProfiles[0] != 1)
{
throw new LoaderClientException(
"'" + PROP_SESSION_FOLDER_PROFILE + "' must always start with '1', " +
"which represents the root of the hierarchy, and have at least one other value. " +
"E.g. '1, 3'");
}
// Construct
LoaderSession session = new LoaderSession(
@@ -313,14 +320,29 @@ public class FileFolderRemoteLoader
// Run
app.start();
synchronized(app)
{
app.wait(1000L);
}
// System.out.println(""
// Now lower this threads priority
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// Wait for a quit signal
System.out.println("Running test " + app.session.getName() + ". Enter 'q' to quit");
while (true)
{
int keyPress = System.in.read();
if (keyPress == 'Q' || keyPress == 'q')
{
break;
}
else if (System.in.available() > 0)
{
// Don't wait, just process
continue;
}
// No more keypresses so just wait
Thread.yield();
}
// Finish off
app.stop();
System.out.println("The test is complete.");
}
catch (LoaderClientException e)
{

View File

@@ -27,6 +27,7 @@ package org.alfresco.repo.model.filefolder.loader;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
@@ -64,8 +65,9 @@ public class LoaderSession
private List<LoaderServerProxy> remoteServers;
private List<NodeRef> workingRootNodeRefs;
private File[] sourceFiles;
private OutputStream outStream;
private OutputStream errStream;
private OutputStream outVerbose;
private OutputStream outSummary;
private OutputStream outError;
/**
*
@@ -153,19 +155,23 @@ public class LoaderSession
// Construct output and error files
long time = System.currentTimeMillis();
File outFile = new File("./LoaderSession-" + name + "-"+ time + "-out.txt");
File errFile = new File("./LoaderSession-" + name + "-"+ time + "-err.txt");
outStream = new BufferedOutputStream(new FileOutputStream(outFile));
errStream = new BufferedOutputStream(new FileOutputStream(errFile));
File fileVerbose = new File("./LoaderSession-" + name + "-"+ time + "-verbose.txt");
File fileSummary = new File("./LoaderSession-" + name + "-"+ time + "-summary.txt");
File fileError = new File("./LoaderSession-" + name + "-"+ time + "-error.txt");
outVerbose = new BufferedOutputStream(new FileOutputStream(fileVerbose));
outSummary = new BufferedOutputStream(new FileOutputStream(fileSummary));
outError = new BufferedOutputStream(new FileOutputStream(fileError));
}
public synchronized void close()
{
try { outStream.close(); } catch (Throwable e) {}
try { errStream.close(); } catch (Throwable e) {}
try { outVerbose.close(); } catch (Throwable e) {}
try { outSummary.close(); } catch (Throwable e) {}
try { outError.close(); } catch (Throwable e) {}
outStream = null;
errStream = null;
outVerbose = null;
outSummary = null;
outError = null;
}
/**
@@ -337,50 +343,75 @@ public class LoaderSession
}
}
public void logVerbose(String msg)
private void writeLineEnding(OutputStream out) throws IOException
{
if (!verbose)
if (File.separatorChar == '/')
{
// Just ignore it
// It's unix
out.write('\n');
}
else
{
// Windows
out.write('\r');
out.write('\n');
}
logNormal(msg);
}
public synchronized void logNormal(String msg)
public synchronized void logVerbose(String msg)
{
if (outStream == null)
if (!verbose || outVerbose == null)
{
return;
}
try
{
byte[] bytes = msg.getBytes("UTF-8");
outStream.write(bytes);
outStream.write('\n');
outStream.flush();
outVerbose.write(bytes);
writeLineEnding(outVerbose);
outVerbose.flush();
}
catch (Throwable e)
{
System.err.println("Failed to write message to output file: " + e.getMessage());
System.err.println("Failed to write message to verbose file: " + e.getMessage());
}
}
public synchronized void logSummary(String msg)
{
if (outSummary == null)
{
return;
}
try
{
byte[] bytes = msg.getBytes("UTF-8");
outSummary.write(bytes);
writeLineEnding(outSummary);
outSummary.flush();
}
catch (Throwable e)
{
System.err.println("Failed to write message to summary file: " + e.getMessage());
}
}
public synchronized void logError(String msg)
{
if (errStream == null)
if (outSummary == null)
{
return;
}
try
{
byte[] bytes = msg.getBytes("UTF-8");
errStream.write(bytes);
outStream.write('\n');
errStream.flush();
outSummary.write(bytes);
writeLineEnding(outError);
outSummary.flush();
}
catch (Throwable e)
{
System.err.println("Failed to write message to output file: " + e.getMessage());
System.err.println("Failed to write message to error file: " + e.getMessage());
}
}
}

View File

@@ -24,7 +24,14 @@
*/
package org.alfresco.repo.model.filefolder.loader;
import java.io.File;
import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.util.GUID;
import org.springframework.util.FileCopyUtils;
/**
* A description of what the remote loader should do.
@@ -44,14 +51,52 @@ public class LoaderUploadThread extends AbstractLoaderThread
}
@Override
protected void doLoading(LoaderServerProxy serverProxy, NodeRef workingRootNodeRef) throws Exception
protected String doLoading(LoaderServerProxy serverProxy, NodeRef workingRootNodeRef) throws Exception
{
int totalNodeCount = serverProxy.loaderRemote.getNodeCount(
serverProxy.ticket);
int storeNodeCount = serverProxy.loaderRemote.getNodeCount(
// Get a random folder
List<String> folderPath = super.chooseFolderPath();
// Make sure the folder exists
FileInfo folderInfo = serverProxy.fileFolderRemote.makeFolders(
serverProxy.ticket,
workingRootNodeRef.getStoreRef());
session.logVerbose("Nodes: " + totalNodeCount + ". Store Nodes: " + storeNodeCount);
workingRootNodeRef,
folderPath,
ContentModel.TYPE_FOLDER);
// Get a random file
File file = getFile();
byte[] bytes = FileCopyUtils.copyToByteArray(file);
// Get the extension
String filename = GUID.generate();
int index = file.getName().lastIndexOf('.');
if (index > 0)
{
String ext = file.getName().substring(index + 1, file.getName().length());
filename += ("." + ext);
}
// Upload it
NodeRef folderNodeRef = folderInfo.getNodeRef();
FileInfo fileInfo = serverProxy.fileFolderRemote.create(
serverProxy.ticket,
folderNodeRef,
filename,
ContentModel.TYPE_CONTENT);
NodeRef fileNodeRef = fileInfo.getNodeRef();
serverProxy.fileFolderRemote.putContent(serverProxy.ticket, fileNodeRef, bytes, filename);
// Done
String msg = String.format("Uploaded %s to folder: %s", filename, folderPath.toString());
session.logVerbose(msg);
return msg;
// int totalNodeCount = serverProxy.loaderRemote.getNodeCount(
// serverProxy.ticket);
// int storeNodeCount = serverProxy.loaderRemote.getNodeCount(
// serverProxy.ticket,
// workingRootNodeRef.getStoreRef());
// session.logVerbose("Nodes: " + totalNodeCount + ". Store Nodes: " + storeNodeCount);
}
@Override