From a45e6504c7e5e9ccf8805ee08006a31978450cfe Mon Sep 17 00:00:00 2001 From: sreenivasulureddy Date: Thu, 5 Sep 2019 12:05:26 +0530 Subject: [PATCH] FileNotFoundException shown in UI when tried to access HFILE URL of a column family name have special char --- .../apache/hadoop/hbase/regionserver/HStoreFile.java | 12 ++++++++++++ .../apache/hadoop/hbase/regionserver/StoreFile.java | 5 +++++ .../resources/hbase-webapps/regionserver/region.jsp | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java index 682185a89a..c14e3a8a3b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStoreFile.java @@ -19,6 +19,8 @@ package org.apache.hadoop.hbase.regionserver; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.Collections; import java.util.HashSet; import java.util.Map; @@ -33,6 +35,7 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellComparator; +import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HDFSBlocksDistribution; import org.apache.hadoop.hbase.io.TimeRange; import org.apache.hadoop.hbase.io.hfile.BlockType; @@ -263,6 +266,15 @@ public class HStoreFile implements StoreFile { return this.fileInfo.getPath(); } + @Override + public Path getEncodedPath() { + try { + return new Path(URLEncoder.encode(fileInfo.getPath().toString(), HConstants.UTF8_ENCODING)); + } catch (UnsupportedEncodingException ex) { + throw new RuntimeException("URLEncoder doesn't support UTF-8", ex); + } + } + @Override public Path getQualifiedPath() { return this.fileInfo.getPath().makeQualified(fs.getUri(), fs.getWorkingDirectory()); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java index a7ac45a377..ce4518b542 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java @@ -65,6 +65,11 @@ public interface StoreFile { */ Path getPath(); + /** + * @return Encoded Path if this StoreFile was made with a Stream. + */ + Path getEncodedPath(); + /** * @return Returns the qualified path of this StoreFile */ diff --git a/hbase-server/src/main/resources/hbase-webapps/regionserver/region.jsp b/hbase-server/src/main/resources/hbase-webapps/regionserver/region.jsp index ff833748f0..8183c69bcb 100644 --- a/hbase-server/src/main/resources/hbase-webapps/regionserver/region.jsp +++ b/hbase-server/src/main/resources/hbase-webapps/regionserver/region.jsp @@ -67,7 +67,7 @@ <% for(StoreFile sf : storeFiles) { %> - <%= sf.getPath() %> + <%= sf.getPath() %> <%= (int) (rs.getFileSystem().getLength(sf.getPath()) / 1024 / 1024) %> <%= new Date(sf.getModificationTimestamp()) %> -- 2.21.0.windows.1