Skip to content

Commit

Permalink
HBASE-13250 chown of ExportSnapshot does not cover all path and files…
Browse files Browse the repository at this point in the history
… (He Liangliang)
  • Loading branch information
tedyu committed Sep 16, 2015
1 parent bd26386 commit 08eabb8
Showing 1 changed file with 36 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ private void copyFile(final Context context, final SnapshotFileInfo inputInfo,
context.getCounter(Counter.BYTES_EXPECTED).increment(inputStat.getLen());

// Ensure that the output folder is there and copy the file
outputFs.mkdirs(outputPath.getParent());
createOutputPath(outputPath.getParent());
FSDataOutputStream out = outputFs.create(outputPath, true);
try {
copyData(context, inputStat.getPath(), in, outputPath, out, inputStat.getLen());
Expand All @@ -288,6 +288,23 @@ private void copyFile(final Context context, final SnapshotFileInfo inputInfo,
}
}

/**
* Create the output folder and optionally set ownership.
*/
private void createOutputPath(final Path path) throws IOException {
if (filesUser == null && filesGroup == null) {
outputFs.mkdirs(path);
} else {
Path parent = path.getParent();
if (!outputFs.exists(parent) && !parent.isRoot()) {
createOutputPath(parent);
}
outputFs.mkdirs(path);
// override the owner when non-null user/group is specified
outputFs.setOwner(path, filesUser, filesGroup);
}
}

/**
* Try to Preserve the files attribute selected by the user copying them from the source file
* This is only required when you are exporting as a different user than "hbase" or on a system
Expand Down Expand Up @@ -802,6 +819,21 @@ private void verifySnapshot(final Configuration baseConf,
SnapshotReferenceUtil.verifySnapshot(conf, fs, snapshotDir, snapshotDesc);
}

/**
* Set path ownership.
*/
private void setOwner(final FileSystem fs, final Path path, final String user,
final String group, final boolean recursive) throws IOException {
if (user != null || group != null) {
if (recursive && fs.isDirectory(path)) {
for (FileStatus child : fs.listStatus(path)) {
setOwner(fs, child.getPath(), user, group, recursive);
}
}
fs.setOwner(path, user, group);
}
}

/**
* Execute the export snapshot by copying the snapshot metadata, hfiles and wals.
* @return 0 on success, and != 0 upon failure.
Expand Down Expand Up @@ -925,6 +957,9 @@ public int run(String[] args) throws IOException {
try {
LOG.info("Copy Snapshot Manifest");
FileUtil.copy(inputFs, snapshotDir, outputFs, initialOutputSnapshotDir, false, false, conf);
if (filesUser != null || filesGroup != null) {
setOwner(outputFs, snapshotTmpDir, filesUser, filesGroup, true);
}
} catch (IOException e) {
throw new ExportSnapshotException("Failed to copy the snapshot directory: from=" +
snapshotDir + " to=" + initialOutputSnapshotDir, e);
Expand Down

0 comments on commit 08eabb8

Please sign in to comment.