Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8275185: Remove dead code and clean up jvmstat LocalVmManager #5923

Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -35,142 +35,83 @@
* Class for managing the LocalMonitoredVm instances on the local system.
* <p>
* This class is responsible for the mechanism that detects the active
* HotSpot Java Virtual Machines on the local host and possibly for a
* specific user. The ability to detect all possible HotSpot Java Virtual
* HotSpot Java Virtual Machines on the local host that can be accessed
* by the current user. The ability to detect all possible HotSpot Java Virtual
* Machines on the local host may be limited by the permissions of the
* principal running this JVM.
* current user running this JVM.
*
* @author Brian Doherty
* @since 1.5
*/
public class LocalVmManager {
private String userName; // user name for monitored jvm
private Pattern userPattern;
private Matcher userMatcher;
private FilenameFilter userFilter;
private Pattern filePattern;
private Matcher fileMatcher;
private FilenameFilter fileFilter;
private Pattern tmpFilePattern;
private Matcher tmpFileMatcher;
private FilenameFilter tmpFileFilter;
private FilenameFilter userDirFilter;
private FilenameFilter userDirFileFilter;
private FilenameFilter oldtmpFileFilter;

/**
* Creates a LocalVmManager instance for the local system.
* <p>
* Manages LocalMonitoredVm instances for which the principal
* Manages LocalMonitoredVm instances for which the current user
* has appropriate permissions.
*/
public LocalVmManager() {
this(null);
}

/**
* Creates a LocalVmManager instance for the given user.
* <p>
* Manages LocalMonitoredVm instances for all JVMs owned by the specified
* user.
*
* @param user the name of the user
*/
public LocalVmManager(String user) {
this.userName = user;

if (userName == null) {
userPattern = Pattern.compile(PerfDataFile.userDirNamePattern);
userMatcher = userPattern.matcher("");

userFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
userMatcher.reset(name);
return userMatcher.lookingAt();
}
};
}

filePattern = Pattern.compile(PerfDataFile.fileNamePattern);
fileMatcher = filePattern.matcher("");

fileFilter = new FilenameFilter() {
// 1.4.2 and later: The files are in {tmpdir}/hsperfdata_{any_user_name}/[0-9]+
Pattern userDirPattern = Pattern.compile(PerfDataFile.userDirNamePattern);
userDirFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
fileMatcher.reset(name);
return fileMatcher.matches();
return userDirPattern.matcher(name).lookingAt();
}
};

tmpFilePattern = Pattern.compile(PerfDataFile.tmpFileNamePattern);
tmpFileMatcher = tmpFilePattern.matcher("");
Pattern userDirFilePattern = Pattern.compile(PerfDataFile.fileNamePattern);
userDirFileFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return userDirFilePattern.matcher(name).matches();
}
};

tmpFileFilter = new FilenameFilter() {
// 1.4.1 (or earlier?): the files are stored directly under {tmpdir}/ with
// the following pattern.
Pattern oldtmpFilePattern = Pattern.compile(PerfDataFile.tmpFileNamePattern);
oldtmpFileFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
tmpFileMatcher.reset(name);
return tmpFileMatcher.matches();
return oldtmpFilePattern.matcher(name).matches();
}
};
}

/**
* Return the current set of monitorable Java Virtual Machines.
* <p>
* The set returned by this method depends on the user name passed
* to the constructor. If no user name was specified, then this
* method will return all candidate JVMs on the system. Otherwise,
* only the JVMs for the given user will be returned. This assumes
* that principal associated with this JVM has the appropriate
* permissions to access the target set of JVMs.
* Return the current set of monitorable Java Virtual Machines that
* are accessible by the current user.
*
* @return Set - the Set of monitorable Java Virtual Machines
*/
public synchronized Set<Integer> activeVms() {
/*
* This method is synchronized because the Matcher object used by
* fileFilter is not safe for concurrent use, and this method is
* called by multiple threads. Before this method was synchronized,
* we'd see strange file names being matched by the matcher.
* TODO: this method was synchronized due to its thread-unsafe use of the regexp
* Matcher objects. That is not the case anymore, but I am too afraid to change
* it now. Maybe fix this later in a separate RFE.
*/
Set<Integer> jvmSet = new HashSet<Integer>();
List<String> tmpdirs = PerfDataFile.getTempDirectories(userName, 0);
List<String> tmpdirs = PerfDataFile.getTempDirectories(0);

for (String dir : tmpdirs) {
File tmpdir = new File(dir);
if (! tmpdir.isDirectory()) {
continue;
}

if (userName == null) {
/*
* get a list of all of the user temporary directories and
* iterate over the list to find any files within those directories.
*/
File[] dirs = tmpdir.listFiles(userFilter);
for (int i = 0 ; i < dirs.length; i ++) {
if (!dirs[i].isDirectory()) {
continue;
}

// get a list of files from the directory
File[] files = dirs[i].listFiles(fileFilter);
if (files != null) {
for (int j = 0; j < files.length; j++) {
if (files[j].isFile() && files[j].canRead()) {
int vmid = PerfDataFile.getLocalVmId(files[j]);
if (vmid != -1) {
jvmSet.add(vmid);
}
}
}
}
// 1.4.2 and later: Look for the files {tmpdir}/hsperfdata_{any_user_name}/[0-9]+
// that are readable by the current user.
File[] dirs = tmpdir.listFiles(userDirFilter);
for (int i = 0 ; i < dirs.length; i ++) {
if (!dirs[i].isDirectory()) {
continue;
}
} else {
/*
* Check if the user directory can be accessed. Any of these
* conditions may have asynchronously changed between subsequent
* calls to this method.
*/

// get the list of files from the specified user directory
File[] files = tmpdir.listFiles(fileFilter);

// get a list of files from the directory
File[] files = dirs[i].listFiles(userDirFileFilter);
if (files != null) {
for (int j = 0; j < files.length; j++) {
if (files[j].isFile() && files[j].canRead()) {
@@ -183,8 +124,8 @@ public synchronized Set<Integer> activeVms() {
}
}

// look for any 1.4.1 files
File[] files = tmpdir.listFiles(tmpFileFilter);
// look for any 1.4.1 files that are readable by the current user.
File[] files = tmpdir.listFiles(oldtmpFileFilter);
if (files != null) {
for (int j = 0; j < files.length; j++) {
if (files[j].isFile() && files[j].canRead()) {