A new concurrency test. Fixed bug in the way that paths were being handed

back in AVMNodeDescriptors.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3255 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-06-27 17:39:27 +00:00
parent c6dfeb1c9d
commit 72f2ff989d
10 changed files with 561 additions and 19 deletions

View File

@@ -0,0 +1,120 @@
/*
* Copyright (C) 2006 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.repo.avm;
import java.util.ArrayList;
import java.util.List;
import org.alfresco.repo.avm.util.BulkLoader;
/**
* Another performance test that runs simultaneous crawlers that
* do operations with locality of reference.
* @author britt
*/
public class AVMCrawlTest extends AVMServiceTestBase
{
/**
* Do the crawl test.
*/
public void testCrawl()
{
int n = 4; // Number of Threads.
int m = 1; // How many multiples of content to start with.
long runTime = 1200000; // Ten minutes
fService.purgeRepository("main");
BulkLoader loader = new BulkLoader(fService);
for (int i = 0; i < m; i++)
{
fService.createRepository("d" + i);
loader.recursiveLoad("source", "d" + i + ":/");
fService.createSnapshot("d" + i);
}
long startTime = System.currentTimeMillis();
List<AVMCrawler> crawlers = new ArrayList<AVMCrawler>();
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < n; i++)
{
crawlers.add(new AVMCrawler(fService));
threads.add(new Thread(crawlers.get(i)));
threads.get(i).start();
}
while (true)
{
try
{
Thread.sleep(5000);
// Check that none of the crawlers has errored out.
for (AVMCrawler crawler : crawlers)
{
if (crawler.getError())
{
for (AVMCrawler craw : crawlers)
{
craw.setDone();
}
for (Thread thread : threads)
{
try
{
thread.join();
}
catch (InterruptedException ie)
{
// Do nothing.
}
}
fail();
}
}
}
catch (InterruptedException ie)
{
// Do nothing.
}
long now = System.currentTimeMillis();
if (now - startTime > runTime)
{
break;
}
}
for (AVMCrawler crawler : crawlers)
{
crawler.setDone();
}
for (Thread thread : threads)
{
try
{
thread.join();
}
catch (InterruptedException ie)
{
// Do nothing.
}
}
long ops = 0L;
for (AVMCrawler crawler : crawlers)
{
ops += crawler.getOpCount();
}
long time = System.currentTimeMillis() - startTime;
System.out.println("Ops/Sec: " + (ops * 1000L / time));
}
}

View File

@@ -0,0 +1,245 @@
/*
* Copyright (C) 2006 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.repo.avm;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* This is another tester designed to emulate more typical use patterns.
* @author britt
*/
class AVMCrawler implements Runnable
{
/**
* The AVMService to use.
*/
private AVMService fService;
/**
* The Operation count.
*/
private int fOpCount;
/**
* Whether we are done.
*/
private boolean fDone;
/**
* Whether an error has occurred.
*/
private boolean fError;
/**
* Random number generator.
*/
private Random fRandom;
/**
* Make up a new one.
* @param service The AVMService.
*/
public AVMCrawler(AVMService service)
{
fService = service;
fOpCount = 0;
fDone = false;
fError = false;
fRandom = new Random();
}
/**
* Tell this thread it is done.
*/
public void setDone()
{
fDone = true;
}
/**
* Is this thread in an error state.
*/
public boolean getError()
{
return fError;
}
/**
* Implementation of run.
*/
public void run()
{
try
{
while (!fDone)
{
doCrawl();
}
}
catch (Exception e)
{
fError = true;
}
}
/**
* Do one crawl.
*/
public void doCrawl()
{
try
{
List<RepositoryDescriptor> reps = fService.getRepositories();
fOpCount++;
RepositoryDescriptor repDesc = reps.get(fRandom.nextInt(reps.size()));
Map<String, AVMNodeDescriptor> rootListing = fService.getDirectoryListing(-1, repDesc.getName() + ":/");
fOpCount++;
// Get all the directories in the root.
List<AVMNodeDescriptor> dirs = new ArrayList<AVMNodeDescriptor>();
for (AVMNodeDescriptor desc : rootListing.values())
{
if (desc.isDirectory())
{
dirs.add(desc);
}
}
AVMNodeDescriptor dir = dirs.get(fRandom.nextInt(dirs.size()));
while (dir != null)
{
Map<String, AVMNodeDescriptor> listing = fService.getDirectoryListing(-1, dir.getPath());
fOpCount++;
List<AVMNodeDescriptor> files = new ArrayList<AVMNodeDescriptor>();
dirs = new ArrayList<AVMNodeDescriptor>();
for (AVMNodeDescriptor desc : listing.values())
{
if (desc.isDirectory())
{
dirs.add(desc);
}
else
{
files.add(desc);
}
}
// Read some files if there are any.
if (files.size() > 0)
{
for (int i = 0; i < 6; i++)
{
BufferedReader
reader = new BufferedReader
(new InputStreamReader
(fService.getFileInputStream(-1, files.get(fRandom.nextInt(files.size())).getPath())));
fOpCount++;
String line = reader.readLine();
System.out.println(line);
reader.close();
}
// Modify some files.
for (int i = 0; i < 2; i++)
{
String path = files.get(fRandom.nextInt(files.size())).getPath();
PrintStream out = new PrintStream(fService.getFileOutputStream(path));
out.println("I am " + path);
out.close();
fOpCount++;
}
}
// Create some files.
for (int i = 0; i < 1; i++)
{
String name = randomName();
PrintStream out = new PrintStream(fService.createFile(dir.getPath(), name));
fOpCount++;
out.println("I am " + name);
out.close();
}
// 1 in 100 times create a directory.
if (fRandom.nextInt(100) == 0)
{
String name = randomName();
fService.createDirectory(dir.getPath(), name);
fOpCount++;
}
if (listing.size() > 0)
{
// 1 in 100 times remove something
if (fRandom.nextInt(100) == 0)
{
List<String> names = new ArrayList<String>(listing.keySet());
fService.removeNode(dir.getPath(),
names.get(fRandom.nextInt(names.size())));
fOpCount++;
}
}
if (dirs.size() > 0)
{
dir = dirs.get(fRandom.nextInt(dirs.size()));
}
else
{
dir = null;
}
}
if (fRandom.nextInt(16) == 0)
{
fService.createSnapshot(repDesc.getName());
fOpCount++;
}
}
catch (Exception e)
{
if (e instanceof AVMNotFoundException ||
e instanceof AVMExistsException)
{
return;
}
e.printStackTrace(System.err);
throw new AVMException("Failure", e);
}
}
/**
* Get a random two character string.
* @return A random name.
*/
private String randomName()
{
char [] chars = new char[2];
chars[0] = (char)('a' + fRandom.nextInt(26));
chars[1] = (char)('a' + fRandom.nextInt(26));
return new String(chars);
}
/**
* Get the operation count.
*/
public int getOpCount()
{
return fOpCount;
}
}

View File

@@ -76,6 +76,14 @@ interface AVMNode
*/ */
public int getType(); public int getType();
/**
* Get the descriptor for this node.
* @param The Lookup.
* @return The descriptor for this node.
*/
public AVMNodeDescriptor getDescriptor(Lookup lPath, String name);
/** /**
* Get the descriptor for this node. * Get the descriptor for this node.
* @param The Lookup. * @param The Lookup.

View File

@@ -31,6 +31,11 @@ public class AVMNodeDescriptor
*/ */
private String fPath; private String fPath;
/**
* The base name of the path.
*/
private String fName;
/** /**
* The type of this node. AVMNodeType constants. * The type of this node. AVMNodeType constants.
*/ */
@@ -114,6 +119,7 @@ public class AVMNodeDescriptor
* @param length The file length. * @param length The file length.
*/ */
public AVMNodeDescriptor(String path, public AVMNodeDescriptor(String path,
String name,
int type, int type,
String creator, String creator,
String owner, String owner,
@@ -129,6 +135,7 @@ public class AVMNodeDescriptor
long length) long length)
{ {
fPath = path; fPath = path;
fName = name;
fType = type; fType = type;
fCreator = creator; fCreator = creator;
fOwner = owner; fOwner = owner;
@@ -342,6 +349,14 @@ public class AVMNodeDescriptor
return fLength; return fLength;
} }
/**
* Get the name of the node.
*/
public String getName()
{
return fName;
}
/** /**
* Get a debuggable string representation of this. * Get a debuggable string representation of this.
* @return A string representation of this. * @return A string representation of this.

View File

@@ -537,6 +537,40 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
} }
} }
/**
* Get the descriptor for this node.
* @param The Lookup.
* @return A descriptor.
*/
public AVMNodeDescriptor getDescriptor(Lookup lPath, String name)
{
BasicAttributes attrs = getBasicAttributes();
String path = lPath.getRepresentedPath();
if (path.endsWith("/"))
{
path = path + name;
}
else
{
path = path + "/" + name;
}
return new AVMNodeDescriptor(path,
name,
AVMNodeType.LAYERED_DIRECTORY,
attrs.getCreator(),
attrs.getOwner(),
attrs.getLastModifier(),
attrs.getCreateDate(),
attrs.getModDate(),
attrs.getAccessDate(),
getId(),
getVersionID(),
getUnderlying(lPath),
fPrimaryIndirection,
fLayerID,
-1);
}
/** /**
* Get the descriptor for this node. * Get the descriptor for this node.
* @param The Lookup. * @param The Lookup.
@@ -545,7 +579,10 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
public AVMNodeDescriptor getDescriptor(Lookup lPath) public AVMNodeDescriptor getDescriptor(Lookup lPath)
{ {
BasicAttributes attrs = getBasicAttributes(); BasicAttributes attrs = getBasicAttributes();
return new AVMNodeDescriptor(lPath.getRepresentedPath(), String path = lPath.getRepresentedPath();
String name = path.substring(path.lastIndexOf("/") + 1);
return new AVMNodeDescriptor(path,
name,
AVMNodeType.LAYERED_DIRECTORY, AVMNodeType.LAYERED_DIRECTORY,
attrs.getCreator(), attrs.getCreator(),
attrs.getOwner(), attrs.getOwner(),
@@ -583,6 +620,7 @@ class LayeredDirectoryNodeImpl extends DirectoryNodeImpl implements LayeredDirec
parentIndirection + "/" + name; parentIndirection + "/" + name;
} }
return new AVMNodeDescriptor(path, return new AVMNodeDescriptor(path,
name,
AVMNodeType.LAYERED_DIRECTORY, AVMNodeType.LAYERED_DIRECTORY,
attrs.getCreator(), attrs.getCreator(),
attrs.getOwner(), attrs.getOwner(),

View File

@@ -141,6 +141,40 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
return "[LF:" + getId() + ":" + fIndirection + "]"; return "[LF:" + getId() + ":" + fIndirection + "]";
} }
/**
* Get the descriptor for this node.
* @param The Lookup.
* @return A descriptor.
*/
public AVMNodeDescriptor getDescriptor(Lookup lPath, String name)
{
BasicAttributes attrs = getBasicAttributes();
String path = lPath.getRepresentedPath();
if (path.endsWith("/"))
{
path = path + name;
}
else
{
path = path + "/" + name;
}
return new AVMNodeDescriptor(path,
name,
AVMNodeType.LAYERED_FILE,
attrs.getCreator(),
attrs.getOwner(),
attrs.getLastModifier(),
attrs.getCreateDate(),
attrs.getModDate(),
attrs.getAccessDate(),
getId(),
getVersionID(),
getUnderlying(lPath),
false,
-1,
0);
}
/** /**
* Get the descriptor for this node. * Get the descriptor for this node.
* @param The Lookup. * @param The Lookup.
@@ -149,7 +183,9 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
public AVMNodeDescriptor getDescriptor(Lookup lPath) public AVMNodeDescriptor getDescriptor(Lookup lPath)
{ {
BasicAttributes attrs = getBasicAttributes(); BasicAttributes attrs = getBasicAttributes();
return new AVMNodeDescriptor(lPath.getRepresentedPath(), String path = lPath.getRepresentedPath();
return new AVMNodeDescriptor(path,
path.substring(path.lastIndexOf("/") + 1),
AVMNodeType.LAYERED_FILE, AVMNodeType.LAYERED_FILE,
attrs.getCreator(), attrs.getCreator(),
attrs.getOwner(), attrs.getOwner(),
@@ -177,6 +213,7 @@ class LayeredFileNodeImpl extends FileNodeImpl implements LayeredFileNode
BasicAttributes attrs = getBasicAttributes(); BasicAttributes attrs = getBasicAttributes();
String path = parentPath.endsWith("/") ? parentPath + name : parentPath + "/" + name; String path = parentPath.endsWith("/") ? parentPath + name : parentPath + "/" + name;
return new AVMNodeDescriptor(path, return new AVMNodeDescriptor(path,
name,
AVMNodeType.LAYERED_FILE, AVMNodeType.LAYERED_FILE,
attrs.getCreator(), attrs.getCreator(),
attrs.getOwner(), attrs.getOwner(),

View File

@@ -338,6 +338,11 @@ class Lookup
return builder.toString(); return builder.toString();
} }
public String getBaseName()
{
return fComponents.get(fPosition).getName();
}
/** /**
* Acquire locks for writing, in path lookup order. * Acquire locks for writing, in path lookup order.
*/ */

View File

@@ -263,6 +263,40 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
assert false : "Should never happen."; assert false : "Should never happen.";
} }
/**
* Get the descriptor for this node.
* @param The Lookup.
* @return A descriptor.
*/
public AVMNodeDescriptor getDescriptor(Lookup lPath, String name)
{
BasicAttributes attrs = getBasicAttributes();
String path = lPath.getRepresentedPath();
if (path.endsWith("/"))
{
path = path + name;
}
else
{
path = path + "/" + name;
}
return new AVMNodeDescriptor(path,
name,
AVMNodeType.PLAIN_DIRECTORY,
attrs.getCreator(),
attrs.getOwner(),
attrs.getLastModifier(),
attrs.getCreateDate(),
attrs.getModDate(),
attrs.getAccessDate(),
getId(),
getVersionID(),
null,
false,
-1,
-1);
}
/** /**
* Get the descriptor for this node. * Get the descriptor for this node.
* @param The Lookup. * @param The Lookup.
@@ -271,7 +305,9 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
public AVMNodeDescriptor getDescriptor(Lookup lPath) public AVMNodeDescriptor getDescriptor(Lookup lPath)
{ {
BasicAttributes attrs = getBasicAttributes(); BasicAttributes attrs = getBasicAttributes();
return new AVMNodeDescriptor(lPath.getRepresentedPath(), String path = lPath.getRepresentedPath();
return new AVMNodeDescriptor(path,
path.substring(path.lastIndexOf("/") + 1),
AVMNodeType.PLAIN_DIRECTORY, AVMNodeType.PLAIN_DIRECTORY,
attrs.getCreator(), attrs.getCreator(),
attrs.getOwner(), attrs.getOwner(),
@@ -299,6 +335,7 @@ class PlainDirectoryNodeImpl extends DirectoryNodeImpl implements PlainDirectory
BasicAttributes attrs = getBasicAttributes(); BasicAttributes attrs = getBasicAttributes();
String path = parentPath.endsWith("/") ? parentPath + name : parentPath + "/" + name; String path = parentPath.endsWith("/") ? parentPath + name : parentPath + "/" + name;
return new AVMNodeDescriptor(path, return new AVMNodeDescriptor(path,
name,
AVMNodeType.PLAIN_DIRECTORY, AVMNodeType.PLAIN_DIRECTORY,
attrs.getCreator(), attrs.getCreator(),
attrs.getOwner(), attrs.getOwner(),

View File

@@ -131,6 +131,40 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
return "[PF:" + getId() + "]"; return "[PF:" + getId() + "]";
} }
/**
* Get the descriptor for this node.
* @param The Lookup.
* @return A descriptor.
*/
public AVMNodeDescriptor getDescriptor(Lookup lPath, String name)
{
BasicAttributes attrs = getBasicAttributes();
String path = lPath.getRepresentedPath();
if (path.endsWith("/"))
{
path = path + name;
}
else
{
path = path + "/" + name;
}
return new AVMNodeDescriptor(path,
name,
AVMNodeType.PLAIN_FILE,
attrs.getCreator(),
attrs.getOwner(),
attrs.getLastModifier(),
attrs.getCreateDate(),
attrs.getModDate(),
attrs.getAccessDate(),
getId(),
getVersionID(),
null,
false,
-1,
getContentForRead().getLength());
}
/** /**
* Get the descriptor for this node. * Get the descriptor for this node.
* @param The Lookup. * @param The Lookup.
@@ -139,7 +173,9 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
public AVMNodeDescriptor getDescriptor(Lookup lPath) public AVMNodeDescriptor getDescriptor(Lookup lPath)
{ {
BasicAttributes attrs = getBasicAttributes(); BasicAttributes attrs = getBasicAttributes();
return new AVMNodeDescriptor(lPath.getRepresentedPath(), String path = lPath.getRepresentedPath();
return new AVMNodeDescriptor(path,
path.substring(path.lastIndexOf("/") + 1),
AVMNodeType.PLAIN_FILE, AVMNodeType.PLAIN_FILE,
attrs.getCreator(), attrs.getCreator(),
attrs.getOwner(), attrs.getOwner(),
@@ -167,6 +203,7 @@ class PlainFileNodeImpl extends FileNodeImpl implements PlainFileNode
BasicAttributes attrs = getBasicAttributes(); BasicAttributes attrs = getBasicAttributes();
String path = parentPath.endsWith("/") ? parentPath + name : parentPath + "/" + name; String path = parentPath.endsWith("/") ? parentPath + name : parentPath + "/" + name;
return new AVMNodeDescriptor(path, return new AVMNodeDescriptor(path,
name,
AVMNodeType.PLAIN_FILE, AVMNodeType.PLAIN_FILE,
attrs.getCreator(), attrs.getCreator(),
attrs.getOwner(), attrs.getOwner(),

View File

@@ -297,7 +297,7 @@ class RepositoryImpl implements Repository, Serializable
for (String name : listing.keySet()) for (String name : listing.keySet())
{ {
AVMNode child = listing.get(name); AVMNode child = listing.get(name);
AVMNodeDescriptor desc = child.getDescriptor(lPath); AVMNodeDescriptor desc = child.getDescriptor(lPath, name);
results.put(name, desc); results.put(name, desc);
} }
return results; return results;