You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2018/06/01 04:53:26 UTC
[1/2] groovy git commit: Fix file descriptor leaks in compiler and
runtime
Repository: groovy
Updated Branches:
refs/heads/master 0e6221576 -> a6e5a041f
Fix file descriptor leaks in compiler and runtime
The JVM keeps a cache of URL connections, which keeps
the underlying files open for the lifetime of the VM
unless the `setUseCaches(false)` method is used.
This change makes it possible to reuse the Groovy compiler,
e.g. embedded in the Gradle daemon without preventing files
from being deleted on Windows.
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/3453072a
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/3453072a
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/3453072a
Branch: refs/heads/master
Commit: 3453072a0210990c8c9563557af12de3da4bbf4a
Parents: 0e62215
Author: Stefan Oehme <st...@gmail.com>
Authored: Wed May 30 00:53:37 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Fri Jun 1 12:50:23 2018 +0800
----------------------------------------------------------------------
.../groovy/groovy/lang/GroovyClassLoader.java | 3 ++-
.../groovy/ast/decompiled/AsmDecompiler.java | 3 ++-
.../groovy/control/SourceExtensionHandler.java | 3 ++-
.../groovy/control/io/URLReaderSource.java | 3 ++-
.../runtime/m12n/ExtensionModuleScanner.java | 3 ++-
.../transform/ASTTransformationVisitor.java | 3 ++-
.../org/codehaus/groovy/util/ReleaseInfo.java | 2 +-
.../org/codehaus/groovy/util/URLStreams.java | 26 ++++++++++++++++++++
8 files changed, 39 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/3453072a/src/main/groovy/groovy/lang/GroovyClassLoader.java
----------------------------------------------------------------------
diff --git a/src/main/groovy/groovy/lang/GroovyClassLoader.java b/src/main/groovy/groovy/lang/GroovyClassLoader.java
index 626ffb0..b1e94bd 100644
--- a/src/main/groovy/groovy/lang/GroovyClassLoader.java
+++ b/src/main/groovy/groovy/lang/GroovyClassLoader.java
@@ -46,6 +46,7 @@ import org.codehaus.groovy.runtime.InvokerHelper;
import org.codehaus.groovy.runtime.memoize.EvictableCache;
import org.codehaus.groovy.runtime.memoize.StampedCommonCache;
import org.codehaus.groovy.runtime.memoize.UnlimitedConcurrentCache;
+import org.codehaus.groovy.util.URLStreams;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
@@ -812,7 +813,7 @@ public class GroovyClassLoader extends URLClassLoader {
// do nothing and fall back to the other version
}
}
- return parseClass(new InputStreamReader(source.openStream(), sourceEncoding), name);
+ return parseClass(new InputStreamReader(URLStreams.openUncachedStream(source), sourceEncoding), name);
}
}
return oldClass;
http://git-wip-us.apache.org/repos/asf/groovy/blob/3453072a/src/main/java/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java b/src/main/java/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java
index c128c49..5efb60b 100644
--- a/src/main/java/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java
+++ b/src/main/java/org/codehaus/groovy/ast/decompiled/AsmDecompiler.java
@@ -20,6 +20,7 @@ package org.codehaus.groovy.ast.decompiled;
import groovy.lang.GroovyRuntimeException;
import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.util.URLStreams;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
@@ -78,7 +79,7 @@ public abstract class AsmDecompiler {
if (stub == null) {
DecompilingVisitor visitor = new DecompilingVisitor();
- try (InputStream stream = new BufferedInputStream(url.openStream())) {
+ try (InputStream stream = new BufferedInputStream(URLStreams.openUncachedStream(url))) {
new ClassReader(stream).accept(visitor, ClassReader.SKIP_FRAMES);
}
stub = visitor.result;
http://git-wip-us.apache.org/repos/asf/groovy/blob/3453072a/src/main/java/org/codehaus/groovy/control/SourceExtensionHandler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/control/SourceExtensionHandler.java b/src/main/java/org/codehaus/groovy/control/SourceExtensionHandler.java
index 774b128..0d85ebe 100644
--- a/src/main/java/org/codehaus/groovy/control/SourceExtensionHandler.java
+++ b/src/main/java/org/codehaus/groovy/control/SourceExtensionHandler.java
@@ -19,6 +19,7 @@
package org.codehaus.groovy.control;
import groovy.lang.GroovyRuntimeException;
+import org.codehaus.groovy.util.URLStreams;
import java.io.BufferedReader;
import java.io.IOException;
@@ -45,7 +46,7 @@ public class SourceExtensionHandler {
BufferedReader svcIn = null;
URL service = globalServices.nextElement();
try {
- svcIn = new BufferedReader(new InputStreamReader(service.openStream()));
+ svcIn = new BufferedReader(new InputStreamReader(URLStreams.openUncachedStream(service)));
String extension = svcIn.readLine();
while (extension != null) {
extension = extension.trim();
http://git-wip-us.apache.org/repos/asf/groovy/blob/3453072a/src/main/java/org/codehaus/groovy/control/io/URLReaderSource.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/control/io/URLReaderSource.java b/src/main/java/org/codehaus/groovy/control/io/URLReaderSource.java
index 7c92559..2af1a91 100644
--- a/src/main/java/org/codehaus/groovy/control/io/URLReaderSource.java
+++ b/src/main/java/org/codehaus/groovy/control/io/URLReaderSource.java
@@ -20,6 +20,7 @@ package org.codehaus.groovy.control.io;
import groovy.lang.GroovyRuntimeException;
import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.util.URLStreams;
import java.io.IOException;
import java.io.InputStreamReader;
@@ -50,7 +51,7 @@ public class URLReaderSource extends AbstractReaderSource {
* Returns a new Reader on the underlying source object.
*/
public Reader getReader() throws IOException {
- return new InputStreamReader( url.openStream(), configuration.getSourceEncoding() );
+ return new InputStreamReader(URLStreams.openUncachedStream(url), configuration.getSourceEncoding() );
}
/**
http://git-wip-us.apache.org/repos/asf/groovy/blob/3453072a/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java b/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java
index 89d5804..596c223 100644
--- a/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java
+++ b/src/main/java/org/codehaus/groovy/runtime/m12n/ExtensionModuleScanner.java
@@ -19,6 +19,7 @@
package org.codehaus.groovy.runtime.m12n;
import groovy.lang.GroovyRuntimeException;
+import org.codehaus.groovy.util.URLStreams;
import java.io.IOException;
import java.io.InputStream;
@@ -70,7 +71,7 @@ public class ExtensionModuleScanner {
Properties properties = new Properties();
InputStream inStream = null;
try {
- inStream = metadata.openStream();
+ inStream = URLStreams.openUncachedStream(metadata);
properties.load(inStream);
} catch (IOException e) {
throw new GroovyRuntimeException("Unable to load module META-INF descriptor", e);
http://git-wip-us.apache.org/repos/asf/groovy/blob/3453072a/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java b/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
index 77bc3cc..150603c 100644
--- a/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/ASTTransformationVisitor.java
@@ -34,6 +34,7 @@ import org.codehaus.groovy.control.Phases;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.control.messages.SimpleMessage;
import org.codehaus.groovy.control.messages.WarningMessage;
+import org.codehaus.groovy.util.URLStreams;
import java.io.BufferedReader;
import java.io.IOException;
@@ -221,7 +222,7 @@ public final class ASTTransformationVisitor extends ClassCodeVisitorSupport {
String className;
BufferedReader svcIn = null;
try {
- svcIn = new BufferedReader(new InputStreamReader(service.openStream(), "UTF-8"));
+ svcIn = new BufferedReader(new InputStreamReader(URLStreams.openUncachedStream(service), "UTF-8"));
try {
className = svcIn.readLine();
} catch (IOException ioe) {
http://git-wip-us.apache.org/repos/asf/groovy/blob/3453072a/src/main/java/org/codehaus/groovy/util/ReleaseInfo.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/util/ReleaseInfo.java b/src/main/java/org/codehaus/groovy/util/ReleaseInfo.java
index 912905e..6c214f8 100644
--- a/src/main/java/org/codehaus/groovy/util/ReleaseInfo.java
+++ b/src/main/java/org/codehaus/groovy/util/ReleaseInfo.java
@@ -53,7 +53,7 @@ public class ReleaseInfo {
if (url != null) {
InputStream is = null;
try {
- is = url.openStream();
+ is = URLStreams.openUncachedStream(url);
if (is != null) {
RELEASE_INFO.load(is);
}
http://git-wip-us.apache.org/repos/asf/groovy/blob/3453072a/src/main/java/org/codehaus/groovy/util/URLStreams.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/util/URLStreams.java b/src/main/java/org/codehaus/groovy/util/URLStreams.java
new file mode 100644
index 0000000..e1da480
--- /dev/null
+++ b/src/main/java/org/codehaus/groovy/util/URLStreams.java
@@ -0,0 +1,26 @@
+package org.codehaus.groovy.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+
+public class URLStreams {
+ private URLStreams() {
+
+ }
+
+ /**
+ * Opens an {@link InputStream} reading from the given URL without
+ * caching the stream. This prevents file descriptor leaks when reading
+ * from file system URLs.
+ *
+ * @param url the URL to connect to
+ * @return an input stream reading from the URL connection
+ */
+ public static InputStream openUncachedStream(URL url) throws IOException {
+ URLConnection urlConnection = url.openConnection();
+ urlConnection.setUseCaches(false);
+ return urlConnection.getInputStream();
+ }
+}
[2/2] groovy git commit: Add the missing license header
Posted by su...@apache.org.
Add the missing license header
Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/a6e5a041
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/a6e5a041
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/a6e5a041
Branch: refs/heads/master
Commit: a6e5a041f6a8ec2fc487891b9a26420f0f0181b2
Parents: 3453072
Author: sunlan <su...@apache.org>
Authored: Fri Jun 1 12:52:00 2018 +0800
Committer: sunlan <su...@apache.org>
Committed: Fri Jun 1 12:52:00 2018 +0800
----------------------------------------------------------------------
.../java/org/codehaus/groovy/util/URLStreams.java | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/groovy/blob/a6e5a041/src/main/java/org/codehaus/groovy/util/URLStreams.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/codehaus/groovy/util/URLStreams.java b/src/main/java/org/codehaus/groovy/util/URLStreams.java
index e1da480..83adbb8 100644
--- a/src/main/java/org/codehaus/groovy/util/URLStreams.java
+++ b/src/main/java/org/codehaus/groovy/util/URLStreams.java
@@ -1,3 +1,21 @@
+/*
+ * 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
+ * regarding copyright ownership. The ASF licenses this file
+ * 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.
+ */
package org.codehaus.groovy.util;
import java.io.IOException;