[jboss-cvs] JBoss Messaging SVN: r2270 - in trunk: src/etc/xmdesc and 9 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sun Feb 11 15:04:36 EST 2007


Author: timfox
Date: 2007-02-11 15:04:36 -0500 (Sun, 11 Feb 2007)
New Revision: 2270

Modified:
   trunk/src/etc/server/default/deploy/clustered-sybase-persistence-service.xml
   trunk/src/etc/server/default/deploy/sybase-persistence-service.xml
   trunk/src/etc/xmdesc/JDBCPersistenceManager-xmbean.xml
   trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManager.java
   trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManagerService.java
   trunk/tests/src/org/jboss/test/messaging/core/SimpleDeliveryTest.java
   trunk/tests/src/org/jboss/test/messaging/core/local/base/PagingFilteredQueueTestBase.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/PagingTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_ReloadTest.java
   trunk/tests/src/org/jboss/test/messaging/core/paging/base/PagingStateTestBase.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/IdManagerTest.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/JDBCPersistenceManagerTest.java
   trunk/tests/src/org/jboss/test/messaging/core/plugin/base/PostOfficeTestBase.java
   trunk/tests/src/org/jboss/test/messaging/jms/XARecoveryTest.java
   trunk/tests/src/org/jboss/test/messaging/jms/XATestBase.java
   trunk/tests/src/org/jboss/test/messaging/jms/persistence/MessagePersistenceManagerTest.java
Log:
src/etc/server/default/deploy/sybase-persistence-service.xml


Modified: trunk/src/etc/server/default/deploy/clustered-sybase-persistence-service.xml
===================================================================
--- trunk/src/etc/server/default/deploy/clustered-sybase-persistence-service.xml	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/src/etc/server/default/deploy/clustered-sybase-persistence-service.xml	2007-02-11 20:04:36 UTC (rev 2270)
@@ -16,6 +16,7 @@
       <attribute name="DataSource">java:/DefaultDS</attribute>
       <attribute name="CreateTablesOnStartup">true</attribute>
       <attribute name="UsingBatchUpdates">true</attribute>
+      <attribute name="UsingTrailingByte">true</attribute>
       <attribute name="SqlProperties"><![CDATA[
    CREATE_MESSAGE_REFERENCE=CREATE TABLE JBM_MSG_REF (CHANNEL_ID DECIMAL(19, 0), MESSAGE_ID DECIMAL(19, 0), TRANSACTION_ID DECIMAL(19, 0) NULL, STATE CHAR(1), ORD DECIMAL(19, 0), PAGE_ORD DECIMAL(19, 0) NULL, DELIVERY_COUNT INTEGER, SCHED_DELIVERY DECIMAL(19, 0), PRIMARY KEY(CHANNEL_ID, MESSAGE_ID))
    CREATE_IDX_MESSAGE_REF_TX=CREATE INDEX JBM_MSG_REF_TX ON JBM_MSG_REF (TRANSACTION_ID)

Modified: trunk/src/etc/server/default/deploy/sybase-persistence-service.xml
===================================================================
--- trunk/src/etc/server/default/deploy/sybase-persistence-service.xml	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/src/etc/server/default/deploy/sybase-persistence-service.xml	2007-02-11 20:04:36 UTC (rev 2270)
@@ -16,6 +16,7 @@
          <attribute name="DataSource">java:/DefaultDS</attribute>
          <attribute name="CreateTablesOnStartup">true</attribute>
          <attribute name="UsingBatchUpdates">true</attribute>
+         <attribute name="UsingTrailingByte">true</attribute>
          <attribute name="SqlProperties"><![CDATA[
    CREATE_MESSAGE_REFERENCE=CREATE TABLE JBM_MSG_REF (CHANNEL_ID DECIMAL(19, 0), MESSAGE_ID DECIMAL(19, 0), TRANSACTION_ID DECIMAL(19, 0) NULL, STATE CHAR(1), ORD DECIMAL(19, 0), PAGE_ORD DECIMAL(19, 0) NULL, DELIVERY_COUNT INTEGER, SCHED_DELIVERY DECIMAL(19, 0), PRIMARY KEY(CHANNEL_ID, MESSAGE_ID))
    CREATE_IDX_MESSAGE_REF_TX=CREATE INDEX JBM_MSG_REF_TX ON JBM_MSG_REF (TRANSACTION_ID)

Modified: trunk/src/etc/xmdesc/JDBCPersistenceManager-xmbean.xml
===================================================================
--- trunk/src/etc/xmdesc/JDBCPersistenceManager-xmbean.xml	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/src/etc/xmdesc/JDBCPersistenceManager-xmbean.xml	2007-02-11 20:04:36 UTC (rev 2270)
@@ -47,6 +47,12 @@
       <type>boolean</type>
    </attribute>    
    
+   <attribute access="read-write" getMethod="isUsingTrailingByte" setMethod="setUsingTrailingByte">
+      <description>Should a trailing byte be added to VARBINARY columns - this would be true for databases such as Sybase which would otherwise truncate trailing zeros</description>
+      <name>UsingTrailingByte</name>
+      <type>boolean</type>
+   </attribute>    
+   
    <attribute access="read-write" getMethod="getSqlProperties" setMethod="setSqlProperties">
       <description>DML and DDL overrides</description>
       <name>SqlProperties</name>

Modified: trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManager.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManager.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManager.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -92,6 +92,8 @@
    
    private boolean usingBinaryStream = true;
    
+   private boolean usingTrailingByte = false;
+   
    private int maxParams;
    
    private short orderCount;
@@ -101,7 +103,7 @@
     
    public JDBCPersistenceManager(DataSource ds, TransactionManager tm, Properties sqlProperties,
                                  boolean createTablesOnStartup, boolean usingBatchUpdates,
-                                 boolean usingBinaryStream, int maxParams)
+                                 boolean usingBinaryStream, boolean usingTrailingByte, int maxParams)
    {
       super(ds, tm, sqlProperties, createTablesOnStartup);
       
@@ -109,6 +111,8 @@
       
       this.usingBinaryStream = usingBinaryStream;
       
+      this.usingTrailingByte = usingTrailingByte;
+      
       this.maxParams = maxParams;      
    }
    
@@ -207,13 +211,17 @@
             //get the existing tx id --MK START
             long txId = rs.getLong(1);
             
-            byte[] branchQual = rs.getBytes(2);
+            byte[] branchQual = getVarBinaryColumn(rs, 2);
+            
             int formatId = rs.getInt(3);
-            byte[] globalTxId = rs.getBytes(4);
+            
+            byte[] globalTxId = getVarBinaryColumn(rs, 4);
+            
             Xid xid = new MessagingXid(branchQual, formatId, globalTxId);
             
             // create a tx info object with the result set detailsdetails
             txInfo = new PreparedTxInfo(txId, xid);
+            
             transactions.add(txInfo);
          }
          
@@ -2748,11 +2756,15 @@
          ps.setLong(1, tx.getId());
          
          Xid xid = tx.getXid();
+         
          formatID = xid.getFormatId();
-         ps.setBytes(2, xid.getBranchQualifier());
+         
+         setVarBinaryColumn(2, ps, xid.getBranchQualifier());
+         
          ps.setInt(3, formatID);
-         ps.setBytes(4, xid.getGlobalTransactionId());
          
+         setVarBinaryColumn(4, ps, xid.getGlobalTransactionId());
+         
          rows = updateWithRetry(ps);
          
       }
@@ -3063,7 +3075,52 @@
       // physically delete the row in the database
       ps.setLong(1, message.getMessageID());      
    }
+   
+   protected void setVarBinaryColumn(int column, PreparedStatement ps, byte[] bytes) throws Exception
+   {
+      if (usingTrailingByte)
+      {
+         // Sybase has the stupid characteristic of truncating all trailing in zeros
+         // in varbinary columns
+         // So we add an extra byte on the end when we store the varbinary data
+         // otherwise we might lose data
+         // http://jira.jboss.org/jira/browse/JBMESSAGING-825
+         
+         byte[] res = new byte[bytes.length + 1];
+         
+         System.arraycopy(bytes, 0, res, 0, bytes.length);
+         
+         res[bytes.length] = 127;
+
+         bytes = res;
+      }
+      
+      ps.setBytes(column, bytes);            
+      
+      if (trace) { log.trace("Setting varbinary column of length: " + bytes.length); }
+   }
+   
+   protected byte[] getVarBinaryColumn(ResultSet rs, int columnIndex) throws Exception
+   {
+      byte[] bytes = rs.getBytes(columnIndex);
+      
+      if (usingTrailingByte)
+      {
+         // Get rid of the trailing byte
+         
+         // http://jira.jboss.org/jira/browse/JBMESSAGING-825
+         
+         byte[] newBytes = new byte[bytes.length - 1];
+         
+         System.arraycopy(bytes, 0, newBytes, 0, bytes.length - 1);
+         
+         bytes = newBytes;
+      }
+      
+      return bytes;
+   }
      
+   // Used for storing message headers and bodies
    protected void setBytes(PreparedStatement ps, int columnIndex, byte[] bytes) throws Exception
    {
       if (usingBinaryStream)
@@ -3089,7 +3146,8 @@
       else
       {
          //Set the bytes using setBytes() - likely to be better for smaller byte[]
-         ps.setBytes(columnIndex, bytes);
+         
+         setVarBinaryColumn(columnIndex, ps, bytes);
       }
    }
    
@@ -3140,7 +3198,7 @@
       else
       {
          //Get the bytes using getBytes() - better for smaller byte[]
-         return rs.getBytes(columnIndex);
+         return getVarBinaryColumn(rs, columnIndex);
       }
    }
    
@@ -3280,6 +3338,8 @@
    
    // Private -------------------------------------------------------
    
+
+   
    private int[] updateWithRetry(PreparedStatement ps, boolean batch) throws Exception
    {
       final int MAX_TRIES = 25;      

Modified: trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManagerService.java
===================================================================
--- trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManagerService.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/src/main/org/jboss/messaging/core/plugin/JDBCPersistenceManagerService.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -48,6 +48,8 @@
    
    private boolean usingBinaryStream = true;
    
+   private boolean usingTrailingByte = false;
+   
    private int maxParams = 100;
    
    // Constructors --------------------------------------------------------
@@ -81,7 +83,7 @@
          persistenceManager =
             new JDBCPersistenceManager(ds, tm, sqlProperties,
                                        createTablesOnStartup, usingBatchUpdates,
-                                       usingBinaryStream, maxParams);
+                                       usingBinaryStream, usingTrailingByte, maxParams);
          
          persistenceManager.start();
          
@@ -147,4 +149,14 @@
    {
       usingBinaryStream = b;
    }
+   
+   public boolean isUsingTrailingByte()
+   {
+      return usingTrailingByte;
+   }
+   
+   public void setUsingTrailingByte(boolean b)
+   {
+      usingTrailingByte = b;
+   }
 }

Modified: trunk/tests/src/org/jboss/test/messaging/core/SimpleDeliveryTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/SimpleDeliveryTest.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/core/SimpleDeliveryTest.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -106,7 +106,7 @@
       PersistenceManager pm =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, true, true, 100);
+                  true, true, true, false, 100);
       pm.start();
       
       IDManager idm = new IDManager("TRANSACTION_ID", 10, pm);

Modified: trunk/tests/src/org/jboss/test/messaging/core/local/base/PagingFilteredQueueTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/local/base/PagingFilteredQueueTestBase.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/core/local/base/PagingFilteredQueueTestBase.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -116,7 +116,7 @@
 
       pm = new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                                       sc.getPersistenceManagerSQLProperties(),
-                                      true, true, true, 100);
+                                      true, true, true, false, 100);
       pm.start();
       
       idm = new IDManager("TRANSACTION_ID", 10, pm);

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/PagingTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/PagingTest.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/PagingTest.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -88,7 +88,7 @@
       pm =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, true, true, 100);   
+                  true, true, true, false, 100);   
       pm.start();
             
       ms = new SimpleMessageStore();

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_ReloadTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_ReloadTest.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/SingleChannel_ReloadTest.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -119,7 +119,7 @@
       pm =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, true, true, 100);      
+                  true, true, true, false, 100);      
       pm.start();
       
       ms = new SimpleMessageStore();
@@ -216,7 +216,7 @@
       pm =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, true, true, 100);     
+                  true, true, true, false, 100);     
       pm.start();
       
       ms = new SimpleMessageStore();

Modified: trunk/tests/src/org/jboss/test/messaging/core/paging/base/PagingStateTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/paging/base/PagingStateTestBase.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/core/paging/base/PagingStateTestBase.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -97,7 +97,7 @@
       pm =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, true, true, 100);     
+                  true, true, true, false, 100);     
       pm.start();
       
       idm = new IDManager("TRANSACTION_ID", 10, pm);

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/IdManagerTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/IdManagerTest.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/IdManagerTest.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -69,7 +69,7 @@
       pm =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, true, true, 100);     
+                  true, true, true, false, 100);     
       pm.start();
       
       pm.start();

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/JDBCPersistenceManagerTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/JDBCPersistenceManagerTest.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/JDBCPersistenceManagerTest.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -104,7 +104,7 @@
       JDBCPersistenceManager p =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, batch, true, maxParams);
+                  true, batch, true, false, maxParams);
       p.start();
       return p;
    }

Modified: trunk/tests/src/org/jboss/test/messaging/core/plugin/base/PostOfficeTestBase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/core/plugin/base/PostOfficeTestBase.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/core/plugin/base/PostOfficeTestBase.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -255,7 +255,7 @@
       pm =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, true, true, 100);
+                  true, true, true, false, 100);
       pm.start();
 
       transactionIDManager = new IDManager("TRANSACTION_ID", 10, pm);

Modified: trunk/tests/src/org/jboss/test/messaging/jms/XARecoveryTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/XARecoveryTest.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/jms/XARecoveryTest.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -3029,8 +3029,8 @@
          }    
       }
    }
+     
 
-
    public void testMockCoordinatorRecovery3() throws Exception
    {
       XAConnection conn1 = null;

Modified: trunk/tests/src/org/jboss/test/messaging/jms/XATestBase.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/XATestBase.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/jms/XATestBase.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -44,6 +44,7 @@
 import org.jboss.jms.client.state.ConnectionState;
 import org.jboss.jms.tx.MessagingXAResource;
 import org.jboss.jms.tx.ResourceManager;
+import org.jboss.messaging.core.tx.MessagingXid;
 import org.jboss.test.messaging.MessagingTestCase;
 import org.jboss.test.messaging.tools.ServerManagement;
 import org.jboss.test.messaging.tools.jmx.ServiceContainer;
@@ -199,6 +200,8 @@
 
    // Public --------------------------------------------------------
    
+   
+   
    //See http://jira.jboss.com/jira/browse/JBMESSAGING-638
    public void testResourceManagerMemoryLeakOnCommit() throws Exception
    {
@@ -659,7 +662,94 @@
 
    }
    
+   // See http://jira.jboss.org/jira/browse/JBMESSAGING-825
+   // Need to test that ids with trailing zeros are dealt with properly - sybase has the habit
+   // of truncating trailing zeros in varbinary columns
+   public void testXidsWithTrailingZeros() throws Exception
+   {
+      if (!ServerManagement.isRemote())
+      {
+         return;
+      }
+      
+      XAConnection conn1 = null;
+      
+      try
+      {      
+         conn1 = cf.createXAConnection();
+   
+         XASession sess1 = conn1.createXASession();
+   
+         XAResource res1 = sess1.getXAResource();
          
+         byte[] branchQualifier = new byte[] { 1, 2, 3, 4, 5, 6, 0, 0, 0, 0 };
+         
+         byte[] globalTxId = new byte[] { 6, 5, 4, 3, 2, 1, 0, 0, 0, 0 };
+                  
+         Xid trailing = new MessagingXid(branchQualifier, 12435, globalTxId);
+         
+         res1.start(trailing, XAResource.TMNOFLAGS);
+   
+         MessageProducer prod1 = sess1.createProducer(queue);
+   
+         TextMessage tm1 = sess1.createTextMessage("testing1");
+   
+         prod1.send(tm1);
+   
+         res1.end(trailing, XAResource.TMSUCCESS);
+   
+   
+         res1.prepare(trailing);
+
+   
+         //Now "crash" the server
+   
+         ServerManagement.stopServerPeer();
+   
+         ServerManagement.startServerPeer();
+   
+         ServerManagement.deployQueue("Queue");
+   
+   
+         XAResource res = cf.createXAConnection().createXASession().getXAResource();
+   
+         Xid[] xids = res.recover(XAResource.TMSTARTRSCAN);
+         assertEquals(1, xids.length);
+   
+         Xid[] xids2 = res.recover(XAResource.TMENDRSCAN);
+         assertEquals(0, xids2.length);
+         
+         Xid trailing2 = xids[0];
+         
+         assertTrue(trailing.getFormatId() == trailing2.getFormatId());
+         
+         assertEqualByteArrays(trailing.getGlobalTransactionId(), trailing2.getGlobalTransactionId());
+         
+         assertEqualByteArrays(trailing.getBranchQualifier(), trailing2.getBranchQualifier());
+   
+         res.commit(trailing, false);
+            
+         if (checkNoMessageData())
+         {
+            fail("Data remains in database");
+         }
+      }
+      finally
+      {
+         if (conn1 != null)
+         {
+            try
+            {
+               conn1.close();
+            }
+            catch (Exception e)
+            {
+               //Ignore
+            }
+         }                  
+      }
+   }
+   
    public void test2PCSendCommit1PCOptimization() throws Exception
    {
       //Since both resources have some RM, TM will probably use 1PC optimization
@@ -2803,6 +2893,24 @@
    
    // Private -------------------------------------------------------
    
+   private void assertEqualByteArrays(byte[] b1, byte[] b2)
+   {
+      log.info("b1 length: " + b1.length + " b2 length " + b2.length);
+      
+      if (b1.length != b2.length)
+      {
+         fail("Lengths not the same");
+      }
+      
+      for (int i = 0; i < b1.length; i++)
+      {
+         if (b1[i] != b2[i])
+         {
+            fail("Not same at index " + i);
+         }
+      }
+   }
+   
    // Inner classes -------------------------------------------------
    
    static class DummyXAResource implements XAResource

Modified: trunk/tests/src/org/jboss/test/messaging/jms/persistence/MessagePersistenceManagerTest.java
===================================================================
--- trunk/tests/src/org/jboss/test/messaging/jms/persistence/MessagePersistenceManagerTest.java	2007-02-11 18:20:10 UTC (rev 2269)
+++ trunk/tests/src/org/jboss/test/messaging/jms/persistence/MessagePersistenceManagerTest.java	2007-02-11 20:04:36 UTC (rev 2270)
@@ -78,7 +78,7 @@
       JDBCPersistenceManager p =
          new JDBCPersistenceManager(sc.getDataSource(), sc.getTransactionManager(),
                   sc.getPersistenceManagerSQLProperties(),
-                  true, batch, true, maxParams);      
+                  true, batch, true, false, maxParams);      
       p.start();
       return p;
    }




More information about the jboss-cvs-commits mailing list