Skip to content

Commit 8b745d9

Browse files
committed
core: Make PickFirst.pick's fast path lock-free
Fixes #2121
1 parent 4aadf55 commit 8b745d9

File tree

1 file changed

+7
-3
lines changed

1 file changed

+7
-3
lines changed

core/src/main/java/io/grpc/PickFirstBalancerFactory.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ private static class PickFirstBalancer<T> extends LoadBalancer<T> {
6969

7070
private final Object lock = new Object();
7171

72-
@GuardedBy("lock")
73-
private EquivalentAddressGroup addresses;
72+
/** "lock" must be held when mutating. */
73+
private volatile EquivalentAddressGroup addresses;
7474
@GuardedBy("lock")
7575
private InterimTransport<T> interimTransport;
7676
@GuardedBy("lock")
@@ -86,7 +86,10 @@ private PickFirstBalancer(TransportManager<T> tm) {
8686

8787
@Override
8888
public T pickTransport(Attributes affinity) {
89-
EquivalentAddressGroup addressesCopy;
89+
EquivalentAddressGroup addressesCopy = addresses;
90+
if (addressesCopy != null) {
91+
return tm.getTransport(addressesCopy);
92+
}
9093
synchronized (lock) {
9194
if (closed) {
9295
return tm.createFailingTransport(SHUTDOWN_STATUS);
@@ -157,6 +160,7 @@ public void shutdown() {
157160
return;
158161
}
159162
closed = true;
163+
addresses = null;
160164
savedInterimTransport = interimTransport;
161165
interimTransport = null;
162166
}

0 commit comments

Comments
 (0)