You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@karaf.apache.org by "Frederic ARNOUD (JIRA)" <ji...@apache.org> on 2016/10/21 14:34:58 UTC
[jira] [Updated] (KARAF-4802) Auto Deploy does not release resource
[ https://issues.apache.org/jira/browse/KARAF-4802?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Frederic ARNOUD updated KARAF-4802:
-----------------------------------
Description:
In org.apache.karaf.deployer.blueprint-4.0.7-sources.jar:
org/apache/karaf/deployer/blueprint/BlueprintTransformer.java:94:
{{url.openConnection().getLastModified()}}
=> call {{sun.net.www.protocol.file.FileURLConnection#getLastModified()}}
=> call {{sun.net.www.protocol.file.FileURLConnection#initializeHeaders()}}
=> call {{sun.net.www.protocol.file.FileURLConnection#connect()}}
line 57: {{this.connected}} is {{false}}
line 61: {{this.isDirectory}} is {{false}}
*Here they open the input stream:*
line 69: open input stream and keep it in this.is
_Note:_
Bad code at line (since they try to open the stream):
sun/net/www/protocol/file/FileURLConnection.java:90 with a nice empty try/catch!
AFAIK, there's no way to know if stream was open or not.
I checked {{HttpURLConnection}}, it does the same (and {{HttpsURLConnection}} also).
*IMHO you should add a function like this one:*
{code:java}
protected static long getLastModified(URL url) throws IOException {
URLConnection urlConnection = url.openConnection();
try(InputStream is = urlConnection.getInputStream()) {
return urlConnection.getLastModified();
}
}
{code}
To avoid risk to open remote stream twice, I did this in my code (in function similar to {{transform(URL, OutputStream)}}):
{code:java}
final URLConnection urlConnection = url.openConnection();
// keep original last modification date
final long lastModified = urlConnection.getLastModified();
try (InputStream in = urlConnection.getInputStream()) {
source = readAllBytes(in);
}
{code}
*Note:*
Since no object reference the InputStream, InputStream class will automatically close the stream while processing the finalization.
Before this process, we cannot delete file in deploy directory.
(sorry I did not find component for this class)
Same issue should appear in other deployer (not checked).
was:
In org.apache.karaf.deployer.blueprint-4.0.7-sources.jar:
org/apache/karaf/deployer/blueprint/BlueprintTransformer.java:94:
{{url.openConnection().getLastModified()}}
=> call {{sun.net.www.protocol.file.FileURLConnection#getLastModified()}}
=> call {{sun.net.www.protocol.file.FileURLConnection#initializeHeaders()}}
=> call {{sun.net.www.protocol.file.FileURLConnection#connect()}}
line 57: {{this.connected}} is {{false}}
line 61: {{this.isDirectory}} is {{false}}
*Here they open the input stream:*
line 69: open input stream and keep it in this.is
_Note:_
Bad code at line (since they try to open the stream):
sun/net/www/protocol/file/FileURLConnection.java:90 with a nice empty try/catch!
AFAIK, there's no way to know if stream was open or not.
I checked {{HttpURLConnection}}, it does the same (and {{HttpsURLConnection}} also).
*IMHO you should add a function like this one:*
{{
protected static long getLastModified(URL url) throws IOException {
URLConnection urlConnection = url.openConnection();
try(InputStream is = urlConnection.getInputStream()) {
return urlConnection.getLastModified();
}
}
}}
To avoid risk to open remote stream twice, I did this in my code (in function similar to {{transform(URL, OutputStream)}}):
{{
final URLConnection urlConnection = url.openConnection();
// keep original last modification date
final long lastModified = urlConnection.getLastModified();
try (InputStream in = urlConnection.getInputStream()) {
source = readAllBytes(in);
}
}}
*Note:*
Since no object reference the InputStream, InputStream class will automatically close the stream while processing the finalization.
Before this process, we cannot delete file in deploy directory.
(sorry I did not find component for this class)
Same issue should appear in other deployer (not checked).
> Auto Deploy does not release resource
> -------------------------------------
>
> Key: KARAF-4802
> URL: https://issues.apache.org/jira/browse/KARAF-4802
> Project: Karaf
> Issue Type: Bug
> Components: karaf-core
> Affects Versions: 4.0.5, 4.0.7
> Environment: JDK 1.8.0_102 / Win10 (x64)
> Reporter: Frederic ARNOUD
> Labels: leak
> Original Estimate: 2h
> Remaining Estimate: 2h
>
> In org.apache.karaf.deployer.blueprint-4.0.7-sources.jar:
> org/apache/karaf/deployer/blueprint/BlueprintTransformer.java:94:
> {{url.openConnection().getLastModified()}}
> => call {{sun.net.www.protocol.file.FileURLConnection#getLastModified()}}
> => call {{sun.net.www.protocol.file.FileURLConnection#initializeHeaders()}}
> => call {{sun.net.www.protocol.file.FileURLConnection#connect()}}
> line 57: {{this.connected}} is {{false}}
> line 61: {{this.isDirectory}} is {{false}}
> *Here they open the input stream:*
> line 69: open input stream and keep it in this.is
> _Note:_
> Bad code at line (since they try to open the stream):
> sun/net/www/protocol/file/FileURLConnection.java:90 with a nice empty try/catch!
> AFAIK, there's no way to know if stream was open or not.
> I checked {{HttpURLConnection}}, it does the same (and {{HttpsURLConnection}} also).
> *IMHO you should add a function like this one:*
> {code:java}
> protected static long getLastModified(URL url) throws IOException {
> URLConnection urlConnection = url.openConnection();
> try(InputStream is = urlConnection.getInputStream()) {
> return urlConnection.getLastModified();
> }
> }
> {code}
> To avoid risk to open remote stream twice, I did this in my code (in function similar to {{transform(URL, OutputStream)}}):
> {code:java}
> final URLConnection urlConnection = url.openConnection();
> // keep original last modification date
> final long lastModified = urlConnection.getLastModified();
> try (InputStream in = urlConnection.getInputStream()) {
> source = readAllBytes(in);
> }
> {code}
> *Note:*
> Since no object reference the InputStream, InputStream class will automatically close the stream while processing the finalization.
> Before this process, we cannot delete file in deploy directory.
> (sorry I did not find component for this class)
> Same issue should appear in other deployer (not checked).
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)