more jmx stuff

This commit is contained in:
Alex Huang 2011-06-28 01:17:10 -07:00
parent 8903801193
commit dc44a4fe6e
3 changed files with 85 additions and 46 deletions

View File

@ -29,6 +29,7 @@ import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicLong;
import javax.sql.DataSource;
@ -77,8 +78,19 @@ public class Transaction {
public static final short CLOUD_DB = 0;
public static final short USAGE_DB = 1;
public static final short CONNECTED_DB = -1;
private static final TransactionMBeanImpl s_mbean = new TransactionMBeanImpl();
static {
try {
JmxUtil.registerMBean("Transaction", "Transaction", s_mbean);
} catch (Exception e) {
s_logger.error("Unable to register mbean for transaction", e);
}
}
private final LinkedList<StackElement> _stack;
private static AtomicLong s_id = new AtomicLong();
private long _id;
private final LinkedList<Pair<String, Long>> _lockTimes = new LinkedList<Pair<String, Long>>();
@ -89,6 +101,7 @@ public class Transaction {
private long _txnTime;
private Statement _stmt;
private final Merovingian _lockMaster;
private String _creator;
private Transaction _prev = null;
@ -125,12 +138,8 @@ public class Transaction {
tls.set(txn);
txn.takeOver(name, true);
try {
s_logger.debug("Registering txn" + System.identityHashCode(txn));
JmxUtil.registerMBean("Transaction", "txn" + System.identityHashCode(txn), new TransactionMBeanImpl(txn));
} catch (Exception e) {
s_logger.error("Unable to register MBean", e);
}
s_logger.debug("Registering txn" + txn.getId());
s_mbean.addTransaction(txn);
return txn;
}
@ -162,12 +171,8 @@ public class Transaction {
txn.takeOver(name, false);
if (isNew) {
try {
s_logger.debug("Registering txn" + System.identityHashCode(txn));
JmxUtil.registerMBean("Transaction", "txn" + System.identityHashCode(txn), new TransactionMBeanImpl(txn));
} catch (Exception e) {
s_logger.error("Unable to register MBean", e);
}
s_logger.debug("Registering txn" + txn.getId());
s_mbean.addTransaction(txn);
}
return txn;
}
@ -307,6 +312,16 @@ public class Transaction {
_txn = false;
_dbId = databaseId;
_lockMaster = forLocking ? null : new Merovingian(_dbId);
_id = s_id.incrementAndGet();
_creator = Thread.currentThread().getName();
}
public String getCreator() {
return _creator;
}
public long getId() {
return _id;
}
public String getName() {
@ -601,12 +616,8 @@ public class Transaction {
if(this._dbId == CONNECTED_DB) {
tls.set(_prev);
_prev = null;
try {
s_logger.debug("Unregistering txn" + System.identityHashCode(this));
JmxUtil.unregisterMBean("Transaction", "txn" + System.identityHashCode(this));
} catch (Exception e) {
s_logger.error("Unable to unregister MBean", e);
}
s_logger.debug("Unregistering txn" + getId());
s_mbean.removeTransaction(this);
}
}

View File

@ -20,12 +20,12 @@ package com.cloud.utils.db;
import java.util.List;
public interface TransactionMBean {
List<String> getStack();
int getTransactionCount();
String getName();
int getActiveTransactionCount();
String getDbConnection();
List<String> getTransactions();
List<String> getActiveTransactions();
String getThreadName();
}

View File

@ -17,52 +17,80 @@
*/
package com.cloud.utils.db;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.management.StandardMBean;
import com.cloud.utils.db.Transaction.StackElement;
public class TransactionMBeanImpl extends StandardMBean implements TransactionMBean {
Transaction _txn = null;
String _threadName = null;
public TransactionMBeanImpl(Transaction txn) {
Map<Long, Transaction> _txns = new ConcurrentHashMap<Long, Transaction>();
public TransactionMBeanImpl() {
super(TransactionMBean.class, false);
_txn = txn;
_threadName = Thread.currentThread().getName();
}
public void addTransaction(Transaction txn) {
_txns.put(txn.getId(), txn);
}
public void removeTransaction(Transaction txn) {
_txns.remove(txn.getId());
}
@Override
public String getThreadName() {
return _threadName;
public int getTransactionCount() {
return _txns.size();
}
@Override
public List<String> getStack() {
ArrayList<StackElement> elements = new ArrayList<StackElement>(_txn.getStack());
ArrayList<String> stack = new ArrayList<String>(elements.size());
for (StackElement element : elements) {
stack.add(element.toString());
public int getActiveTransactionCount() {
int count = 0;
for (Transaction txn : _txns.values()) {
if (txn.getStack().size() > 0) {
count++;
}
}
return stack;
return count;
}
@Override
public String getDbConnection() {
Connection conn = _txn.getCurrentConnection();
return (conn != null) ? conn.toString() : "No DB connection";
public List<String> getTransactions() {
ArrayList<String> txns = new ArrayList<String>();
for (Transaction info : _txns.values()) {
txns.add(toString(info));
}
return txns;
}
@Override
public String getName() {
return _txn.getName();
public List<String> getActiveTransactions() {
ArrayList<String> txns = new ArrayList<String>();
for (Transaction txn : _txns.values()) {
if (txn.getStack().size() > 0 || txn.getCurrentConnection() != null) {
txns.add(toString(txn));
}
}
return txns;
}
protected String toString(Transaction txn) {
StringBuilder buff = new StringBuilder("[Name=");
buff.append(txn.getName());
buff.append("; Creator=");
buff.append(txn.getCreator());
buff.append("; DB=");
buff.append(txn.getCurrentConnection());
buff.append("; Stack=");
for (StackElement element : txn.getStack()) {
buff.append(",").append(element.toString());
}
buff.append("]");
return buff.toString();
}
}