From 072622f92367e272d9283d66e5645b9fc145059d Mon Sep 17 00:00:00 2001 From: chengwu Date: Fri, 17 Sep 2021 15:02:40 +0800 Subject: [PATCH] pass inner exception directly --- jar/chdfs_hadoop_plugin_network-2.4.jar | Bin 19834 -> 0 bytes jar/chdfs_hadoop_plugin_network-2.5.jar | Bin 0 -> 17860 bytes jar/jar.md5 | 2 +- pom.xml | 5 +- .../fs/CHDFSHadoopFileSystemAdapter.java | 584 ++++-------------- .../fs/CHDFSHadoopFileSystemJarLoader.java | 86 +-- 6 files changed, 180 insertions(+), 497 deletions(-) delete mode 100644 jar/chdfs_hadoop_plugin_network-2.4.jar create mode 100644 jar/chdfs_hadoop_plugin_network-2.5.jar diff --git a/jar/chdfs_hadoop_plugin_network-2.4.jar b/jar/chdfs_hadoop_plugin_network-2.4.jar deleted file mode 100644 index b06136a33d921f0075aa7519b88c1b8a9b0cc42a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19834 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
flsmJ1 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 R$iH58;6Olvg1>$H{{YlQZNUHl literal 0 HcmV?d00001 diff --git a/jar/jar.md5 b/jar/jar.md5 index 07a5a10..34882a4 100644 --- a/jar/jar.md5 +++ b/jar/jar.md5 @@ -1 +1 @@ -MD5 (chdfs_hadoop_plugin_network-2.4.jar) = 386f43324d2272705e769c32d8755c10 +MD5 (chdfs_hadoop_plugin_network-2.5.jar) = 65d3bc5a7510ac18d7c48648cf2a6d5a diff --git a/pom.xml b/pom.xml index 6dbcaf4..098248f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.qcloud chdfs_hadoop_plugin_network - 2.4 + 2.5 jar chdfs_hadoop_plugin_network @@ -15,10 +15,9 @@ UTF-8 1.7 1.7 - 3.1.2 + 2.8.5 - org.apache.hadoop diff --git a/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemAdapter.java b/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemAdapter.java index bb0e0f8..ad26460 100644 --- a/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemAdapter.java +++ b/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemAdapter.java @@ -8,6 +8,7 @@ import org.apache.hadoop.fs.FileAlreadyExistsException; import org.apache.hadoop.fs.FileChecksum; import org.apache.hadoop.fs.FileStatus; +import org.apache.hadoop.fs.FsStatus; import org.apache.hadoop.fs.ParentNotDirectoryException; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.UnsupportedFileSystemException; @@ -16,7 +17,6 @@ import org.apache.hadoop.fs.permission.AclStatus; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.security.AccessControlException; -import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.Token; import org.apache.hadoop.util.Progressable; import org.slf4j.Logger; @@ -55,26 +55,14 @@ public String getScheme() { return CHDFSHadoopFileSystemAdapter.SCHEME; } - private static void initUGI(Configuration conf) throws IOException { - if (!UserGroupInformation.isInitialized()) { - synchronized (UserGroupInformation.class) { - if (!UserGroupInformation.isInitialized()) { - UserGroupInformation.setConfiguration(conf); - } - } - } - } - @Override public void initialize(URI name, Configuration conf) throws IOException { - initUGI(conf); log.debug("CHDFSHadoopFileSystemAdapter adapter initialize"); this.initStartMs = System.currentTimeMillis(); log.debug("CHDFSHadoopFileSystemAdapter start-init-start time: {}", initStartMs); try { super.initialize(name, conf); this.setConf(conf); - String mountPointAddr = name.getHost(); if (mountPointAddr == null || !isValidMountPointAddr(mountPointAddr)) { String errMsg = String.format("mountPointAddr %s is invalid, fullUri: %s, exp. f4mabcdefgh-xyzw.chdfs" @@ -217,166 +205,78 @@ public java.net.URI getUri() { return this.uri; } - @Override - public FileChecksum getFileChecksum(Path f, long length) throws IOException { + private void judgeActualFSInitialized() { if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getFileChecksum(f, length); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getFileChecksum failed! a unexpected exception occur!", e); - throw new IOException("getFileChecksum failed! a unexpected exception occur! " + e.getMessage()); + throw new RuntimeException("please init the fileSystem first!"); } } @java.lang.Override public FSDataInputStream open(Path f, int bufferSize) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.open(f, bufferSize); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("open failed! a unexpected exception occur!", e); - throw new IOException("open failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.open(f, bufferSize); } @java.lang.Override public FSDataOutputStream createNonRecursive(Path f, FsPermission permission, EnumSet flags, int bufferSize, short replication, long blockSize, Progressable progress) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.createNonRecursive(f, permission, flags, bufferSize, replication, blockSize, - progress); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("createNonRecursive failed! a unexpected exception occur!", e); - throw new IOException("createNonRecursive failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.createNonRecursive(f, permission, flags, bufferSize, replication, blockSize, progress); } @java.lang.Override public FSDataOutputStream create(Path f, FsPermission permission, boolean overwrite, int bufferSize, short replication, long blockSize, Progressable progress) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.create(f, permission, overwrite, bufferSize, replication, blockSize, progress); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("create failed! a unexpected exception occur!", e); - throw new IOException("create failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.create(f, permission, overwrite, bufferSize, replication, blockSize, progress); } @java.lang.Override public FSDataOutputStream append(Path f, int bufferSize, Progressable progress) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.append(f, bufferSize, progress); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("append failed! a unexpected exception occur!", e); - throw new IOException("append failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.append(f, bufferSize, progress); } - @Override public boolean truncate(Path f, long newLength) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.truncate(f, newLength); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("truncate failed! a unexpected exception occur!", e); - throw new IOException("truncate failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.truncate(f, newLength); + } + + @Override + public void concat(Path trg, Path[] psrcs) throws IOException { + judgeActualFSInitialized(); + this.actualImplFS.concat(trg, psrcs); } @java.lang.Override public boolean rename(Path src, Path dst) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.rename(src, dst); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("rename failed! a unexpected exception occur!", e); - throw new IOException("rename failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.rename(src, dst); } @java.lang.Override public boolean delete(Path f, boolean recursive) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.delete(f, recursive); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("delete failed! a unexpected exception occur!", e); - throw new IOException("delete failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.delete(f, recursive); } @java.lang.Override public boolean deleteOnExit(Path f) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.deleteOnExit(f); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("deleteOnExit failed! a unexpected exception occur!", e); - throw new IOException("deleteOnExit failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.deleteOnExit(f); } @java.lang.Override public boolean cancelDeleteOnExit(Path f) { - if (this.actualImplFS == null) { - throw new RuntimeException("please init the fileSystem first!"); - } + judgeActualFSInitialized(); return this.actualImplFS.cancelDeleteOnExit(f); } @java.lang.Override public FileStatus[] listStatus(Path f) throws FileNotFoundException, IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.listStatus(f); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("listStatus failed! a unexpected exception occur!", e); - throw new IOException("listStatus failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.listStatus(f); } @java.lang.Override @@ -386,11 +286,10 @@ public Path getWorkingDirectory() { @java.lang.Override public void setWorkingDirectory(Path new_dir) { + this.workingDir = new_dir; if (this.actualImplFS == null) { - this.workingDir = new_dir; log.warn("fileSystem is not init yet!"); } else { - this.workingDir = new_dir; this.actualImplFS.setWorkingDirectory(new_dir); } } @@ -405,372 +304,187 @@ public Path getHomeDirectory() { @java.lang.Override public boolean mkdirs(Path f, FsPermission permission) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.mkdirs(f, permission); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("mkdir failed! a unexpected exception occur!", e); - throw new IOException("mkdir failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.mkdirs(f, permission); } @java.lang.Override public FileStatus getFileStatus(Path f) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getFileStatus(f); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getFileStatus failed! a unexpected exception occur!", e); - throw new IOException("getFileStatus failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.getFileStatus(f); } @Override - public void setPermission(Path p, FsPermission permission) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.setPermission(p, permission); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("setPermission failed! a unexpected exception occur!", e); - throw new IOException("setPermission failed! a unexpected exception occur! " + e.getMessage()); - } + public void createSymlink(Path target, Path link, boolean createParent) + throws AccessControlException, FileAlreadyExistsException, FileNotFoundException, + ParentNotDirectoryException, UnsupportedFileSystemException, IOException { + judgeActualFSInitialized(); + this.actualImplFS.createSymlink(target, link, createParent); } @Override - public void setOwner(Path p, String username, String groupname) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.setOwner(p, username, groupname); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("setOwner failed! a unexpected exception occur!", e); - throw new IOException("setOwner failed! a unexpected exception occur! " + e.getMessage()); - } + public FileStatus getFileLinkStatus(final Path f) + throws AccessControlException, FileNotFoundException, UnsupportedFileSystemException, IOException { + judgeActualFSInitialized(); + return this.actualImplFS.getFileLinkStatus(f); } @Override - public void setTimes(Path p, long mtime, long atime) throws IOException { + public boolean supportsSymlinks() { if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.setTimes(p, mtime, atime); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("setTimes failed! a unexpected exception occur!", e); - throw new IOException("setTimes failed! a unexpected exception occur! " + e.getMessage()); + return super.supportsSymlinks(); } + return this.actualImplFS.supportsSymlinks(); } + @Override - public void setXAttr(Path path, String name, byte[] value, EnumSet flag) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.setXAttr(path, name, value, flag); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("setXAttr failed! a unexpected exception occur!", e); - throw new IOException("setXAttr failed! a unexpected exception occur! " + e.getMessage()); - } + public Path getLinkTarget(Path f) throws IOException { + judgeActualFSInitialized(); + return this.actualImplFS.getLinkTarget(f); } @Override - public byte[] getXAttr(Path path, String name) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getXAttr(path, name); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getXAttr failed! a unexpected exception occur!", e); - throw new IOException("getXAttr failed! a unexpected exception occur! " + e.getMessage()); - } + protected Path resolveLink(Path f) throws IOException { + return getLinkTarget(f); } @Override - public Map getXAttrs(Path path) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getXAttrs(path); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getXAttrs failed! a unexpected exception occur!", e); - throw new IOException("getXAttrs failed! a unexpected exception occur! " + e.getMessage()); - } + public FileChecksum getFileChecksum(Path f, long length) throws IOException { + judgeActualFSInitialized(); + return this.actualImplFS.getFileChecksum(f, length); } @Override - public Map getXAttrs(Path path, List names) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getXAttrs(path, names); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getXAttrs failed! a unexpected exception occur!", e); - throw new IOException("getXAttrs failed! a unexpected exception occur! " + e.getMessage()); - } + public void setVerifyChecksum(boolean verifyChecksum) { + judgeActualFSInitialized(); + this.actualImplFS.setVerifyChecksum(verifyChecksum); } @Override - public List listXAttrs(Path path) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.listXAttrs(path); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("listXAttrs failed! a unexpected exception occur!", e); - throw new IOException("listXAttrs failed! a unexpected exception occur! " + e.getMessage()); - } + public void setWriteChecksum(boolean writeChecksum) { + judgeActualFSInitialized(); + this.actualImplFS.setWriteChecksum(writeChecksum); } @Override - public void removeXAttr(Path path, String name) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.removeXAttr(path, name); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("removeXAttr failed! a unexpected exception occur!", e); - throw new IOException("removeXAttr failed! a unexpected exception occur! " + e.getMessage()); - } + public FsStatus getStatus(Path p) throws IOException { + judgeActualFSInitialized(); + return this.actualImplFS.getStatus(p); } @Override - public Path createSnapshot(Path path, String snapshotName) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.createSnapshot(path, snapshotName); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("createSnapshot failed! a unexpected exception occur!", e); - throw new IOException("createSnapshot failed! a unexpected exception occur! " + e.getMessage()); - } + public void setPermission(Path p, FsPermission permission) throws IOException { + judgeActualFSInitialized(); + this.actualImplFS.setPermission(p, permission); } @Override - public void renameSnapshot(Path path, String snapshotOldName, String snapshotNewName) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.renameSnapshot(path, snapshotOldName, snapshotNewName); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("renameSnapshot failed! a unexpected exception occur!", e); - throw new IOException("renameSnapshot failed! a unexpected exception occur! " + e.getMessage()); - } + public void setOwner(Path p, String username, String groupname) throws IOException { + judgeActualFSInitialized(); + this.actualImplFS.setOwner(p, username, groupname); } @Override - public void deleteSnapshot(Path path, String snapshotName) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.deleteSnapshot(path, snapshotName); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("deleteSnapshot failed! a unexpected exception occur!", e); - throw new IOException("deleteSnapshot failed! a unexpected exception occur! " + e.getMessage()); - } + public void setTimes(Path p, long mtime, long atime) throws IOException { + judgeActualFSInitialized(); + this.actualImplFS.setTimes(p, mtime, atime); } @Override - public void createSymlink(Path target, Path link, boolean createParent) - throws AccessControlException, FileAlreadyExistsException, FileNotFoundException, - ParentNotDirectoryException, UnsupportedFileSystemException, IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.createSymlink(target, link, createParent); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("createSymlink failed! a unexpected exception occur!", e); - throw new IOException("createSymlink failed! a unexpected exception occur! " + e.getMessage()); - } + public Path createSnapshot(Path path, String snapshotName) throws IOException { + judgeActualFSInitialized(); + return this.actualImplFS.createSnapshot(path, snapshotName); } @Override - public boolean supportsSymlinks() { - if (this.actualImplFS == null) { - return false; - } - return this.actualImplFS.supportsSymlinks(); + public void renameSnapshot(Path path, String snapshotOldName, String snapshotNewName) throws IOException { + judgeActualFSInitialized(); + this.actualImplFS.renameSnapshot(path, snapshotOldName, snapshotNewName); } @Override - public Path getLinkTarget(Path f) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getLinkTarget(f); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getLinkTarget failed! a unexpected exception occur!", e); - throw new IOException("getLinkTarget failed! a unexpected exception occur! " + e.getMessage()); - } + public void deleteSnapshot(Path path, String snapshotName) throws IOException { + judgeActualFSInitialized(); + this.actualImplFS.deleteSnapshot(path, snapshotName); } @Override public void modifyAclEntries(Path path, List aclSpec) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.modifyAclEntries(path, aclSpec); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("modifyAclEntries failed! a unexpected exception occur!", e); - throw new IOException("modifyAclEntries failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + this.actualImplFS.modifyAclEntries(path, aclSpec); } @Override public void removeAclEntries(Path path, List aclSpec) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.removeAclEntries(path, aclSpec); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("removeAclEntries failed! a unexpected exception occur!", e); - throw new IOException("removeAclEntries failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + this.actualImplFS.removeAclEntries(path, aclSpec); } @Override public void removeDefaultAcl(Path path) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.removeDefaultAcl(path); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("removeDefaultAcl failed! a unexpected exception occur!", e); - throw new IOException("removeDefaultAcl failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + this.actualImplFS.removeDefaultAcl(path); } @Override public void removeAcl(Path path) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.removeAcl(path); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("removeAcl failed! a unexpected exception occur!", e); - throw new IOException("removeAcl failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + this.actualImplFS.removeAcl(path); } @Override public void setAcl(Path path, List aclSpec) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.setAcl(path, aclSpec); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("setAcl failed! a unexpected exception occur!", e); - throw new IOException("setAcl failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + this.actualImplFS.setAcl(path, aclSpec); } @Override public AclStatus getAclStatus(Path path) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getAclStatus(path); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getAclStatus failed! a unexpected exception occur!", e); - throw new IOException("getAclStatus failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.getAclStatus(path); } @Override - public void concat(Path trg, Path[] psrcs) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - this.actualImplFS.concat(trg, psrcs); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("concat failed! a unexpected exception occur!", e); - throw new IOException("concat failed! a unexpected exception occur! " + e.getMessage()); - } + public void setXAttr(Path path, String name, byte[] value, EnumSet flag) throws IOException { + judgeActualFSInitialized(); + this.actualImplFS.setXAttr(path, name, value, flag); + } + + @Override + public byte[] getXAttr(Path path, String name) throws IOException { + judgeActualFSInitialized(); + return this.actualImplFS.getXAttr(path, name); + } + + @Override + public Map getXAttrs(Path path) throws IOException { + judgeActualFSInitialized(); + return this.actualImplFS.getXAttrs(path); + } + + @Override + public Map getXAttrs(Path path, List names) throws IOException { + judgeActualFSInitialized(); + return this.actualImplFS.getXAttrs(path, names); + } + + @Override + public List listXAttrs(Path path) throws IOException { + judgeActualFSInitialized(); + return this.actualImplFS.listXAttrs(path); + } + + @Override + public void removeXAttr(Path path, String name) throws IOException { + judgeActualFSInitialized(); + this.actualImplFS.removeXAttr(path, name); } @Override public Token getDelegationToken(String renewer) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getDelegationToken(renewer); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getDelegationToken failed! a unexpected exception occur!", e); - throw new IOException("getDelegationToken failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.getDelegationToken(renewer); } @Override @@ -784,17 +498,8 @@ public String getCanonicalServiceName() { @Override public ContentSummary getContentSummary(Path f) throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - return this.actualImplFS.getContentSummary(f); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("getContentSummary failed! a unexpected exception occur!", e); - throw new IOException("getContentSummary failed! a unexpected exception occur! " + e.getMessage()); - } + judgeActualFSInitialized(); + return this.actualImplFS.getContentSummary(f); } @Override @@ -802,35 +507,14 @@ public void releaseFileLock(Path p) throws IOException { if (this.actualImplFS == null) { throw new IOException("please init the fileSystem first!"); } - try { - this.actualImplFS.releaseFileLock(p); - } catch (IOException ioe) { - throw ioe; - } catch (Exception e) { - log.error("releaseFileLock failed! a unexpected exception occur!", e); - throw new IOException("releaseFileLock failed! a unexpected exception occur! " + e.getMessage()); - } + this.actualImplFS.releaseFileLock(p); } @Override public void close() throws IOException { - if (this.actualImplFS == null) { - throw new IOException("please init the fileSystem first!"); - } - try { - super.close(); - long actualCloseStartTimeMs = System.currentTimeMillis(); - this.actualImplFS.close(); - log.debug("actual-file-system-close usedTime: {}", System.currentTimeMillis() - actualCloseStartTimeMs); - } catch (IOException ioe) { - log.error("close fileSystem occur a ioException!", ioe); - throw ioe; - } catch (Exception e) { - log.error("close fileSystem failed! a unexpected exception occur!", e); - throw new IOException("close fileSystem failed! a unexpected exception occur! " + e.getMessage()); - } - long endMs = System.currentTimeMillis(); - log.debug("end-close time: {}, total-used-time: {}", endMs, endMs - initStartMs); + judgeActualFSInitialized(); + super.close(); + this.actualImplFS.close(); } } diff --git a/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemJarLoader.java b/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemJarLoader.java index 0f5bdef..190a1eb 100644 --- a/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemJarLoader.java +++ b/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemJarLoader.java @@ -53,6 +53,45 @@ synchronized void init(String mountPointAddr, long appid, int jarPluginServerPor } } + private void parseJarPluginInfoResp(String respStr) throws IOException { + JsonObject respJson = new JsonParser().parse(respStr).getAsJsonObject(); + if (!respJson.has("Response")) { + String errMsg = String.format("resp json miss element Response, resp: %s", respStr); + log.error(errMsg); + throw new IOException(errMsg); + } + + if (!respJson.get("Response").getAsJsonObject().has("HadoopPluginJar")) { + String errMsg = String.format("resp json miss element Response.HadoopPluginJar, resp: %s", respStr); + log.error(errMsg); + throw new IOException(errMsg); + } + JsonObject jarInfoJson = respJson.get("Response").getAsJsonObject().get("HadoopPluginJar").getAsJsonObject(); + if (!jarInfoJson.has("VersionId")) { + String errMsg = String.format("resp miss config Response.HadoopPluginJar.VersionId, resp: %s", respStr); + log.error(errMsg); + throw new IOException(errMsg); + } else { + this.versionId = jarInfoJson.get("VersionId").getAsString(); + } + + if (!jarInfoJson.has("JarPath")) { + String errMsg = String.format("resp miss config Response.HadoopPluginJar.JarPath, resp: %s", respStr); + log.error(errMsg); + throw new IOException(errMsg); + } else { + this.jarPath = jarInfoJson.get("JarPath").getAsString(); + } + + if (!jarInfoJson.has("JarMd5")) { + String errMsg = String.format("resp miss config Response.HadoopPluginJar.JarMd5, resp: %s", respStr); + log.error(errMsg); + throw new IOException(errMsg); + } else { + this.jarMd5 = jarInfoJson.get("JarMd5").getAsString(); + } + } + private void queryJarPluginInfo(String mountPointAddr, long appid, int jarPluginServerPort, boolean jarPluginServerHttpsFlag) throws IOException { String hadoopVersion = VersionInfo.getVersion(); @@ -89,48 +128,8 @@ private void queryJarPluginInfo(String mountPointAddr, long appid, int jarPlugin while ((readLen = bis.read(buf)) != -1) { bos.write(buf, 0, readLen); } - String respStr = bos.toString(); - JsonObject respJson = new JsonParser().parse(respStr).getAsJsonObject(); - - if (!respJson.has("Response")) { - String errMsg = String.format("resp json miss element Response, resp: %s", respStr); - log.error(errMsg); - throw new IOException(errMsg); - } - - if (!respJson.get("Response").getAsJsonObject().has("HadoopPluginJar")) { - String errMsg = String.format("resp json miss element Response.HadoopPluginJar, resp: %s", respStr); - log.error(errMsg); - throw new IOException(errMsg); - } - - JsonObject jarInfoJson = respJson.get("Response").getAsJsonObject().get("HadoopPluginJar") - .getAsJsonObject(); - if (!jarInfoJson.has("VersionId")) { - String errMsg = String.format("resp miss config Response.HadoopPluginJar.VersionId, resp: %s", respStr); - log.error(errMsg); - throw new IOException(errMsg); - } else { - this.versionId = jarInfoJson.get("VersionId").getAsString(); - } - - if (!jarInfoJson.has("JarPath")) { - String errMsg = String.format("resp miss config Response.HadoopPluginJar.JarPath, resp: %s", respStr); - log.error(errMsg); - throw new IOException(errMsg); - } else { - this.jarPath = jarInfoJson.get("JarPath").getAsString(); - } - - if (!jarInfoJson.has("JarMd5")) { - String errMsg = String.format("resp miss config Response.HadoopPluginJar.JarMd5, resp: %s", respStr); - log.error(errMsg); - throw new IOException(errMsg); - } else { - this.jarMd5 = jarInfoJson.get("JarMd5").getAsString(); - } - log.debug("query jarPluginInfo, usedTimeMs: {}", (System.nanoTime() - startTimeNs) * 1.0 / 1000000); + parseJarPluginInfoResp(respStr); } catch (IOException e) { String errMsg = "queryJarPluginInfo occur an io exception"; log.error(errMsg, e); @@ -146,6 +145,7 @@ private void queryJarPluginInfo(String mountPointAddr, long appid, int jarPlugin conn.disconnect(); } } + log.debug("query jarPluginInfo, usedTimeMs: {}", (System.nanoTime() - startTimeNs) * 1.0 / 1000000); } private static synchronized FileSystemWithLockCleaner getAlreadyLoadedClassInfo(ClassLoader currentClassLoader, @@ -284,8 +284,8 @@ private static File downloadJarPath(String jarPath, String versionId, String jar String md5Hex = getFileHexMd5(localCacheJarFile); if (!md5Hex.equalsIgnoreCase(jarMd5)) { - String errMsg = String.format( - "download jar md5 check failed, local jar md5: %s, query jar md5: %s", md5Hex, jarMd5); + String errMsg = String.format("download jar md5 check failed, local jar md5: %s, query jar md5: %s", + md5Hex, jarMd5); log.error(errMsg); throw new IOException(errMsg); }