diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 5fcc367cc9..98659d21f5 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -2468,15 +2468,17 @@ private boolean isPathEncrypted(Path path) throws HiveException { * @throws HiveException If an error occurs while comparing key strengths. */ private int comparePathKeyStrength(Path p1, Path p2) throws HiveException { - HadoopShims.HdfsEncryptionShim hdfsEncryptionShim; + try { + HadoopShims.HdfsEncryptionShim hdfsEncryptionShim1; + HadoopShims.HdfsEncryptionShim hdfsEncryptionShim2; + hdfsEncryptionShim1 = SessionState.get().getHdfsEncryptionShim(p1.getFileSystem(conf)); + hdfsEncryptionShim2 = SessionState.get().getHdfsEncryptionShim(p2.getFileSystem(conf)); - hdfsEncryptionShim = SessionState.get().getHdfsEncryptionShim(); - if (hdfsEncryptionShim != null) { - try { - return hdfsEncryptionShim.comparePathKeyStrength(p1, p2); - } catch (Exception e) { - throw new HiveException("Unable to compare key strength for " + p1 + " and " + p2 + " : " + e, e); + if (hdfsEncryptionShim1 != null && hdfsEncryptionShim2 != null) { + return hdfsEncryptionShim1.comparePathKeyStrength(p1, p2, hdfsEncryptionShim2); } + } catch (Exception e) { + throw new HiveException("Unable to compare key strength for " + p1 + " and " + p2 + " : " + e, e); } return 0; // Non-encrypted path (or equals strength) diff --git a/shims/0.23/src/main/java/org/apache/hadoop/hive/shims/Hadoop23Shims.java b/shims/0.23/src/main/java/org/apache/hadoop/hive/shims/Hadoop23Shims.java index 23e7d5ef26..3d28e94e22 100644 --- a/shims/0.23/src/main/java/org/apache/hadoop/hive/shims/Hadoop23Shims.java +++ b/shims/0.23/src/main/java/org/apache/hadoop/hive/shims/Hadoop23Shims.java @@ -1286,15 +1286,16 @@ public boolean arePathsOnSameEncryptionZone(Path path1, Path path2, * * @param path1 First path to compare * @param path2 Second path to compare + * @param encryptionShim2 The encryption-shim corresponding to path2. * @return 1 if path1 is stronger; 0 if paths are equals; -1 if path1 is weaker. * @throws IOException If an error occurred attempting to get key metadata */ @Override - public int comparePathKeyStrength(Path path1, Path path2) throws IOException { + public int comparePathKeyStrength(Path path1, Path path2, HadoopShims.HdfsEncryptionShim encryptionShim2) throws IOException { EncryptionZone zone1, zone2; zone1 = getEncryptionZoneForPath(path1); - zone2 = getEncryptionZoneForPath(path2); + zone2 = ((HdfsEncryptionShim)encryptionShim2).hdfsAdmin.getEncryptionZoneForPath(path2); if (zone1 == null && zone2 == null) { return 0; diff --git a/shims/common/src/main/java/org/apache/hadoop/hive/shims/HadoopShims.java b/shims/common/src/main/java/org/apache/hadoop/hive/shims/HadoopShims.java index 49a2ab3616..64b4bd76cf 100644 --- a/shims/common/src/main/java/org/apache/hadoop/hive/shims/HadoopShims.java +++ b/shims/common/src/main/java/org/apache/hadoop/hive/shims/HadoopShims.java @@ -558,10 +558,11 @@ boolean runDistCpAs(List srcPaths, Path dst, Configuration conf, UserGroup * * @param path1 HDFS path to compare. * @param path2 HDFS path to compare. + * @param encryptionShim2 The encryption-shim corresponding to path2. * @return 1 if path1 is stronger; 0 if paths are equals; -1 if path1 is weaker. * @throws IOException If an error occurred attempting to get encryption/key metadata */ - public int comparePathKeyStrength(Path path1, Path path2) throws IOException; + public int comparePathKeyStrength(Path path1, Path path2, HdfsEncryptionShim encryptionShim2) throws IOException; /** * create encryption zone by path and keyname @@ -614,7 +615,7 @@ public boolean arePathsOnSameEncryptionZone(Path path1, Path path2, HdfsEncrypti } @Override - public int comparePathKeyStrength(Path path1, Path path2) throws IOException { + public int comparePathKeyStrength(Path path1, Path path2, HdfsEncryptionShim encryptionShim2) throws IOException { /* not supported */ return 0; }