Fix intermittent HEAD test failure (AVMCrawler -> NPE)

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@17175 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jan Vonka
2009-10-27 11:13:25 +00:00
parent f360f5fe3c
commit 1362d02f8e
3 changed files with 250 additions and 220 deletions

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2008 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -55,6 +55,16 @@ public class AVMCrawlTestP extends AVMServiceTestBase
30000); // 30 secs 30000); // 30 secs
} }
/*
public void xtestCrawlC()
{
testCrawl(10,
"source/java/org/alfresco/repo/avm", // relative from .../repository
2,
60000); // 1 min
}
*/
/* /*
public void xtestCrawlZ() public void xtestCrawlZ()
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2008 Alfresco Software Limited. * Copyright (C) 2005-2009 Alfresco Software Limited.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@@ -39,9 +39,12 @@ import net.sf.acegisecurity.Authentication;
import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.service.cmr.avm.AVMException; import org.alfresco.service.cmr.avm.AVMException;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor; import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.alfresco.service.cmr.avm.AVMNotFoundException;
import org.alfresco.service.cmr.avm.AVMService; import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.avm.AVMStoreDescriptor; import org.alfresco.service.cmr.avm.AVMStoreDescriptor;
import org.alfresco.service.cmr.repository.ContentIOException; import org.alfresco.service.cmr.repository.ContentIOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
@@ -50,6 +53,8 @@ import org.alfresco.service.cmr.repository.ContentIOException;
*/ */
class AVMCrawler implements Runnable class AVMCrawler implements Runnable
{ {
private static Log logger = LogFactory.getLog(AVMCrawler.class);
/** /**
* The AVMService to use. * The AVMService to use.
*/ */
@@ -158,7 +163,7 @@ class AVMCrawler implements Runnable
if (reps.size() == 0) if (reps.size() == 0)
{ {
System.out.println("No AVM stores"); logger.warn("No AVM stores");
return; return;
} }
@@ -177,7 +182,7 @@ class AVMCrawler implements Runnable
if (dirs.size() == 0) if (dirs.size() == 0)
{ {
System.out.println("No dirs in root: "+repDesc.getName() + ":/"); logger.warn("No dirs in root: "+repDesc.getName() + ":/");
} }
else else
{ {
@@ -205,20 +210,25 @@ class AVMCrawler implements Runnable
{ {
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
String path = files.get(fRandom.nextInt(files.size())).getPath();
logger.info("Reading: " + path);
BufferedReader BufferedReader
reader = new BufferedReader reader = new BufferedReader
(new InputStreamReader (new InputStreamReader
(fService.getFileInputStream(-1, files.get(fRandom.nextInt(files.size())).getPath()))); (fService.getFileInputStream(-1, path)));
fOpCount++; fOpCount++;
String line = reader.readLine(); String line = reader.readLine();
System.out.println(line); if (logger.isDebugEnabled())
{
logger.debug(line);
}
reader.close(); reader.close();
} }
// Modify some files. // Modify some files.
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
String path = files.get(fRandom.nextInt(files.size())).getPath(); String path = files.get(fRandom.nextInt(files.size())).getPath();
System.out.println("Modifying: " + path); logger.info("Modifying: " + path);
PrintStream out = new PrintStream(fService.getFileOutputStream(path)); PrintStream out = new PrintStream(fService.getFileOutputStream(path));
out.println("I am " + path); out.println("I am " + path);
out.close(); out.close();
@@ -235,7 +245,7 @@ class AVMCrawler implements Runnable
{ {
break; break;
} }
System.out.println("Creating File: " + name); logger.info("Creating File: " + name);
fService.createFile(dir.getPath(), name, fService.createFile(dir.getPath(), name,
new ByteArrayInputStream(("I am " + name).getBytes())); new ByteArrayInputStream(("I am " + name).getBytes()));
fOpCount++; fOpCount++;
@@ -249,7 +259,7 @@ class AVMCrawler implements Runnable
{ {
break; break;
} }
System.out.println("Creating Directory: " + name); logger.info("Creating Directory: " + name);
fService.createDirectory(dir.getPath(), name); fService.createDirectory(dir.getPath(), name);
fOpCount++; fOpCount++;
} }
@@ -260,7 +270,7 @@ class AVMCrawler implements Runnable
{ {
List<String> names = new ArrayList<String>(listing.keySet()); List<String> names = new ArrayList<String>(listing.keySet());
String name = names.get(fRandom.nextInt(names.size())); String name = names.get(fRandom.nextInt(names.size()));
System.out.println("Removing: " + name); logger.info("Removing: " + name);
fService.removeNode(dir.getPath(), fService.removeNode(dir.getPath(),
name); name);
fOpCount++; fOpCount++;
@@ -280,13 +290,18 @@ class AVMCrawler implements Runnable
if (fRandom.nextInt(16) == 0) if (fRandom.nextInt(16) == 0)
{ {
System.out.println("Snapshotting: " + repDesc.getName()); logger.info("Snapshotting: " + repDesc.getName());
fService.createSnapshot(repDesc.getName(), null, null); fService.createSnapshot(repDesc.getName(), null, null);
fOpCount++; fOpCount++;
} }
} }
catch (Exception e) catch (Exception e)
{ {
if (e instanceof AVMNotFoundException)
{
logger.info(e.getMessage());
return;
}
e.printStackTrace(System.err); e.printStackTrace(System.err);
if (e instanceof AVMException) if (e instanceof AVMException)
{ {
@@ -320,5 +335,3 @@ class AVMCrawler implements Runnable
return fOpCount; return fOpCount;
} }
} }

View File

@@ -34,6 +34,7 @@ import org.alfresco.repo.avm.ChildEntryImpl;
import org.alfresco.repo.avm.ChildKey; import org.alfresco.repo.avm.ChildKey;
import org.alfresco.repo.avm.DirectoryNode; import org.alfresco.repo.avm.DirectoryNode;
import org.alfresco.repo.domain.avm.AVMChildEntryEntity; import org.alfresco.repo.domain.avm.AVMChildEntryEntity;
import org.springframework.dao.ConcurrencyFailureException;
/** /**
* iBATIS DAO wrapper for ChildEntry * iBATIS DAO wrapper for ChildEntry
@@ -147,9 +148,12 @@ class ChildEntryDAOIbatis implements ChildEntryDAO
AVMNode childNode = AVMDAOs.Instance().fAVMNodeDAO.getByID(childEntryEntity.getChildId()); AVMNode childNode = AVMDAOs.Instance().fAVMNodeDAO.getByID(childEntryEntity.getChildId());
if (childNode == null)
{
throw new ConcurrencyFailureException("Child node (" + childEntryEntity.getParentNodeId() + ", " + childEntryEntity.getChildId() + ") no longer exists");
}
ChildEntry ce = new ChildEntryImpl(new ChildKey(parentNode, childEntryEntity.getName()), childNode); ChildEntry ce = new ChildEntryImpl(new ChildKey(parentNode, childEntryEntity.getName()), childNode);
ce.setKey(new ChildKey(parentNode, childEntryEntity.getName()));
ce.setChild(childNode);
return ce; return ce;
} }
@@ -162,9 +166,12 @@ class ChildEntryDAOIbatis implements ChildEntryDAO
DirectoryNode parentNode = (DirectoryNode)AVMDAOs.Instance().fAVMNodeDAO.getByID(childEntryEntity.getParentNodeId()); DirectoryNode parentNode = (DirectoryNode)AVMDAOs.Instance().fAVMNodeDAO.getByID(childEntryEntity.getParentNodeId());
if (parentNode == null)
{
throw new ConcurrencyFailureException("Parent node (" + childEntryEntity.getParentNodeId() + ", " + childEntryEntity.getChildId() + ") no longer exists");
}
ChildEntry ce = new ChildEntryImpl(new ChildKey(parentNode, childEntryEntity.getName()), childNode); ChildEntry ce = new ChildEntryImpl(new ChildKey(parentNode, childEntryEntity.getName()), childNode);
ce.setKey(new ChildKey(parentNode, childEntryEntity.getName()));
ce.setChild(childNode);
return ce; return ce;
} }
} }