Skip to content

Commit

Permalink
Make AdversarialReadPageCursor faster by doing less allocation
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisvest committed May 26, 2016
1 parent d910a57 commit 2bd4213
Showing 1 changed file with 26 additions and 9 deletions.
Expand Up @@ -33,6 +33,7 @@
import org.neo4j.adversaries.Adversary; import org.neo4j.adversaries.Adversary;
import org.neo4j.io.pagecache.CursorException; import org.neo4j.io.pagecache.CursorException;
import org.neo4j.io.pagecache.PageCursor; import org.neo4j.io.pagecache.PageCursor;
import org.neo4j.unsafe.impl.internal.dragons.FeatureToggles;


/** /**
* A read {@linkplain PageCursor page cursor} that wraps another page cursor and an {@linkplain Adversary adversary} * A read {@linkplain PageCursor page cursor} that wraps another page cursor and an {@linkplain Adversary adversary}
Expand All @@ -58,6 +59,9 @@
@SuppressWarnings( "unchecked" ) @SuppressWarnings( "unchecked" )
class AdversarialReadPageCursor extends PageCursor class AdversarialReadPageCursor extends PageCursor
{ {
private static final boolean enableInconsistencyTracing = FeatureToggles.flag(
AdversarialReadPageCursor.class, "enableInconsistencyTracing", false );

private static class State implements Adversary private static class State implements Adversary
{ {
private final Adversary adversary; private final Adversary adversary;
Expand All @@ -73,7 +77,7 @@ private static class State implements Adversary
private State( Adversary adversary ) private State( Adversary adversary )
{ {
this.adversary = adversary; this.adversary = adversary;
inconsistentReadHistory = new ArrayList<>(); inconsistentReadHistory = new ArrayList<>( 32 );
} }


private <T extends Number> Number inconsistently( T value, PageCursor delegate ) private <T extends Number> Number inconsistently( T value, PageCursor delegate )
Expand Down Expand Up @@ -470,18 +474,28 @@ public String toString()
private static class NumberValue private static class NumberValue
{ {
private final Class<? extends Number> type; private final Class<? extends Number> type;
private final Long value; private final long value;
private final int offset; private final int offset;
private final Number insteadOf; private final Number insteadOf;
private final Exception trace; private Exception trace;


NumberValue( Class<? extends Number> type, Long value, int offset, Number insteadOf ) NumberValue( Class<? extends Number> type, long value, int offset, Number insteadOf )
{ {
this.type = type; this.type = type;
this.value = value; this.value = value;
this.offset = offset; this.offset = offset;
this.insteadOf = insteadOf; this.insteadOf = insteadOf;
trace = new Exception( toString() ); if ( enableInconsistencyTracing )
{
trace = new Exception()
{
@Override
public String getMessage()
{
return NumberValue.this.toString();
}
};
}
} }


@Override @Override
Expand All @@ -490,9 +504,9 @@ public String toString()
String typeName = type.getCanonicalName(); String typeName = type.getCanonicalName();
switch ( typeName ) switch ( typeName )
{ {
case "java.lang.Byte": return "(byte)" + value.byteValue() + " at offset " + offset + " (instead of " + insteadOf + ")"; case "java.lang.Byte": return "(byte)" + value + " at offset " + offset + " (instead of " + insteadOf + ")";
case "java.lang.Short": return "(short)" + value.shortValue() + " at offset " + offset + " (instead of " + insteadOf + ")"; case "java.lang.Short": return "(short)" + value + " at offset " + offset + " (instead of " + insteadOf + ")";
case "java.lang.Integer": return "(int)" + value.intValue() + " at offset " + offset + " (instead of " + insteadOf + ")"; case "java.lang.Integer": return "(int)" + value + " at offset " + offset + " (instead of " + insteadOf + ")";
case "java.lang.Long": return "(long)" + value + " at offset " + offset + " (instead of " + insteadOf + ")"; case "java.lang.Long": return "(long)" + value + " at offset " + offset + " (instead of " + insteadOf + ")";
} }
return "(" + typeName + ")" + value + " at offset " + offset + " (instead of " + insteadOf + ")"; return "(" + typeName + ")" + value + " at offset " + offset + " (instead of " + insteadOf + ")";
Expand All @@ -502,7 +516,10 @@ public void printStackTrace( StringBuilder sb )
{ {
StringWriter w = new StringWriter(); StringWriter w = new StringWriter();
PrintWriter pw = new PrintWriter( w ); PrintWriter pw = new PrintWriter( w );
trace.printStackTrace( pw ); if ( trace != null )
{
trace.printStackTrace( pw );
}
pw.flush(); pw.flush();
sb.append( w ); sb.append( w );
sb.append( '\n' ); sb.append( '\n' );
Expand Down

0 comments on commit 2bd4213

Please sign in to comment.