From: Bela B. <bel...@jb...> - 2005-06-08 07:43:46
|
User: bela Date: 05/06/08 03:43:13 Modified: src/org/jboss/cache/interceptors LockInterceptor.java Log: Reduced unnecessary Fqn creation in lock(), suggested by Brian Dueck Revision Changes Path 1.4 +9 -6 JBossCache/src/org/jboss/cache/interceptors/LockInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: LockInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/LockInterceptor.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -b -r1.3 -r1.4 --- LockInterceptor.java 26 Apr 2005 18:18:37 -0000 1.3 +++ LockInterceptor.java 8 Jun 2005 07:43:13 -0000 1.4 @@ -20,7 +20,7 @@ * scope of the TX. When no TX is present, we keep track of the locks acquired during the current method and unlock * when the method returns * @author Bela Ban - * @version $Id: LockInterceptor.java,v 1.3 2005/04/26 18:18:37 bela Exp $ + * @version $Id: LockInterceptor.java,v 1.4 2005/06/08 07:43:13 bela Exp $ */ public class LockInterceptor extends Interceptor { private TransactionManager tx_mgr=null; @@ -46,9 +46,9 @@ public Object invoke(MethodCall m) throws Throwable { - Transaction tx=null; + Transaction tx; GlobalTransaction gtx=null; - Object retval=null; + Object retval; Fqn fqn=null; int lock_type=Node.LOCK_TYPE_NONE; long lock_timeout=lock_acquisition_timeout; @@ -183,7 +183,7 @@ throws TimeoutException, LockingException, InterruptedException { Node n, child_node=null; Object child_name, owner=gtx != null? gtx : (Object)Thread.currentThread(); - Fqn tmp_fqn=new Fqn(); + List child_names; int treeNodeSize; boolean acquired=false; IsolationLevel isolation_level; @@ -196,26 +196,29 @@ if((treeNodeSize=fqn.size()) == 0) return; + child_names=new ArrayList(treeNodeSize); isolation_level=cache.getIsolationLevelClass(); if(isolation_level == IsolationLevel.NONE) lock_type=Node.LOCK_TYPE_NONE; n=cache.getRoot(); for(int i=0; i < treeNodeSize; i++) { child_name=fqn.get(i); - tmp_fqn=new Fqn(tmp_fqn, child_name); + child_names.add(child_name); + if(createIfNotExists) create_lock.acquire(); try { child_node=n.getChild(child_name); if(child_node == null) { if(createIfNotExists) { + final Fqn tmp_fqn=new Fqn(child_names); child_node=n.createChild(child_name, tmp_fqn, n); if(log.isTraceEnabled()) log.trace("created child " + child_name); if(gtx != null) { // add the node name to the list maintained for the current tx // (needed for abort/rollback of transaction) - cache.addNode(gtx, (Fqn)tmp_fqn.clone()); + cache.addNode(gtx, tmp_fqn); // clone() is not needed since tmp_fqn is not referenced elsewhere } create_lock.release(); cache.notifyNodeCreated(tmp_fqn); |
From: Bela B. <bel...@jb...> - 2005-06-10 14:56:49
|
User: bela Date: 05/06/10 10:56:17 Modified: src/org/jboss/cache/interceptors CreateIfNotExistsInterceptor.java Log: Fixed inefficient node access (get or creation): http://jira.jboss.com/jira/browse/JBCACHE-187 Revision Changes Path 1.3 +4 -5 JBossCache/src/org/jboss/cache/interceptors/CreateIfNotExistsInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: CreateIfNotExistsInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/CreateIfNotExistsInterceptor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -b -r1.2 -r1.3 --- CreateIfNotExistsInterceptor.java 10 Jun 2005 08:53:10 -0000 1.2 +++ CreateIfNotExistsInterceptor.java 10 Jun 2005 14:56:17 -0000 1.3 @@ -13,7 +13,7 @@ * Handles putXXX() methods: if the given node doesn't exist, it will be created * (depending on the create_if_not_exists argument) * @author Bela Ban - * @version $Id: CreateIfNotExistsInterceptor.java,v 1.2 2005/06/10 08:53:10 bela Exp $ + * @version $Id: CreateIfNotExistsInterceptor.java,v 1.3 2005/06/10 14:56:17 bela Exp $ */ public class CreateIfNotExistsInterceptor extends Interceptor { @@ -333,7 +333,7 @@ private void createNode(Fqn fqn, GlobalTransaction tx) { Node n, child_node; Object child_name; - Fqn tmp_fqn=new Fqn(), copy; + Fqn tmp_fqn=new Fqn(); if(fqn == null) return; synchronized(this) { @@ -344,14 +344,13 @@ tmp_fqn=new Fqn(tmp_fqn, child_name); child_node=n.getChild(child_name); if(child_node == null) { - copy=(Fqn)tmp_fqn.clone(); - child_node=n.createChild(child_name, copy, n); + child_node=n.createChild(child_name, tmp_fqn, n); if(tx != null) { // add the node name to the list maintained for the current tx // (needed for abort/rollback of transaction) cache.addNode(tx, (Fqn)tmp_fqn.clone()); } - cache.notifyNodeCreated(copy); + cache.notifyNodeCreated(tmp_fqn); } n=child_node; } |
From: Bela B. <bel...@jb...> - 2005-06-10 14:57:00
|
User: bela Date: 05/06/10 10:56:30 Modified: src/org/jboss/cache/interceptors LockInterceptor.java Log: Fixed inefficient node access (get or creation): http://jira.jboss.com/jira/browse/JBCACHE-187 Revision Changes Path 1.7 +7 -37 JBossCache/src/org/jboss/cache/interceptors/LockInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: LockInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/LockInterceptor.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -b -r1.6 -r1.7 --- LockInterceptor.java 10 Jun 2005 08:53:10 -0000 1.6 +++ LockInterceptor.java 10 Jun 2005 14:56:30 -0000 1.7 @@ -1,6 +1,5 @@ package org.jboss.cache.interceptors; -import EDU.oswego.cs.dl.util.concurrent.ReentrantLock; import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap; import org.jboss.cache.*; import org.jboss.cache.lock.IdentityLock; @@ -21,7 +20,7 @@ * scope of the TX. When no TX is present, we keep track of the locks acquired during the current method and unlock * when the method returns * @author Bela Ban - * @version $Id: LockInterceptor.java,v 1.6 2005/06/10 08:53:10 bela Exp $ + * @version $Id: LockInterceptor.java,v 1.7 2005/06/10 14:56:30 bela Exp $ */ public class LockInterceptor extends Interceptor { private TransactionManager tx_mgr=null; @@ -29,10 +28,8 @@ Map lock_table; private long lock_acquisition_timeout; - ReentrantLock create_lock=new ReentrantLock(); - /** List<Transaction> that we have registered for */ - private ConcurrentHashMap transactions=new ConcurrentHashMap(16); + private Map transactions=new ConcurrentHashMap(16); private static final Object NULL=new Object(); @@ -185,7 +182,6 @@ throws TimeoutException, LockingException, InterruptedException { Node n, child_node=null; Object child_name, owner=gtx != null? gtx : (Object)Thread.currentThread(); - List child_names; int treeNodeSize; boolean acquired=false; IsolationLevel isolation_level; @@ -198,44 +194,18 @@ if((treeNodeSize=fqn.size()) == 0) return; - child_names=new ArrayList(treeNodeSize); isolation_level=cache.getIsolationLevelClass(); if(isolation_level == IsolationLevel.NONE) lock_type=Node.LOCK_TYPE_NONE; n=cache.getRoot(); for(int i=0; i < treeNodeSize; i++) { child_name=fqn.get(i); - child_names.add(child_name); - - if(createIfNotExists) - create_lock.acquire(); - try { - child_node=n.getChild(child_name); + child_node=n.getOrCreateChild(child_name, gtx, createIfNotExists); if(child_node == null) { - if(createIfNotExists) { - final Fqn tmp_fqn=new Fqn(child_names); - child_node=n.createChild(child_name, tmp_fqn, n); - if(log.isTraceEnabled()) - log.trace("created child " + child_name); - if(gtx != null) { - // add the node name to the list maintained for the current tx - // (needed for abort/rollback of transaction) - cache.addNode(gtx, tmp_fqn); // clone() is not needed since tmp_fqn is not referenced elsewhere - } - create_lock.release(); - cache.notifyNodeCreated(tmp_fqn); - } - else { if(log.isTraceEnabled()) - log.trace("failed finding child " + child_name + " of node " + n.getFqn()); + log.trace("failed to find or create child " + child_name + " of node " + n.getFqn()); return; } - } - } - finally { - if(create_lock.holds() > 0) - create_lock.release(); - } if(lock_type == Node.LOCK_TYPE_NONE) { // acquired=false; |
From: Manik S. <msu...@jb...> - 2005-07-01 04:44:40
|
User: msurtani Date: 05/07/01 00:43:52 Modified: src/org/jboss/cache/interceptors CacheLoaderInterceptor.java Log: added casting of Node to TreeNode Revision Changes Path 1.5 +3 -3 JBossCache/src/org/jboss/cache/interceptors/CacheLoaderInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: CacheLoaderInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/CacheLoaderInterceptor.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -b -r1.4 -r1.5 --- CacheLoaderInterceptor.java 30 Jun 2005 11:51:01 -0000 1.4 +++ CacheLoaderInterceptor.java 1 Jul 2005 04:43:52 -0000 1.5 @@ -15,7 +15,7 @@ /** * Loads nodes that don't exist at the time of the call into memory from the CacheLoader * @author Bela Ban - * @version $Id: CacheLoaderInterceptor.java,v 1.4 2005/06/30 11:51:01 msurtani Exp $ + * @version $Id: CacheLoaderInterceptor.java,v 1.5 2005/07/01 04:43:52 msurtani Exp $ */ public class CacheLoaderInterceptor extends Interceptor { private CacheLoader loader=null; @@ -95,7 +95,7 @@ n=getNode(fqn, false, false); // don't load if(n != null) { Map children=n.getChildren(); - if(children == null || n.getChildrenLoaded() == false) { + if(children == null || ((TreeNode) n).getChildrenLoaded() == false) { Set children_names=null; try { children_names=loader.getChildrenNames(fqn); @@ -112,7 +112,7 @@ } lock(fqn, Node.LOCK_TYPE_READ, true); // recursive=true: lock entire subtree } - n.setChildrenLoaded(true); + ((TreeNode) n).setChildrenLoaded(true); } } } |
From: Manik S. <msu...@jb...> - 2005-07-11 01:19:16
|
User: msurtani Date: 05/07/10 21:18:23 Modified: src/org/jboss/cache/interceptors OptimisticReplicationInterceptor.java Log: Removed Eclipse-generated TODO's... Revision Changes Path 1.2 +365 -366 JBossCache/src/org/jboss/cache/interceptors/OptimisticReplicationInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticReplicationInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticReplicationInterceptor.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -b -r1.1 -r1.2 --- OptimisticReplicationInterceptor.java 4 Jul 2005 11:39:07 -0000 1.1 +++ OptimisticReplicationInterceptor.java 11 Jul 2005 01:18:23 -0000 1.2 @@ -360,7 +360,6 @@ * @see org.jboss.cache.Replicatable#replicate(org.jgroups.blocks.MethodCall) */ public Object replicate(MethodCall method_call) throws Throwable { - // TODO Auto-generated method stub return null; } |
From: Manik S. <msu...@jb...> - 2005-07-22 18:21:22
|
User: msurtani Date: 05/07/22 14:19:49 Modified: src/org/jboss/cache/interceptors OptimisticTxInterceptor.java Log: fixed node factory creation bug Revision Changes Path 1.3 +769 -640 JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticTxInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -b -r1.2 -r1.3 --- OptimisticTxInterceptor.java 11 Jul 2005 09:49:33 -0000 1.2 +++ OptimisticTxInterceptor.java 22 Jul 2005 18:19:49 -0000 1.3 @@ -1,114 +1,119 @@ package org.jboss.cache.interceptors; -import java.lang.reflect.Method; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import javax.transaction.Status; -import javax.transaction.Synchronization; -import javax.transaction.SystemException; -import javax.transaction.Transaction; -import javax.transaction.TransactionManager; - +import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap; import org.apache.log4j.MDC; -import org.jboss.cache.CacheException; -import org.jboss.cache.GlobalTransaction; -import org.jboss.cache.OptimisticTransactionEntry; -import org.jboss.cache.TransactionEntry; -import org.jboss.cache.TransactionTable; -import org.jboss.cache.TreeCache; +import org.jboss.cache.*; import org.jboss.cache.optimistic.NodeWrapper; import org.jboss.util.NestedRuntimeException; import org.jgroups.Address; import org.jgroups.blocks.MethodCall; -import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap; +import javax.transaction.*; +import java.lang.reflect.Method; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; /** * */ -public class OptimisticTxInterceptor extends Interceptor { +public class OptimisticTxInterceptor extends Interceptor +{ TransactionManager txMgr = null; TreeCache cache = null; TransactionTable txTable = null; - /** List <Transaction>that we have registered for */ + /** + * List <Transaction>that we have registered for + */ //private List transactions = Collections.synchronizedList(new ArrayList()); private Map transactions = new ConcurrentHashMap(); - public void setCache(TreeCache cache) { + public void setCache(TreeCache cache) + { super.setCache(cache); this.cache = cache; txMgr = cache.getTransactionManager(); txTable = cache.getTransactionTable(); } - public Object invoke(MethodCall m) throws Throwable { + public Object invoke(MethodCall m) throws Throwable + { GlobalTransaction gtx = null; Method meth = m.getMethod(); Object result = null; - try { - if (cache.getLocalAddress() != null) { + try + { + if (cache.getLocalAddress() != null) + { MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); } // first of all deal with tx methods - these are only going to be // remote prepare/commit/rollback - if (meth.equals(TreeCache.prepareMethod) || meth.equals(TreeCache.optimisticPrepareMethod)) { + if (meth.equals(TreeCache.prepareMethod) || meth.equals(TreeCache.optimisticPrepareMethod)) + { +// assume that a global tx is present in such a case. Object[] args = m.getArgs(); gtx = (GlobalTransaction) args[0]; if (gtx != null && (gtx.getAddress() != null) - && (!gtx.getAddress().equals(cache.getLocalAddress()))) { + && (!gtx.getAddress().equals(cache.getLocalAddress()))) + { // handleRemotePrepare gtx.setRemote(true); result = handleRemotePrepare(m); - } else { - throw new CacheException( - "prepare cannot be called directly for local method"); + } + else + { + throw new CacheException("prepare cannot be called directly for local method"); } - } else if (meth.equals(TreeCache.commitMethod) - || meth.equals(TreeCache.rollbackMethod)) { + } + else if (meth.equals(TreeCache.commitMethod) + || meth.equals(TreeCache.rollbackMethod)) + { Object[] args = m.getArgs(); gtx = (GlobalTransaction) args[0]; // Find the local transactions associated with gtx, commit or // rollback TX if (gtx != null && (gtx.getAddress() != null) - && (!gtx.getAddress().equals(cache.getLocalAddress()))) { + && (!gtx.getAddress().equals(cache.getLocalAddress()))) + { // handleRemotePrepare gtx.setRemote(true); result = handleRemoteCommitRollback(m); - } else { - throw new CacheException( - m + } + else + { + throw new CacheException(m + " cannot be called directly for local transaction"); } - } else { + } + else + { // it is some sort of other call - so we may neeed to wrap with // a local tx - - result = handleLocalTx(m); - - } return result; - } finally { + } + finally + { MDC.remove("MDC_LOCAL_ADDRESS"); } } private GlobalTransaction registerTransaction(Transaction tx) - throws Exception { + throws Exception + { GlobalTransaction gtx = cache.getCurrentTransaction(tx); SynchronizationHandler myHandler = new SynchronizationHandler(gtx, tx, @@ -117,22 +122,27 @@ } private GlobalTransaction registerRemoteTransaction(GlobalTransaction gtx, - Transaction tx) throws Exception { - RemoteSynchronizationHandler myHandler = new RemoteSynchronizationHandler( - gtx, tx, cache); + Transaction tx + ) throws Exception + { + RemoteSynchronizationHandler myHandler = new RemoteSynchronizationHandler(gtx, tx, cache); return registerHandler(tx, gtx, myHandler); } private GlobalTransaction registerHandler(Transaction tx, - GlobalTransaction gtx, SynchronizationHandler handler) - throws Exception { - if (!transactions.containsKey(tx)) { + GlobalTransaction gtx, SynchronizationHandler handler + ) + throws Exception + { + if (!transactions.containsKey(tx)) + { // GlobalTransaction gtx=tx_table.get(tx); // this will create a gtx if one does not exist log .debug("registering handler for TX completion: SynchronizationHandler(" + handler + ")"); - if (gtx == null) { + if (gtx == null) + { throw new Exception("failed to get global transaction " + gtx); } @@ -140,29 +150,36 @@ .getInstance(tx); if (log.isTraceEnabled()) + { log .trace("registering for TX completion: SynchronizationHandler(" + handler + ")"); + } orderedHandler.registerAtHead(handler); // needs to be invoked first // on // TX commit - transactions.put(tx,tx); + transactions.put(tx, tx); return gtx; - } else { + } + else + { log.debug("already registered transaction " + tx); return gtx; } } - private Object handleLocalTx(MethodCall m) throws Throwable { + private Object handleLocalTx(MethodCall m) throws Throwable + { Transaction tx = null; Object result = null; - if (txMgr != null && (tx = txMgr.getTransaction()) == null) { // no + if (txMgr != null && (tx = txMgr.getTransaction()) == null) + { // no // transaction - try { + try + { log.debug(" creating transaction for thread " + Thread.currentThread()); txMgr.begin(); @@ -171,36 +188,61 @@ tx = txMgr.getTransaction(); GlobalTransaction gtx = registerTransaction(tx); + + // why is this TX not put in the TX table?? - Manik + // lets try a hack here... + OptimisticTransactionEntry ote = new OptimisticTransactionEntry( ); + ote.setTransaction( tx ); + txTable.put(gtx, ote); + txTable.put(tx, gtx); + // end hack + m = replaceGtx(m, gtx); result = super.invoke(m); log.debug(" commiting transaction for thread " + Thread.currentThread()); txMgr.commit(); - } catch (Throwable t) { + } + catch (Throwable t) + { // rollback log.warn(" Rolling back exception encountered ", t); - try { + try + { txMgr.rollback(); - } catch (Throwable th) { + } + catch (Throwable th) + { log.warn(" Roll back failed encountered ", th); } } return result; - } else { + } + else + { log .debug(" local transaction exists - registering global tx if not present for " + Thread.currentThread()); System.out.println("BEFORE:\n" + txTable.toString(true)); GlobalTransaction gtx = registerTransaction(tx); System.out.println("AFTER:\n" + txTable.toString(true)); + // why is this TX not put in the TX table?? - Manik + // lets try a hack here... + OptimisticTransactionEntry ote = new OptimisticTransactionEntry( ); + ote.setTransaction( tx ); + txTable.put(gtx, ote); + txTable.put(tx, gtx); + // end hack + m = replaceGtx(m, gtx); result = super.invoke(m); } return result; } - private Object handleLocalPrepare(MethodCall m) throws Throwable { + private Object handleLocalPrepare(MethodCall m) throws Throwable + { Object[] args = m.getArgs(); GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed to be @@ -214,16 +256,18 @@ //if ltx is not null and it is already running if (txMgr.getTransaction() != null && ltx != null - && ltx.equals(txMgr.getTransaction())) { + && ltx.equals(txMgr.getTransaction())) + { log.debug(" running local prepare for " + gtx); result = super.invoke(m); log.debug(" finished local prepare for " + gtx); - } else { + } + else + { log .warn(" local transaction does not exist or does not match expected transaction " + gtx); - throw new CacheException( - " local transaction " + throw new CacheException(" local transaction " + ltx + " does not exist or does not match expected transaction " + gtx); @@ -233,12 +277,16 @@ //we use this to replace the gtx when a method called outside a transaction // here we replace the null gtx with our created one - private MethodCall replaceGtx(MethodCall m, GlobalTransaction gtx) { + private MethodCall replaceGtx(MethodCall m, GlobalTransaction gtx) + { Class[] argClasses = m.getMethod().getParameterTypes(); Object[] args = m.getArgs(); - for (int i = 0; i < argClasses.length; i++) { - if (argClasses[i].equals(GlobalTransaction.class)) { - if (!gtx.equals(args[i])) { + for (int i = 0; i < argClasses.length; i++) + { + if (argClasses[i].equals(GlobalTransaction.class)) + { + if (!gtx.equals(args[i])) + { args[i] = gtx; m.setArgs(args); } @@ -249,7 +297,8 @@ } - private Object handleRemotePrepare(MethodCall m) throws Throwable { + private Object handleRemotePrepare(MethodCall m) throws Throwable + { Object[] args = m.getArgs(); GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed to @@ -265,13 +314,16 @@ ltx = txTable.getLocalTransaction(gtx); // suspend the current one - if running - if (txMgr.getTransaction() != null) { + if (txMgr.getTransaction() != null) + { log.debug(" suspending current transaction " + gtx); curr_tx = txMgr.suspend(); // might be null if not LTX running } - try { - if (ltx == null) { + try + { + if (ltx == null) + { ltx = createNewLocalTransaction(gtx); // creates new LTX and // associates it with // GTX @@ -281,9 +333,12 @@ + cache.getLocalAddress() + "): started new local TX as result of remote PREPARE: local TX=" + ltx + ", global TX=" + gtx); - } else { + } + else + { //this should be valid - if (!isValid(ltx)) { + if (!isValid(ltx)) + { throw new CacheException("transaction " + ltx + " not in correct state to be prepared"); } @@ -291,8 +346,10 @@ //associate this thread txMgr.resume(ltx); if (log.isTraceEnabled()) + { log.trace(" resuming existing transaction " + ltx + ", global TX=" + gtx); + } // at this point we have a non-null // ltx @@ -301,7 +358,8 @@ // entry for TX in tx_table, the modifications // below will need this entry to add their modifications // under the GlobalTx key - if ((entry = txTable.get(gtx)) == null) { + if ((entry = txTable.get(gtx)) == null) + { // create a new transaction entry entry = new OptimisticTransactionEntry(); entry.setTransaction(ltx); @@ -314,9 +372,12 @@ retval = super.invoke(m); - } finally { + } + finally + { txMgr.suspend(); // suspends ltx - could be null - if (curr_tx != null) { + if (curr_tx != null) + { txMgr.resume(curr_tx); } log.debug(" finished remote prepare " + gtx); @@ -324,7 +385,8 @@ return retval; } - private Object handleRemoteCommitRollback(MethodCall m) throws Throwable { + private Object handleRemoteCommitRollback(MethodCall m) throws Throwable + { Object[] args = m.getArgs(); GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed to be // non-null @@ -333,24 +395,29 @@ Object result = null; // set transaction to be remote if it is - if (!gtx.isRemote()) { - throw new CacheException( - "Commit/Rollback must be remote - not handling local gtx"); + if (!gtx.isRemote()) + { + throw new CacheException("Commit/Rollback must be remote - not handling local gtx"); } ltx = txTable.getLocalTransaction(gtx); - if (ltx != null) { + if (ltx != null) + { log.debug(" received " + meth.getName() + ": local TX=" + ltx + ", global TX=" + gtx); - } else { + } + else + { throw new IllegalStateException(" found no local TX for global TX " + gtx); } // disconnect if we have a current tx associated Transaction curr_tx = null; - try { - if (!ltx.equals(txMgr.getTransaction())) { + try + { + if (!ltx.equals(txMgr.getTransaction())) + { curr_tx = txMgr.suspend(); txMgr.resume(ltx); } @@ -358,15 +425,21 @@ + ltx + " under global tx " + gtx); //call commit on the remote handler - if (meth.equals(TreeCache.commitMethod)) { + if (meth.equals(TreeCache.commitMethod)) + { ltx.commit(); - } else { + } + else + { // call rollback on the remote handler ltx.rollback(); } - } finally { + } + finally + { //resume the old transaction if we suspended it - if (curr_tx != null) { + if (curr_tx != null) + { txMgr.suspend(); txMgr.resume(curr_tx); } @@ -375,7 +448,8 @@ return null; } - private Object handleCommitRollback(MethodCall m) throws Throwable { + private Object handleCommitRollback(MethodCall m) throws Throwable + { Object[] args = m.getArgs(); GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed to be // non-null @@ -389,15 +463,19 @@ Transaction tempTx = txMgr.getTransaction(); - if (ltx != null) { + if (ltx != null) + { log.debug(" received " + meth.getName() + ": local TX=" + ltx + ", global TX=" + gtx); - } else { + } + else + { throw new IllegalStateException(" found no local TX for global TX " + gtx); } - if (!ltx.equals(tempTx)) { + if (!ltx.equals(tempTx)) + { throw new IllegalStateException(" local transaction " + ltx + " transaction does not match running tx" + tempTx); } @@ -409,11 +487,13 @@ } private Transaction createNewLocalTransaction(GlobalTransaction gtx) - throws Exception { + throws Exception + { Transaction local_tx; if (txMgr == null) - throw new Exception( - " failed to create local transaction: TransactionManager is null"); + { + throw new Exception(" failed to create local transaction: TransactionManager is null"); + } txMgr.begin(); local_tx = txMgr.getTransaction(); // this is done more than one way? @@ -426,15 +506,21 @@ * * @param tx */ - protected void runCommitPhase(GlobalTransaction gtx) { + protected void runCommitPhase(GlobalTransaction gtx) + { - try { + try + { MethodCall commit_method = new MethodCall(TreeCache.commitMethod, - new Object[] { gtx }); + new Object[]{gtx}); if (log.isTraceEnabled()) + { log.trace(" running commit for " + gtx); + } handleCommitRollback(commit_method); - } catch (Throwable e) { + } + catch (Throwable e) + { log.error(" commit failed", e); } } @@ -444,23 +530,29 @@ * * @param tx */ - protected void runRollbackPhase(GlobalTransaction gtx) { + protected void runRollbackPhase(GlobalTransaction gtx) + { boolean sync_rollback_phase = cache.getSyncRollbackPhase(); // 1. Multicast rollback() to all other members (excluding myself) - try { - MethodCall rollback_method = new MethodCall( - TreeCache.rollbackMethod, new Object[] { gtx }); + try + { + MethodCall rollback_method = new MethodCall(TreeCache.rollbackMethod, new Object[]{gtx}); if (log.isTraceEnabled()) + { log.trace(" running rollback for " + gtx); + } handleCommitRollback(rollback_method); - } catch (Throwable e) { + } + catch (Throwable e) + { log.warn(" rollback had a problem ", e); } } // this controls the whole transaction - class SynchronizationHandler implements Synchronization { + class SynchronizationHandler implements Synchronization + { Transaction tx = null; GlobalTransaction gtx = null; @@ -470,15 +562,20 @@ List modifications = null; SynchronizationHandler(GlobalTransaction gtx, Transaction tx, - TreeCache cache) { + TreeCache cache + ) + { this.gtx = gtx; this.tx = tx; this.cache = cache; } - public void beforeCompletion() { - try { - if (cache.getLocalAddress() != null) { + public void beforeCompletion() + { + try + { + if (cache.getLocalAddress() != null) + { MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); } // fetch the modifications before the transaction is committed @@ -486,43 +583,52 @@ // thus removed from the tx_table) OptimisticTransactionEntry entry = (OptimisticTransactionEntry) txTable.get(gtx); if (entry == null) - throw new IllegalStateException( - "cannot find transaction entry for " + gtx); + { + throw new IllegalStateException("cannot find transaction entry for " + gtx); + } modifications = new LinkedList(entry.getModifications()); - if (modifications.size() == 0) { + if (modifications.size() == 0) + { // we don't replicate if there are return; } Map nodeVersions = null; Map temp = entry.getTransactionWorkSpace().getNodes(); - for(Iterator it = temp.entrySet().iterator();it.hasNext();){ - Map.Entry mapEntry = (Map.Entry)it.next(); + for (Iterator it = temp.entrySet().iterator(); it.hasNext();) + { + Map.Entry mapEntry = (Map.Entry) it.next(); // this should be a value - nodeVersions.put(mapEntry.getKey(),new Long(((NodeWrapper)mapEntry.getValue()).getVersion())); + Object key = mapEntry.getKey(); + Object value = mapEntry.getValue(); + long version = ((NodeWrapper) value).getVersion(); + nodeVersions.put(key, new Long(version)); } - if (nodeVersions.size() == 0){ + if (nodeVersions.size() == 0) + { //we dont replicate this return; } - try { + try + { int status = tx.getStatus(); - switch (status) { + switch (status) + { // if we are active or preparing then we can go ahead case Status.STATUS_ACTIVE: // added Feb 2 2004 (bela) case Status.STATUS_PREPARING: // do prepare Object result = null; - try { + try + { //add the node versions into the prepare method - MethodCall prepare_method = new MethodCall( - TreeCache.optimisticPrepareMethod, new Object[] { - gtx, modifications,nodeVersions, + MethodCall prepare_method = new MethodCall(TreeCache.optimisticPrepareMethod, new Object[]{ + gtx, modifications, nodeVersions, (Address) cache.getLocalAddress(), - Boolean.FALSE }); + Boolean.FALSE}); // sends to local cache - the replication // interceptor @@ -534,14 +640,16 @@ //result = cache._replicate(prepare_method); //result = // OptimisticTxInterceptor.super.invoke(prepare_method); - if (result instanceof Throwable) { + if (result instanceof Throwable) + { tx.setRollbackOnly(); throw (Throwable) result; } - } catch (Throwable t) { + } + catch (Throwable t) + { log - .warn( - "runPreparePhase() failed. Transaction is marked as rolled back", + .warn("runPreparePhase() failed. Transaction is marked as rolled back", t); tx.setRollbackOnly(); // change Bela Nov 5 2003: we need to rethrow the @@ -555,16 +663,22 @@ + " in status " + status + " unbale to start transaction"); } - } catch (Throwable t) { - try { + } + catch (Throwable t) + { + try + { tx.setRollbackOnly(); - } catch (SystemException se) { - throw new NestedRuntimeException( - "setting tx rollback failed ", se); + } + catch (SystemException se) + { + throw new NestedRuntimeException("setting tx rollback failed ", se); } throw new NestedRuntimeException("", t); } - } finally { + } + finally + { MDC.remove("MDC_LOCAL_ADDRESS"); } @@ -573,17 +687,21 @@ // this should really not be done here - // it is supposed to be post commit not actually run the commit - public void afterCompletion(int status) { - try { - if (cache.getLocalAddress() != null) { + public void afterCompletion(int status) + { + try + { + if (cache.getLocalAddress() != null) + { MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); } int cache_mode = cache.getCacheModeInternal(); - log.debug("calling aftercompletion for "+gtx); + log.debug("calling aftercompletion for " + gtx); transactions.remove(tx); - switch (status) { + switch (status) + { case Status.STATUS_COMMITTED: log.debug(" running commit phase "); @@ -597,7 +715,9 @@ // needed case Status.STATUS_ROLLEDBACK: if (log.isDebugEnabled()) + { log.debug(" running rollback phase"); + } runRollbackPhase(gtx); log.debug(" finished rollback phase"); @@ -606,7 +726,9 @@ throw new IllegalStateException("illegal status: " + status); } - } finally { + } + finally + { MDC.remove("MDC_LOCAL_ADDRESS"); // clean up the tx table txTable.remove(gtx); @@ -614,22 +736,27 @@ } } - public String toString() { + public String toString() + { return "OptimisticReplicationInterceptor:SynchronizationHandler(gtx=" + gtx + ", tx=" + tx + ")"; } } // this controls the whole transaction - class RemoteSynchronizationHandler extends SynchronizationHandler { + class RemoteSynchronizationHandler extends SynchronizationHandler + { RemoteSynchronizationHandler(GlobalTransaction gtx, Transaction tx, - TreeCache cache) { + TreeCache cache + ) + { super(gtx, tx, cache); } - public void beforeCompletion() { + public void beforeCompletion() + { //do nothing here log.debug("remote beforeCompletion called - no before completion step"); @@ -637,13 +764,15 @@ // this should really not be done here - // it is supposed to be post commit not actually run the commit - public void afterCompletion(int status) { + public void afterCompletion(int status) + { log.debug("calling afterCompletion in remote handler"); super.afterCompletion(status); log.debug("finished afterCompletion in remote handler"); } - public String toString() { + public String toString() + { return "OptimisticReplicationInterceptor:RemoteSynchronizationHandler(gtx=" + gtx + ", tx=" + tx + ")"; } |
From: Manik S. <msu...@jb...> - 2005-07-27 19:08:43
|
User: msurtani Date: 05/07/27 15:07:33 Modified: src/org/jboss/cache/interceptors OptimisticValidatorInterceptor.java Log: Fixed problems with casts and method calls in tests Revision Changes Path 1.3 +2 -7 JBossCache/src/org/jboss/cache/interceptors/OptimisticValidatorInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticValidatorInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticValidatorInterceptor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -b -r1.2 -r1.3 --- OptimisticValidatorInterceptor.java 24 Jul 2005 00:06:20 -0000 1.2 +++ OptimisticValidatorInterceptor.java 27 Jul 2005 19:07:33 -0000 1.3 @@ -16,7 +16,7 @@ * Handles putXXX() methods: if the given node doesn't exist, it will be created * (depending on the create_if_not_exists argument) * @author Bela Ban - * @version $Id: OptimisticValidatorInterceptor.java,v 1.2 2005/07/24 00:06:20 msurtani Exp $ + * @version $Id: OptimisticValidatorInterceptor.java,v 1.3 2005/07/27 19:07:33 msurtani Exp $ */ public class OptimisticValidatorInterceptor extends Interceptor { TransactionManager txMgr=null; @@ -45,12 +45,7 @@ Transaction tx=null; GlobalTransaction gtx=null; Object retval=null; - Fqn fqn=null; Method meth=m.getMethod(); - Object[] args=m.getArgs(); - - - if(txMgr != null && (tx=txMgr.getTransaction()) != null) { // ACTIVE or PREPARING |
From: Manik S. <msu...@jb...> - 2005-07-27 21:11:15
|
User: msurtani Date: 05/07/27 17:10:05 Modified: src/org/jboss/cache/interceptors OptimisticTxInterceptor.java Log: Rolled back change on GlobalTransaction.isRemote() default values and GTX Ctor Revision Changes Path 1.6 +9 -3 JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticTxInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -b -r1.5 -r1.6 --- OptimisticTxInterceptor.java 27 Jul 2005 15:19:03 -0000 1.5 +++ OptimisticTxInterceptor.java 27 Jul 2005 21:10:05 -0000 1.6 @@ -40,6 +40,12 @@ public Object invoke(MethodCall m) throws Throwable { + if (log.isDebugEnabled()) + { + log.debug("invoke() called for method [" + m.getMethod().getName() + "] on target cache object " + cache); + log.debug("local address is " + cache.getLocalAddress()); + } + GlobalTransaction gtx = null; Method meth = m.getMethod(); Object result = null; @@ -55,10 +61,10 @@ // remote prepare/commit/rollback if (meth.equals(TreeCache.prepareMethod) || meth.equals(TreeCache.optimisticPrepareMethod)) { -// assume that a global tx is present in such a case. + // assume that a global tx is present in such a case. Object[] args = m.getArgs(); gtx = (GlobalTransaction) args[0]; - + if (log.isDebugEnabled()) log.debug("Got gtx " + gtx); if (gtx != null && (gtx.getAddress() != null) && (!gtx.getAddress().equals(cache.getLocalAddress()))) { @@ -68,7 +74,7 @@ } else { - throw new CacheException("prepare cannot be called directly for local method"); + throw new CacheException("prepare/optimisticPrepare cannot be called directly for local method"); } } |
From: Bela B. <bel...@jb...> - 2005-08-23 14:53:11
|
User: bela Date: 05/08/23 10:53:09 Modified: src/org/jboss/cache/interceptors ReplicationInterceptor.java Log: no message Revision Changes Path 1.5 +3 -4 JBossCache/src/org/jboss/cache/interceptors/ReplicationInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: ReplicationInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/ReplicationInterceptor.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -b -r1.4 -r1.5 --- ReplicationInterceptor.java 10 Jun 2005 08:53:10 -0000 1.4 +++ ReplicationInterceptor.java 23 Aug 2005 14:53:09 -0000 1.5 @@ -1,5 +1,6 @@ package org.jboss.cache.interceptors; +import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap; import org.jboss.cache.*; import org.jboss.util.NestedRuntimeException; import org.jgroups.Address; @@ -12,13 +13,11 @@ import java.lang.reflect.Method; import java.util.*; -import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap; - /** * Takes care of replicating modifications to other nodes in a cluster. Also listens for prepare(), * commit() and rollback() messages which are received 'side-ways' (see docs/design/Refactoring.txt). * @author Bela Ban - * @version $Id: ReplicationInterceptor.java,v 1.4 2005/06/10 08:53:10 bela Exp $ + * @version $Id: ReplicationInterceptor.java,v 1.5 2005/08/23 14:53:09 bela Exp $ */ public class ReplicationInterceptor extends Interceptor implements Replicatable { TransactionManager tx_mgr=null; @@ -143,7 +142,7 @@ for(Iterator it=rsps.iterator(); it.hasNext();) { rsp=it.next(); if(rsp != null && rsp instanceof Throwable) - throw (Exception)rsp; + throw (Throwable)rsp; } } } |
From: Manik S. <msu...@jb...> - 2005-08-26 10:32:28
|
User: msurtani Date: 05/08/26 06:32:08 Modified: src/org/jboss/cache/interceptors OptimisticValidatorInterceptor.java Log: - Only increment version info and update node in the tree if the node (or any of its children) are marked as dirty. (WorkspaceNode.isDeepDirty() convenience method) - updated test accordingly Revision Changes Path 1.7 +23 -15 JBossCache/src/org/jboss/cache/interceptors/OptimisticValidatorInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticValidatorInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticValidatorInterceptor.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -b -r1.6 -r1.7 --- OptimisticValidatorInterceptor.java 10 Aug 2005 17:34:58 -0000 1.6 +++ OptimisticValidatorInterceptor.java 26 Aug 2005 10:32:08 -0000 1.7 @@ -25,7 +25,7 @@ * * @author <a href="mailto:st...@st...">Steve Woodcock (st...@st...)</a> * @author <a href="mailto:ma...@jb...">Manik Surtani (ma...@jb...)</a> - * @version $Id: OptimisticValidatorInterceptor.java,v 1.6 2005/08/10 17:34:58 msurtani Exp $ + * @version $Id: OptimisticValidatorInterceptor.java,v 1.7 2005/08/26 10:32:08 msurtani Exp $ */ public class OptimisticValidatorInterceptor extends Interceptor { @@ -162,6 +162,9 @@ { WorkspaceNode wrappedNode = (WorkspaceNode) it.next(); + if (wrappedNode.isDeepDirty()) + { + OptimisticTreeNode current = (OptimisticTreeNode) wrappedNode.getNode(); Map mergedChildren = wrappedNode.getMergedChildren(); @@ -183,6 +186,11 @@ current.setVersion((current.getVersion() + 1)); log.debug("committed changes for " + current.getName()); } + else + { + if (log.isInfoEnabled()) log.info("Merging not necessary since the nodes in the workspace under " + wrappedNode.getName() + " are not dirty"); + } + } } |
From: Manik S. <msu...@jb...> - 2005-08-30 12:57:06
|
User: msurtani Date: 05/08/30 08:57:02 Removed: src/org/jboss/cache/interceptors OptimisticLockInterceptor.java Log: removed unnecessary interceptor |
From: Manik S. <msu...@jb...> - 2005-08-30 14:51:47
|
User: msurtani Date: 05/08/30 10:51:41 Modified: src/org/jboss/cache/interceptors CacheLoaderInterceptor.java Log: - refactored optimistic interceptor chain creation - bypassed _lock call in case of opt locking Revision Changes Path 1.10 +4 -1 JBossCache/src/org/jboss/cache/interceptors/CacheLoaderInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: CacheLoaderInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/CacheLoaderInterceptor.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -b -r1.9 -r1.10 --- CacheLoaderInterceptor.java 26 Aug 2005 14:13:43 -0000 1.9 +++ CacheLoaderInterceptor.java 30 Aug 2005 14:51:41 -0000 1.10 @@ -12,7 +12,7 @@ /** * Loads nodes that don't exist at the time of the call into memory from the CacheLoader * @author Bela Ban - * @version $Id: CacheLoaderInterceptor.java,v 1.9 2005/08/26 14:13:43 msurtani Exp $ + * @version $Id: CacheLoaderInterceptor.java,v 1.10 2005/08/30 14:51:41 msurtani Exp $ */ public class CacheLoaderInterceptor extends Interceptor { protected CacheLoader loader=null; @@ -119,6 +119,9 @@ } protected void lock(Fqn fqn, int lock_type, boolean recursive) throws Throwable { + + if (cache.isNodeLockingOptimistic()) return; + MethodCall meth=new MethodCall(TreeCache.lockMethodLocal, new Object[]{fqn, new Integer(lock_type), |
From: Manik S. <msu...@jb...> - 2005-08-31 10:56:30
|
User: msurtani Date: 05/08/31 06:56:22 Modified: src/org/jboss/cache/interceptors OptimisticLockingInterceptor.java Log: Added a trip wire for calls to TreeCache._lock() Revision Changes Path 1.7 +7 -0 JBossCache/src/org/jboss/cache/interceptors/OptimisticLockingInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticLockingInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticLockingInterceptor.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -b -r1.6 -r1.7 --- OptimisticLockingInterceptor.java 26 Aug 2005 13:32:10 -0000 1.6 +++ OptimisticLockingInterceptor.java 31 Aug 2005 10:56:22 -0000 1.7 @@ -48,6 +48,13 @@ Object retval = null; Method meth = m.getMethod(); + // bail out if _lock() is being called on the tree cache... this should never be called with o/l enabled. + if (meth.equals(TreeCache.lockMethodLocal)) + { + log.warn("OptimisticLockingInterceptor intercepted a call to TreeCache._lock(). This should NEVER be called if optimistic locking is used!! Not allowing this call to proceed further down the chain."); + return retval; + } + if (txMgr != null && (tx = txMgr.getTransaction()) != null) { |
From: Bela B. <bel...@jb...> - 2005-09-05 14:28:47
|
User: bela Date: 05/09/05 10:28:44 Modified: src/org/jboss/cache/interceptors PessimisticLockInterceptor.java Log: fixed problem with leftover locks caused by callbacks (http://jira.jboss.com/jira/browse/JBCACHE-280) Revision Changes Path 1.6 +19 -7 JBossCache/src/org/jboss/cache/interceptors/PessimisticLockInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: PessimisticLockInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/PessimisticLockInterceptor.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -b -r1.5 -r1.6 --- PessimisticLockInterceptor.java 26 Aug 2005 14:13:43 -0000 1.5 +++ PessimisticLockInterceptor.java 5 Sep 2005 14:28:44 -0000 1.6 @@ -26,7 +26,7 @@ * scope of the TX. When no TX is present, we keep track of the locks acquired during the current method and unlock * when the method returns * @author Bela Ban - * @version $Id: PessimisticLockInterceptor.java,v 1.5 2005/08/26 14:13:43 msurtani Exp $ + * @version $Id: PessimisticLockInterceptor.java,v 1.6 2005/09/05 14:28:44 bela Exp $ */ public class PessimisticLockInterceptor extends AbstractLockInterceptor { private TransactionManager tx_mgr=null; @@ -63,7 +63,7 @@ /** List<IdentityLock> locks. Locks acquired during the current method; will be released later by UnlockInterceptor. * This list is only populated when there is no TX, otherwise the TransactionTable maintains the locks * (keyed by TX) */ - List locks=null; + // List locks=null; boolean recursive=false; boolean createIfNotExists=false; @@ -89,11 +89,11 @@ } else { // no TX // we don't need synchronization on lock_table because the same thread won't enter concurrently - locks=(List)lock_table.get(Thread.currentThread()); + /*locks=(List)lock_table.get(Thread.currentThread()); if(locks == null) { locks=new LinkedList(); lock_table.put(Thread.currentThread(), locks); - } + }*/ } // 1. Determine the type of lock (read, write, or none) depending on the method. If no lock is required, invoke @@ -155,13 +155,13 @@ if(fqn != null) { if(createIfNotExists) { do { - lock(fqn, gtx, lock_type, locks, recursive, lock_timeout, createIfNotExists); + lock(fqn, gtx, lock_type, recursive, lock_timeout, createIfNotExists); } while(cache.exists(fqn) == false); // keep trying until we have the lock (fixes concurrent remove()) // terminates successfully, or with (Timeout)Exception } else - lock(fqn, gtx, lock_type, locks, recursive, lock_timeout, createIfNotExists); + lock(fqn, gtx, lock_type, recursive, lock_timeout, createIfNotExists); } else { if(log.isTraceEnabled()) @@ -183,7 +183,7 @@ * @param locks A List<Lock> of locks held, each new node locked is added * @param recursive Lock children recursively */ - private void lock(Fqn fqn, GlobalTransaction gtx, int lock_type, List locks, boolean recursive, + private void lock(Fqn fqn, GlobalTransaction gtx, int lock_type, boolean recursive, long lock_timeout, boolean createIfNotExists) throws TimeoutException, LockingException, InterruptedException { DataNode n, child_node=null; @@ -192,6 +192,7 @@ boolean acquired=false; IsolationLevel isolation_level; + if(fqn == null) { log.error("fqn is null - this should not be the case"); return; @@ -227,6 +228,7 @@ } } + if(acquired) { if(gtx != null) { // add the lock to the list of locks maintained for this transaction @@ -235,6 +237,11 @@ } else { IdentityLock l=child_node.getLock(); + List locks=(List)lock_table.get(Thread.currentThread()); + if(locks == null) { + locks=new LinkedList(); + lock_table.put(Thread.currentThread(), locks); + } if(!locks.contains(l)) locks.add(l); } @@ -247,6 +254,11 @@ cache.getTransactionTable().addLocks(gtx, acquired_locks); } else { + List locks=(List)lock_table.get(Thread.currentThread()); + if(locks == null) { + locks=new LinkedList(); + lock_table.put(Thread.currentThread(), locks); + } locks.addAll(acquired_locks); } } |
From: Manik S. <msu...@jb...> - 2005-09-07 11:42:45
|
User: msurtani Date: 05/09/07 07:42:41 Modified: src/org/jboss/cache/interceptors OptimisticTxInterceptor.java Log: Removed sysout; replaced with log msg Revision Changes Path 1.12 +1 -1 JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticTxInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -b -r1.11 -r1.12 --- OptimisticTxInterceptor.java 26 Aug 2005 13:32:10 -0000 1.11 +++ OptimisticTxInterceptor.java 7 Sep 2005 11:42:41 -0000 1.12 @@ -378,7 +378,7 @@ // create a new transaction entry entry = new OptimisticTransactionEntry(); entry.setTransaction(ltx); - System.out.println("PUTTING optimistic tx entry " + entry.getClass()); + if (log.isDebugEnabled()) log.debug("PUTTING optimistic tx entry " + entry.getClass()); txTable.put(gtx, entry); } //create a synch handler for the remote gtx |
From: Brian S. <bri...@wa...> - 2005-10-04 04:48:02
|
User: bstansberry Date: 05/10/04 00:47:50 Modified: src/org/jboss/cache/interceptors Tag: JBossCache_1_2_4 ReplicationInterceptor.java Log: Fix JBCACHE-298 and JBCACHE-308. Revision Changes Path No revision No revision 1.5.2.1 +8 -3 JBossCache/src/org/jboss/cache/interceptors/ReplicationInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: ReplicationInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/ReplicationInterceptor.java,v retrieving revision 1.5 retrieving revision 1.5.2.1 diff -u -b -r1.5 -r1.5.2.1 --- ReplicationInterceptor.java 23 Aug 2005 14:53:09 -0000 1.5 +++ ReplicationInterceptor.java 4 Oct 2005 04:47:50 -0000 1.5.2.1 @@ -17,13 +17,13 @@ * Takes care of replicating modifications to other nodes in a cluster. Also listens for prepare(), * commit() and rollback() messages which are received 'side-ways' (see docs/design/Refactoring.txt). * @author Bela Ban - * @version $Id: ReplicationInterceptor.java,v 1.5 2005/08/23 14:53:09 bela Exp $ + * @version $Id: ReplicationInterceptor.java,v 1.5.2.1 2005/10/04 04:47:50 bstansberry Exp $ */ public class ReplicationInterceptor extends Interceptor implements Replicatable { TransactionManager tx_mgr=null; TransactionTable tx_table=null; - /** List<Transaction> that we have registered for */ + /** Map<Transaction, NULL> that we have registered for */ private ConcurrentHashMap transactions=new ConcurrentHashMap(16); final static Object NULL=new Object(); @@ -65,7 +65,7 @@ if(gtx == null) throw new Exception("failed to get global transaction"); - if(remote_transactions.contains(gtx)) { + if(remote_transactions.contains(gtx)) { // can happen if cache listener calls back into the cache if(log.isTraceEnabled()) log.trace("ReplicationInterceptor: won't register for TX completion as " + "GlobalTransaction is result of a PREPARE"); @@ -205,6 +205,8 @@ ltx.rollback(); else ltx.commit(); + + transactions.remove(ltx); // JBAS-298 remote_transactions.remove(gtx); } finally { @@ -321,6 +323,9 @@ ltx.commit(); else ltx.rollback(); + + transactions.remove(ltx); // JBAS-298 + remote_transactions.remove(gtx); // JBAS-308 } } } |
From: Brian S. <bri...@wa...> - 2005-10-04 04:49:49
|
User: bstansberry Date: 05/10/04 00:49:43 Modified: src/org/jboss/cache/interceptors ReplicationInterceptor.java Log: Fix for JBCACHE-298 and JBCACHE-308. Revision Changes Path 1.6 +8 -3 JBossCache/src/org/jboss/cache/interceptors/ReplicationInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: ReplicationInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/ReplicationInterceptor.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -b -r1.5 -r1.6 --- ReplicationInterceptor.java 23 Aug 2005 14:53:09 -0000 1.5 +++ ReplicationInterceptor.java 4 Oct 2005 04:49:43 -0000 1.6 @@ -17,13 +17,13 @@ * Takes care of replicating modifications to other nodes in a cluster. Also listens for prepare(), * commit() and rollback() messages which are received 'side-ways' (see docs/design/Refactoring.txt). * @author Bela Ban - * @version $Id: ReplicationInterceptor.java,v 1.5 2005/08/23 14:53:09 bela Exp $ + * @version $Id: ReplicationInterceptor.java,v 1.6 2005/10/04 04:49:43 bstansberry Exp $ */ public class ReplicationInterceptor extends Interceptor implements Replicatable { TransactionManager tx_mgr=null; TransactionTable tx_table=null; - /** List<Transaction> that we have registered for */ + /** Map<Transaction, NULL> that we have registered for */ private ConcurrentHashMap transactions=new ConcurrentHashMap(16); final static Object NULL=new Object(); @@ -65,7 +65,7 @@ if(gtx == null) throw new Exception("failed to get global transaction"); - if(remote_transactions.contains(gtx)) { + if(remote_transactions.contains(gtx)) { // can happen if cache listener calls back into the cache if(log.isTraceEnabled()) log.trace("ReplicationInterceptor: won't register for TX completion as " + "GlobalTransaction is result of a PREPARE"); @@ -205,6 +205,8 @@ ltx.rollback(); else ltx.commit(); + + transactions.remove(ltx); // JBAS-298 remote_transactions.remove(gtx); } finally { @@ -321,6 +323,9 @@ ltx.commit(); else ltx.rollback(); + + transactions.remove(ltx); // JBAS-298 + remote_transactions.remove(gtx); // JBAS-308 } } } |
From: Manik S. <msu...@jb...> - 2005-10-05 15:28:08
|
User: msurtani Date: 05/10/05 11:27:58 Modified: src/org/jboss/cache/interceptors OptimisticReplicationInterceptor.java Log: implemented missing async features when replicating Revision Changes Path 1.11 +31 -36 JBossCache/src/org/jboss/cache/interceptors/OptimisticReplicationInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticReplicationInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticReplicationInterceptor.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -b -r1.10 -r1.11 --- OptimisticReplicationInterceptor.java 20 Sep 2005 15:18:41 -0000 1.10 +++ OptimisticReplicationInterceptor.java 5 Oct 2005 15:27:58 -0000 1.11 @@ -232,10 +232,11 @@ protected Object broadcastPrepare(MethodCall methodCall) throws Exception { + boolean remoteCallSync = cache.getCacheModeInternal() == TreeCache.REPL_SYNC; + Object[] args = methodCall.getArgs(); GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed List modifications = (List) args[1]; - List rsps; int num_mods = modifications != null ? modifications.size() : 0; // this method will return immediately if we're the only member (because @@ -249,19 +250,8 @@ if (log.isDebugEnabled()) log.debug("(" + cache.getLocalAddress() + "): broadcasting prepare for " + gtx + " (" + num_mods + " modifications"); - rsps = cache.callRemoteMethods(cache.getMembers(), - TreeCache.replicateMethod, new Object[]{methodCall}, - true, // sync or async call ? - true, // exclude self - cache.getSyncReplTimeout()); - //do this as JGroups dispatcher swallows exception and returns null (is this ok)- - // this should be a runtime exception at least - if (rsps == null) - { - throw new CacheException("Null responses received from message broadcasts"); - } - checkResponses(rsps); // throws an exception if one of the rsps is - // an exception + + replicateCall(methodCall, remoteCallSync); } else { @@ -275,8 +265,7 @@ protected void broadcastCommit(MethodCall methodCall) throws Exception { - - List rsps = null; + boolean remoteCallSync = cache.getSyncCommitPhase(); Object[] args = methodCall.getArgs(); GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed @@ -292,20 +281,13 @@ log.debug("running remote commit for " + gtx + " and coord=" + cache.getLocalAddress()); - - rsps = cache.callRemoteMethods(cache.getMembers(), - TreeCache.replicateMethod, new Object[]{commit_method}, - true, // this is async by default, can be - // changed in TreeCache - true, // exclude self - cache.getSyncReplTimeout()); + replicateCall(commit_method, remoteCallSync); } - catch (Throwable e) + catch (Exception e) { log.fatal("commit failed", e); + throw e; } - checkResponses(rsps); // throws an exception if one of the rsps is - // an exception } else { @@ -315,8 +297,7 @@ protected void broadcastRollback(MethodCall methodCall) throws Exception { - - List rsps = null; + boolean remoteCallSync = cache.getSyncRollbackPhase(); Object[] args = methodCall.getArgs(); GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed @@ -330,19 +311,33 @@ log.debug("running remote rollback for " + gtx + " and coord=" + cache.getLocalAddress()); - rsps = cache.callRemoteMethods(cache.getMembers(), - TreeCache.replicateMethod, - new Object[]{rollback_method}, true, - true, // exclude self - cache.getSyncReplTimeout()); + replicateCall( rollback_method, remoteCallSync ); } - catch (Throwable e) + catch (Exception e) { log.error("rollback failed", e); + throw e; } - checkResponses(rsps); - // throws an exception if one of the rsps is } } + + protected void replicateCall(MethodCall call, boolean sync) throws Exception + { + if (!sync && cache.getUseReplQueue() && cache.getReplQueue() != null) + { + cache.getReplQueue().add(new MethodCall(TreeCache.replicateMethod, new Object[]{call})); + } + else + { + List rsps = cache.callRemoteMethods(cache.getMembers(), + TreeCache.replicateMethod, + new Object[]{call}, + sync, // is sunchronised? + true, // ignore self? + cache.getSyncReplTimeout()); + if (sync) checkResponses( rsps ); + } + + } } \ No newline at end of file |
From: Brian S. <bri...@wa...> - 2005-10-06 23:23:38
|
User: bstansberry Date: 05/10/06 19:23:36 Modified: src/org/jboss/cache/interceptors Tag: JBossCache_1_2_4 OptimisticTxInterceptor.java Log: JBCACHE-323. Comment out the use of the log4j MDC class. Revision Changes Path No revision No revision 1.14.2.1 +26 -26 JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticTxInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java,v retrieving revision 1.14 retrieving revision 1.14.2.1 diff -u -b -r1.14 -r1.14.2.1 --- OptimisticTxInterceptor.java 9 Sep 2005 14:02:13 -0000 1.14 +++ OptimisticTxInterceptor.java 6 Oct 2005 23:23:36 -0000 1.14.2.1 @@ -7,7 +7,7 @@ package org.jboss.cache.interceptors; import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap; -import org.apache.log4j.MDC; +//import org.apache.log4j.MDC; import org.jboss.cache.*; import org.jboss.cache.optimistic.WorkspaceNode; import org.jboss.util.NestedRuntimeException; @@ -52,10 +52,10 @@ try { - if (cache.getLocalAddress() != null) - { - MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); - } +// if (cache.getLocalAddress() != null) +// { +// MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); +// } // first of all deal with tx methods - these are only going to be // remote prepare/commit/rollback @@ -112,10 +112,10 @@ log.info("There was a problem handling this request", e); throw e; } - finally - { - MDC.remove("MDC_LOCAL_ADDRESS"); - } +// finally +// { +// MDC.remove("MDC_LOCAL_ADDRESS"); +// } } @@ -560,12 +560,12 @@ public void beforeCompletion() { - try - { - if (cache.getLocalAddress() != null) - { - MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); - } +// try +// { +// if (cache.getLocalAddress() != null) +// { +// MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); +// } // fetch the modifications before the transaction is committed // (and // thus removed from the txTable) @@ -664,12 +664,12 @@ } throw new NestedRuntimeException("", t); } - } - finally - { - - MDC.remove("MDC_LOCAL_ADDRESS"); - } +// } +// finally +// { +// +// MDC.remove("MDC_LOCAL_ADDRESS"); +// } } @@ -679,10 +679,10 @@ { try { - if (cache.getLocalAddress() != null) - { - MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); - } +// if (cache.getLocalAddress() != null) +// { +// MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); +// } int cache_mode = cache.getCacheModeInternal(); log.debug("calling aftercompletion for " + gtx); @@ -717,7 +717,7 @@ } finally { - MDC.remove("MDC_LOCAL_ADDRESS"); +// MDC.remove("MDC_LOCAL_ADDRESS"); // clean up the tx table txTable.remove(gtx); txTable.remove(tx); |
From: Brian S. <bri...@wa...> - 2005-10-06 23:28:01
|
User: bstansberry Date: 05/10/06 19:27:57 Modified: src/org/jboss/cache/interceptors OptimisticTxInterceptor.java Log: JBCACHE-323. Comment out use of the log4j MDC class. Revision Changes Path 1.16 +26 -26 JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticTxInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -b -r1.15 -r1.16 --- OptimisticTxInterceptor.java 20 Sep 2005 15:18:41 -0000 1.15 +++ OptimisticTxInterceptor.java 6 Oct 2005 23:27:57 -0000 1.16 @@ -7,7 +7,7 @@ package org.jboss.cache.interceptors; import EDU.oswego.cs.dl.util.concurrent.ConcurrentHashMap; -import org.apache.log4j.MDC; +//import org.apache.log4j.MDC; import org.jboss.cache.*; import org.jboss.util.NestedRuntimeException; import org.jgroups.Address; @@ -55,10 +55,10 @@ try { - if (cache.getLocalAddress() != null) - { - MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); - } +// if (cache.getLocalAddress() != null) +// { +// MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); +// } // first of all deal with tx methods - these are only going to be // remote prepare/commit/rollback @@ -115,10 +115,10 @@ log.info("There was a problem handling this request", e); throw e; } - finally - { - MDC.remove("MDC_LOCAL_ADDRESS"); - } +// finally +// { +// MDC.remove("MDC_LOCAL_ADDRESS"); +// } } @@ -557,12 +557,12 @@ public void beforeCompletion() { - try - { - if (cache.getLocalAddress() != null) - { - MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); - } +// try +// { +// if (cache.getLocalAddress() != null) +// { +// MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); +// } // fetch the modifications before the transaction is committed // (and // thus removed from the txTable) @@ -639,12 +639,12 @@ } throw new NestedRuntimeException("", t); } - } - finally - { - - MDC.remove("MDC_LOCAL_ADDRESS"); - } +// } +// finally +// { +// +// MDC.remove("MDC_LOCAL_ADDRESS"); +// } } // this should really not be done here - @@ -653,10 +653,10 @@ { try { - if (cache.getLocalAddress() != null) - { - MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); - } +// if (cache.getLocalAddress() != null) +// { +// MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); +// } log.debug("calling aftercompletion for " + gtx); transactions.remove(tx); @@ -690,7 +690,7 @@ } finally { - MDC.remove("MDC_LOCAL_ADDRESS"); +// MDC.remove("MDC_LOCAL_ADDRESS"); // clean up the tx table txTable.remove(gtx); txTable.remove(tx); |
From: Manik S. <msu...@jb...> - 2005-10-15 09:48:10
|
User: msurtani Date: 05/10/15 05:48:07 Modified: src/org/jboss/cache/interceptors OptimisticCreateIfNotExistsInterceptor.java Log: Fixed bug with concurrent access on multi-cpu machines Revision Changes Path 1.12 +28 -33 JBossCache/src/org/jboss/cache/interceptors/OptimisticCreateIfNotExistsInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticCreateIfNotExistsInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticCreateIfNotExistsInterceptor.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -b -r1.11 -r1.12 --- OptimisticCreateIfNotExistsInterceptor.java 13 Oct 2005 14:57:14 -0000 1.11 +++ OptimisticCreateIfNotExistsInterceptor.java 15 Oct 2005 09:48:07 -0000 1.12 @@ -115,6 +115,8 @@ // try and get the root from the transaction TransactionWorkspace workspace = transactionEntry.getTransactionWorkSpace(); + synchronized( workspace ) + { if (log.isDebugEnabled()) log.debug(" Getting root fqn from workspace for gtx " + gtx); workspaceNode = workspace.getNode(cache.getRoot().getFqn()); @@ -146,14 +148,6 @@ log.debug(" Entering synchronized nodewrapper access for gtx " + gtx); Node tempchildNode = workspaceNode.getChild(childName); -// Node tempchildNode = cache._get(new Fqn(workspaceNode.getFqn(), childName)); - // Lock on the WorkspaceNode to prevent overwriting. The lock is local to the transaction and WorkspaceNode - // only an issue if we have multiple threads in the same transaction - - // root access in the transaction is a bit of a bottle neck - // but the contention inside a tx should not really be that high - synchronized (workspaceNode) - { if (log.isDebugEnabled()) log.debug(" Entered synchronized workspaceNode " + workspaceNode + " access for gtx " + gtx); // no child exists with this name @@ -205,8 +199,9 @@ } workspaceNode = childWorkspaceNode; } + if (log.isDebugEnabled()) log.debug("left synchronized nodewrapper access for gtx " + gtx); - } + } // end sync block // run the notify outside the synch block as we do not know what that // code might do if (nodesCreated.size() > 0) |
From: Manik S. <msu...@jb...> - 2005-10-19 11:22:12
|
User: msurtani Date: 05/10/19 07:22:09 Modified: src/org/jboss/cache/interceptors OptimisticValidatorInterceptor.java Log: Testing node mods using isDirty() rather than isDeepDirty() Revision Changes Path 1.15 +36 -22 JBossCache/src/org/jboss/cache/interceptors/OptimisticValidatorInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticValidatorInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticValidatorInterceptor.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -b -r1.14 -r1.15 --- OptimisticValidatorInterceptor.java 13 Oct 2005 14:57:14 -0000 1.14 +++ OptimisticValidatorInterceptor.java 19 Oct 2005 11:22:09 -0000 1.15 @@ -146,7 +146,7 @@ if (!wrappedNode.isCreated() && realNode.getVersion() >= wrappedNode.getVersion()) { // we have an out of date node here - log.info("DataNode " + wrappedNode.getNode() + " version number (" + ((OptimisticTreeNode)wrappedNode.getNode()).getVersion() + ") is greater than or equal to workspace node version " + wrappedNode.getVersion()); + log.info("DataNode [" + wrappedNode.getNode().getFqn() + "] version number (" + ((OptimisticTreeNode)wrappedNode.getNode()).getVersion() + ") is greater than or equal to workspace node version " + wrappedNode.getVersion()); return false; } } @@ -188,10 +188,22 @@ { if (log.isTraceEnabled()) log.trace("Workspace node " + wrappedNode.getFqn() + " is deleted; removing from tree cache"); DataNode dNode = wrappedNode.getNode(); + if (dNode.getFqn().isRoot()) + { + log.warn("Attempting to delete the root node - this cannot be done!"); + } + else + { DataNode parent = (DataNode) dNode.getParent(); parent.removeChild( dNode.getName() ); } - else if (wrappedNode.isDeepDirty()) + } +// else if (wrappedNode.isDeepDirty()) + else + { + // "Will somebody please think of the children!!" + //if (wrappedNode.hasCreatedOrRemovedChildren() handleChildNodes(wrappedNode); + if (wrappedNode.isDirty()) { current = (OptimisticTreeNode) wrappedNode.getNode(); Map mergedChildren = wrappedNode.getMergedChildren(); @@ -206,6 +218,7 @@ current.getChildren().clear(); current.getChildren().putAll(mergedChildren); } + // TODO: MANIK: At the moment even parent nodes are marked as dirty when a child is created, so that child maps can be updated. This mergng needs to be more subtle - why update the parent's version whena child node is added?!? See WorkspaceNodeImpl.remove(child) and WorkspaceNodeImpl.createChild() if (log.isTraceEnabled())log.trace("inserting merged data " + wrappedNode.getMergedData()); Map mergedData = wrappedNode.getMergedData(); @@ -216,7 +229,8 @@ } else { - if (log.isDebugEnabled()) log.debug("Merging not necessary since the nodes in the workspace under " + wrappedNode.getName() + " are not dirty"); + if (log.isDebugEnabled()) log.debug("Merging node " + wrappedNode.getFqn() + " not necessary since the node is not dirty"); + } } } |
From: Manik S. <msu...@jb...> - 2005-10-20 14:44:57
|
User: msurtani Date: 05/10/20 10:44:50 Modified: src/org/jboss/cache/interceptors OptimisticTxInterceptor.java Log: Cleaned up comments, debug msgs Revision Changes Path 1.19 +8 -36 JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: OptimisticTxInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/OptimisticTxInterceptor.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -b -r1.18 -r1.19 --- OptimisticTxInterceptor.java 20 Oct 2005 13:57:55 -0000 1.18 +++ OptimisticTxInterceptor.java 20 Oct 2005 14:44:50 -0000 1.19 @@ -32,7 +32,6 @@ /** * List <Transaction>that we have registered for */ - //private List transactions = Collections.synchronizedList(new ArrayList()); private Map transactions = new ConcurrentHashMap(); public void setCache(TreeCache cache) @@ -54,11 +53,6 @@ try { -// if (cache.getLocalAddress() != null) -// { -// MDC.put("MDC_LOCAL_ADDRESS", cache.getLocalAddress()); -// } - // first of all deal with tx methods - these are only going to be // remote prepare/commit/rollback if (meth.equals(TreeCache.optimisticPrepareMethod)) @@ -114,10 +108,6 @@ log.info("There was a problem handling this request", e); throw e; } -// finally -// { -// MDC.remove("MDC_LOCAL_ADDRESS"); -// } } @@ -146,7 +136,6 @@ { if (!transactions.containsKey(tx)) { - // GlobalTransaction gtx=txTable.get(tx); // this will create a gtx if one does not exist log .debug("registering handler for TX completion: SynchronizationHandler(" @@ -165,9 +154,7 @@ .trace("registering for TX completion: SynchronizationHandler(" + handler + ")"); } - orderedHandler.registerAtHead(handler); // needs to be invoked first - // on - // TX commit + orderedHandler.registerAtHead(handler); // needs to be invoked first on TX commit transactions.put(tx, tx); return gtx; } @@ -198,16 +185,6 @@ tx = txManager.getTransaction(); GlobalTransaction gtx = registerTransaction(tx); - - // why is this TX not put in the TX table?? - Manik - // lets try a hack here... - /* - OptimisticTransactionEntry ote = new OptimisticTransactionEntry( ); - ote.setTransaction( tx ); - txTable.put(gtx, ote); - txTable.put(tx, gtx);*/ - // end hack - m = replaceGtx(m, gtx); result = super.invoke(m); log.debug(" commiting transaction for thread " @@ -244,8 +221,7 @@ private Object handleLocalPrepare(MethodCall m) throws Throwable { Object[] args = m.getArgs(); - GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed to be - // non null + GlobalTransaction gtx = (GlobalTransaction) args[0]; // guaranteed to be non null Transaction ltx = null; Object result = null; @@ -321,16 +297,13 @@ { if (ltx == null) { - ltx = createNewLocalTransaction(gtx); // creates new LTX and - // associates it with - // GTX - - log - .debug("(" - + cache.getLocalAddress() - + "): started new local TX as result of remote PREPARE: local TX=" + ltx = createNewLocalTransaction(gtx); // creates new LTX and associates it with a GTX + if (log.isDebugEnabled()) + { + log.debug("(" + cache.getLocalAddress() + "): started new local TX as result of remote PREPARE: local TX=" + ltx + ", global TX=" + gtx); } + } else { //this should be valid @@ -377,7 +350,7 @@ { txManager.resume(curr_tx); } - log.debug(" finished remote prepare " + gtx); + if (log.isDebugEnabled()) log.debug(" finished remote prepare " + gtx); } return retval; } @@ -599,7 +572,6 @@ result = handleLocalPrepare(prepare_method); //result = cache._replicate(prepare_method); //result = - // OptimisticTxInterceptor.super.invoke(prepare_method); if (result instanceof Throwable) { tx.setRollbackOnly(); |
From: Manik S. <msu...@jb...> - 2005-10-27 17:47:36
|
User: msurtani Date: 05/10/27 13:47:28 Modified: src/org/jboss/cache/interceptors InvalidationInterceptor.java Log: Invalidation messages are now broadcast in the prepare() phase, and if this fails (and mode is INVALIDATION_SYNC), an exception is thrown and the tx is rolled back. Revision Changes Path 1.3 +46 -19 JBossCache/src/org/jboss/cache/interceptors/InvalidationInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: InvalidationInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/InvalidationInterceptor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -b -r1.2 -r1.3 --- InvalidationInterceptor.java 25 Oct 2005 10:07:35 -0000 1.2 +++ InvalidationInterceptor.java 27 Oct 2005 17:47:28 -0000 1.3 @@ -6,15 +6,14 @@ */ package org.jboss.cache.interceptors; -import org.jboss.cache.TreeCache; -import org.jboss.cache.Fqn; -import org.jboss.cache.GlobalTransaction; -import org.jboss.cache.TransactionEntry; +import org.jboss.cache.*; +import org.jboss.util.NestedRuntimeException; import org.jgroups.blocks.MethodCall; -import javax.transaction.Transaction; -import javax.transaction.Synchronization; import javax.transaction.Status; +import javax.transaction.Synchronization; +import javax.transaction.SystemException; +import javax.transaction.Transaction; import java.lang.reflect.Method; import java.util.*; @@ -96,22 +95,15 @@ replicateCall(call, synchronous); } - protected void invalidateModifications(List modifications) + protected void invalidateModifications(List modifications) throws Throwable { // optimise the calls list here. Iterator modifiedFqns = optimisedIterator(modifications); while (modifiedFqns.hasNext()) { Fqn fqn = (Fqn) modifiedFqns.next(); - try - { invalidateAcrossCluster(fqn); } - catch (Throwable throwable) - { - log.error("Unable to perform a remote invalidate on Fqn " + fqn, throwable); - } - } } protected Fqn findFqn(Object[] objects) @@ -145,7 +137,6 @@ { private GlobalTransaction gtx; private Transaction tx; - private List modifications; public InvalidationSynchronisationHandler(GlobalTransaction gtx, Transaction tx) { @@ -155,20 +146,54 @@ public void beforeCompletion() { + log.debug("Entering InvalidationSynchronisationHandler.beforeCompletion()"); // fetch the modifications before the transaction is committed (and thus removed from the txTable) TransactionEntry entry = txTable.get(gtx); if (entry == null) throw new IllegalStateException("cannot find transaction entry for " + gtx); - modifications = new LinkedList(entry.getModifications()); + List modifications = new LinkedList(entry.getModifications()); + + if (modifications.size() > 0) + { + try + { + switch (tx.getStatus()) + { + + // if we are active or preparing then we can go ahead + case Status.STATUS_ACTIVE: + case Status.STATUS_PREPARING: + invalidateModifications(modifications); + break; + default: + throw new CacheException("transaction " + tx + " in status " + tx.getStatus() + " unable to start transaction"); + } + } + catch (Throwable t) + { + log.warn("Unable to broadcast evicts as a part of the prepare phase. Rolling back.", t); + try + { + tx.setRollbackOnly(); + } + catch (SystemException se) + { + throw new NestedRuntimeException("setting tx rollback failed ", se); + } + throw new NestedRuntimeException("Unable to broadcast invalidation messages", t); + } + } + log.debug("Leaving InvalidationSynchronisationHandler.beforeCompletion()"); + } public void afterCompletion(int status) { - int cacheMode = cache.getCacheModeInternal(); +// int cacheMode = cache.getCacheModeInternal(); transactions.remove(tx); - if (log.isDebugEnabled()) log.debug("AfterCompletion transactional status (int): " + status); + /* switch (status) { case Status.STATUS_COMMITTED: @@ -186,7 +211,9 @@ break; default: throw new IllegalStateException("illegal status: " + status); + } + */ } public String toString() |
From: Manik S. <msu...@jb...> - 2005-10-27 17:49:53
|
User: msurtani Date: 05/10/27 13:49:43 Modified: src/org/jboss/cache/interceptors InvalidationInterceptor.java Log: Removed commented out code bloc Revision Changes Path 1.4 +0 -25 JBossCache/src/org/jboss/cache/interceptors/InvalidationInterceptor.java (In the diff below, changes in quantity of whitespace are not shown.) Index: InvalidationInterceptor.java =================================================================== RCS file: /cvsroot/jboss/JBossCache/src/org/jboss/cache/interceptors/InvalidationInterceptor.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -b -r1.3 -r1.4 --- InvalidationInterceptor.java 27 Oct 2005 17:47:28 -0000 1.3 +++ InvalidationInterceptor.java 27 Oct 2005 17:49:43 -0000 1.4 @@ -188,32 +188,7 @@ public void afterCompletion(int status) { - -// int cacheMode = cache.getCacheModeInternal(); - transactions.remove(tx); - - /* - switch (status) - { - case Status.STATUS_COMMITTED: - if (log.isDebugEnabled()) log.debug("AfterCompletion transactional status: COMMITTED"); - if (modifications != null && modifications.size() > 0 && cacheMode != TreeCache.LOCAL) - { - invalidateModifications(modifications); - } - break; - case Status.STATUS_MARKED_ROLLBACK: - // this one is probably not needed - case Status.STATUS_ROLLEDBACK: - if (log.isDebugEnabled()) log.debug("AfterCompletion transactional status: ROLLEDBACK"); - // do nothing for a rollback. - break; - default: - throw new IllegalStateException("illegal status: " + status); - - } - */ } public String toString() |