Skip to content

Commit

Permalink
HBASE-27670 Improve FSUtils to directly obtain FSDataOutputStream (#5064
Browse files Browse the repository at this point in the history
)

Co-authored-by: alanzhao <[email protected]>
Signed-off-by: Duo Zhang <[email protected]>
  • Loading branch information
haohao0103 and alanzhao authored Mar 4, 2023
1 parent d2b0074 commit 59fdaa2
Showing 1 changed file with 10 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@
import org.apache.hadoop.hdfs.protocol.LocatedBlock;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.ipc.RemoteException;
import org.apache.hadoop.util.Progressable;
import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -198,27 +197,20 @@ public static FSDataOutputStream create(Configuration conf, FileSystem fs, Path
if (fs instanceof HFileSystem) {
FileSystem backingFs = ((HFileSystem) fs).getBackingFs();
if (backingFs instanceof DistributedFileSystem) {
// Try to use the favoredNodes version via reflection to allow backwards-
// compatibility.
short replication = Short.parseShort(conf.get(ColumnFamilyDescriptorBuilder.DFS_REPLICATION,
String.valueOf(ColumnFamilyDescriptorBuilder.DEFAULT_DFS_REPLICATION)));
try {
return (FSDataOutputStream) (DistributedFileSystem.class
.getDeclaredMethod("create", Path.class, FsPermission.class, boolean.class, int.class,
short.class, long.class, Progressable.class, InetSocketAddress[].class)
.invoke(backingFs, path, perm, true, CommonFSUtils.getDefaultBufferSize(backingFs),
replication > 0 ? replication : CommonFSUtils.getDefaultReplication(backingFs, path),
CommonFSUtils.getDefaultBlockSize(backingFs, path), null, favoredNodes));
} catch (InvocationTargetException ite) {
// Function was properly called, but threw it's own exception.
throw new IOException(ite.getCause());
} catch (NoSuchMethodException e) {
LOG.debug("DFS Client does not support most favored nodes create; using default create");
LOG.trace("Ignoring; use default create", e);
} catch (IllegalArgumentException | SecurityException | IllegalAccessException e) {
LOG.debug("Ignoring (most likely Reflection related exception) " + e);
DistributedFileSystem.HdfsDataOutputStreamBuilder builder =
((DistributedFileSystem) backingFs).createFile(path).recursive().permission(perm)
.create();
if (favoredNodes != null) {
builder.favoredNodes(favoredNodes);
}
if (replication > 0) {
builder.replication(replication);
}
return builder.build();
}

}
return CommonFSUtils.create(fs, path, perm, true);
}
Expand Down

0 comments on commit 59fdaa2

Please sign in to comment.