HDFS-11850. Ozone: Stack Overflow in XceiverClientManager because of race condition in accessing openClient. Contributed by Mukul Kumar Singh.

This commit is contained in:
Chen Liang 2017-05-22 10:20:04 -07:00 committed by Owen O'Malley
parent ae5242accb
commit a0f51ee3d7
1 changed files with 22 additions and 21 deletions

View File

@ -105,7 +105,9 @@ public class XceiverClientManager {
Preconditions.checkArgument(pipeline.getMachines() != null);
Preconditions.checkArgument(!pipeline.getMachines().isEmpty());
String containerName = pipeline.getContainerName();
XceiverClientWithAccessInfo info = openClient.getIfPresent(containerName);
synchronized(openClient) {
XceiverClientWithAccessInfo info =
openClient.getIfPresent(containerName);
if (info != null) {
// we do have this connection, add reference and return
@ -123,12 +125,11 @@ public class XceiverClientManager {
}
info = new XceiverClientWithAccessInfo(xceiverClient);
info.incrementReference();
synchronized (openClient) {
openClient.put(containerName, info);
}
return xceiverClient;
}
}
}
/**
* Releases an XceiverClient after use.
@ -141,10 +142,10 @@ public class XceiverClientManager {
XceiverClientWithAccessInfo info;
synchronized (openClient) {
info = openClient.getIfPresent(containerName);
}
Preconditions.checkNotNull(info);
info.decrementReference();
}
}
/**
* A helper class for caching and cleaning XceiverClient. Three parameters: