src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdDump.java
author egahlin
Mon, 05 Nov 2018 14:40:16 +0100
changeset 52413 6372f5af9612
parent 50745 a390cbb82d47
child 55378 bd613b97c7c8
permissions -rw-r--r--
8209960: -Xlog:jfr* doesn't work with the JFR Reviewed-by: mgronlun
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
package jdk.jfr.internal.dcmd;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.nio.file.InvalidPathException;
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    29
import java.time.Duration;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    30
import java.time.Instant;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    31
import java.time.LocalDate;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    32
import java.time.LocalDateTime;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    33
import java.time.LocalTime;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    34
import java.time.ZoneId;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    35
import java.time.ZonedDateTime;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    36
import java.time.format.DateTimeParseException;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    38
import jdk.jfr.FlightRecorder;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
import jdk.jfr.Recording;
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    40
import jdk.jfr.internal.LogLevel;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    41
import jdk.jfr.internal.LogTag;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    42
import jdk.jfr.internal.Logger;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    43
import jdk.jfr.internal.PlatformRecorder;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
import jdk.jfr.internal.PlatformRecording;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
import jdk.jfr.internal.PrivateAccess;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
import jdk.jfr.internal.SecuritySupport.SafePath;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
import jdk.jfr.internal.Utils;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
import jdk.jfr.internal.WriteableUserPath;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
 * JFR.dump
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
 */
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    54
// Instantiated by native
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
final class DCmdDump extends AbstractDCmd {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
     * Execute JFR.dump.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
     *
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    59
     * @param name name or id of the recording to dump, or <code>null</code> to dump everything
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
     *
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    61
     * @param filename file path where recording should be written, not null
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    62
     * @param maxAge how far back in time to dump, may be null
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    63
     * @param maxSize how far back in size to dump data from, may be null
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    64
     * @param begin point in time to dump data from, may be null
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    65
     * @param end point in time to dump data to, may be null
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    66
     * @param pathToGcRoots if Java heap should be swept for reference chains
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
     * @return result output
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
     * @throws DCmdException if the dump could not be completed
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
     */
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    72
    public String execute(String name, String filename, Long maxAge, Long maxSize, String begin, String end, Boolean pathToGcRoots) throws DCmdException {
52413
6372f5af9612 8209960: -Xlog:jfr* doesn't work with the JFR
egahlin
parents: 50745
diff changeset
    73
        if (Logger.shouldLog(LogTag.JFR_DCMD, LogLevel.DEBUG)) {
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    74
            Logger.log(LogTag.JFR_DCMD, LogLevel.DEBUG,
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    75
                    "Executing DCmdDump: name=" + name +
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    76
                    ", filename=" + filename +
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    77
                    ", maxage=" + maxAge +
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    78
                    ", maxsize=" + maxSize +
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    79
                    ", begin=" + begin +
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    80
                    ", end" + end +
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    81
                    ", path-to-gc-roots=" + pathToGcRoots);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    82
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    83
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    84
        if (FlightRecorder.getFlightRecorder().getRecordings().isEmpty()) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    85
            throw new DCmdException("No recordings to dump from. Use JFR.start to start a recording.");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    86
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    87
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    88
        if (maxAge != null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    89
            if (end != null || begin != null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    90
                throw new DCmdException("Dump failed, maxage can't be combined with begin or end.");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    91
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    92
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    93
            if (maxAge < 0) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    94
                throw new DCmdException("Dump failed, maxage can't be negative.");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    95
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    96
            if (maxAge == 0) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    97
                maxAge = Long.MAX_VALUE / 2; // a high value that won't overflow
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
    98
            }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
        }
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   100
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   101
        if (maxSize!= null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   102
            if (maxSize < 0) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   103
                throw new DCmdException("Dump failed, maxsize can't be negative.");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   104
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   105
            if (maxSize == 0) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   106
                maxSize = Long.MAX_VALUE / 2; // a high value that won't overflow
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   107
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   108
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   109
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   110
        Instant beginTime = parseTime(begin, "begin");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   111
        Instant endTime = parseTime(end, "end");
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   113
        if (beginTime != null && endTime != null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   114
            if (endTime.isBefore(beginTime)) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   115
                throw new DCmdException("Dump failed, begin must preceed end.");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   116
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   117
        }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   119
        Duration duration = null;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   120
        if (maxAge != null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   121
            duration = Duration.ofNanos(maxAge);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   122
            beginTime = Instant.now().minus(duration);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   123
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   124
        Recording recording = null;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   125
        if (name != null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   126
            recording = findRecording(name);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   127
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   128
        PlatformRecorder recorder = PrivateAccess.getInstance().getPlatformRecorder();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   129
        synchronized (recorder) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   130
            dump(recorder, recording, name, filename, maxSize, pathToGcRoots, beginTime, endTime);
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
        return getResult();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
50745
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   135
    public void dump(PlatformRecorder recorder, Recording recording, String name, String filename, Long maxSize, Boolean pathToGcRoots, Instant beginTime, Instant endTime) throws DCmdException {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   136
        try (PlatformRecording r = newSnapShot(recorder, recording, pathToGcRoots)) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   137
            r.filter(beginTime, endTime, maxSize);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   138
            if (r.getChunks().isEmpty()) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   139
                throw new DCmdException("Dump failed. No data found in the specified interval.");
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   140
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   141
            SafePath dumpFile = resolvePath(recording, filename);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   142
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   143
            // Needed for JVM
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   144
            Utils.touch(dumpFile.toPath());
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   145
            r.dumpStopped(new WriteableUserPath(dumpFile.toPath()));
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   146
            reportOperationComplete("Dumped", name, dumpFile);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   147
        } catch (IOException | InvalidPathException e) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   148
            throw new DCmdException("Dump failed. Could not copy recording data. %s", e.getMessage());
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   149
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   150
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   151
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   152
    private Instant parseTime(String time, String parameter) throws DCmdException {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   153
        if (time == null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   154
            return null;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   155
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   156
        try {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   157
            return Instant.parse(time);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   158
        } catch (DateTimeParseException dtp) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   159
            // fall through
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   160
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   161
        try {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   162
            LocalDateTime ldt = LocalDateTime.parse(time);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   163
            return ZonedDateTime.of(ldt, ZoneId.systemDefault()).toInstant();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   164
        } catch (DateTimeParseException dtp) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   165
            // fall through
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   166
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   167
        try {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   168
            LocalTime lt = LocalTime.parse(time);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   169
            LocalDate ld = LocalDate.now();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   170
            Instant instant = ZonedDateTime.of(ld, lt, ZoneId.systemDefault()).toInstant();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   171
            Instant now = Instant.now();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   172
            if (instant.isAfter(now) && !instant.isBefore(now.plusSeconds(3600))) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   173
                // User must have meant previous day
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   174
                ld = ld.minusDays(1);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   175
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   176
            return ZonedDateTime.of(ld, lt, ZoneId.systemDefault()).toInstant();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   177
        } catch (DateTimeParseException dtp) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   178
            // fall through
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   179
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   180
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   181
        if (time.startsWith("-")) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   182
            try {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   183
                long durationNanos = Utils.parseTimespan(time.substring(1));
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   184
                Duration duration = Duration.ofNanos(durationNanos);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   185
                return Instant.now().minus(duration);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   186
            } catch (NumberFormatException nfe) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   187
                // fall through
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   188
            }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   189
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   190
        throw new DCmdException("Dump failed, not a valid %s time.", parameter);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   191
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   192
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   193
    private PlatformRecording newSnapShot(PlatformRecorder recorder, Recording recording, Boolean pathToGcRoots) throws DCmdException, IOException {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   194
        if (recording == null) {
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   195
            // Operate on all recordings
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   196
            PlatformRecording snapshot = recorder.newTemporaryRecording();
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   197
            recorder.fillWithRecordedData(snapshot, pathToGcRoots);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   198
            return snapshot;
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   199
        }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   200
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   201
        PlatformRecording pr = PrivateAccess.getInstance().getPlatformRecording(recording);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   202
        return pr.newSnapshotClone("Dumped by user", pathToGcRoots);
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   203
    }
a390cbb82d47 8203929: Limit amount of data for JFR.dump
egahlin
parents: 50113
diff changeset
   204
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
}