Skip to content

Commit eb4087e

Browse files
authored
Merge pull request #219 from pontusmelke/1.1-expose-timings
timings and version
2 parents ff8d06e + 71303c2 commit eb4087e

File tree

15 files changed

+336
-14
lines changed

15 files changed

+336
-14
lines changed

driver/src/main/java/org/neo4j/driver/internal/InternalSession.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
import java.util.concurrent.atomic.AtomicBoolean;
2323

2424
import org.neo4j.driver.internal.spi.Connection;
25-
import org.neo4j.driver.v1.Logger;
2625
import org.neo4j.driver.internal.types.InternalTypeSystem;
26+
import org.neo4j.driver.v1.Logger;
2727
import org.neo4j.driver.v1.Record;
2828
import org.neo4j.driver.v1.Session;
2929
import org.neo4j.driver.v1.Statement;
@@ -144,6 +144,12 @@ public void close()
144144
}
145145
}
146146

147+
@Override
148+
public String server()
149+
{
150+
return connection.server();
151+
}
152+
147153
@Override
148154
public Transaction beginTransaction()
149155
{

driver/src/main/java/org/neo4j/driver/internal/InternalStatementResult.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,19 @@ public void done()
8282
keys = new ArrayList<>();
8383
}
8484
}
85+
86+
@Override
87+
public void resultAvailableAfter( long l )
88+
{
89+
pullAllResponseCollector.resultAvailableAfter( l );
90+
}
8591
};
8692
}
8793

8894
private StreamCollector newPullAllResponseCollector( Statement statement )
8995
{
9096
final SummaryBuilder summaryBuilder = new SummaryBuilder( statement );
97+
9198
return new StreamCollector.NoOperationStreamCollector()
9299
{
93100
@Override
@@ -131,6 +138,18 @@ public void done() {
131138
summary = summaryBuilder.build();
132139
done = true;
133140
}
141+
142+
@Override
143+
public void resultAvailableAfter(long l)
144+
{
145+
summaryBuilder.resultAvailableAfter( l );
146+
}
147+
148+
@Override
149+
public void resultConsumedAfter(long l)
150+
{
151+
summaryBuilder.resultConsumedAfter( l );
152+
}
134153
};
135154
}
136155

driver/src/main/java/org/neo4j/driver/internal/net/ConcurrencyGuardingConnection.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,4 +228,10 @@ private void markAsInUse()
228228
"do that is to give each thread its own dedicated session." );
229229
}
230230
}
231+
232+
@Override
233+
public String server()
234+
{
235+
return delegate.server();
236+
}
231237
}

driver/src/main/java/org/neo4j/driver/internal/net/SocketConnection.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class SocketConnection implements Connection
4747
private final Queue<Message> pendingMessages = new LinkedList<>();
4848
private final SocketResponseHandler responseHandler;
4949
private AtomicBoolean interrupted = new AtomicBoolean( false );
50+
private final StreamCollector.InitStreamCollector initStreamCollector = new StreamCollector.InitStreamCollector();
5051

5152
private final SocketClient socket;
5253

@@ -70,7 +71,7 @@ public SocketConnection( BoltServerAddress address, SecurityPlan securityPlan, L
7071
@Override
7172
public void init( String clientName, Map<String,Value> authToken )
7273
{
73-
queueMessage( new InitMessage( clientName, authToken ), StreamCollector.INIT );
74+
queueMessage( new InitMessage( clientName, authToken ), initStreamCollector );
7475
sync();
7576
}
7677

@@ -231,4 +232,10 @@ public boolean isInterrupted()
231232
{
232233
return interrupted.get();
233234
}
235+
236+
@Override
237+
public String server()
238+
{
239+
return initStreamCollector.server( );
240+
}
234241
}

driver/src/main/java/org/neo4j/driver/internal/net/SocketResponseHandler.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,42 @@ public void handleFailureMessage( String code, String message )
8484
public void handleSuccessMessage( Map<String,Value> meta )
8585
{
8686
StreamCollector collector = collectors.remove();
87+
collectServer( collector, meta.get( "server" ));
8788
collectFields( collector, meta.get( "fields" ) );
8889
collectType( collector, meta.get( "type" ) );
8990
collectStatistics( collector, meta.get( "stats" ) );
9091
collectPlan( collector, meta.get( "plan" ) );
9192
collectProfile( collector, meta.get( "profile" ) );
9293
collectNotifications( collector, meta.get( "notifications" ) );
94+
collectResultAvailableAfter( collector, meta.get("result_available_after"));
95+
collectResultConsumedAfter( collector, meta.get("result_consumed_after"));
9396
collector.doneSuccess();
9497
}
9598

99+
private void collectServer( StreamCollector collector, Value server )
100+
{
101+
if (server != null)
102+
{
103+
collector.server( server.asString() );
104+
}
105+
}
106+
107+
private void collectResultAvailableAfter( StreamCollector collector, Value resultAvailableAfter )
108+
{
109+
if (resultAvailableAfter != null)
110+
{
111+
collector.resultAvailableAfter(resultAvailableAfter.asLong());
112+
}
113+
}
114+
115+
private void collectResultConsumedAfter( StreamCollector collector, Value resultConsumedAfter )
116+
{
117+
if (resultConsumedAfter != null)
118+
{
119+
collector.resultConsumedAfter(resultConsumedAfter.asLong());
120+
}
121+
}
122+
96123
private void collectNotifications( StreamCollector collector, Value notifications )
97124
{
98125
if ( notifications != null )

driver/src/main/java/org/neo4j/driver/internal/net/pooling/PooledConnection.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,12 @@ public boolean isInterrupted()
230230
return delegate.isInterrupted();
231231
}
232232

233+
@Override
234+
public String server()
235+
{
236+
return delegate.server();
237+
}
238+
233239
public void dispose()
234240
{
235241
delegate.close();
@@ -280,7 +286,6 @@ private boolean isClientOrTransientError( RuntimeException e )
280286

281287
public long idleTime()
282288
{
283-
long idleTime = clock.millis() - lastUsed;
284-
return idleTime;
289+
return clock.millis() - lastUsed;
285290
}
286291
}

driver/src/main/java/org/neo4j/driver/internal/spi/Connection.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public interface Connection extends AutoCloseable
100100
* runnable. This is used in the driver to clean up resources associated with
101101
* the connection, like an open transaction.
102102
*
103-
* @param runnable
103+
* @param runnable To be run on error.
104104
*/
105105
void onError( Runnable runnable );
106106

@@ -117,4 +117,10 @@ public interface Connection extends AutoCloseable
117117
* @return true if the current session statement execution has been interrupted by another thread, otherwise false
118118
*/
119119
boolean isInterrupted();
120+
121+
/**
122+
* Returns the version of the server connected to.
123+
* @return The version of the server connected to.
124+
*/
125+
String server();
120126
}

driver/src/main/java/org/neo4j/driver/internal/spi/StreamCollector.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,27 @@ public void doneIgnored()
5050
}
5151
};
5252

53-
StreamCollector INIT = new NoOperationStreamCollector()
53+
class InitStreamCollector extends NoOperationStreamCollector
5454
{
55+
private String server;
5556
@Override
5657
public void doneIgnored()
5758
{
5859
throw new ClientException(
5960
"Invalid server response message `IGNORED` received for client message `INIT`." );
6061
}
61-
};
62+
63+
@Override
64+
public void server( String server )
65+
{
66+
this.server = server;
67+
}
68+
69+
public String server()
70+
{
71+
return server;
72+
}
73+
}
6274

6375
StreamCollector RESET = new ResetStreamCollector();
6476

@@ -144,6 +156,15 @@ public void doneIgnored()
144156
{
145157
done();
146158
}
159+
160+
@Override
161+
public void resultAvailableAfter( long l ) {}
162+
163+
@Override
164+
public void resultConsumedAfter( long l ) {}
165+
166+
@Override
167+
public void server( String server ){}
147168
}
148169

149170
// TODO: This should be modified to simply have head/record/tail methods
@@ -169,5 +190,11 @@ public void doneIgnored()
169190
void doneFailure( Neo4jException error );
170191

171192
void doneIgnored();
193+
194+
void resultAvailableAfter( long l );
195+
196+
void resultConsumedAfter( long l );
197+
198+
void server( String server );
172199
}
173200

driver/src/main/java/org/neo4j/driver/internal/summary/SummaryBuilder.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,19 @@
2020

2121
import java.util.ArrayList;
2222
import java.util.List;
23+
import java.util.concurrent.TimeUnit;
2324

2425
import org.neo4j.driver.internal.spi.StreamCollector;
26+
import org.neo4j.driver.v1.Statement;
27+
import org.neo4j.driver.v1.Value;
28+
import org.neo4j.driver.v1.exceptions.ClientException;
2529
import org.neo4j.driver.v1.exceptions.Neo4jException;
2630
import org.neo4j.driver.v1.summary.Notification;
2731
import org.neo4j.driver.v1.summary.Plan;
2832
import org.neo4j.driver.v1.summary.ProfiledPlan;
2933
import org.neo4j.driver.v1.summary.ResultSummary;
30-
import org.neo4j.driver.v1.Statement;
3134
import org.neo4j.driver.v1.summary.StatementType;
3235
import org.neo4j.driver.v1.summary.SummaryCounters;
33-
import org.neo4j.driver.v1.Value;
34-
import org.neo4j.driver.v1.exceptions.ClientException;
3536

3637
public class SummaryBuilder implements StreamCollector
3738
{
@@ -42,6 +43,8 @@ public class SummaryBuilder implements StreamCollector
4243
private Plan plan = null;
4344
private ProfiledPlan profile;
4445
private List<Notification> notifications = null;
46+
private long resultAvailableAfter = -1L;
47+
private long resultConsumedAfter = -1L;
4548

4649
public SummaryBuilder( Statement statement )
4750
{
@@ -148,6 +151,24 @@ public void doneIgnored()
148151
// intentionally empty
149152
}
150153

154+
@Override
155+
public void resultAvailableAfter( long l )
156+
{
157+
this.resultAvailableAfter = l;
158+
}
159+
160+
@Override
161+
public void resultConsumedAfter( long l )
162+
{
163+
this.resultConsumedAfter = l;
164+
}
165+
166+
@Override
167+
public void server( String server )
168+
{
169+
// intentionally empty
170+
}
171+
151172
public ResultSummary build()
152173
{
153174
return new ResultSummary()
@@ -199,6 +220,18 @@ public List<Notification> notifications()
199220
{
200221
return notifications == null ? new ArrayList<Notification>() : notifications;
201222
}
223+
224+
@Override
225+
public long resultAvailableAfter( TimeUnit timeUnit )
226+
{
227+
return timeUnit.convert( resultAvailableAfter, TimeUnit.MILLISECONDS );
228+
}
229+
230+
@Override
231+
public long resultConsumedAfter( TimeUnit timeUnit )
232+
{
233+
return timeUnit.convert( resultConsumedAfter, TimeUnit.MILLISECONDS );
234+
}
202235
};
203236
}
204237
}

driver/src/main/java/org/neo4j/driver/v1/Session.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,10 @@ public interface Session extends Resource, StatementRunner
7575
*/
7676
@Override
7777
void close();
78+
79+
/**
80+
* Returns a string telling which version of the server the session is connected to.
81+
* @return The server version of <code>null</code> if not available.
82+
*/
83+
String server();
7884
}

driver/src/main/java/org/neo4j/driver/v1/summary/ResultSummary.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
package org.neo4j.driver.v1.summary;
2020

2121
import java.util.List;
22+
import java.util.concurrent.TimeUnit;
2223

23-
import org.neo4j.driver.v1.util.Immutable;
2424
import org.neo4j.driver.v1.Statement;
25+
import org.neo4j.driver.v1.util.Immutable;
2526

2627
/**
2728
* The result summary of running a statement. The result summary interface can be used to investigate
@@ -90,4 +91,20 @@ public interface ResultSummary
9091
* notifications produced while executing the statement.
9192
*/
9293
List<Notification> notifications();
94+
95+
/**
96+
* The time it took the server to make the result available for consumption.
97+
*
98+
* @param unit The unit of the duration.
99+
* @return The time it took for the server to have the result available in the provided time unit.
100+
*/
101+
long resultAvailableAfter( TimeUnit unit );
102+
103+
/**
104+
* The time it took the server to consume the result.
105+
*
106+
* @param unit The unit of the duration.
107+
* @return The time it took for the server to consume the result in the provided time unit.
108+
*/
109+
long resultConsumedAfter( TimeUnit unit );
93110
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class SessionIT
4848
public void shouldKnowSessionIsClosed() throws Throwable
4949
{
5050
// Given
51-
try( Driver driver = GraphDatabase.driver( neo4j.uri() ); )
51+
try( Driver driver = GraphDatabase.driver( neo4j.uri() ) )
5252
{
5353
Session session = driver.session();
5454

0 commit comments

Comments
 (0)