diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java index 26cdc5a..12c13fd 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java @@ -3430,9 +3430,24 @@ public static boolean createDirsWithPermission(Configuration conf, Path mkdir, return createDirsWithPermission(conf, mkdir, fsPermission, recursive); } - public static boolean createDirsWithPermission(Configuration conf, Path mkdir, + private static void resetConfAndCloseFS (Configuration conf, boolean unsetUmask, + String origUmask, FileSystem fs) throws IOException { + if (unsetUmask) { + if (origUmask != null) { + conf.set("fs.permissions.umask-mode", origUmask); + } else { + conf.unset("fs.permissions.umask-mode"); + } + } + + fs.close(); + } + + public static boolean createDirsWithPermission(Configuration conf, Path mkdirPath, FsPermission fsPermission, boolean recursive) throws IOException { String origUmask = null; + LOG.debug("Create dirs " + mkdirPath + " with permission " + fsPermission + " recursive " + + recursive); if (recursive) { origUmask = conf.get("fs.permissions.umask-mode"); @@ -3441,19 +3456,30 @@ public static boolean createDirsWithPermission(Configuration conf, Path mkdir, conf.set("fs.permissions.umask-mode", "000"); } - FileSystem fs = mkdir.getFileSystem(conf); - boolean retval = fs.mkdirs(mkdir, fsPermission); - - if (recursive) { - if (origUmask != null) { - conf.set("fs.permissions.umask-mode", origUmask); - } else { - conf.unset("fs.permissions.umask-mode"); + boolean origDisableHDFSCache = conf.getBoolean("fs." + mkdirPath.toUri().getScheme() + + ".impl.disable.cache", false); + // hadoop-1 compatible flag. + conf.setBoolean("fs." + mkdirPath.toUri().getScheme() + + ".impl.disable.cache", true); + FileSystem fs = FileSystem.get(mkdirPath.toUri(), conf); + conf.setBoolean("fs." + mkdirPath.toUri().getScheme() + + ".impl.disable.cache", origDisableHDFSCache); + boolean retval = false; + try { + retval = fs.mkdirs(mkdirPath, fsPermission); + resetConfAndCloseFS(conf, recursive, origUmask, fs); + } catch (IOException ioe) { + try { + resetConfAndCloseFS(conf, recursive, origUmask, fs); + } + catch (IOException e) { + // do nothing - double failure } } return retval; } + /** * Convert path to qualified path. *