This is an automated email from the ASF dual-hosted git repository.
xkrogen pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git
The following commit(s) were added to refs/heads/trunk by this push:
new bad3ffd HDFS-14279. [SBN read] Fix race condition in
ObserverReadProxyProvider. Contributed by Erik Krogen.
bad3ffd is described below
commit bad3ffd2907d75395907ff6b76c909ab50add4bc
Author: Erik Krogen <[email protected]>
AuthorDate: Thu Feb 14 08:59:56 2019 -0800
HDFS-14279. [SBN read] Fix race condition in ObserverReadProxyProvider.
Contributed by Erik Krogen.
---
.../namenode/ha/ObserverReadProxyProvider.java | 23 +++++++++-------------
1 file changed, 9 insertions(+), 14 deletions(-)
diff --git
a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/ObserverReadProxyProvider.java
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/ObserverReadProxyProvider.java
index a623be2..3cf14cb 100644
---
a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/ObserverReadProxyProvider.java
+++
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/ObserverReadProxyProvider.java
@@ -92,13 +92,12 @@ public class ObserverReadProxyProvider<T extends
ClientProtocol>
* be accessed in synchronized methods.
*/
private int currentIndex = -1;
+
/**
- * The proxy being used currently; this will match with currentIndex above.
- * This field is volatile to allow reads without synchronization; updates
- * should still be performed synchronously to maintain consistency between
- * currentIndex and this field.
+ * The proxy being used currently. Should only be accessed in synchronized
+ * methods.
*/
- private volatile NNProxyInfo<T> currentProxy;
+ private NNProxyInfo<T> currentProxy;
/** The last proxy that has been used. Only used for testing. */
private volatile ProxyInfo<T> lastProxy = null;
@@ -191,10 +190,7 @@ public class ObserverReadProxyProvider<T extends
ClientProtocol>
* {@link #changeProxy(NNProxyInfo)} to initialize one.
*/
private NNProxyInfo<T> getCurrentProxy() {
- if (currentProxy == null) {
- changeProxy(null);
- }
- return currentProxy;
+ return changeProxy(null);
}
/**
@@ -205,15 +201,13 @@ public class ObserverReadProxyProvider<T extends
ClientProtocol>
* returning.
*
* @param initial The expected current proxy
+ * @return The new proxy that should be used.
*/
- private synchronized void changeProxy(NNProxyInfo<T> initial) {
+ private synchronized NNProxyInfo<T> changeProxy(NNProxyInfo<T> initial) {
if (currentProxy != initial) {
// Must have been a concurrent modification; ignore the move request
- return;
+ return currentProxy;
}
- // Attempt to force concurrent callers of getCurrentProxy to wait for the
- // new proxy; best-effort by setting currentProxy to null
- currentProxy = null;
currentIndex = (currentIndex + 1) % nameNodeProxies.size();
currentProxy = createProxyIfNeeded(nameNodeProxies.get(currentIndex));
try {
@@ -227,6 +221,7 @@ public class ObserverReadProxyProvider<T extends
ClientProtocol>
LOG.debug("Changed current proxy from {} to {}",
initial == null ? "none" : initial.proxyInfo,
currentProxy.proxyInfo);
+ return currentProxy;
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]