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 13:01:13 UTC

[hbase] branch branch-2.3 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 branch-2.3
in repository https://gitbox.apache.org/repos/asf/hbase.git


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

commit d62d44ca3544ce8ec424bea602d04a3f53870ffd
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   | 15 +++++++++++++--
 .../hadoop/hbase/TestHDFSBlocksDistribution.java      | 19 ++++++++++++++++++-
 2 files changed, 31 insertions(+), 3 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 aa25fef..e44b68f 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
@@ -25,10 +25,9 @@ import java.util.Map;
 import java.util.NavigableSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
-
+import org.apache.hadoop.hbase.util.DNS;
 import org.apache.yetus.audience.InterfaceAudience;
 
-
 /**
  * Data structure to describe the distribution of HDFS blocks among hosts.
  *
@@ -201,6 +200,18 @@ public class HDFSBlocksDistribution {
   public float getBlockLocalityIndex(String host) {
     float 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=(float)hostAndWeight.weight/(float)uniqueBlocksTotalWeight;
     }
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 e9ec333..9c39396 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,12 +17,14 @@
  */
 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;
 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;
@@ -73,4 +75,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);
+  }
+
 }