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

Auto Deploy does not release resource

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 4.0.5, 4.0.7
    • 4.1.0, 4.0.9
    • karaf
    • JDK 1.8.0_102 / Win10 (x64)

    • 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

            ffang Freeman Yue Fang
            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