You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by xk...@apache.org on 2019/02/22 21:59:23 UTC

[hadoop] branch trunk updated: HDFS-14279. [SBN read] Fix race condition in ObserverReadProxyProvider. Contributed by Erik Krogen.

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 <xk...@apache.org>
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: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org