Skip to content

Commit 48fddab

Browse files
author
Zhen
committed
lock free driver
This PR ensure that after a driver is closed, no new session could be started.
1 parent 7d54179 commit 48fddab

File tree

1 file changed

+17
-33
lines changed

1 file changed

+17
-33
lines changed

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

Lines changed: 17 additions & 33 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,26 @@ public final Session session()
6758
@Override
6859
public final Session session( AccessMode mode )
6960
{
70-
closedLock.readLock().lock();
71-
try
61+
assertOpen();
62+
Session session = newSessionWithMode( mode );
63+
if( closed.get() )
7264
{
73-
assertOpen();
74-
return newSessionWithMode( mode );
75-
}
76-
finally
77-
{
78-
closedLock.readLock().unlock();
65+
// the driver is already closed and we either 1. obtain this session from the old session pool
66+
// or 2. we obtain this session from a new session pool
67+
// For 1. this closeResources will take no effect as everything is already closed.
68+
// For 2. this closeResources will close the new connection pool just created to ensure no resource leak.
69+
closeResources();
70+
throw new IllegalStateException( "This driver instance has already been closed" );
7971
}
72+
return session;
8073
}
8174

8275
@Override
8376
public final void close()
8477
{
85-
closedLock.writeLock().lock();
86-
try
87-
{
88-
if ( !closed )
89-
{
90-
closeResources();
91-
}
92-
}
93-
finally
78+
if ( closed.compareAndSet(false, true) )
9479
{
95-
closed = true;
96-
closedLock.writeLock().unlock();
80+
closeResources();
9781
}
9882
}
9983

@@ -103,7 +87,7 @@ public final void close()
10387

10488
private void assertOpen()
10589
{
106-
if ( closed )
90+
if ( closed.get() )
10791
{
10892
throw new IllegalStateException( "This driver instance has already been closed" );
10993
}

0 commit comments

Comments
 (0)