mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user