package org.neo4j.index.lucene;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.index.IndexService;
import org.neo4j.index.Neo4jTestCase;
public abstract class TestLuceneTooManyOpenFiles extends Neo4jTestCase
{
private IndexService indexService;
protected IndexService instantiateIndexService()
{
return new LuceneIndexService( graphDb() );
}
@Override
protected void setUp() throws Exception
{
super.setUp();
indexService = instantiateIndexService();
}
protected IndexService indexService()
{
return indexService;
}
@Override
protected void beforeShutdown()
{
indexService().shutdown();
}
public void testTooManyOpenFilesException() throws Exception
{
RelationshipType relType = DynamicRelationshipType.withName( "tmofe" );
Node root = graphDb().createNode();
AtomicInteger counter = new AtomicInteger();
createChildren( root, 0, counter, relType );
restartTx();
// Now, do the tight loop which should trigger the error
long startTime = System.currentTimeMillis();
long endTime = startTime + 1000 * 15;
int commitEvery = 20;
int i = 0;
for ( ; System.currentTimeMillis() < endTime; i++ )
{
Node node = indexService().getSingleNode( "tmofe_name", "Name " +
( new Random().nextInt( counter.get() ) + 1 ) );
indexService().removeIndex( node, "tmofe_title",
node.getProperty( "title" ) );
node.setProperty( "title", "Something " + i );
indexService().index( node, "tmofe_title",
node.getProperty( "title" ) );
if ( i > 0 && i % commitEvery == 0 )
{
restartTx();
}
}
// System.out.println( "test ran fine (" + i + ")" );
deleteDownwards( root, relType );
root.delete();
// indexService().removeIndex( "tmofe_name" );
// indexService().removeIndex( "tmofe_type" );
// indexService().removeIndex( "tmofe_sex" );
// indexService().removeIndex( "tmofe_title" );
}
private void deleteDownwards( Node root, RelationshipType relType )
{
for ( Relationship rel : root.getRelationships( relType ) )
{
Node child = rel.getEndNode();
rel.delete();
deleteDownwards( child, relType );
child.delete();
}
}
private void createChildren( Node node, int level, AtomicInteger counter,
RelationshipType relType )
{
if ( level > 3 )
{
return;
}
Random random = new Random();
int numChildren = random.nextInt( 2 ) + 2;
for ( int i = 0; i < numChildren; i++ )
{
Node child = graphDb().createNode();
node.createRelationshipTo( child, relType );
child.setProperty( "name", "Name " + counter.incrementAndGet() );
indexService().index( child, "tmofe_name",
child.getProperty( "name" ) );
child.setProperty( "type", "blabla" );
indexService().index( child, "tmofe_type",
child.getProperty( "type" ) );
child.setProperty( "title", "Nothing" );
indexService().index( child, "tmofe_title",
child.getProperty( "title" ) );
child.setProperty( "sex", random.nextBoolean() ?
"male" : "female" );
indexService().index( child, "tmofe_sex",
child.getProperty( "sex" ) );
createChildren( child, level + 1, counter, relType );
}
}
}