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

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


The following commit(s) were added to refs/heads/master by this push:
     new bf9e66fc70d HIVE-26707: Iceberg: Write failing due to Ranger 
Authorization failure. (#3731). (Ayush Saxena, reviewed by Adam Szita,  Chris 
Nauroth)
bf9e66fc70d is described below

commit bf9e66fc70d9142bc9682d92c71c8358f1086927
Author: Ayush Saxena <[email protected]>
AuthorDate: Tue Nov 8 14:49:45 2022 +0530

    HIVE-26707: Iceberg: Write failing due to Ranger Authorization failure. 
(#3731). (Ayush Saxena, reviewed by Adam Szita,  Chris Nauroth)
---
 .../iceberg/mr/hive/HiveIcebergStorageHandler.java  | 21 ++++++++++++++++-----
 .../hive/TestHiveIcebergStorageHandlerNoScan.java   |  7 +++++++
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git 
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
 
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
index 078acc30b7b..91439beec3b 100644
--- 
a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
+++ 
b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/HiveIcebergStorageHandler.java
@@ -541,21 +541,32 @@ public class HiveIcebergStorageHandler implements 
HiveStoragePredicateHandler, H
   public URI getURIForAuth(org.apache.hadoop.hive.metastore.api.Table 
hmsTable) throws URISyntaxException {
     String dbName = hmsTable.getDbName();
     String tableName = hmsTable.getTableName();
-    StringBuilder authURI = new 
StringBuilder(ICEBERG_URI_PREFIX).append(dbName).append("/").append(tableName)
-        .append("?snapshot=");
+    StringBuilder authURI =
+        new 
StringBuilder(ICEBERG_URI_PREFIX).append(encodeString(dbName)).append("/").append(encodeString(tableName))
+            .append("?snapshot=");
     Optional<String> locationProperty = SessionStateUtil.getProperty(conf, 
hive_metastoreConstants.META_TABLE_LOCATION);
     if (locationProperty.isPresent()) {
       Preconditions.checkArgument(locationProperty.get() != null,
           "Table location is not set in SessionState. Authorization URI cannot 
be supplied.");
       // this property is set during the create operation before the hive 
table was created
       // we are returning a dummy iceberg metadata file
-      
authURI.append(URI.create(locationProperty.get()).getPath()).append("/metadata/dummy.metadata.json");
+      
authURI.append(encodeString(URI.create(locationProperty.get()).getPath()))
+          .append(encodeString("/metadata/dummy.metadata.json"));
     } else {
       Table table = IcebergTableUtil.getTable(conf, hmsTable);
-      authURI.append(URI.create(((BaseTable) 
table).operations().current().metadataFileLocation()).getPath());
+      authURI.append(
+          encodeString(URI.create(((BaseTable) 
table).operations().current().metadataFileLocation()).getPath()));
     }
     LOG.debug("Iceberg storage handler authorization URI {}", authURI);
-    return new 
URI(HiveConf.EncoderDecoderFactory.URL_ENCODER_DECODER.encode(authURI.toString()));
+    return new URI(authURI.toString());
+  }
+
+  @VisibleForTesting
+  static String encodeString(String rawString) {
+    if (rawString == null) {
+      return null;
+    }
+    return 
HiveConf.EncoderDecoderFactory.URL_ENCODER_DECODER.encode(rawString);
   }
 
 
diff --git 
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergStorageHandlerNoScan.java
 
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergStorageHandlerNoScan.java
index af18d4c8c7e..53ac887ecc6 100644
--- 
a/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergStorageHandlerNoScan.java
+++ 
b/iceberg/iceberg-handler/src/test/java/org/apache/iceberg/mr/hive/TestHiveIcebergStorageHandlerNoScan.java
@@ -1437,6 +1437,13 @@ public class TestHiveIcebergStorageHandlerNoScan {
     storageHandler.setConf(shell.getHiveConf());
     URI uriForAuth = storageHandler.getURIForAuth(hmsTable);
 
+    Assert.assertEquals("iceberg://" +
+            
HiveIcebergStorageHandler.encodeString(target.namespace().toString()) + "/" +
+            HiveIcebergStorageHandler.encodeString(target.name()) + 
"?snapshot=" +
+            HiveIcebergStorageHandler.encodeString(
+            URI.create(((BaseTable) 
table).operations().current().metadataFileLocation()).getPath()),
+        uriForAuth.toString());
+
     Assert.assertEquals("iceberg://" + target.namespace() + "/" + 
target.name() + "?snapshot=" +
         URI.create(((BaseTable) 
table).operations().current().metadataFileLocation()).getPath(),
         
HiveConf.EncoderDecoderFactory.URL_ENCODER_DECODER.decode(uriForAuth.toString()));

Reply via email to