jenkinsci/lib-file-leak-detector

Missing open/close from Files.lines

z669016 opened this issue · 4 comments

Hi,
I tried to figure out if my Files.lines("some-path") stream is closed correctly. I used the agent but if I use the trace option, I do see messages from class files being opened and closed, but the text file ("some-path") is not in the list.
Are streams handled differently, or does the agent just doesn't see the calls for the open/close?

public static void main(String[] args) {
    Stream<Entry> entries = getEntries();
    entries.forEach(System.out::println);
    entries.close();
}

public static Stream<Entry> getEntries() {
    Path path = Paths.get("./src/test/resources", "entries.txt");
    try {
        Stream<String> lines = Files.lines(path);
        return lines.map(line -> asEntry(line));
    } catch (IOException exc) {
        System.out.println(exc);
    }

    return Stream.empty();
}

Regards,
René

Looks like the FileDescriptor sun.nio.fs.UnixChannelFactory.open(...) needs to be intercepted.

@z669016 I've had a similar problem that calling Files.lines too many times will cause a "too many opened files" exception. Perhaps there is indeed a file leak in Java's Files.lines()?

@binma1 , you have to close the stream to free the file handle.

This issue is about adding support for finding such invalid uses via file-leak-detector.

@centic9 Thanks!