test/jdk/jdk/nio/zipfs/ReleaseDeflater.java
author simonis
Fri, 15 Nov 2019 20:29:11 +0100
changeset 59112 fe87a92570db
permissions -rw-r--r--
8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater() Reviewed-by: clanger, lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59112
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     1
/*
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     2
 * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     4
 *
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     7
 * published by the Free Software Foundation.
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     8
 *
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    13
 * accompanied this code).
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    14
 *
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    18
 *
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    21
 * questions.
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    22
 *
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    23
 */
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    24
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    25
/*
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    26
 * @test
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    27
 * @bug 8234011
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    28
 * @summary Check that jdk.nio.zipfs.ZipFileSystem doesn't cache more than ZipFileSystem.MAX_FLATER Inflater/Deflater objects
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    29
 * @run main ReleaseDeflater
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    30
 * @modules jdk.zipfs/jdk.nio.zipfs:+open
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    31
 * @author Volker Simonis
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    32
 */
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    33
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    34
import java.io.InputStream;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    35
import java.io.OutputStream;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    36
import java.lang.reflect.Field;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    37
import java.nio.file.FileSystem;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    38
import java.nio.file.FileSystems;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    39
import java.nio.file.Files;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    40
import java.nio.file.Path;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    41
import java.nio.file.Paths;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    42
import java.nio.file.spi.FileSystemProvider;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    43
import java.util.List;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    44
import java.util.Map;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    45
import java.util.ArrayList;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    46
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    47
public class ReleaseDeflater {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    48
    public static void main(String[] args) throws Throwable {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    49
        Path zipFile = Paths.get("ReleaseDeflaterTest.zip");
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    50
        try (FileSystem fs = FileSystems.newFileSystem(zipFile, Map.of("create", true))) {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    51
            FileSystemProvider zprov = fs.provider();
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    52
            Path test = fs.getPath("test.txt");
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    53
            int STREAMS = 100;
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    54
            List<OutputStream> ostreams = new ArrayList<>(STREAMS);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    55
            List<InputStream> istreams = new ArrayList<>(STREAMS);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    56
            for (int i = 0; i < STREAMS; i++) {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    57
                OutputStream zos = zprov.newOutputStream(test);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    58
                ostreams.add(zos);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    59
                zos.write("Hello".getBytes());
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    60
            }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    61
            for (OutputStream os : ostreams) {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    62
                os.close();
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    63
            }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    64
            for (int i = 0; i < STREAMS; i++) {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    65
                InputStream zis = zprov.newInputStream(test);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    66
                istreams.add(zis);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    67
            }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    68
            for (InputStream is : istreams) {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    69
                is.close();
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    70
            }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    71
            try {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    72
                Field max_flaters = fs.getClass().getDeclaredField("MAX_FLATER");
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    73
                max_flaters.setAccessible(true);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    74
                int MAX_FLATERS = max_flaters.getInt(fs);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    75
                Field inflaters = fs.getClass().getDeclaredField("inflaters");
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    76
                inflaters.setAccessible(true);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    77
                int inflater_count = ((List<?>) inflaters.get(fs)).size();
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    78
                if (inflater_count > MAX_FLATERS) {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    79
                    throw new Exception("Too many inflaters " + inflater_count);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    80
                }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    81
                Field deflaters = fs.getClass().getDeclaredField("deflaters");
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    82
                deflaters.setAccessible(true);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    83
                int deflater_count = ((List<?>) deflaters.get(fs)).size();
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    84
                if (deflater_count > MAX_FLATERS) {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    85
                    throw new Exception("Too many deflaters " + deflater_count);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    86
                }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    87
            } catch (NoSuchFieldException nsfe) {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    88
                // Probably the implementation has changed, so there's not much we can do...
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    89
                throw new RuntimeException("Implementation of jdk.nio.zipfs.ZipFileSystem changed - disable or fix the test");
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    90
            }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    91
        } finally {
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    92
            Files.deleteIfExists(zipFile);
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    93
        }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    94
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    95
    }
fe87a92570db 8234011: (zipfs) Memory leak in ZipFileSystem.releaseDeflater()
simonis
parents:
diff changeset
    96
}