jackrabbit-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ju...@apache.org
Subject svn commit: r897904 - in /jackrabbit/branches/1.6: ./ jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/ jackrabbit-core/src/test/java/org/apache/jackrabbit/core/
Date Mon, 11 Jan 2010 15:25:19 GMT
Author: jukka
Date: Mon Jan 11 15:25:19 2010
New Revision: 897904

URL: http://svn.apache.org/viewvc?rev=897904&view=rev
Log:
1.6: Merged revisions 816124 and 819491 from trunk (JCR-2207 and JCR-769)

Modified:
    jackrabbit/branches/1.6/   (props changed)
    jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java
    jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/UserTransactionImpl.java
    jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java

Propchange: jackrabbit/branches/1.6/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan 11 15:25:19 2010
@@ -1,3 +1,3 @@
 /jackrabbit/branches/1.5:794012,794100,794102
 /jackrabbit/branches/1.x:801262-801983,812129,812371
-/jackrabbit/trunk:770143-773197,773483,773525-773555,773584,773588,773828,773835-775756,775833,775836,775840,775868,775981,775986,776036,776256,776310,776313,776321-776322,776332,776356-776357,776362,776373,776650-776693,776737,776757,776776-776777,777024,777029,777034,777478,777509,777541,777548,777936,778445,778613,778616,778621,778645,778720,778802,779032,779040,779068-779071,779074,779076,779081,779084,779086-779088,779090-779092,779094-779096,779101,779223,779225,779227-779228,779230,779233-779234,779460,779475-779476,779504,779550,779552,779555,779561,779563,779583,779590,779618,779621-779622,779624,779642,779654,779657-779659,779661,779936,780006,780010,780025,780085,780985,780989,780993,781017,781051,781054,781294-781300,781305-781311,781318,781328,781338,781344,781347,781369,781372,781377,781416-781417,781423,782621-782622,782644,782646,782652,782669,782675,782677,782683,782694,782921,782925,782930,782936,783002,783004-783005,783042-783043,783239,783243,783245,78327
 8,783304,783319-783321,783324,783326-783327,783330-783333,783337-783338,783340-783341,783343,783345-783347,783356,783359,783383,783386,783412,783435,783444,783447,783523,783688,783703,783708,783710,783719,783757,783759,783761,783786,783809,784011,784013,784039,784058,784060-784061,784090-784091,784106,784108-784109,784111,784117-784120,784124,784163,784261,784680,784691,784696,784760,784824,785112,785116,785157,785169,785209,785492,785517,785519,785529,785533,785535,785539-785540,785545,785580,785589-785590,785592,785594,785597,785602,785627,785629,785631,785635,785645,785668,785711,785725,785777,785863,785981,786003,786019,786028,786062,786075,786089-786090,786093-786094,786144,786146-786147,786149,786167,786280,786295,786319,786329-786330,786336,786409,786419,786423,786480,786485,786492,786513,786562,786565,786680,786685,787183,787219,787241,787942,787952,787964,787996,788002,788012-788013,788350-788351,788443,788446,788450,789245,789257,789269-789270,789279,789307,789312,
 789324,789338,789347,789485,789629,789809,789986,790054,790056,790065-790066,790068,790070-790071,790118,790127,790153,790235-790236,790528,790537,790541,790557-790558,790568,790590,790600,790603,790629,790814,790826,790834,790887,790892,790901,790930,790939,791180,791253,791255,791438-791439,791441,791452,791457,791475,791492,791505,791520,791527,791737,791832,791884,791906,792102,792109,792118,792138,792152,792155-792156,792160,792162,792167-792168,792175,792180-792181,792211,792214,792218,792437,792453,792464,792467,792469,792485,792488,792496,792498,792508-792509,792547-792548,792588-792589,792849,792894-792895,792912,792932,792934,792968,793012-793013,793015-793016,793018,793046-793047,793072,793180,793238,793240,793243,793283,793484-793485,793507,793559,793571,793830,793836,793840,794162,794190,794193,794253,794278,794293-794294,794302,794304,794323,794329,794600,794617,794633,794641,794644,794652,794674,794702,794718,794743,794783,794994,795046,795049,795082,795096,79
 5136,795138,795841-795842,795854,795866,796584,796586,796757,796845,796855,796876,796899,796955,796957,797094,797139,797158,797386,797399,797410,797414,797416-797417,797424,797470,797484,797488-797489,797539,797549,797634,797662,797836,798141,798183,798196,798209,798306,798834,798844,798847-798848,798889-798890,798940,798958,799188,799284,799550,799595,799599,799610,800269,800464,800466,800478,800483,800715,800807,800829,800854,800862-800863,801104,801125-801126,801128,801135,801169,801210,801213,801226,801241,801968,801973,812102,812369,815233,829015,830575,881283,889133
+/jackrabbit/trunk:770143-773197,773483,773525-773555,773584,773588,773828,773835-775756,775833,775836,775840,775868,775981,775986,776036,776256,776310,776313,776321-776322,776332,776356-776357,776362,776373,776650-776693,776737,776757,776776-776777,777024,777029,777034,777478,777509,777541,777548,777936,778445,778613,778616,778621,778645,778720,778802,779032,779040,779068-779071,779074,779076,779081,779084,779086-779088,779090-779092,779094-779096,779101,779223,779225,779227-779228,779230,779233-779234,779460,779475-779476,779504,779550,779552,779555,779561,779563,779583,779590,779618,779621-779622,779624,779642,779654,779657-779659,779661,779936,780006,780010,780025,780085,780985,780989,780993,781017,781051,781054,781294-781300,781305-781311,781318,781328,781338,781344,781347,781369,781372,781377,781416-781417,781423,782621-782622,782644,782646,782652,782669,782675,782677,782683,782694,782921,782925,782930,782936,783002,783004-783005,783042-783043,783239,783243,783245,78327
 8,783304,783319-783321,783324,783326-783327,783330-783333,783337-783338,783340-783341,783343,783345-783347,783356,783359,783383,783386,783412,783435,783444,783447,783523,783688,783703,783708,783710,783719,783757,783759,783761,783786,783809,784011,784013,784039,784058,784060-784061,784090-784091,784106,784108-784109,784111,784117-784120,784124,784163,784261,784680,784691,784696,784760,784824,785112,785116,785157,785169,785209,785492,785517,785519,785529,785533,785535,785539-785540,785545,785580,785589-785590,785592,785594,785597,785602,785627,785629,785631,785635,785645,785668,785711,785725,785777,785863,785981,786003,786019,786028,786062,786075,786089-786090,786093-786094,786144,786146-786147,786149,786167,786280,786295,786319,786329-786330,786336,786409,786419,786423,786480,786485,786492,786513,786562,786565,786680,786685,787183,787219,787241,787942,787952,787964,787996,788002,788012-788013,788350-788351,788443,788446,788450,789245,789257,789269-789270,789279,789307,789312,
 789324,789338,789347,789485,789629,789809,789986,790054,790056,790065-790066,790068,790070-790071,790118,790127,790153,790235-790236,790528,790537,790541,790557-790558,790568,790590,790600,790603,790629,790814,790826,790834,790887,790892,790901,790930,790939,791180,791253,791255,791438-791439,791441,791452,791457,791475,791492,791505,791520,791527,791737,791832,791884,791906,792102,792109,792118,792138,792152,792155-792156,792160,792162,792167-792168,792175,792180-792181,792211,792214,792218,792437,792453,792464,792467,792469,792485,792488,792496,792498,792508-792509,792547-792548,792588-792589,792849,792894-792895,792912,792932,792934,792968,793012-793013,793015-793016,793018,793046-793047,793072,793180,793238,793240,793243,793283,793484-793485,793507,793559,793571,793830,793836,793840,794162,794190,794193,794253,794278,794293-794294,794302,794304,794323,794329,794600,794617,794633,794641,794644,794652,794674,794702,794718,794743,794783,794994,795046,795049,795082,795096,79
 5136,795138,795841-795842,795854,795866,796584,796586,796757,796845,796855,796876,796899,796955,796957,797094,797139,797158,797386,797399,797410,797414,797416-797417,797424,797470,797484,797488-797489,797539,797549,797634,797662,797836,798141,798183,798196,798209,798306,798834,798844,798847-798848,798889-798890,798940,798958,799188,799284,799550,799595,799599,799610,800269,800464,800466,800478,800483,800715,800807,800829,800854,800862-800863,801104,801125-801126,801128,801135,801169,801210,801213,801226,801241,801968,801973,812102,812369,815233,816124,819491,829015,830575,881283,889133

Modified: jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java?rev=897904&r1=897903&r2=897904&view=diff
==============================================================================
--- jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java
(original)
+++ jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/DefaultISMLocking.java
Mon Jan 11 15:25:19 2010
@@ -16,10 +16,14 @@
  */
 package org.apache.jackrabbit.core.state;
 
+import java.util.Arrays;
+
 import javax.transaction.xa.Xid;
 
 import org.apache.jackrabbit.core.ItemId;
 import org.apache.jackrabbit.core.TransactionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import EDU.oswego.cs.dl.util.concurrent.ReentrantWriterPreferenceReadWriteLock;
 import EDU.oswego.cs.dl.util.concurrent.Sync;
@@ -32,6 +36,11 @@
 public class DefaultISMLocking implements ISMLocking {
 
     /**
+     * Logger instance
+     */
+    private static final Logger log = LoggerFactory.getLogger(DefaultISMLocking.class);
+
+    /**
      * The internal read-write lock.
      */
     private final RWLock rwLock = new RWLock();
@@ -60,7 +69,6 @@
              * {@inheritDoc}
              */
             public void release() {
-                rwLock.setActiveXid(null);
                 rwLock.writeLock().release();
             }
 
@@ -109,8 +117,36 @@
          * @param xid
          */
         synchronized void setActiveXid(Xid xid) {
+            if (activeXid != null && xid != null) {
+                boolean sameGTI = Arrays.equals(activeXid.getGlobalTransactionId(), xid.getGlobalTransactionId());
+                if (!sameGTI) {
+                    log.warn("Unable to set the ActiveXid while a other one is associated
with a different GloalTransactionId with this RWLock.");
+                    return;
+                }
+            }
             activeXid = xid;
         }
-        
+
+        /**
+         * {@inheritDoc}
+         * 
+         * If there are no more writeHolds the activeXid will be set to null
+         */
+        protected synchronized Signaller endWrite() {
+            --writeHolds_;
+            if (writeHolds_ > 0) {  // still being held
+                return null;
+            } else {
+                activeXid = null;
+                activeWriter_ = null;
+                if (waitingReaders_ > 0 && allowReader()) {
+                    return readerLock_;
+                } else if (waitingWriters_ > 0) {
+                    return writerLock_;
+                } else {
+                    return null;
+                }
+            }
+        }
     }
 }

Modified: jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/UserTransactionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/UserTransactionImpl.java?rev=897904&r1=897903&r2=897904&view=diff
==============================================================================
--- jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/UserTransactionImpl.java
(original)
+++ jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/UserTransactionImpl.java
Mon Jan 11 15:25:19 2010
@@ -16,6 +16,10 @@
  */
 package org.apache.jackrabbit.core;
 
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
 import javax.transaction.xa.XAResource;
 import javax.transaction.xa.Xid;
 import javax.transaction.xa.XAException;
@@ -41,14 +45,9 @@
     private static byte counter = 0;
 
     /**
-     * XAResource
-     */
-    private final XAResource xares;
-
-    /**
-     * Xid
+     * The XAResources map
      */
-    private Xid xid;
+    private Map xaResources = new HashMap();
 
     /**
      * Status
@@ -75,7 +74,8 @@
      */
     public UserTransactionImpl(Session session, boolean distributedThreadAccess) {
         if (session instanceof XASession) {
-            xares = ((XASession) session).getXAResource();
+            counter++;
+            xaResources.put(((XASession) session).getXAResource(), new XidImpl(counter));
             this.distributedThreadAccess = distributedThreadAccess; 
         } else {
             throw new IllegalArgumentException("Session not of type XASession");
@@ -83,6 +83,14 @@
     }
 
     /**
+     * Enlists the given Session to this UserTransaction
+     * @param session
+     */
+    public void enlistXAResource(Session session) {
+        xaResources.put(session, new XidImpl(counter));
+    }
+
+    /**
      * @see javax.transaction.UserTransaction#begin
      */
     public void begin() throws NotSupportedException, SystemException {
@@ -91,8 +99,11 @@
         }
 
         try {
-            xid = new XidImpl(counter++);
-            xares.start(xid, XAResource.TMNOFLAGS);
+            for (Iterator it = xaResources.keySet().iterator(); it.hasNext(); ) {
+                XAResource resource = (XAResource) it.next();
+                XidImpl xid = (XidImpl) xaResources.get(resource);
+                resource.start(xid, XAResource.TMNOFLAGS);
+            }
             status = Status.STATUS_ACTIVE;
 
         } catch (XAException e) {
@@ -114,32 +125,47 @@
         }
 
         try {
-            xares.end(xid, XAResource.TMSUCCESS);
+            for (Iterator it = xaResources.keySet().iterator(); it.hasNext(); ) {
+                XAResource resource = (XAResource) it.next();
+                XidImpl xid = (XidImpl) xaResources.get(resource);
+                resource.end(xid, XAResource.TMSUCCESS);
+            }
 
             status = Status.STATUS_PREPARING;
-            xares.prepare(xid);
+            for (Iterator it = xaResources.keySet().iterator(); it.hasNext(); ) {
+                XAResource resource = (XAResource) it.next();
+                XidImpl xid = (XidImpl) xaResources.get(resource);
+                resource.prepare(xid);
+            }
             status = Status.STATUS_PREPARED;
 
             status = Status.STATUS_COMMITTING;
             if (distributedThreadAccess) {
-                try {
-                    Thread distributedThread = new Thread() {
-                        public void run() {
-                            try {
-                                xares.commit(xid, false);
-                            } catch (Exception e) {
-                                throw new RuntimeException(e.getMessage());
+                Thread distributedThread = new Thread() {
+                    public void run() {
+                        try {
+                            for (Iterator it = xaResources.keySet().iterator(); it.hasNext();
) {
+                                XAResource resource = (XAResource) it.next();
+                                XidImpl xid = (XidImpl) xaResources.get(resource);
+                                resource.commit(xid, false);
                             }
+                        } catch (Exception e) {
+                            throw new RuntimeException(e.getMessage());
                         }
-                    };
-                    distributedThread.start();
-                    distributedThread.join(1000);
-                } catch (InterruptedException e) {
+                    }
+                };
+                distributedThread.start();
+                distributedThread.join(1000);
+                if (distributedThread.isAlive()) {
                     throw new SystemException(
                             "Commit from different thread but same XID must not block");
                 }
             } else {
-                xares.commit(xid, false);
+                for (Iterator it = xaResources.keySet().iterator(); it.hasNext(); ) {
+                    XAResource resource = (XAResource) it.next();
+                    XidImpl xid = (XidImpl) xaResources.get(resource);
+                    resource.commit(xid, false);
+                }
             }
             
             status = Status.STATUS_COMMITTED;
@@ -158,6 +184,8 @@
                 se.initCause(e.getCause());
                 throw se;
             }
+        } catch (InterruptedException e) {
+            throw new SystemException("Thread.join() interrupted");
         }
     }
 
@@ -181,10 +209,18 @@
         }
 
         try {
-            xares.end(xid, XAResource.TMFAIL);
+            for (Iterator it = xaResources.keySet().iterator(); it.hasNext(); ) {
+                XAResource resource = (XAResource) it.next();
+                XidImpl xid = (XidImpl) xaResources.get(resource);
+                resource.end(xid, XAResource.TMFAIL);
+            }
 
             status = Status.STATUS_ROLLING_BACK;
-            xares.rollback(xid);
+            for (Iterator it = xaResources.keySet().iterator(); it.hasNext(); ) {
+                XAResource resource = (XAResource) it.next();
+                XidImpl xid = (XidImpl) xaResources.get(resource);
+                resource.rollback(xid);
+            }
             status = Status.STATUS_ROLLEDBACK;
 
         } catch (XAException e) {
@@ -210,7 +246,9 @@
      */
     public void setTransactionTimeout(int seconds) throws SystemException {
         try {
-            xares.setTransactionTimeout(seconds);
+            for (Iterator it = xaResources.keySet().iterator(); it.hasNext(); ) {
+                ((XAResource) it.next()).setTransactionTimeout(seconds);
+            }
         } catch (XAException e) {
             SystemException se = new SystemException(
                     "Unable to set the TransactionTiomeout: XA_ERR=" + e.errorCode);

Modified: jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java?rev=897904&r1=897903&r2=897904&view=diff
==============================================================================
--- jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java
(original)
+++ jackrabbit/branches/1.6/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/XATest.java
Mon Jan 11 15:25:19 2010
@@ -1636,6 +1636,99 @@
             fail("Committed node not visible in this session");
         }
     }
+    
+    /**
+     * Tests two different Sessions in one Transaction
+     * (see JCR-769)
+     */
+    public void testTwoSessionsInOneTransaction() throws Exception {
+        Session otherSuperuser = getHelper().getSuperuserSession();
+        
+        // get user transaction object
+        UserTransactionImpl utx = new UserTransactionImpl(superuser, true);
+        utx.enlistXAResource(otherSuperuser);
+        
+        // start transaction
+        utx.begin();
+
+        Node rootNode = superuser.getRootNode();
+        // add node and save
+        Node n = rootNode.addNode(nodeName1, testNodeType);
+        n.addMixin(mixReferenceable);
+        rootNode.save();
+
+        // assertion: node exists in this session
+        try {
+            superuser.getNodeByUUID(n.getUUID());
+        } catch (ItemNotFoundException e) {
+            fail("New node not visible after save()");
+        }
+
+        // assertion: node does exist in other session
+        try {
+            otherSuperuser.getNodeByUUID(n.getUUID());
+            fail("Uncommitted node visible for other session");
+        } catch (ItemNotFoundException e) {
+            /* expected */
+        }
+
+        // add node with other session and save
+        rootNode = otherSuperuser.getRootNode();
+        Node n1 = rootNode.addNode(nodeName2, testNodeType);
+        n1.addMixin(mixReferenceable);
+        rootNode.save();
+
+        // assertion: node exists in this session
+        try {
+            otherSuperuser.getNodeByUUID(n1.getUUID());
+        } catch (ItemNotFoundException e) {
+            fail("New node not visible after save()");
+        }
+
+        // assertion: node does exist in other session
+        try {
+            superuser.getNodeByUUID(n1.getUUID());
+            fail("Uncommitted node visible for other session");
+        } catch (ItemNotFoundException e) {
+            /* expected */
+        }
+
+        
+        // commit
+        utx.commit();
+
+        // assertion: node exists in this session
+        try {
+            superuser.getNodeByUUID(n.getUUID());
+        } catch (ItemNotFoundException e) {
+            fail("Committed node not visible in this session");
+        }
+
+        // assertion: node also exists in other session
+        try {
+            otherSuperuser.getNodeByUUID(n.getUUID());
+        } catch (ItemNotFoundException e) {
+            fail("Committed node not visible in the other session");
+        }
+
+        // assertion: node1 exists in this session
+        try {
+            superuser.getNodeByUUID(n1.getUUID());
+        } catch (ItemNotFoundException e) {
+            fail("Committed node not visible in this session");
+        }
+
+        // assertion: node1 also exists in other session
+        try {
+            otherSuperuser.getNodeByUUID(n1.getUUID());
+        } catch (ItemNotFoundException e) {
+            fail("Committed node not visible in this session");
+        }
+
+        // logout
+        superuser.logout();
+        otherSuperuser.logout();
+    }
 
     /**
      * Test setting the same property multiple times. Exposes an issue where



Mime
View raw message