From f8692bef4bd2874412093c9cced4f72ab8ec3c07 Mon Sep 17 00:00:00 2001 From: xu tao Date: Thu, 14 Sep 2023 11:51:30 +0800 Subject: [PATCH] [fix](io): use try with resource make io stream close automatically to avoid resource leak (#24297) --- .../org/apache/doris/common/ConfigBase.java | 8 +++-- .../org/apache/doris/common/io/DeepCopy.java | 32 ++++++++----------- .../main/java/org/apache/doris/DorisFE.java | 6 ++-- .../org/apache/doris/backup/Repository.java | 8 ++--- .../apache/doris/catalog/JdbcResource.java | 6 ++-- .../doris/common/util/SmallFileMgr.java | 4 +-- .../deploy/impl/LocalFileDeployManager.java | 3 +- .../doris/load/loadv2/SparkRepository.java | 4 +-- .../doris/broker/hdfs/BrokerBootstrap.java | 5 +-- .../org/apache/doris/common/ConfigBase.java | 4 ++- 10 files changed, 37 insertions(+), 43 deletions(-) diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/ConfigBase.java b/fe/fe-common/src/main/java/org/apache/doris/common/ConfigBase.java index 3d0bd54b4d..3173f26faa 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/ConfigBase.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/ConfigBase.java @@ -133,7 +133,9 @@ public class ConfigBase { private void initConf(String confFile) throws Exception { Properties props = new Properties(); - props.load(new FileReader(confFile)); + try (FileReader fr = new FileReader(confFile)) { + props.load(fr); + } replacedByEnv(props); setFields(props, isLdapConfig); } @@ -398,7 +400,9 @@ public class ConfigBase { } Properties props = new Properties(); - props.load(new FileReader(customConfFile)); + try (FileReader fr = new FileReader(customConfFile)) { + props.load(fr); + } for (Map.Entry entry : customConf.entrySet()) { props.setProperty(entry.getKey(), entry.getValue()); diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/io/DeepCopy.java b/fe/fe-common/src/main/java/org/apache/doris/common/io/DeepCopy.java index c4e74e968c..106205f225 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/io/DeepCopy.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/io/DeepCopy.java @@ -44,18 +44,15 @@ public class DeepCopy { metaContext.setMetaVersion(metaVersion); metaContext.setThreadLocalInfo(); - FastByteArrayOutputStream byteArrayOutputStream = new FastByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(byteArrayOutputStream); - try { + try (FastByteArrayOutputStream byteArrayOutputStream = new FastByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(byteArrayOutputStream)) { orig.write(out); out.flush(); - out.close(); - DataInputStream in = new DataInputStream(byteArrayOutputStream.getInputStream()); - - Method readMethod = c.getDeclaredMethod(READ_FIELDS_METHOD_NAME, DataInput.class); - readMethod.invoke(dest, in); - in.close(); + try (DataInputStream in = new DataInputStream(byteArrayOutputStream.getInputStream())) { + Method readMethod = c.getDeclaredMethod(READ_FIELDS_METHOD_NAME, DataInput.class); + readMethod.invoke(dest, in); + } } catch (Exception e) { LOG.warn("failed to copy object.", e); return false; @@ -74,19 +71,16 @@ public class DeepCopy { metaContext.setMetaVersion(metaVersion); metaContext.setThreadLocalInfo(); - FastByteArrayOutputStream byteArrayOutputStream = new FastByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(byteArrayOutputStream); - try { + try (FastByteArrayOutputStream byteArrayOutputStream = new FastByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(byteArrayOutputStream)) { orig.write(out); out.flush(); - out.close(); - DataInputStream in = new DataInputStream(byteArrayOutputStream.getInputStream()); - - Method readMethod = c.getDeclaredMethod(READ_METHOD_NAME, DataInput.class); - T result = (T) readMethod.invoke(orig, in); - in.close(); - return result; + try (DataInputStream in = new DataInputStream(byteArrayOutputStream.getInputStream())) { + Method readMethod = c.getDeclaredMethod(READ_METHOD_NAME, DataInput.class); + T result = (T) readMethod.invoke(orig, in); + return result; + } } catch (Exception e) { LOG.warn("failed to copy object.", e); return null; diff --git a/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java b/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java index e3cf89410d..5eb0e0575a 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java @@ -390,8 +390,8 @@ public class DorisFE { private static boolean createAndLockPidFile(String pidFilePath) throws IOException { File pid = new File(pidFilePath); - RandomAccessFile file = new RandomAccessFile(pid, "rws"); - try { + + try (RandomAccessFile file = new RandomAccessFile(pid, "rws")) { FileLock lock = file.getChannel().tryLock(); if (lock == null) { return false; @@ -405,10 +405,8 @@ public class DorisFE { return true; } catch (OverlappingFileLockException e) { - file.close(); return false; } catch (IOException e) { - file.close(); throw e; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/Repository.java b/fe/fe-core/src/main/java/org/apache/doris/backup/Repository.java index 12a2bf29e8..10227ce469 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/backup/Repository.java +++ b/fe/fe-core/src/main/java/org/apache/doris/backup/Repository.java @@ -451,8 +451,8 @@ public class Repository implements Writable { // get md5usm of local file File file = new File(localFilePath); String md5sum = null; - try { - md5sum = DigestUtils.md5Hex(new FileInputStream(file)); + try (FileInputStream fis = new FileInputStream(file)) { + md5sum = DigestUtils.md5Hex(fis); } catch (FileNotFoundException e) { return new Status(ErrCode.NOT_FOUND, "file " + localFilePath + " does not exist"); } catch (IOException e) { @@ -558,8 +558,8 @@ public class Repository implements Writable { // 3. verify checksum String localMd5sum = null; - try { - localMd5sum = DigestUtils.md5Hex(new FileInputStream(localFilePath)); + try (FileInputStream fis = new FileInputStream(localFilePath)) { + localMd5sum = DigestUtils.md5Hex(fis); } catch (FileNotFoundException e) { return new Status(ErrCode.NOT_FOUND, "file " + localFilePath + " does not exist"); } catch (IOException e) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java index 999b5c4d34..da4f90d2a7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/JdbcResource.java @@ -228,9 +228,9 @@ public class JdbcResource extends Resource { return ""; } String fullDriverUrl = getFullDriverUrl(driverPath); - InputStream inputStream = null; - try { - inputStream = Util.getInputStreamFromUrl(fullDriverUrl, null, HTTP_TIMEOUT_MS, HTTP_TIMEOUT_MS); + + try (InputStream inputStream = + Util.getInputStreamFromUrl(fullDriverUrl, null, HTTP_TIMEOUT_MS, HTTP_TIMEOUT_MS)) { MessageDigest digest = MessageDigest.getInstance("MD5"); byte[] buf = new byte[4096]; int bytesRead = 0; diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/SmallFileMgr.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/SmallFileMgr.java index 7a1660798b..b8185b4472 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/util/SmallFileMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/SmallFileMgr.java @@ -437,8 +437,8 @@ public class SmallFileMgr implements Writable { private boolean checkMd5(File file, String expectedMd5) throws DdlException { String md5sum = null; - try { - md5sum = DigestUtils.md5Hex(new FileInputStream(file)); + try (FileInputStream fis = new FileInputStream(file)) { + md5sum = DigestUtils.md5Hex(fis); } catch (FileNotFoundException e) { throw new DdlException("File " + file.getName() + " does not exist"); } catch (IOException e) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/deploy/impl/LocalFileDeployManager.java b/fe/fe-core/src/main/java/org/apache/doris/deploy/impl/LocalFileDeployManager.java index db1a93fccd..efe8cdf7a6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/deploy/impl/LocalFileDeployManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/deploy/impl/LocalFileDeployManager.java @@ -87,8 +87,7 @@ public class LocalFileDeployManager extends DeployManager { FileChannel channel = null; FileLock lock = null; BufferedReader bufferedReader = null; - try { - FileInputStream stream = new FileInputStream(clusterInfoFile); + try (FileInputStream stream = new FileInputStream(clusterInfoFile)) { channel = stream.getChannel(); lock = channel.lock(0, Long.MAX_VALUE, true); diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkRepository.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkRepository.java index bbe7d71edf..d916c624c4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkRepository.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkRepository.java @@ -253,8 +253,8 @@ public class SparkRepository { public String getMd5String(String filePath) throws LoadException { File file = new File(filePath); String md5sum = null; - try { - md5sum = DigestUtils.md5Hex(new FileInputStream(file)); + try (FileInputStream fis = new FileInputStream(file)) { + md5sum = DigestUtils.md5Hex(fis); Preconditions.checkNotNull(md5sum); LOG.debug("get md5sum from file {}, md5sum={}", filePath, md5sum); return md5sum; diff --git a/fs_brokers/apache_hdfs_broker/src/main/java/org/apache/doris/broker/hdfs/BrokerBootstrap.java b/fs_brokers/apache_hdfs_broker/src/main/java/org/apache/doris/broker/hdfs/BrokerBootstrap.java index acf0367e84..245e7213a9 100644 --- a/fs_brokers/apache_hdfs_broker/src/main/java/org/apache/doris/broker/hdfs/BrokerBootstrap.java +++ b/fs_brokers/apache_hdfs_broker/src/main/java/org/apache/doris/broker/hdfs/BrokerBootstrap.java @@ -65,8 +65,7 @@ public class BrokerBootstrap { private static boolean createAndLockPidFile(String pidFilePath) throws IOException { File pid = new File(pidFilePath); - RandomAccessFile file = new RandomAccessFile(pid, "rws"); - try { + try (RandomAccessFile file = new RandomAccessFile(pid, "rws")) { FileLock lock = file.getChannel().tryLock(); if (lock == null) { return false; @@ -79,10 +78,8 @@ public class BrokerBootstrap { file.write(name.split("@")[0].getBytes(Charsets.UTF_8)); return true; } catch (OverlappingFileLockException e) { - file.close(); return false; } catch (IOException e) { - file.close(); throw e; } } diff --git a/fs_brokers/apache_hdfs_broker/src/main/java/org/apache/doris/common/ConfigBase.java b/fs_brokers/apache_hdfs_broker/src/main/java/org/apache/doris/common/ConfigBase.java index 909eff39e5..a9fde084c0 100644 --- a/fs_brokers/apache_hdfs_broker/src/main/java/org/apache/doris/common/ConfigBase.java +++ b/fs_brokers/apache_hdfs_broker/src/main/java/org/apache/doris/common/ConfigBase.java @@ -40,7 +40,9 @@ public class ConfigBase { public void init(String propfile) throws Exception { props = new Properties(); confClass = this.getClass(); - props.load(new FileReader(propfile)); + try (FileReader fr = new FileReader(propfile)) { + props.load(fr); + } replacedByEnv(); setFields(); }