Skip to content

Commit d2950c6

Browse files
committed
Add basic causal clustering stress test
This commit introduces a basic stress test for `bolt+routing` scheme with the following commands: * read query using `Session#run()` * read query using `Transaction#run()` * write query using `Session#run()` * write query using `Transaction#run()` * write query through read session using `Session#run()` * write query through read session using `Transaction#run()` * create new driver using wrong credentials Test can run either against a local cluster (started with boltkit) or against a remote cluster if the needed system property is set. Duration and thread count can also be configured through system properties. Number of open file descriptors is asserted to not be very high after the load is applied. Also made some cleanup around dev null logging.
1 parent fbdfd00 commit d2950c6

File tree

11 files changed

+672
-55
lines changed

11 files changed

+672
-55
lines changed

driver/src/main/java/org/neo4j/driver/internal/logging/DevNullLogger.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,36 +22,35 @@
2222

2323
public class DevNullLogger implements Logger
2424
{
25-
public static final DevNullLogger DEV_NULL_LOGGER = new DevNullLogger();
25+
public static final Logger DEV_NULL_LOGGER = new DevNullLogger();
26+
27+
private DevNullLogger()
28+
{
29+
}
2630

2731
@Override
2832
public void error( String message, Throwable cause )
2933
{
30-
3134
}
3235

3336
@Override
3437
public void info( String message, Object... params )
3538
{
36-
3739
}
3840

3941
@Override
4042
public void warn( String message, Object... params )
4143
{
42-
4344
}
4445

4546
@Override
4647
public void debug( String message, Object... params )
4748
{
48-
4949
}
5050

5151
@Override
5252
public void trace( String message, Object... params )
5353
{
54-
5554
}
5655

5756
@Override
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright (c) 2002-2017 "Neo Technology,"
3+
* Network Engine for Objects in Lund AB [http://neotechnology.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Licensed under the Apache License, Version 2.0 (the "License");
8+
* you may not use this file except in compliance with the License.
9+
* You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing, software
14+
* distributed under the License is distributed on an "AS IS" BASIS,
15+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
* See the License for the specific language governing permissions and
17+
* limitations under the License.
18+
*/
19+
package org.neo4j.driver.internal.logging;
20+
21+
import org.neo4j.driver.v1.Logger;
22+
import org.neo4j.driver.v1.Logging;
23+
24+
public class DevNullLogging implements Logging
25+
{
26+
public static final Logging DEV_NULL_LOGGING = new DevNullLogging();
27+
28+
private DevNullLogging()
29+
{
30+
}
31+
32+
@Override
33+
public Logger getLog( String name )
34+
{
35+
return DevNullLogger.DEV_NULL_LOGGER;
36+
}
37+
}

driver/src/test/java/org/neo4j/driver/internal/net/LoggingResponseHandlerTest.java

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020

2121
import org.junit.Rule;
2222
import org.junit.Test;
23+
import org.junit.rules.ExpectedException;
24+
import org.mockito.invocation.InvocationOnMock;
25+
import org.mockito.stubbing.Answer;
2326

27+
import java.util.Arrays;
2428
import java.util.HashMap;
2529

26-
import org.junit.rules.ExpectedException;
27-
import org.neo4j.driver.internal.logging.DevNullLogger;
2830
import org.neo4j.driver.internal.messaging.DiscardAllMessage;
2931
import org.neo4j.driver.internal.messaging.FailureMessage;
3032
import org.neo4j.driver.internal.messaging.IgnoredMessage;
@@ -40,24 +42,17 @@
4042
import org.neo4j.driver.v1.Value;
4143

4244
import static org.junit.Assert.assertEquals;
43-
import static org.mockito.Mockito.doThrow;
45+
import static org.mockito.Matchers.anyString;
46+
import static org.mockito.Matchers.anyVararg;
47+
import static org.mockito.Mockito.doAnswer;
4448
import static org.mockito.Mockito.mock;
45-
import static org.mockito.Mockito.verify;
46-
import static org.neo4j.driver.v1.Values.parameters;
4749
import static org.neo4j.driver.v1.Values.ofValue;
50+
import static org.neo4j.driver.v1.Values.parameters;
4851

4952
public class LoggingResponseHandlerTest
5053
{
51-
5254
private String log;
53-
private Logger debugLogger = new DevNullLogger()
54-
{
55-
@Override
56-
public void debug( String message, Object... params )
57-
{
58-
log = String.format( message, params );
59-
}
60-
};
55+
private Logger debugLogger = newCapturingLogger();
6156

6257
@Rule
6358
public ExpectedException exception = ExpectedException.none();
@@ -176,7 +171,8 @@ public void shouldLogMessageWhenHandleMessageThrowsError() throws Throwable
176171
SocketResponseHandler handler = new LoggingResponseHandler( debugLogger )
177172
{
178173
@Override
179-
public void handleIgnoredMessage() {
174+
public void handleIgnoredMessage()
175+
{
180176
throw new RuntimeException( "This will not stop logging" );
181177
}
182178
};
@@ -195,4 +191,24 @@ private String format( Message message )
195191
{
196192
return String.format( "S: %s", message );
197193
}
194+
195+
private Logger newCapturingLogger()
196+
{
197+
Logger logger = mock( Logger.class );
198+
199+
doAnswer( new Answer<Void>()
200+
{
201+
@Override
202+
public Void answer( InvocationOnMock invocation ) throws Throwable
203+
{
204+
Object[] arguments = invocation.getArguments();
205+
String message = ((String) arguments[0]);
206+
Object[] params = Arrays.copyOfRange( arguments, 1, arguments.length );
207+
LoggingResponseHandlerTest.this.log = String.format( message, params );
208+
return null;
209+
}
210+
} ).when( logger ).debug( anyString(), anyVararg() );
211+
212+
return logger;
213+
}
198214
}

driver/src/test/java/org/neo4j/driver/internal/net/SocketClientTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import java.util.ArrayList;
3131
import java.util.List;
3232

33-
import org.neo4j.driver.internal.logging.DevNullLogger;
3433
import org.neo4j.driver.internal.security.SecurityPlan;
3534
import org.neo4j.driver.v1.exceptions.ClientException;
3635
import org.neo4j.driver.v1.exceptions.ServiceUnavailableException;
@@ -39,6 +38,7 @@
3938
import static org.hamcrest.MatcherAssert.assertThat;
4039
import static org.mockito.Mockito.mock;
4140
import static org.mockito.Mockito.when;
41+
import static org.neo4j.driver.internal.logging.DevNullLogger.DEV_NULL_LOGGER;
4242
import static org.neo4j.driver.internal.net.BoltServerAddress.LOCAL_DEFAULT;
4343

4444
public class SocketClientTest
@@ -59,7 +59,7 @@ public void testNetworkTimeout() throws Throwable
5959
BoltServerAddress address = new BoltServerAddress( "localhost", server.getLocalPort() );
6060

6161
SecurityPlan securityPlan = SecurityPlan.insecure();
62-
SocketClient client = new SocketClient( address, securityPlan, CONNECTION_TIMEOUT, new DevNullLogger() );
62+
SocketClient client = new SocketClient( address, securityPlan, CONNECTION_TIMEOUT, DEV_NULL_LOGGER );
6363

6464
// Expect
6565
exception.expect( ClientException.class );
@@ -71,7 +71,7 @@ public void testNetworkTimeout() throws Throwable
7171

7272
private SocketClient dummyClient()
7373
{
74-
return new SocketClient( LOCAL_DEFAULT, SecurityPlan.insecure(), CONNECTION_TIMEOUT, new DevNullLogger() );
74+
return new SocketClient( LOCAL_DEFAULT, SecurityPlan.insecure(), CONNECTION_TIMEOUT, DEV_NULL_LOGGER );
7575
}
7676

7777
@Test

driver/src/test/java/org/neo4j/driver/v1/integration/SocketClientIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.util.LinkedList;
2929
import java.util.Queue;
3030

31-
import org.neo4j.driver.internal.logging.DevNullLogger;
3231
import org.neo4j.driver.internal.messaging.InitMessage;
3332
import org.neo4j.driver.internal.messaging.Message;
3433
import org.neo4j.driver.internal.net.SocketClient;
@@ -45,6 +44,7 @@
4544
import static org.mockito.Mockito.times;
4645
import static org.mockito.Mockito.verify;
4746
import static org.mockito.Mockito.when;
47+
import static org.neo4j.driver.internal.logging.DevNullLogger.DEV_NULL_LOGGER;
4848
import static org.neo4j.driver.v1.Values.ofValue;
4949
import static org.neo4j.driver.v1.Values.parameters;
5050

@@ -59,7 +59,7 @@ public class SocketClientIT
5959
public void setup() throws GeneralSecurityException, IOException
6060
{
6161
SecurityPlan securityPlan = SecurityPlan.insecure();
62-
client = new SocketClient( neo4j.address(), securityPlan, 42, new DevNullLogger() );
62+
client = new SocketClient( neo4j.address(), securityPlan, 42, DEV_NULL_LOGGER );
6363
}
6464

6565
@After

driver/src/test/java/org/neo4j/driver/v1/integration/TLSSocketChannelIT.java

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,22 @@
2727
import java.io.File;
2828
import java.io.FileWriter;
2929
import java.io.IOException;
30-
import java.net.InetAddress;
3130
import java.net.InetSocketAddress;
32-
import java.net.URI;
3331
import java.nio.channels.SocketChannel;
3432
import java.security.cert.X509Certificate;
3533
import javax.net.ssl.SSLHandshakeException;
3634

37-
import org.neo4j.driver.internal.logging.DevNullLogger;
35+
import org.neo4j.driver.internal.net.BoltServerAddress;
3836
import org.neo4j.driver.internal.security.SecurityPlan;
3937
import org.neo4j.driver.internal.security.TLSSocketChannel;
40-
import org.neo4j.driver.internal.net.BoltServerAddress;
41-
import org.neo4j.driver.v1.*;
4238
import org.neo4j.driver.internal.util.CertificateTool;
43-
39+
import org.neo4j.driver.v1.Config;
40+
import org.neo4j.driver.v1.Driver;
41+
import org.neo4j.driver.v1.GraphDatabase;
42+
import org.neo4j.driver.v1.Logger;
43+
import org.neo4j.driver.v1.Logging;
44+
import org.neo4j.driver.v1.Session;
45+
import org.neo4j.driver.v1.StatementResult;
4446
import org.neo4j.driver.v1.util.CertificateToolTest;
4547
import org.neo4j.driver.v1.util.Neo4jRunner;
4648
import org.neo4j.driver.v1.util.Neo4jSettings;
@@ -56,6 +58,7 @@
5658
import static org.mockito.Mockito.mock;
5759
import static org.mockito.Mockito.verify;
5860
import static org.mockito.Mockito.when;
61+
import static org.neo4j.driver.internal.logging.DevNullLogger.DEV_NULL_LOGGER;
5962
import static org.neo4j.driver.internal.security.TrustOnFirstUseTrustManager.fingerprint;
6063

6164
public class TLSSocketChannelIT
@@ -182,7 +185,7 @@ public void shouldFailTLSHandshakeDueToWrongCertInKnownCertsFile() throws Throwa
182185
createFakeServerCertPairInKnownCerts( address, knownCerts );
183186

184187
// When & Then
185-
SecurityPlan securityPlan = SecurityPlan.forTrustOnFirstUse( knownCerts, address, new DevNullLogger() );
188+
SecurityPlan securityPlan = SecurityPlan.forTrustOnFirstUse( knownCerts, address, DEV_NULL_LOGGER );
186189
TLSSocketChannel sslChannel = null;
187190
try
188191
{
@@ -266,7 +269,6 @@ public void shouldPerformTLSHandshakeWithTheSameTrustedServerCert() throws Throw
266269
channel.connect( address.toSocketAddress() );
267270

268271
// When
269-
URI url = URI.create( "localhost:7687" );
270272
SecurityPlan securityPlan = SecurityPlan.forCustomCASignedCertificates( Neo4jSettings.DEFAULT_TLS_CERT_FILE );
271273
TLSSocketChannel sslChannel = TLSSocketChannel.create( address, securityPlan, channel, logger );
272274
sslChannel.close();
@@ -331,7 +333,7 @@ private void performTLSHandshakeUsingKnownCerts( File knownCerts ) throws Throwa
331333

332334
// When
333335

334-
SecurityPlan securityPlan = SecurityPlan.forTrustOnFirstUse( knownCerts, address, new DevNullLogger() );
336+
SecurityPlan securityPlan = SecurityPlan.forTrustOnFirstUse( knownCerts, address, DEV_NULL_LOGGER );
335337
TLSSocketChannel sslChannel =
336338
TLSSocketChannel.create( address, securityPlan, channel, logger );
337339
sslChannel.close();
@@ -364,20 +366,4 @@ private File installRootCertificate() throws Exception
364366
neo4j.updateEncryptionKeyAndCert( key, cert );
365367
return rootCert;
366368
}
367-
368-
private void createFakeServerCertPairInKnownCerts( String host, int port, File knownCerts )
369-
throws Throwable
370-
{
371-
String ip = InetAddress.getByName( host ).getHostAddress(); // localhost -> 127.0.0.1
372-
String serverId = ip + ":" + port;
373-
374-
X509Certificate cert = CertificateToolTest.generateSelfSignedCertificate();
375-
String certStr = fingerprint( cert );
376-
377-
BufferedWriter writer = new BufferedWriter( new FileWriter( knownCerts, true ) );
378-
writer.write( serverId + "," + certStr );
379-
writer.newLine();
380-
writer.close();
381-
}
382-
383369
}

driver/src/test/java/org/neo4j/driver/v1/integration/TLSSocketChannelReadFragmentationIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@
3030
import javax.net.ssl.SSLEngine;
3131
import javax.net.ssl.SSLServerSocketFactory;
3232

33-
import org.neo4j.driver.internal.logging.DevNullLogger;
3433
import org.neo4j.driver.internal.security.TLSSocketChannel;
3534

3635
import static org.hamcrest.core.IsEqual.equalTo;
3736
import static org.junit.Assert.assertThat;
37+
import static org.neo4j.driver.internal.logging.DevNullLogger.DEV_NULL_LOGGER;
3838

3939
/**
4040
* This tests that the TLSSocketChannel handles every combination of network buffer sizes that we
@@ -75,7 +75,7 @@ protected void testForBufferSizes( int blobOfDataSize, int networkFrameSize, int
7575
ByteChannel ch = SocketChannel.open( new InetSocketAddress( server.getInetAddress(), server.getLocalPort() ) );
7676
ch = new LittleAtATimeChannel( ch, networkFrameSize );
7777

78-
try ( TLSSocketChannel channel = new TLSSocketChannel( ch, new DevNullLogger(), engine ) )
78+
try ( TLSSocketChannel channel = new TLSSocketChannel( ch, DEV_NULL_LOGGER, engine ) )
7979
{
8080
ByteBuffer readBuffer = ByteBuffer.allocate( blobOfData.length );
8181
while ( readBuffer.position() < readBuffer.capacity() )

driver/src/test/java/org/neo4j/driver/v1/integration/TLSSocketWriteChannelFragmentationIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@
3333
import javax.net.ssl.SSLEngine;
3434
import javax.net.ssl.SSLServerSocketFactory;
3535

36-
import org.neo4j.driver.internal.logging.DevNullLogger;
3736
import org.neo4j.driver.internal.security.TLSSocketChannel;
3837

3938
import static org.hamcrest.core.IsEqual.equalTo;
4039
import static org.junit.Assert.assertThat;
40+
import static org.neo4j.driver.internal.logging.DevNullLogger.DEV_NULL_LOGGER;
4141

4242
/**
4343
* This tests that the TLSSocketChannel handles every combination of network buffer sizes that we
@@ -84,7 +84,7 @@ protected void testForBufferSizes( int blobOfDataSize, int networkFrameSize, int
8484
ByteChannel ch = SocketChannel.open( new InetSocketAddress( server.getInetAddress(), server.getLocalPort() ) );
8585
ch = new LittleAtATimeChannel( ch, networkFrameSize );
8686

87-
try ( TLSSocketChannel channel = new TLSSocketChannel( ch, new DevNullLogger(), engine ) )
87+
try ( TLSSocketChannel channel = new TLSSocketChannel( ch, DEV_NULL_LOGGER, engine ) )
8888
{
8989
ByteBuffer writeBuffer = ByteBuffer.wrap( blob );
9090
while ( writeBuffer.position() < writeBuffer.capacity() )

0 commit comments

Comments
 (0)