Skip to content

Commit ea600ad

Browse files
author
Zhen
committed
lock free driver
This PR ensure that after a driver is closed, no new session could be started. While if there are sessions that has already started before driver.close, the sessions will probably crash becasue connection get closed in driver.close.
1 parent 7d54179 commit ea600ad

File tree

1 file changed

+9
-35
lines changed

1 file changed

+9
-35
lines changed

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

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package org.neo4j.driver.internal;
2020

21-
import java.util.concurrent.locks.ReentrantReadWriteLock;
21+
import java.util.concurrent.atomic.AtomicBoolean;
2222

2323
import org.neo4j.driver.internal.security.SecurityPlan;
2424
import org.neo4j.driver.v1.AccessMode;
@@ -34,8 +34,7 @@ abstract class BaseDriver implements Driver
3434
private final SecurityPlan securityPlan;
3535
protected final Logger log;
3636

37-
private final ReentrantReadWriteLock closedLock = new ReentrantReadWriteLock();
38-
private boolean closed;
37+
private AtomicBoolean closed = new AtomicBoolean( false );
3938

4039
BaseDriver( SecurityPlan securityPlan, Logging logging )
4140
{
@@ -46,16 +45,8 @@ abstract class BaseDriver implements Driver
4645
@Override
4746
public final boolean isEncrypted()
4847
{
49-
closedLock.readLock().lock();
50-
try
51-
{
52-
assertOpen();
53-
return securityPlan.requiresEncryption();
54-
}
55-
finally
56-
{
57-
closedLock.readLock().unlock();
58-
}
48+
assertOpen();
49+
return securityPlan.requiresEncryption();
5950
}
6051

6152
@Override
@@ -67,33 +58,16 @@ public final Session session()
6758
@Override
6859
public final Session session( AccessMode mode )
6960
{
70-
closedLock.readLock().lock();
71-
try
72-
{
73-
assertOpen();
74-
return newSessionWithMode( mode );
75-
}
76-
finally
77-
{
78-
closedLock.readLock().unlock();
79-
}
61+
assertOpen();
62+
return newSessionWithMode( mode );
8063
}
8164

8265
@Override
8366
public final void close()
8467
{
85-
closedLock.writeLock().lock();
86-
try
87-
{
88-
if ( !closed )
89-
{
90-
closeResources();
91-
}
92-
}
93-
finally
68+
if ( closed.compareAndSet(false, true) )
9469
{
95-
closed = true;
96-
closedLock.writeLock().unlock();
70+
closeResources();
9771
}
9872
}
9973

@@ -103,7 +77,7 @@ public final void close()
10377

10478
private void assertOpen()
10579
{
106-
if ( closed )
80+
if ( closed.get() )
10781
{
10882
throw new IllegalStateException( "This driver instance has already been closed" );
10983
}

0 commit comments

Comments
 (0)