You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by "Michael McCandless (JIRA)" <ji...@apache.org> on 2016/12/09 22:50:58 UTC

[jira] [Updated] (LUCENE-7584) Potential leak issue

     [ https://issues.apache.org/jira/browse/LUCENE-7584?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Michael McCandless updated LUCENE-7584:
---------------------------------------
    Description: 
May the following method have a potential leak like LUCENE-3251 when  directory.createOutput(fileName) throws IOException?

(Found the code from the recent code snapshot)

lucene/src/java/org/apache/lucene/index/CompoundFileWriter.java
{noformat}
   public void close() throws IOException {
        if (merged)
            throw new IllegalStateException("Merge already performed");

        if (entries.isEmpty())
            throw new IllegalStateException("No entries to merge have been defined");

        merged = true;

        // open the compound stream
        IndexOutput os = directory.createOutput(fileName);
        IOException priorException = null;
        try {
            // Write the Version info - must be a VInt because CFR reads a VInt
            // in older versions!
            os.writeVInt(FORMAT_CURRENT);

            // Write the number of entries
            os.writeVInt(entries.size());

            // Write the directory with all offsets at 0.
            // Remember the positions of directory entries so that we can
            // adjust the offsets later
            long totalSize = 0;
            for (FileEntry fe : entries) {
                fe.directoryOffset = os.getFilePointer();
                os.writeLong(0);    // for now
                os.writeString(IndexFileNames.stripSegmentName(fe.file));
                totalSize += directory.fileLength(fe.file);
            }

            // Pre-allocate size of file as optimization --
...
        } catch (IOException e) {
          priorException = e;
        } finally {
          IOUtils.closeSafely(priorException, os);
        }
    }
{noformat}

  was:
May the following method have a potential leak like LUCENE-3251 when  directory.createOutput(fileName) throws IOException?

(Found the code from the recent code snapshot)

lucene/src/java/org/apache/lucene/index/CompoundFileWriter.java

   public void close() throws IOException {
        if (merged)
            throw new IllegalStateException("Merge already performed");

        if (entries.isEmpty())
            throw new IllegalStateException("No entries to merge have been defined");

        merged = true;

        // open the compound stream
        IndexOutput os = directory.createOutput(fileName);
        IOException priorException = null;
        try {
            // Write the Version info - must be a VInt because CFR reads a VInt
            // in older versions!
            os.writeVInt(FORMAT_CURRENT);

            // Write the number of entries
            os.writeVInt(entries.size());

            // Write the directory with all offsets at 0.
            // Remember the positions of directory entries so that we can
            // adjust the offsets later
            long totalSize = 0;
            for (FileEntry fe : entries) {
                fe.directoryOffset = os.getFilePointer();
                os.writeLong(0);    // for now
                os.writeString(IndexFileNames.stripSegmentName(fe.file));
                totalSize += directory.fileLength(fe.file);
            }

            // Pre-allocate size of file as optimization --
...
        } catch (IOException e) {
          priorException = e;
        } finally {
          IOUtils.closeSafely(priorException, os);
        }
    }



> Potential leak issue
> --------------------
>
>                 Key: LUCENE-7584
>                 URL: https://issues.apache.org/jira/browse/LUCENE-7584
>             Project: Lucene - Core
>          Issue Type: Bug
>            Reporter: Jaechang Nam
>            Priority: Trivial
>
> May the following method have a potential leak like LUCENE-3251 when  directory.createOutput(fileName) throws IOException?
> (Found the code from the recent code snapshot)
> lucene/src/java/org/apache/lucene/index/CompoundFileWriter.java
> {noformat}
>    public void close() throws IOException {
>         if (merged)
>             throw new IllegalStateException("Merge already performed");
>         if (entries.isEmpty())
>             throw new IllegalStateException("No entries to merge have been defined");
>         merged = true;
>         // open the compound stream
>         IndexOutput os = directory.createOutput(fileName);
>         IOException priorException = null;
>         try {
>             // Write the Version info - must be a VInt because CFR reads a VInt
>             // in older versions!
>             os.writeVInt(FORMAT_CURRENT);
>             // Write the number of entries
>             os.writeVInt(entries.size());
>             // Write the directory with all offsets at 0.
>             // Remember the positions of directory entries so that we can
>             // adjust the offsets later
>             long totalSize = 0;
>             for (FileEntry fe : entries) {
>                 fe.directoryOffset = os.getFilePointer();
>                 os.writeLong(0);    // for now
>                 os.writeString(IndexFileNames.stripSegmentName(fe.file));
>                 totalSize += directory.fileLength(fe.file);
>             }
>             // Pre-allocate size of file as optimization --
> ...
>         } catch (IOException e) {
>           priorException = e;
>         } finally {
>           IOUtils.closeSafely(priorException, os);
>         }
>     }
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: dev-help@lucene.apache.org