From 2a6438e4c26e7c568da70c63d62a5f96ab65150e Mon Sep 17 00:00:00 2001 From: chengwu Date: Tue, 13 Apr 2021 11:56:03 +0800 Subject: [PATCH] 1 add file lock cleaner interface 2 add get home direcotry interface --- jar/chdfs_hadoop_plugin_network-2.1.jar | Bin 18309 -> 0 bytes jar/chdfs_hadoop_plugin_network-2.3.jar | Bin 0 -> 19249 bytes jar/jar.md5 | 2 +- pom.xml | 2 +- .../chdfs/fs/AlreadyLoadedFileSystemInfo.java | 4 +-- .../fs/CHDFSHadoopFileSystemAdapter.java | 27 ++++++++++++++++-- .../fs/CHDFSHadoopFileSystemJarLoader.java | 12 ++++---- .../com/qcloud/chdfs/fs/FileLockCleaner.java | 9 ++++++ .../chdfs/fs/FileSystemWithLockCleaner.java | 6 ++++ 9 files changed, 50 insertions(+), 12 deletions(-) delete mode 100644 jar/chdfs_hadoop_plugin_network-2.1.jar create mode 100644 jar/chdfs_hadoop_plugin_network-2.3.jar create mode 100644 src/main/java/com/qcloud/chdfs/fs/FileLockCleaner.java create mode 100644 src/main/java/com/qcloud/chdfs/fs/FileSystemWithLockCleaner.java diff --git a/jar/chdfs_hadoop_plugin_network-2.1.jar b/jar/chdfs_hadoop_plugin_network-2.1.jar deleted file mode 100644 index 1c68e4b2862119fe16fd7b237f4be09b0fb97beb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18309 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

upt%1HJFpZfg#NTO$6}AT@!z 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 literal 0 HcmV?d00001 diff --git a/jar/jar.md5 b/jar/jar.md5 index 7ec18d8..6133776 100644 --- a/jar/jar.md5 +++ b/jar/jar.md5 @@ -1 +1 @@ -MD5 (chdfs_hadoop_plugin_network-2.1.jar) = c60e3cdf3b5f3a0b5094ea6cc4392b0f +MD5 (chdfs_hadoop_plugin_network-2.3.jar) = b165f29ad9266228972603d036595a86 diff --git a/pom.xml b/pom.xml index c01dde1..a439fa4 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.qcloud chdfs_hadoop_plugin_network - 2.1 + 2.3 jar chdfs_hadoop_plugin_network diff --git a/src/main/java/com/qcloud/chdfs/fs/AlreadyLoadedFileSystemInfo.java b/src/main/java/com/qcloud/chdfs/fs/AlreadyLoadedFileSystemInfo.java index 84ab3cd..3a74aa2 100644 --- a/src/main/java/com/qcloud/chdfs/fs/AlreadyLoadedFileSystemInfo.java +++ b/src/main/java/com/qcloud/chdfs/fs/AlreadyLoadedFileSystemInfo.java @@ -6,9 +6,9 @@ public class AlreadyLoadedFileSystemInfo { String versionId; String jarPath; String jarMd5; - FileSystem actualFileSystem; + FileSystemWithLockCleaner actualFileSystem; - public AlreadyLoadedFileSystemInfo(String versionId, String jarPath, String jarMd5, FileSystem actualFileSystem) { + public AlreadyLoadedFileSystemInfo(String versionId, String jarPath, String jarMd5, FileSystemWithLockCleaner actualFileSystem) { this.versionId = versionId; this.jarPath = jarPath; this.jarMd5 = jarMd5; diff --git a/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemAdapter.java b/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemAdapter.java index 72e2e34..dbeecab 100644 --- a/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemAdapter.java +++ b/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemAdapter.java @@ -20,7 +20,7 @@ import java.util.Map; import java.util.regex.Pattern; -public class CHDFSHadoopFileSystemAdapter extends FileSystem { +public class CHDFSHadoopFileSystemAdapter extends FileSystemWithLockCleaner { private static final Logger log = LoggerFactory.getLogger(CHDFSHadoopFileSystemAdapter.class); static final String SCHEME = "ofs"; @@ -34,7 +34,7 @@ public class CHDFSHadoopFileSystemAdapter extends FileSystem { private static final int DEFAULT_CHDFS_META_SERVER_PORT = 443; private CHDFSHadoopFileSystemJarLoader jarLoader = new CHDFSHadoopFileSystemJarLoader(); - private FileSystem actualImplFS = null; + private FileSystemWithLockCleaner actualImplFS = null; private URI uri = null; private Path workingDir = null; private long initStartMs; @@ -334,6 +334,14 @@ public Path getWorkingDirectory() { return this.workingDir; } + @Override + public Path getHomeDirectory() { + if (this.actualImplFS == null) { + return super.getHomeDirectory(); + } + return this.actualImplFS.getHomeDirectory(); + } + @java.lang.Override public boolean mkdirs(Path f, FsPermission permission) throws IOException { if (this.actualImplFS == null) { @@ -726,6 +734,21 @@ public ContentSummary getContentSummary(Path f) throws IOException { } } + @Override + 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()); + } + } + @Override public void close() throws IOException { if (this.actualImplFS == null) { diff --git a/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemJarLoader.java b/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemJarLoader.java index 6982153..eff1caf 100644 --- a/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemJarLoader.java +++ b/src/main/java/com/qcloud/chdfs/fs/CHDFSHadoopFileSystemJarLoader.java @@ -22,7 +22,7 @@ class CHDFSHadoopFileSystemJarLoader { private String jarPath; private String jarMd5; - private FileSystem actualFileSystem; + private FileSystemWithLockCleaner actualFileSystem; private static AlreadyLoadedFileSystemInfo alreadyLoadedFileSystemInfo; private String chdfsDataTransferEndpointSuffix; @@ -70,8 +70,8 @@ private boolean queryJarPluginInfo(String mountPointAddr, long appid, int jarPlu try { HttpURLConnection conn = (HttpURLConnection) queryJarUrl.openConnection(); conn.setRequestProperty("Connection", "Keep-Alive"); + conn.setReadTimeout(120000); conn.connect(); - BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buf = new byte[4096]; @@ -148,7 +148,7 @@ synchronized boolean init(String mountPointAddr, long appid, int jarPluginServer return true; } - FileSystem getActualFileSystem() { + FileSystemWithLockCleaner getActualFileSystem() { return actualFileSystem; } @@ -156,7 +156,8 @@ public void setChdfsDataTransferEndpointSuffix(String chdfsDataTransferEndpointS this.chdfsDataTransferEndpointSuffix = chdfsDataTransferEndpointSuffix; } - private static synchronized FileSystem getAlreadyLoadedClassInfo(ClassLoader currentClassLoader, String jarPath, String versionId, String jarMd5, String tmpDirPath) { + private static synchronized FileSystemWithLockCleaner getAlreadyLoadedClassInfo(ClassLoader currentClassLoader, String jarPath, + String versionId, String jarMd5, String tmpDirPath) { if (alreadyLoadedFileSystemInfo != null && alreadyLoadedFileSystemInfo.jarPath.equals(jarPath) && alreadyLoadedFileSystemInfo.versionId.equals(versionId) @@ -182,7 +183,7 @@ private static synchronized FileSystem getAlreadyLoadedClassInfo(ClassLoader cur "chdfs.%s.com.qcloud.chdfs.fs.CHDFSHadoopFileSystem", versionId); try { Class chdfsFSClass = chdfsJarClassLoader.loadClass(className); - FileSystem actualFileSystem = (FileSystem) chdfsFSClass.newInstance(); + FileSystemWithLockCleaner actualFileSystem = (FileSystemWithLockCleaner) chdfsFSClass.newInstance(); alreadyLoadedFileSystemInfo = new AlreadyLoadedFileSystemInfo(versionId, jarPath, jarMd5, actualFileSystem); return actualFileSystem; } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { @@ -325,5 +326,4 @@ private static File downloadJarPath(String jarPath, String versionId, String jar } } } - } diff --git a/src/main/java/com/qcloud/chdfs/fs/FileLockCleaner.java b/src/main/java/com/qcloud/chdfs/fs/FileLockCleaner.java new file mode 100644 index 0000000..4b359ca --- /dev/null +++ b/src/main/java/com/qcloud/chdfs/fs/FileLockCleaner.java @@ -0,0 +1,9 @@ +package com.qcloud.chdfs.fs; + +import org.apache.hadoop.fs.Path; + +import java.io.IOException; + +public interface FileLockCleaner { + void releaseFileLock(Path p) throws IOException; +} \ No newline at end of file diff --git a/src/main/java/com/qcloud/chdfs/fs/FileSystemWithLockCleaner.java b/src/main/java/com/qcloud/chdfs/fs/FileSystemWithLockCleaner.java new file mode 100644 index 0000000..e536ee1 --- /dev/null +++ b/src/main/java/com/qcloud/chdfs/fs/FileSystemWithLockCleaner.java @@ -0,0 +1,6 @@ +package com.qcloud.chdfs.fs; + +import org.apache.hadoop.fs.FileSystem; + +public abstract class FileSystemWithLockCleaner extends FileSystem implements FileLockCleaner { +}