Skip to content

Commit

Permalink
Print stacktraces for debugging purposes
Browse files Browse the repository at this point in the history
  • Loading branch information
davidegrohmann committed Sep 26, 2016
1 parent a02a1d2 commit 9a90cee
Show file tree
Hide file tree
Showing 9 changed files with 49 additions and 43 deletions.
14 changes: 14 additions & 0 deletions stresstests/src/test/java/org/neo4j/StressTestingHelper.java
Expand Up @@ -20,6 +20,8 @@
package org.neo4j;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;

import static java.lang.System.getenv;
import static org.junit.Assert.assertEquals;
Expand Down Expand Up @@ -50,4 +52,16 @@ public static String fromEnv( String environmentVariableName, String defaultValu
String environmentVariableValue = getenv( environmentVariableName );
return environmentVariableValue == null ? defaultValue : environmentVariableValue;
}

public static String prettyPrintStackTrace( Throwable throwable )
{
if ( throwable == null )
{
return "";
}

StringWriter stringWriter = new StringWriter();
throwable.printStackTrace( new PrintWriter( stringWriter ) );
return stringWriter.toString();
}
}
Expand Up @@ -43,7 +43,7 @@ class BackupLoad extends RepeatUntilOnSelectedMemberCallable
}

@Override
protected boolean doWorkOnMember( boolean isCore, int id )
protected void doWorkOnMember( boolean isCore, int id )
{
SocketAddress address = backupAddress.apply( isCore, id );
File backupDirectory = new File( baseDirectory, Integer.toString( address.getPort() ) );
Expand All @@ -59,16 +59,14 @@ protected boolean doWorkOnMember( boolean isCore, int id )
{
// if we could not connect, wait a bit and try again...
LockSupport.parkNanos( 10_000_000 );
return true;
return;
}
throw e;
}

boolean success = backup.isConsistent();
if ( !success )
if ( !backup.isConsistent() )
{
System.err.println( "Not consistent backup from " + address );
throw new RuntimeException( "Not consistent backup from " + address );
}
return success;
}
}
Expand Up @@ -43,9 +43,10 @@
import static java.lang.Integer.parseInt;
import static java.lang.Long.parseLong;
import static java.lang.System.getProperty;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNull;
import static org.neo4j.StressTestingHelper.ensureExistsAndEmpty;
import static org.neo4j.StressTestingHelper.fromEnv;
import static org.neo4j.StressTestingHelper.prettyPrintStackTrace;
import static org.neo4j.coreedge.stresstests.ClusterConfiguration.configureBackup;
import static org.neo4j.coreedge.stresstests.ClusterConfiguration.configureRaftLogRotationAndPruning;
import static org.neo4j.coreedge.stresstests.ClusterConfiguration.configureTxLogRotationAndPruning;
Expand Down Expand Up @@ -105,14 +106,14 @@ public void shouldBehaveCorrectlyUnderStress() throws Exception
try
{
cluster.start();
Future<Boolean> workload = service.submit( new Workload( keepGoing, onFailure, cluster ) );
Future<Boolean> startStopWorker = service.submit( new StartStopLoad( keepGoing, onFailure, cluster ) );
Future<Boolean> backupWorker =
Future<Throwable> workload = service.submit( new Workload( keepGoing, onFailure, cluster ) );
Future<Throwable> startStopWorker = service.submit( new StartStopLoad( keepGoing, onFailure, cluster ) );
Future<Throwable> backupWorker =
service.submit( new BackupLoad( keepGoing, onFailure, cluster, backupDirectory, backupAddress ) );

assertTrue( workload.get() );
assertTrue( startStopWorker.get() );
assertTrue( backupWorker.get() );
assertNull( prettyPrintStackTrace( workload.get() ), workload.get() );
assertNull( prettyPrintStackTrace( startStopWorker.get() ), startStopWorker.get() );
assertNull( prettyPrintStackTrace( backupWorker.get() ), backupWorker.get() );
}
finally
{
Expand Down
Expand Up @@ -48,7 +48,7 @@ class CatchUpLoad extends RepeatUntilCallable
}

@Override
protected boolean doWork()
protected void doWork()
{
CoreClusterMember leader;
try
Expand All @@ -58,7 +58,7 @@ protected boolean doWork()
catch ( TimeoutException e )
{
// whatever... we'll try again
return true;
return;
}

long txIdBeforeStartingNewEdge = txId( leader );
Expand All @@ -84,8 +84,6 @@ protected boolean doWork()
{
throw new RuntimeException( exception.get() );
}

return true;
}

private AtomicReference<Throwable> startAndRegisterExceptionMonitor( EdgeClusterMember edgeClusterMember )
Expand Down
Expand Up @@ -40,9 +40,10 @@
import static java.lang.Long.parseLong;
import static java.lang.System.getProperty;
import static java.util.Collections.emptyMap;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNull;
import static org.neo4j.StressTestingHelper.ensureExistsAndEmpty;
import static org.neo4j.StressTestingHelper.fromEnv;
import static org.neo4j.StressTestingHelper.prettyPrintStackTrace;
import static org.neo4j.coreedge.stresstests.ClusterConfiguration.configureRaftLogRotationAndPruning;
import static org.neo4j.coreedge.stresstests.ClusterConfiguration.configureTxLogRotationAndPruning;
import static org.neo4j.function.Suppliers.untilTimeExpired;
Expand Down Expand Up @@ -86,13 +87,13 @@ public void shouldBehaveCorrectlyUnderStress() throws Exception
try
{
cluster.start();
Future<Boolean> workload = service.submit( new Workload( keepGoing, onFailure, cluster ) );
Future<Boolean> startStopWorker = service.submit( new StartStopLoad( keepGoing, onFailure, cluster ) );
Future<Boolean> catchUpWorker = service.submit( new CatchUpLoad( keepGoing, onFailure, cluster ) );
Future<Throwable> workload = service.submit( new Workload( keepGoing, onFailure, cluster ) );
Future<Throwable> startStopWorker = service.submit( new StartStopLoad( keepGoing, onFailure, cluster ) );
Future<Throwable> catchUpWorker = service.submit( new CatchUpLoad( keepGoing, onFailure, cluster ) );

assertTrue( workload.get() );
assertTrue( startStopWorker.get() );
assertTrue( catchUpWorker.get() );
assertNull( prettyPrintStackTrace( workload.get() ), workload.get() );
assertNull( prettyPrintStackTrace( startStopWorker.get() ), startStopWorker.get() );
assertNull( prettyPrintStackTrace( catchUpWorker.get() ), catchUpWorker.get() );
}
finally
{
Expand Down
Expand Up @@ -22,7 +22,7 @@
import java.util.concurrent.Callable;
import java.util.function.BooleanSupplier;

abstract class RepeatUntilCallable implements Callable<Boolean>
abstract class RepeatUntilCallable implements Callable<Throwable>
{
private BooleanSupplier keepGoing;
private Runnable onFailure;
Expand All @@ -34,28 +34,24 @@ abstract class RepeatUntilCallable implements Callable<Boolean>
}

@Override
public final Boolean call()
public final Throwable call()
{
try
{
boolean success = true;
while ( keepGoing.getAsBoolean() )
{
success &= doWork();
if ( !success )
{
onFailure.run();
}
doWork();
}
return success;
}
catch ( Throwable t )
{
t.printStackTrace();
onFailure.run();
return false;
return t;
}

return null;
}

protected abstract boolean doWork();
protected abstract void doWork();
}
Expand Up @@ -40,17 +40,17 @@ abstract class RepeatUntilOnSelectedMemberCallable extends RepeatUntilCallable
}

@Override
protected final boolean doWork()
protected final void doWork()
{
boolean isCore = onlyCores || random.nextBoolean();
Collection<? extends ClusterMember> members = isCore ? cluster.coreMembers() : cluster.edgeMembers();
if ( members.isEmpty() )
{
return true;
return;
}
int id = random.nextInt( members.size() );
return doWorkOnMember( isCore, id );
doWorkOnMember( isCore, id );
}

protected abstract boolean doWorkOnMember( boolean isCore, int id );
protected abstract void doWorkOnMember( boolean isCore, int id );
}
Expand Up @@ -33,12 +33,11 @@ class StartStopLoad extends RepeatUntilOnSelectedMemberCallable
}

@Override
protected boolean doWorkOnMember( boolean isCore, int id )
protected void doWorkOnMember( boolean isCore, int id )
{
ClusterMember member = isCore ? cluster.getCoreMemberById( id ) : cluster.getEdgeMemberById( id );
member.shutdown();
LockSupport.parkNanos( 5_000_000_000L );
member.start();
return true;
}
}
Expand Up @@ -37,7 +37,7 @@ class Workload extends RepeatUntilCallable
}

@Override
protected boolean doWork()
protected void doWork()
{
try
{
Expand All @@ -64,6 +64,5 @@ protected boolean doWork()
{
// whatever let's go on with the workload
}
return true;
}
}

0 comments on commit 9a90cee

Please sign in to comment.