Return-Path: Delivered-To: apmail-activemq-commits-archive@www.apache.org Received: (qmail 68510 invoked from network); 29 Jun 2009 14:02:57 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 29 Jun 2009 14:02:57 -0000 Received: (qmail 74047 invoked by uid 500); 29 Jun 2009 14:03:08 -0000 Delivered-To: apmail-activemq-commits-archive@activemq.apache.org Received: (qmail 74005 invoked by uid 500); 29 Jun 2009 14:03:08 -0000 Mailing-List: contact commits-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list commits@activemq.apache.org Received: (qmail 73996 invoked by uid 99); 29 Jun 2009 14:03:08 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 29 Jun 2009 14:03:08 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 29 Jun 2009 14:03:06 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id C337C23888FD; Mon, 29 Jun 2009 14:02:45 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r789330 - in /activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker: TransactionManager.java XATransaction.java XidImpl.java Date: Mon, 29 Jun 2009 14:02:45 -0000 To: commits@activemq.apache.org From: chirino@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090629140245.C337C23888FD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: chirino Date: Mon Jun 29 14:02:45 2009 New Revision: 789330 URL: http://svn.apache.org/viewvc?rev=789330&view=rev Log: - Making the XidImpl a little simpler and frendiler to the use of Buffer classes. - Streamlining the TransactionManager class.. Parsing Xids is not really required on the broker side.. so lets not force it. Modified: activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/TransactionManager.java activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XATransaction.java activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XidImpl.java Modified: activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/TransactionManager.java URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/TransactionManager.java?rev=789330&r1=789329&r2=789330&view=diff ============================================================================== --- activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/TransactionManager.java (original) +++ activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/TransactionManager.java Mon Jun 29 14:02:45 2009 @@ -22,8 +22,6 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicLong; -import javax.transaction.xa.Xid; - import org.apache.activemq.apollo.broker.BrokerDatabase.OperationContext; import org.apache.activemq.apollo.broker.Transaction.TxOp; import org.apache.activemq.broker.store.Store.MessageRecord; @@ -157,7 +155,7 @@ * @param xid * @return */ - public final Transaction createTransaction(Xid xid) { + public final Transaction createTransaction(Buffer xid) { Transaction ret; long tid = tidGen.incrementAndGet(); @@ -230,8 +228,9 @@ tx = new LocalTransaction(this, tid, queue); break; case Transaction.TYPE_XA: - XidImpl xid = new XidImpl(); - xid.readbody(bais); + int length = bais.readByte(); + Buffer xid = new Buffer(new byte[length]); + bais.readFully(xid.data); tx = new XATransaction(this, tid, xid, queue); break; default: @@ -252,7 +251,10 @@ baos.writeLong(tx.getTid()); if(tx.getType() == Transaction.TYPE_XA) { - ((XATransaction)tx).getXid().writebody(baos); + Buffer xid = ((XATransaction)tx).getXid(); + // An XID max size is around 140 bytes + baos.writeByte( xid.length ); + baos.write(xid.data, xid.offset, xid.length); } return database.updateMapEntry(TXN_MAP, tx.getBackingQueueName(), new Buffer(baos.getData(), 0, baos.size())); Modified: activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XATransaction.java URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XATransaction.java?rev=789330&r1=789329&r2=789330&view=diff ============================================================================== --- activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XATransaction.java (original) +++ activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XATransaction.java Mon Jun 29 14:02:45 2009 @@ -19,10 +19,9 @@ import java.io.IOException; import javax.transaction.xa.XAException; -import javax.transaction.xa.Xid; +import org.apache.activemq.protobuf.Buffer; import org.apache.activemq.queue.IQueue; -import org.apache.activemq.util.DataByteArrayInputStream; /** * XATransaction @@ -35,18 +34,14 @@ */ public class XATransaction extends Transaction { - private final XidImpl xid; + private final Buffer xid; - XATransaction(TransactionManager manager, long tid, Xid xid, IQueue opQueue) { + XATransaction(TransactionManager manager, long tid, Buffer xid, IQueue opQueue) { super(manager, tid, opQueue); - if (xid instanceof XidImpl) { - this.xid = XidImpl.class.cast(xid); - } else { - this.xid = new XidImpl(xid); - } + this.xid = xid; } - public XidImpl getXid() { + public Buffer getXid() { return xid; } Modified: activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XidImpl.java URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XidImpl.java?rev=789330&r1=789329&r2=789330&view=diff ============================================================================== --- activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XidImpl.java (original) +++ activemq/sandbox/activemq-flow/activemq-broker/src/main/java/org/apache/activemq/apollo/broker/XidImpl.java Mon Jun 29 14:02:45 2009 @@ -22,26 +22,20 @@ import javax.transaction.xa.Xid; +import org.apache.activemq.protobuf.Buffer; + /** - * An implementation of JTA transaction idenifier (javax.transaction.xa.Xid). - * This is SonicMQ internal Xid. Any external Xid object will be converted to - * this class. + * An implementation of JTA transaction identifier (javax.transaction.xa.Xid). */ public class XidImpl implements Xid, Cloneable, java.io.Serializable { - //fix bug #8334 - static final long serialVersionUID = -5363901495878210611L; + private static final long serialVersionUID = -5363901495878210611L; + private static final Buffer EMPTY_BUFFER = new Buffer(new byte[]{}); // The format identifier for the XID. A value of -1 indicates the NULLXID - private int m_formatID = -1; // default format - - private byte m_gtrid[]; - // The number of bytes in the global transaction identfier - private int m_gtridLength; // Value from 1 through MAXGTRIDSIZE - - private byte m_bqual[]; - // The number of bytes in the branch qualifier - private int m_bqualLength; // Value from 1 through MAXBQUALSIZE + private int formatId = -1; // default format + Buffer globalTransactionId = EMPTY_BUFFER; + Buffer branchQualifier = EMPTY_BUFFER; /////////////////////////////// Constructors ///////////////////////////// /** @@ -50,15 +44,20 @@ * After construction the data within the XID should be initialized. */ public XidImpl() { - this(-1, null, null); } public XidImpl(int formatID, byte[] globalTxnID, byte[] branchID) { - m_formatID = formatID; + this.formatId = formatID; setGlobalTransactionId(globalTxnID); setBranchQualifier(branchID); } + public XidImpl(int formatID, Buffer globalTransactionId, Buffer branchQualifier) { + this.formatId = formatID; + this.globalTransactionId = globalTransactionId; + this.branchQualifier=branchQualifier; + } + /** * Initialize an XID using another XID as the source of data. * @@ -66,13 +65,12 @@ * the XID to initialize this XID from */ public XidImpl(Xid from) { - if ((from == null) || (from.getFormatId() == -1)) { - m_formatID = -1; + formatId = -1; setGlobalTransactionId(null); setBranchQualifier(null); } else { - m_formatID = from.getFormatId(); + formatId = from.getFormatId(); setGlobalTransactionId(from.getGlobalTransactionId()); setBranchQualifier(from.getBranchQualifier()); } @@ -81,9 +79,7 @@ // used for test purpose public XidImpl(String globalTxnId, String branchId) { - this(99, globalTxnId.getBytes(), branchId.getBytes()); - } //////////// Public Methods ////////////// @@ -98,22 +94,16 @@ * transaction as this, otherwise returns false. */ public boolean equals(Object o) { - Xid other; - - if (!(o instanceof Xid)) + if (o.getClass() != XidImpl.class) return false; - other = (Xid) o; - - if (m_formatID == -1 && other.getFormatId() == -1) + XidImpl other = (XidImpl) o; + if (formatId == -1 && other.formatId == -1) return true; - if (m_formatID != other.getFormatId() || m_gtridLength != other.getGlobalTransactionId().length || m_bqualLength != other.getBranchQualifier().length) { - return false; - } - - return isEqualGtrid(other) && isEqualBranchQualifier(other.getBranchQualifier()); - + return formatId == other.formatId + && globalTransactionId.equals(other.globalTransactionId) + && branchQualifier.equals(other.branchQualifier); } /** @@ -121,14 +111,10 @@ * * @return the computed hashcode */ - public int hashCode() { - - if (m_formatID == -1) + if (formatId == -1) return (-1); - - return m_formatID + m_gtridLength - m_bqualLength; - + return formatId ^ globalTransactionId.hashCode() ^ branchQualifier.hashCode(); } /** @@ -142,7 +128,7 @@ public String toString() { String gtString = new String(getGlobalTransactionId()); String brString = new String(getBranchQualifier()); - return new String("{Xid: " + "formatID=" + m_formatID + ", " + "gtrid[" + m_gtridLength + "]=" + gtString + ", " + "brid[" + m_bqualLength + "]=" + brString + "}"); + return new String("{Xid: " + "formatID=" + formatId + ", " + "gtrid[" + globalTransactionId.length + "]=" + gtString + ", " + "brid[" + branchQualifier.length + "]=" + brString + "}"); } @@ -152,7 +138,7 @@ * @return Format identifier. -1 indicates a null XID */ public int getFormatId() { - return m_formatID; + return formatId; } /** @@ -161,7 +147,8 @@ * @return the global transaction identifier */ public byte[] getGlobalTransactionId() { - return m_gtrid; + // TODO.. may want to compact() first and keep cache that.. + return globalTransactionId.toByteArray(); } /** @@ -170,7 +157,8 @@ * @return the branch qualifier */ public byte[] getBranchQualifier() { - return m_bqual; + // TODO.. may want to compact() first and keep cache that.. + return branchQualifier.toByteArray(); } ///////////////////////// private methods //////////////////////////////// @@ -186,76 +174,32 @@ */ private void setBranchQualifier(byte[] branchID) { if (branchID == null) { - m_bqualLength = 0; - m_bqual = new byte[m_bqualLength]; + branchQualifier = EMPTY_BUFFER; } else { - m_bqualLength = branchID.length > MAXBQUALSIZE ? MAXBQUALSIZE : branchID.length; - m_bqual = new byte[m_bqualLength]; - System.arraycopy(branchID, 0, m_bqual, 0, m_bqualLength); + int length = branchID.length > MAXBQUALSIZE ? MAXBQUALSIZE : branchID.length; + // TODO: Do we really need to copy the bytes?? + branchQualifier = new Buffer(new byte[length]); + System.arraycopy(branchID, 0, branchQualifier.data, 0, length); } } private void setGlobalTransactionId(byte[] globalTxnID) { if (globalTxnID == null) { - m_gtridLength = 0; - m_gtrid = new byte[m_gtridLength]; + globalTransactionId = EMPTY_BUFFER; } else { - m_gtridLength = globalTxnID.length > MAXGTRIDSIZE ? MAXGTRIDSIZE : globalTxnID.length; - m_gtrid = new byte[m_gtridLength]; - System.arraycopy(globalTxnID, 0, m_gtrid, 0, m_gtridLength); + int length = globalTxnID.length > MAXGTRIDSIZE ? MAXGTRIDSIZE : globalTxnID.length; + // TODO: Do we really need to copy the bytes?? + globalTransactionId = new Buffer(new byte[length]); + System.arraycopy(globalTxnID, 0, globalTransactionId.data, 0, length); } } - /** - * Return whether the Gtrid of this is equal to the Gtrid of xid - */ - private boolean isEqualGtrid(Xid xid) { - byte[] xidGtrid = xid.getGlobalTransactionId(); - - if (getGlobalTransactionId() == null && xidGtrid == null) - return true; - if (getGlobalTransactionId() == null) - return false; - if (xidGtrid == null) - return false; - - if (m_gtridLength != xidGtrid.length) { - return false; - } - - for (int i = 0; i < m_gtridLength; i++) { - if (m_gtrid[i] != xidGtrid[i]) - return false; - } - return true; - } - - /** - * Determine if an array of bytes equals the branch qualifier - * - * @return true if equal - */ - private boolean isEqualBranchQualifier(byte[] data) { - - int L = data.length > MAXBQUALSIZE ? MAXBQUALSIZE : data.length; - - if (L != m_bqualLength) - return false; - - for (int i = 0; i < m_bqualLength; i++) { - if (data[i] != m_bqual[i]) - return false; - } - - return true; - } - public int getMemorySize() { return 4 // formatId + 4 // length of globalTxnId - + m_gtridLength // globalTxnId + + globalTransactionId.length // globalTxnId + 4 // length of branchId - + m_bqualLength; // branchId + + branchQualifier.length; // branchId } /** @@ -272,12 +216,12 @@ * written. */ public void writebody(DataOutput out) throws IOException { - out.writeInt(m_formatID); // format ID + out.writeInt(formatId); // format ID - out.writeInt(m_gtridLength); // length of global Txn ID - out.write(getGlobalTransactionId(), 0, m_gtridLength); // global transaction ID - out.writeInt(m_bqualLength); // length of branch ID - out.write(getBranchQualifier(), 0, m_bqualLength); // branch ID + out.writeInt(globalTransactionId.length); // length of global Txn ID + out.write(globalTransactionId.data, globalTransactionId.offset, globalTransactionId.length); // global transaction ID + out.writeInt(branchQualifier.length); // length of branch ID + out.write(branchQualifier.data, branchQualifier.offset, branchQualifier.length); // branch ID } /** @@ -288,16 +232,16 @@ * @throws IOException */ public void readbody(DataInput in) throws IOException { - m_formatID = in.readInt(); - int gtidLen = in.readInt(); - byte[] globalTxnId = new byte[gtidLen]; - in.readFully(globalTxnId, 0, gtidLen); - - int brlen = in.readInt(); - byte[] branchId = new byte[brlen]; - in.readFully(branchId, 0, brlen); + formatId = in.readInt(); - setGlobalTransactionId(globalTxnId); - setBranchQualifier(branchId); + int length = in.readInt(); + byte[] data = new byte[length]; + in.readFully(data); + setGlobalTransactionId(data); + + length = in.readInt(); + data = new byte[length]; + in.readFully(data); + setBranchQualifier(data); } } // class XidImpl