You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by vj...@apache.org on 2020/09/01 12:47:46 UTC

[hbase] branch master updated: HBASE-24569 Get hostAndWeights in addition using localhost if it is null in local mode

This is an automated email from the ASF dual-hosted git repository.

vjasani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new ee450ae  HBASE-24569 Get hostAndWeights in addition using localhost if it is null in local mode
ee450ae is described below

commit ee450ae94370fb047a3d60883c0ae6016eac13e4
Author: Zheng Wang <18...@qq.com>
AuthorDate: Tue Sep 1 15:51:33 2020 +0530

    HBASE-24569 Get hostAndWeights in addition using localhost if it is null in local mode
    
    Closes #1909
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
    Signed-off-by: Viraj Jasani <vj...@apache.org>
---
 .../apache/hadoop/hbase/HDFSBlocksDistribution.java   | 14 +++++++++++++-
 .../hadoop/hbase/TestHDFSBlocksDistribution.java      | 19 ++++++++++++++++++-
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/HDFSBlocksDistribution.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/HDFSBlocksDistribution.java
index 9d677f8..0f0e938 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/HDFSBlocksDistribution.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/HDFSBlocksDistribution.java
@@ -26,9 +26,9 @@ import java.util.NavigableSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import org.apache.hadoop.fs.StorageType;
+import org.apache.hadoop.hbase.util.DNS;
 import org.apache.yetus.audience.InterfaceAudience;
 
-
 /**
  * Data structure to describe the distribution of HDFS blocks among hosts.
  *
@@ -280,6 +280,18 @@ public class HDFSBlocksDistribution {
   private long getBlocksLocalityWeightInternal(String host, Visitor visitor) {
     long localityIndex = 0;
     HostAndWeight hostAndWeight = this.hostAndWeights.get(host);
+    // Compatible with local mode, see HBASE-24569
+    if (hostAndWeight == null) {
+      String currentHost = "";
+      try {
+        currentHost = DNS.getDefaultHost("default", "default");
+      } catch (Exception e) {
+        // Just ignore, it's ok, avoid too many log info
+      }
+      if (host.equals(currentHost)) {
+        hostAndWeight = this.hostAndWeights.get(HConstants.LOCALHOST);
+      }
+    }
     if (hostAndWeight != null && uniqueBlocksTotalWeight != 0) {
       localityIndex = visitor.visit(hostAndWeight);
     }
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHDFSBlocksDistribution.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHDFSBlocksDistribution.java
index bebc7e3..17f5038 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHDFSBlocksDistribution.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHDFSBlocksDistribution.java
@@ -17,7 +17,8 @@
  */
 package org.apache.hadoop.hbase;
 
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -25,6 +26,7 @@ import java.util.Map;
 import org.apache.hadoop.fs.StorageType;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
+import org.apache.hadoop.hbase.util.DNS;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -81,4 +83,19 @@ public class TestHDFSBlocksDistribution {
     assertEquals("Should be one host", 1, distribution.getHostAndWeights().size());
     assertEquals("Total weight should be 10", 10, distribution.getUniqueBlocksTotalWeight());
   }
+
+  @Test
+  public void testLocalHostCompatibility() throws Exception {
+    String currentHost = DNS.getDefaultHost("default", "default");
+    HDFSBlocksDistribution distribution = new HDFSBlocksDistribution();
+    assertEquals("Locality should be 0.0", 0.0,
+      distribution.getBlockLocalityIndex(currentHost), 0.01);
+    distribution.addHostsAndBlockWeight(new String[] { "localhost" }, 10);
+    assertEquals("Should be one host", 1, distribution.getHostAndWeights().size());
+    assertEquals("Locality should be 0.0", 0.0,
+      distribution.getBlockLocalityIndex("test"), 0.01);
+    assertNotEquals("Locality should be 0.0", 0.0,
+      distribution.getBlockLocalityIndex(currentHost), 0.01);
+  }
+
 }