Skip to content

Commit b3d4bc2

Browse files
author
Zhen Li
committed
Made run, beginTx and reset to be synchronized
to enforce no new statement or tx after reset. So `reset` could be called during or after running a tx/statement. While after `session.reset` and/or after the current session is closed, no more interaction with this session is allowed.
1 parent b758757 commit b3d4bc2

File tree

2 files changed

+65
-12
lines changed

2 files changed

+65
-12
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public void run()
5959

6060
private ExplicitTransaction currentTransaction;
6161
private AtomicBoolean isOpen = new AtomicBoolean( true );
62-
private AtomicBoolean markedToClose = new AtomicBoolean( false );
62+
private boolean markedToClose;
6363

6464
NetworkSession( Connection connection, Logger logger )
6565
{
@@ -94,7 +94,7 @@ public StatementResult run( String statementText, Value statementParameters )
9494
}
9595

9696
@Override
97-
public StatementResult run( Statement statement )
97+
public synchronized StatementResult run( Statement statement )
9898
{
9999
ensureConnectionIsValidBeforeRunningSession();
100100
InternalStatementResult cursor = new InternalStatementResult( connection, null, statement );
@@ -104,21 +104,23 @@ public StatementResult run( Statement statement )
104104
return cursor;
105105
}
106106

107-
public void reset()
107+
public synchronized void reset()
108108
{
109+
ensureSessionIsOpen();
109110
ensureNoUnrecoverableError();
110111
ensureConnectionIsOpen();
111112

112-
if( markedToClose.compareAndSet( false, true ) )
113+
if( !markedToClose )
113114
{
115+
markedToClose = true;
114116
connection.resetAsync();
115117
}
116118
}
117119

118120
@Override
119121
public boolean isOpen()
120122
{
121-
return isOpen.get() && !markedToClose.get();
123+
return isOpen.get() && !markedToClose;
122124
}
123125

124126
@Override
@@ -166,7 +168,7 @@ public Transaction beginTransaction()
166168
}
167169

168170
@Override
169-
public Transaction beginTransaction( String bookmark )
171+
public synchronized Transaction beginTransaction( String bookmark )
170172
{
171173
ensureConnectionIsValidBeforeOpeningTransaction();
172174
currentTransaction = new ExplicitTransaction( connection, txCleanup, bookmark );
@@ -206,13 +208,15 @@ public TypeSystem typeSystem()
206208

207209
private void ensureConnectionIsValidBeforeRunningSession()
208210
{
211+
ensureSessionIsOpen();
209212
ensureNoUnrecoverableError();
210213
ensureNoOpenTransactionBeforeRunningSession();
211214
ensureConnectionIsOpen();
212215
}
213216

214217
private void ensureConnectionIsValidBeforeOpeningTransaction()
215218
{
219+
ensureSessionIsOpen();
216220
ensureNoUnrecoverableError();
217221
ensureNoOpenTransactionBeforeOpeningTransaction();
218222
ensureConnectionIsOpen();

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

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,13 @@
2121
import org.junit.Rule;
2222
import org.junit.Test;
2323

24-
import org.neo4j.driver.v1.AuthToken;
25-
import org.neo4j.driver.v1.AuthTokens;
26-
import org.neo4j.driver.v1.Driver;
27-
import org.neo4j.driver.v1.GraphDatabase;
28-
import org.neo4j.driver.v1.Session;
29-
import org.neo4j.driver.v1.StatementResult;
24+
import org.neo4j.driver.v1.*;
3025
import org.neo4j.driver.v1.exceptions.ClientException;
3126
import org.neo4j.driver.v1.exceptions.Neo4jException;
3227
import org.neo4j.driver.v1.util.TestNeo4j;
3328

3429
import static org.hamcrest.CoreMatchers.equalTo;
30+
import static org.hamcrest.CoreMatchers.startsWith;
3531
import static org.hamcrest.Matchers.greaterThan;
3632
import static org.junit.Assert.assertFalse;
3733
import static org.junit.Assert.assertThat;
@@ -201,4 +197,57 @@ public void run()
201197
}
202198
} ).start();
203199
}
200+
201+
@Test
202+
public void shouldNotAllowMoreStatementAfterSessionReset()
203+
{
204+
// Given
205+
try( Driver driver = GraphDatabase.driver( neo4j.uri() );
206+
Session session = driver.session() )
207+
{
208+
209+
session.run( "Return 1" );
210+
session.reset();
211+
212+
// When & Then
213+
try
214+
{
215+
session.run( "Return 2" );
216+
fail( "Should disallow more statements" );
217+
}
218+
catch( Exception e )
219+
{
220+
assertThat( e.getMessage(), startsWith("No more interaction with this session is allowed " +
221+
"as the current session is already closed or marked as closed.") );
222+
}
223+
}
224+
}
225+
226+
@Test
227+
public void shouldNotAllowMoreTxAfterSessionReset()
228+
{
229+
// Given
230+
try( Driver driver = GraphDatabase.driver( neo4j.uri() );
231+
Session session = driver.session() )
232+
{
233+
try( Transaction tx = session.beginTransaction() )
234+
{
235+
tx.run("Return 1");
236+
tx.success();
237+
}
238+
session.reset();
239+
240+
// When & Then
241+
try
242+
{
243+
session.beginTransaction();
244+
fail( "Should disallow more statements" );
245+
}
246+
catch( Exception e )
247+
{
248+
assertThat( e.getMessage(), startsWith("No more interaction with this session is allowed " +
249+
"as the current session is already closed or marked as closed.") );
250+
}
251+
}
252+
}
204253
}

0 commit comments

Comments
 (0)