You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kato-commits@incubator.apache.org by mo...@apache.org on 2009/05/26 15:50:02 UTC

svn commit: r778768 - in /incubator/kato/trunk/org.apache.kato.tools.katoview/src: com/ibm/ org/apache/kato/katoview/ org/apache/kato/katoview/commands/ org/apache/kato/katoview/commands/helpers/ org/apache/kato/katoview/commands/infocommands/ org/apac...

Author: monteith
Date: Tue May 26 15:50:02 2009
New Revision: 778768

URL: http://svn.apache.org/viewvc?rev=778768&view=rev
Log:
Tomcat pools command added.

Added:
    incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/JavaObjectVisitor.java   (with props)
    incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/tomcat/TomcatThreadPoolsCommand.java   (with props)
Removed:
    incubator/kato/trunk/org.apache.kato.tools.katoview/src/com/ibm/
Modified:
    incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/Session.java
    incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/TomcatCommand.java
    incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/KatoSearch.java
    incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/infocommands/InfoPropertyCommand.java

Modified: incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/Session.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/Session.java?rev=778768&r1=778767&r2=778768&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/Session.java (original)
+++ incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/Session.java Tue May 26 15:50:02 2009
@@ -31,7 +31,6 @@
 public class Session {
 
 	public static final String CORE_FILE_PATH_PROPERTY = "core_file_path";
-	private String factoryName;
 	private Image loadedImage;
 	private RootCommand rootCommand;
 	private HashMap variables;
@@ -42,7 +41,6 @@
 	private static final String launcherProperty = "org.apache.kato.tools.katoview.launcher";
 	
 	public Session(String[] args) {
-		factoryName = System.getProperty(factoryProperty, defaultFactoryName);
 		sessionInit(args);
 	}
 
@@ -61,23 +59,6 @@
 		loadedImage = imageFromCommandLine(args);
 	}
 	
-	private ImageFactory getFactory() {
-		try {
-			Class factoryClass = Class.forName(factoryName);
-			return (ImageFactory)factoryClass.newInstance();
-		} catch (ClassNotFoundException e) {
-			out.error("ClassNotFoundException while getting ImageFactory: " + e.getMessage());
-			out.error("Use -D" + factoryProperty + "=<classname> to change the ImageFactory");
-			return null;
-		} catch (InstantiationException e) {
-			out.error("InstantiationException while getting ImageFactory: " + e.getMessage());
-			return null;
-		} catch (IllegalAccessException e) {
-			out.error("IllegalAccessException while getting ImageFactory: " + e.getMessage());
-			return null;
-		}
-	}
-	
 	/**
 	 * @param args
 	 */
@@ -107,7 +88,7 @@
 			loadedImage = FactoryRegistry.getDefaultRegistry().getImage(new File(coreFilePath));
 			
 			if (loadedImage == null) {
-				throw new IOException("No ImageFactory could load "+loadedImage);
+				throw new IOException("No ImageFactory could load "+coreFilePath);
 			}
 			
 			//Store the core file file path in the variables. We need it for creating default filenames for heapdumps

Modified: incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/TomcatCommand.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/TomcatCommand.java?rev=778768&r1=778767&r2=778768&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/TomcatCommand.java (original)
+++ incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/TomcatCommand.java Tue May 26 15:50:02 2009
@@ -16,6 +16,7 @@
 import java.util.Vector;
 
 import org.apache.kato.katoview.Output;
+import org.apache.kato.katoview.commands.tomcat.TomcatThreadPoolsCommand;
 import org.apache.kato.katoview.commands.tomcat.TomcatVersionCommand;
 
 /**
@@ -32,7 +33,7 @@
 		super(o, COMMAND_NAME, DESCRIPTION, LONG_DESCRIPTION);
 		child_commands = new Vector();
 		child_commands.add(new TomcatVersionCommand(o));
-
+		child_commands.add(new TomcatThreadPoolsCommand(o));
 	}
 	
 }

Added: incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/JavaObjectVisitor.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/JavaObjectVisitor.java?rev=778768&view=auto
==============================================================================
--- incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/JavaObjectVisitor.java (added)
+++ incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/JavaObjectVisitor.java Tue May 26 15:50:02 2009
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.katoview.commands.helpers;
+
+import org.apache.kato.image.KatoException;
+import org.apache.kato.java.JavaObject;
+
+/**
+ * Used to visit objects.
+ * 
+ *
+ */
+public interface JavaObjectVisitor {
+	
+	/**
+	 * callback to be executed over objects.
+	 * 
+	 * @param object JavaObject being visited
+	 * @return false if visiting is to stop
+	 * @throws KatoException
+	 */
+	public boolean visit(JavaObject object) throws KatoException;
+}

Propchange: incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/JavaObjectVisitor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/KatoSearch.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/KatoSearch.java?rev=778768&r1=778767&r2=778768&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/KatoSearch.java (original)
+++ incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/helpers/KatoSearch.java Tue May 26 15:50:02 2009
@@ -13,6 +13,8 @@
  ******************************************************************************/
 package org.apache.kato.katoview.commands.helpers;
 
+import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.kato.image.CorruptData;
@@ -24,6 +26,8 @@
 import org.apache.kato.java.JavaClass;
 import org.apache.kato.java.JavaClassLoader;
 import org.apache.kato.java.JavaField;
+import org.apache.kato.java.JavaHeap;
+import org.apache.kato.java.JavaObject;
 import org.apache.kato.java.JavaRuntime;
 
 /**
@@ -194,4 +198,89 @@
 		}
 		return null;
 	}
+	
+	/**
+	 * Finds all instances of a given class and returns them in a list.
+	 * Only suitable for small numbers.
+	 * 
+	 * @param runtime
+	 * @param clazz
+	 * @return
+	 */
+	public static List<JavaObject> findInstances(JavaRuntime runtime, JavaClass clazz) {
+		LinkedList<JavaObject> instances = new LinkedList<JavaObject>();
+		InstanceFinder finder = new InstanceFinder(instances, clazz);
+		
+		visitObjects(runtime, finder);
+
+		return instances;
+	}
+	
+	/**
+	 * Helper class for finding JavaObjects of a certain JavaClass.
+	 * 
+	 *
+	 */
+	private static class InstanceFinder implements JavaObjectVisitor {
+		private JavaClass clazz;
+		private List<JavaObject> list;
+		
+		public InstanceFinder(List<JavaObject> list, JavaClass clazz) {
+			this.list = list;
+			this.clazz = clazz;
+		}
+		
+		public boolean visit(JavaObject object) throws KatoException {
+			if (clazz.equals(object.getJavaClass())) {
+				list.add(object);
+			}
+			
+			return true;
+		}
+		
+	}
+	
+	/**
+	 * Executes the passed JavaObjectVisitor over all objects on all the heaps in
+	 * the given JavaRuntime.
+	 * CorruptData objects are not passed.
+	 * 
+	 * @param runtime JavaRuntime whose objects are being visited
+	 * @param visitor Visitor to execute against each object.
+	 */
+	public static void visitObjects(JavaRuntime runtime, JavaObjectVisitor visitor) {
+		Iterator heaps = runtime.getHeaps().iterator();
+		
+		while (heaps.hasNext()) {
+			Object nextHeap = heaps.next();
+			
+			 if (nextHeap instanceof CorruptData) {
+				 continue;
+			 }
+			 
+			 JavaHeap heap = (JavaHeap) nextHeap;
+			 
+			 Iterator objects = heap.getObjects().iterator();
+			 
+			 while (objects.hasNext()) {
+				 Object nextObject = objects.next();
+				 
+				 if (nextObject instanceof CorruptData) {
+					 continue;
+				 }
+				 
+				 JavaObject object = (JavaObject) nextObject;
+				 
+				 try {
+					boolean rc = visitor.visit(object);
+				
+					if (rc == false) {
+						return;
+					}
+				} catch (KatoException e) {
+					e.printStackTrace();
+				}
+			 }
+		}
+	}
 }

Modified: incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/infocommands/InfoPropertyCommand.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/infocommands/InfoPropertyCommand.java?rev=778768&r1=778767&r2=778768&view=diff
==============================================================================
--- incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/infocommands/InfoPropertyCommand.java (original)
+++ incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/infocommands/InfoPropertyCommand.java Tue May 26 15:50:02 2009
@@ -68,7 +68,13 @@
 			if (systemClass != null) {
 				try{
 					JavaField props = KatoSearch.getField(systemClass, "props");
+					if (props == null) {
+						return;
+					}
 					JavaObject systemProperties = (JavaObject) props.get(null);
+					if (systemProperties == null) {
+						return;
+					}
 					JavaClass propertyClass = systemProperties.getJavaClass();
 					JavaField tableField = KatoSearch.getField(propertyClass,"table");
 					JavaObject table = (JavaObject) tableField.get(systemProperties);

Added: incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/tomcat/TomcatThreadPoolsCommand.java
URL: http://svn.apache.org/viewvc/incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/tomcat/TomcatThreadPoolsCommand.java?rev=778768&view=auto
==============================================================================
--- incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/tomcat/TomcatThreadPoolsCommand.java (added)
+++ incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/tomcat/TomcatThreadPoolsCommand.java Tue May 26 15:50:02 2009
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+package org.apache.kato.katoview.commands.tomcat;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Stack;
+
+import org.apache.kato.image.Image;
+import org.apache.kato.image.KatoException;
+import org.apache.kato.java.JavaClass;
+import org.apache.kato.java.JavaField;
+import org.apache.kato.java.JavaObject;
+import org.apache.kato.java.JavaRuntime;
+import org.apache.kato.katoview.Output;
+import org.apache.kato.katoview.commands.Command;
+import org.apache.kato.katoview.commands.helpers.JavaClassVisitor;
+import org.apache.kato.katoview.commands.helpers.JavaRuntimeVisitor;
+import org.apache.kato.katoview.commands.helpers.KatoSearch;
+
+/**
+ * Retrieves the version of Tomcat in the dump, or displays an error.
+ *
+ */
+public class TomcatThreadPoolsCommand extends Command {
+	private static final String SHORT_DESCRIPTION = "Shows thread pool state";
+	private static final String COMMAND_NAME = "pools";
+	private static final String LONG_DESCRIPTION = "Reports tomcat's thread pool state.";
+	
+	// Look for this class.
+	private static final String THREAD_POOL_CLASS="org/apache/tomcat/util/threads/ThreadPool"; 
+	private static final String POOL_NAME = "name",
+								SERVER_BUILT = "serverBuilt",
+								SERVER_INFO = "serverInfo";
+	
+	public TomcatThreadPoolsCommand(Output o) {
+		super(o, COMMAND_NAME, SHORT_DESCRIPTION, LONG_DESCRIPTION);
+		
+		child_commands = null;
+	}
+
+	public void doCommand(Stack args, Image loadedImage, HashMap properties) {
+		try {
+			KatoSearch.visitRuntimes(loadedImage, new PrintVersion());
+		} catch (KatoException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * A visitor for finding the correct class and then return
+	 *
+	 */
+	private class PrintVersion implements JavaRuntimeVisitor, JavaClassVisitor {
+		boolean found = false;
+		JavaRuntime runtime;
+		
+		public void visit(JavaRuntime runtime) throws KatoException {
+			found = false;
+			this.runtime = runtime;
+			KatoSearch.visitClasses(runtime, this);
+			
+			if (found == false) {
+				out.println("ERROR: Couldn't find a Tomcat server");				
+			}
+		}
+
+		public boolean visit(JavaClass clazz) throws KatoException {
+			if (clazz.getName().equals(THREAD_POOL_CLASS)) {
+				found = true;
+				JavaField nameField = KatoSearch.getField(clazz, POOL_NAME);
+				
+				List<JavaObject> instances = KatoSearch.findInstances(runtime, clazz);
+				if (instances.size() >0) {
+					out.println("Found thread pools");
+					for (JavaObject obj : instances) {
+						try {
+							out.println("Pool name:" + nameField.getString(obj));
+						
+						}catch (KatoException e) {
+							e.printStackTrace();
+						}
+					}
+				}
+				
+				return false; // Stop searching through classes.
+			}
+			return true;
+		}
+		
+	}
+}
\ No newline at end of file

Propchange: incubator/kato/trunk/org.apache.kato.tools.katoview/src/org/apache/kato/katoview/commands/tomcat/TomcatThreadPoolsCommand.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain