Uploaded image for project: 'Karaf'
  1. Karaf
  2. KARAF-4802

Auto Deploy does not release resource

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 4.0.5, 4.0.7
    • Fix Version/s: 4.1.0, 4.0.9
    • Component/s: karaf
    • Labels:
    • Environment:

      JDK 1.8.0_102 / Win10 (x64)

    • Flags:
      Patch, Important

      Description

      Calling getLastModified() opens the input stream.

      In org.apache.karaf.deployer.blueprint-4.0.7-sources.jar:

      org/apache/karaf/deployer/blueprint/BlueprintTransformer.java:94:
      url.openConnection().getLastModified()
      => calls sun.net.www.protocol.file.FileURLConnection#getLastModified()
      => calls sun.net.www.protocol.file.FileURLConnection#initializeHeaders()
      => calls sun.net.www.protocol.file.FileURLConnection#connect()
      in this function at line 57: this.connected is false
      and line 61: this.isDirectory is false
      Here they open the input stream:
      error source is at line 69: open input stream and keep it in this.is

      Note:
      There's a mistake 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 (in BlueprintTransformer.java):

          protected static long getLastModified(URL url) throws IOException {
              URLConnection urlConnection = url.openConnection();
              try(InputStream is = urlConnection.getInputStream()) {
                  return urlConnection.getLastModified();
              }
          }
      

      To limit number of stream access, 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:
      When no object reference the InputStream, InputStream class will automatically close the stream while processing finalizations.
      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 deployers (not checked).

        Attachments

          Activity

            People

            • Assignee:
              ffang Freeman Fang
              Reporter:
              F.Arnoud Frederic ARNOUD
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Time Tracking

                Estimated:
                Original Estimate - 2h
                2h
                Remaining:
                Remaining Estimate - 2h
                2h
                Logged:
                Time Spent - Not Specified
                Not Specified