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;