From 74bdf633e9d6e03237b9b5285ce23b39d6846c3f Mon Sep 17 00:00:00 2001 From: Dave Brosius Date: Mon, 17 Apr 2017 07:33:48 -0400 Subject: [PATCH] remove use of FileInputStream/FileOutputStream for gc concerns patcb by dbrosius reviewed by rstupp for CASSANDRA-13452 --- .../db/commitlog/CommitLogReader.java | 8 ++-- .../apache/cassandra/gms/FailureDetector.java | 16 +++++--- .../hadoop/cql3/CqlConfigHelper.java | 40 ++++++++++--------- .../io/compress/CompressionMetadata.java | 4 +- .../io/sstable/format/SSTableReader.java | 6 ++- .../cassandra/security/JKSKeyProvider.java | 6 ++- .../apache/cassandra/security/SSLFactory.java | 13 +++--- .../tools/SSTableMetadataViewer.java | 3 +- .../apache/cassandra/stress/StressGraph.java | 4 +- .../stress/settings/SettingsNode.java | 12 +++--- 10 files changed, 66 insertions(+), 46 deletions(-) diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogReader.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogReader.java index 9eec477bf8..5fb1d5dff6 100644 --- a/src/java/org/apache/cassandra/db/commitlog/CommitLogReader.java +++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogReader.java @@ -17,6 +17,8 @@ */ package org.apache.cassandra.db.commitlog; +import java.nio.file.Files; +import java.nio.file.Path; import java.io.*; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; @@ -397,9 +399,9 @@ public class CommitLogReader catch (Throwable t) { JVMStabilityInspector.inspectThrowable(t); - File f = File.createTempFile("mutation", "dat"); + Path p = Files.createTempFile("mutation", "dat"); - try (DataOutputStream out = new DataOutputStream(new FileOutputStream(f))) + try (DataOutputStream out = new DataOutputStream(Files.newOutputStream(p))) { out.write(inputBuffer, 0, size); } @@ -409,7 +411,7 @@ public class CommitLogReader String.format( "Unexpected error deserializing mutation; saved to %s. " + "This may be caused by replaying a mutation against a table with the same name but incompatible schema. " + - "Exception follows: %s", f.getAbsolutePath(), t), + "Exception follows: %s", p.toString(), t), CommitLogReadErrorReason.MUTATION_ERROR, false)); return; diff --git a/src/java/org/apache/cassandra/gms/FailureDetector.java b/src/java/org/apache/cassandra/gms/FailureDetector.java index e5a29d6f58..8aad4723b7 100644 --- a/src/java/org/apache/cassandra/gms/FailureDetector.java +++ b/src/java/org/apache/cassandra/gms/FailureDetector.java @@ -17,6 +17,9 @@ */ package org.apache.cassandra.gms; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.nio.file.Path; import java.io.*; import java.lang.management.ManagementFactory; import java.net.InetAddress; @@ -215,15 +218,18 @@ public class FailureDetector implements IFailureDetector, FailureDetectorMBean */ public void dumpInterArrivalTimes() { - File file = FileUtils.createTempFile("failuredetector-", ".dat"); + Path path = null; + try { + path = Files.createTempFile("failuredetector-", ".dat"); - try (OutputStream os = new BufferedOutputStream(new FileOutputStream(file, true))) - { - os.write(toString().getBytes()); + try (OutputStream os = new BufferedOutputStream(Files.newOutputStream(path, StandardOpenOption.APPEND))) + { + os.write(toString().getBytes()); + } } catch (IOException e) { - throw new FSWriteError(e, file); + throw new FSWriteError(e, (path == null) ? null : path.toFile()); } } diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java index 4c712734ed..f9a6f3ae0f 100644 --- a/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java +++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java @@ -19,7 +19,9 @@ package org.apache.cassandra.hadoop.cql3; * under the License. * */ -import java.io.FileInputStream; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.io.InputStream; import java.io.IOException; import java.security.KeyManagementException; import java.security.KeyStore; @@ -86,7 +88,7 @@ public class CqlConfigHelper private static final String OUTPUT_CQL = "cassandra.output.cql"; private static final String OUTPUT_NATIVE_PORT = "cassandra.output.native.port"; - + /** * Set the CQL columns for the input of this job. * @@ -97,10 +99,10 @@ public class CqlConfigHelper { if (columns == null || columns.isEmpty()) return; - + conf.set(INPUT_CQL_COLUMNS_CONFIG, columns); } - + /** * Set the CQL query Limit for the input of this job. * @@ -127,10 +129,10 @@ public class CqlConfigHelper { if (clauses == null || clauses.isEmpty()) return; - + conf.set(INPUT_CQL_WHERE_CLAUSE_CONFIG, clauses); } - + /** * Set the CQL prepared statement for the output of this job. * @@ -141,7 +143,7 @@ public class CqlConfigHelper { if (cql == null || cql.isEmpty()) return; - + conf.set(OUTPUT_CQL, cql); } @@ -283,7 +285,7 @@ public class CqlConfigHelper return conf.get(OUTPUT_CQL); } - private static Optional getProtocolVersion(Configuration conf) + private static Optional getProtocolVersion(Configuration conf) { return getIntSetting(INPUT_NATIVE_PROTOCOL_VERSION, conf); } @@ -331,7 +333,7 @@ public class CqlConfigHelper if (sslOptions.isPresent()) builder.withSSL(sslOptions.get()); - if (protocolVersion.isPresent()) + if (protocolVersion.isPresent()) { builder.withProtocolVersion(ProtocolVersion.fromInt(protocolVersion.get())); } @@ -356,7 +358,7 @@ public class CqlConfigHelper public static void setInputMaxSimultReqPerConnections(Configuration conf, String reqs) { conf.set(INPUT_NATIVE_MAX_SIMULT_REQ_PER_CONNECTION, reqs); - } + } public static void setInputNativeConnectionTimeout(Configuration conf, String timeout) { @@ -396,7 +398,7 @@ public class CqlConfigHelper public static void setInputNativeSSLTruststorePath(Configuration conf, String path) { conf.set(INPUT_NATIVE_SSL_TRUST_STORE_PATH, path); - } + } public static void setInputNativeSSLKeystorePath(Configuration conf, String path) { @@ -452,7 +454,7 @@ public class CqlConfigHelper } return poolingOptions; - } + } private static QueryOptions getReadQueryOptions(Configuration conf) { @@ -476,7 +478,7 @@ public class CqlConfigHelper Optional sendBufferSize = getInputNativeSendBufferSize(conf); Optional soLinger = getInputNativeSolinger(conf); Optional tcpNoDelay = getInputNativeTcpNodelay(conf); - Optional reuseAddress = getInputNativeReuseAddress(conf); + Optional reuseAddress = getInputNativeReuseAddress(conf); Optional keepAlive = getInputNativeKeepAlive(conf); if (connectTimeoutMillis.isPresent()) @@ -494,7 +496,7 @@ public class CqlConfigHelper if (reuseAddress.isPresent()) socketOptions.setReuseAddress(reuseAddress.get()); if (keepAlive.isPresent()) - socketOptions.setKeepAlive(keepAlive.get()); + socketOptions.setKeepAlive(keepAlive.get()); return socketOptions; } @@ -565,7 +567,7 @@ public class CqlConfigHelper String setting = conf.get(parameter); if (setting == null) return Optional.absent(); - return Optional.of(Integer.valueOf(setting)); + return Optional.of(Integer.valueOf(setting)); } private static Optional getBooleanSetting(String parameter, Configuration conf) @@ -573,7 +575,7 @@ public class CqlConfigHelper String setting = conf.get(parameter); if (setting == null) return Optional.absent(); - return Optional.of(Boolean.valueOf(setting)); + return Optional.of(Boolean.valueOf(setting)); } private static Optional getStringSetting(String parameter, Configuration conf) @@ -581,7 +583,7 @@ public class CqlConfigHelper String setting = conf.get(parameter); if (setting == null) return Optional.absent(); - return Optional.of(setting); + return Optional.of(setting); } private static AuthProvider getClientAuthProvider(String factoryClassName, Configuration conf) @@ -623,7 +625,7 @@ public class CqlConfigHelper TrustManagerFactory tmf = null; if (truststorePath.isPresent()) { - try (FileInputStream tsf = new FileInputStream(truststorePath.get())) + try (InputStream tsf = Files.newInputStream(Paths.get(truststorePath.get()))) { KeyStore ts = KeyStore.getInstance("JKS"); ts.load(tsf, truststorePassword.isPresent() ? truststorePassword.get().toCharArray() : null); @@ -635,7 +637,7 @@ public class CqlConfigHelper KeyManagerFactory kmf = null; if (keystorePath.isPresent()) { - try (FileInputStream ksf = new FileInputStream(keystorePath.get())) + try (InputStream ksf = Files.newInputStream(Paths.get(keystorePath.get()))) { KeyStore ks = KeyStore.getInstance("JKS"); ks.load(ksf, keystorePassword.isPresent() ? keystorePassword.get().toCharArray() : null); diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java index a591bb570a..6c1849f942 100644 --- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java +++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java @@ -17,6 +17,8 @@ */ package org.apache.cassandra.io.compress; +import java.nio.file.Files; +import java.nio.file.Paths; import java.io.BufferedOutputStream; import java.io.DataInput; import java.io.DataInputStream; @@ -103,7 +105,7 @@ public class CompressionMetadata { this.indexFilePath = indexFilePath; - try (DataInputStream stream = new DataInputStream(new FileInputStream(indexFilePath))) + try (DataInputStream stream = new DataInputStream(Files.newInputStream(Paths.get(indexFilePath)))) { String compressorName = stream.readUTF(); int optionCount = stream.readInt(); diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java index 2a6e405420..568336e5f3 100644 --- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java +++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java @@ -17,6 +17,8 @@ */ package org.apache.cassandra.io.sstable.format; +import java.nio.file.Files; +import java.nio.file.Paths; import java.io.*; import java.lang.ref.WeakReference; import java.nio.ByteBuffer; @@ -730,7 +732,7 @@ public abstract class SSTableReader extends SSTable implements SelfRefCounted firstLast = new IndexSummary.IndexSummarySerializer().deserializeFirstLastKey(iStream, partitioner); out.printf("First token: %s (key=%s)%n", firstLast.left.getToken(), keyType.getString(firstLast.left.getKey())); diff --git a/tools/stress/src/org/apache/cassandra/stress/StressGraph.java b/tools/stress/src/org/apache/cassandra/stress/StressGraph.java index 6729a2833e..7a865b4cd0 100644 --- a/tools/stress/src/org/apache/cassandra/stress/StressGraph.java +++ b/tools/stress/src/org/apache/cassandra/stress/StressGraph.java @@ -148,7 +148,7 @@ public class StressGraph currentThreadCount = tc.group(2); } } - + // Detect mode changes if (line.equals(StressMetrics.HEAD)) { @@ -232,7 +232,7 @@ public class StressGraph private JSONObject createJSONStats(JSONObject json) { - try (InputStream logStream = new FileInputStream(stressSettings.graph.temporaryLogFile)) + try (InputStream logStream = Files.newInputStream(stressSettings.graph.temporaryLogFile.toPath())) { JSONArray stats; if (json == null) diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsNode.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsNode.java index ef20092cdf..a0291627c4 100644 --- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsNode.java +++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsNode.java @@ -1,6 +1,6 @@ package org.apache.cassandra.stress.settings; /* - * + * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -8,19 +8,21 @@ package org.apache.cassandra.stress.settings; * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * + * */ +import java.nio.file.Files; +import java.nio.file.Paths; import java.io.*; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -44,7 +46,7 @@ public class SettingsNode implements Serializable { String node; List tmpNodes = new ArrayList<>(); - try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(options.file.value())))) + try (BufferedReader in = new BufferedReader(new InputStreamReader(Files.newInputStream(Paths.get(options.file.value()))))) { while ((node = in.readLine()) != null) {