package org.multiverse.stms.gamma; import org.multiverse.api.*; import org.multiverse.api.exceptions.*; import org.multiverse.api.callables.*; import org.multiverse.stms.gamma.transactions.*; import java.util.concurrent.Callable; import java.util.logging.Logger; import static java.lang.String.format; import static org.multiverse.api.TxnThreadLocal.*; /** * The {@link TxnExecutor} made for the GammaStm. * * This code is generated. * * @author Peter Veentjer */ public final class LeanGammaTxnExecutor extends AbstractGammaTxnExecutor{ private static final Logger logger = Logger.getLogger(LeanGammaTxnExecutor.class.getName()); public LeanGammaTxnExecutor(final GammaTxnFactory txnFactory) { super(txnFactory); } @Override public GammaTxnFactory getTxnFactory(){ return txnFactory; } @Override public final <E> E executeChecked( final TxnCallable<E> callable)throws Exception{ try{ return execute(callable); }catch(InvisibleCheckedException e){ throw e.getCause(); } } @Override public final <E> E execute(final TxnCallable<E> callable){ if(callable == null){ throw new NullPointerException(); } final TxnThreadLocal.Container transactionContainer = getThreadLocalTxnContainer(); GammaTxnPool pool = (GammaTxnPool) transactionContainer.txPool; if (pool == null) { pool = new GammaTxnPool(); transactionContainer.txPool = pool; } GammaTxn tx = (GammaTxn)transactionContainer.txn; if(tx == null || !tx.isAlive()){ tx = null; } Throwable cause = null; try{ if(tx != null && tx.isAlive()){ return callable.call(tx); } tx = txnFactory.newTransaction(pool); transactionContainer.txn=tx; boolean abort = true; try { do { try { cause = null; E result = callable.call(tx); tx.commit(); abort = false; return result; } catch (RetryError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a retry", txnConfig.familyName)); } } tx.awaitUpdate(); } catch (SpeculativeConfigurationError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a speculative configuration error", txnConfig.familyName)); } } abort = false; GammaTxn old = tx; tx = txnFactory.upgradeAfterSpeculativeFailure(tx,pool); pool.put(old); transactionContainer.txn = tx; } catch (ReadWriteConflict e) { cause = e; if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a read or write conflict", txnConfig.familyName)); } } backoffPolicy.delayUninterruptible(tx.getAttempt()); } } while (tx.softReset()); } finally { if (abort) { tx.abort(); } pool.put(tx); transactionContainer.txn = null; } }catch(RuntimeException e){ throw e; }catch(Exception e){ throw new InvisibleCheckedException(e); } if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Maximum number of %s retries has been reached", txnConfig.familyName, txnConfig.getMaxRetries())); } } throw new TooManyRetriesException( format("[%s] Maximum number of %s retries has been reached", txnConfig.getFamilyName(), txnConfig.getMaxRetries()), cause); } @Override public final int executeChecked( final TxnIntCallable callable)throws Exception{ try{ return execute(callable); }catch(InvisibleCheckedException e){ throw e.getCause(); } } @Override public final int execute(final TxnIntCallable callable){ if(callable == null){ throw new NullPointerException(); } final TxnThreadLocal.Container transactionContainer = getThreadLocalTxnContainer(); GammaTxnPool pool = (GammaTxnPool) transactionContainer.txPool; if (pool == null) { pool = new GammaTxnPool(); transactionContainer.txPool = pool; } GammaTxn tx = (GammaTxn)transactionContainer.txn; if(tx == null || !tx.isAlive()){ tx = null; } Throwable cause = null; try{ if(tx != null && tx.isAlive()){ return callable.call(tx); } tx = txnFactory.newTransaction(pool); transactionContainer.txn=tx; boolean abort = true; try { do { try { cause = null; int result = callable.call(tx); tx.commit(); abort = false; return result; } catch (RetryError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a retry", txnConfig.familyName)); } } tx.awaitUpdate(); } catch (SpeculativeConfigurationError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a speculative configuration error", txnConfig.familyName)); } } abort = false; GammaTxn old = tx; tx = txnFactory.upgradeAfterSpeculativeFailure(tx,pool); pool.put(old); transactionContainer.txn = tx; } catch (ReadWriteConflict e) { cause = e; if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a read or write conflict", txnConfig.familyName)); } } backoffPolicy.delayUninterruptible(tx.getAttempt()); } } while (tx.softReset()); } finally { if (abort) { tx.abort(); } pool.put(tx); transactionContainer.txn = null; } }catch(RuntimeException e){ throw e; }catch(Exception e){ throw new InvisibleCheckedException(e); } if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Maximum number of %s retries has been reached", txnConfig.familyName, txnConfig.getMaxRetries())); } } throw new TooManyRetriesException( format("[%s] Maximum number of %s retries has been reached", txnConfig.getFamilyName(), txnConfig.getMaxRetries()), cause); } @Override public final long executeChecked( final TxnLongCallable callable)throws Exception{ try{ return execute(callable); }catch(InvisibleCheckedException e){ throw e.getCause(); } } @Override public final long execute(final TxnLongCallable callable){ if(callable == null){ throw new NullPointerException(); } final TxnThreadLocal.Container transactionContainer = getThreadLocalTxnContainer(); GammaTxnPool pool = (GammaTxnPool) transactionContainer.txPool; if (pool == null) { pool = new GammaTxnPool(); transactionContainer.txPool = pool; } GammaTxn tx = (GammaTxn)transactionContainer.txn; if(tx == null || !tx.isAlive()){ tx = null; } Throwable cause = null; try{ if(tx != null && tx.isAlive()){ return callable.call(tx); } tx = txnFactory.newTransaction(pool); transactionContainer.txn=tx; boolean abort = true; try { do { try { cause = null; long result = callable.call(tx); tx.commit(); abort = false; return result; } catch (RetryError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a retry", txnConfig.familyName)); } } tx.awaitUpdate(); } catch (SpeculativeConfigurationError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a speculative configuration error", txnConfig.familyName)); } } abort = false; GammaTxn old = tx; tx = txnFactory.upgradeAfterSpeculativeFailure(tx,pool); pool.put(old); transactionContainer.txn = tx; } catch (ReadWriteConflict e) { cause = e; if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a read or write conflict", txnConfig.familyName)); } } backoffPolicy.delayUninterruptible(tx.getAttempt()); } } while (tx.softReset()); } finally { if (abort) { tx.abort(); } pool.put(tx); transactionContainer.txn = null; } }catch(RuntimeException e){ throw e; }catch(Exception e){ throw new InvisibleCheckedException(e); } if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Maximum number of %s retries has been reached", txnConfig.familyName, txnConfig.getMaxRetries())); } } throw new TooManyRetriesException( format("[%s] Maximum number of %s retries has been reached", txnConfig.getFamilyName(), txnConfig.getMaxRetries()), cause); } @Override public final double executeChecked( final TxnDoubleCallable callable)throws Exception{ try{ return execute(callable); }catch(InvisibleCheckedException e){ throw e.getCause(); } } @Override public final double execute(final TxnDoubleCallable callable){ if(callable == null){ throw new NullPointerException(); } final TxnThreadLocal.Container transactionContainer = getThreadLocalTxnContainer(); GammaTxnPool pool = (GammaTxnPool) transactionContainer.txPool; if (pool == null) { pool = new GammaTxnPool(); transactionContainer.txPool = pool; } GammaTxn tx = (GammaTxn)transactionContainer.txn; if(tx == null || !tx.isAlive()){ tx = null; } Throwable cause = null; try{ if(tx != null && tx.isAlive()){ return callable.call(tx); } tx = txnFactory.newTransaction(pool); transactionContainer.txn=tx; boolean abort = true; try { do { try { cause = null; double result = callable.call(tx); tx.commit(); abort = false; return result; } catch (RetryError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a retry", txnConfig.familyName)); } } tx.awaitUpdate(); } catch (SpeculativeConfigurationError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a speculative configuration error", txnConfig.familyName)); } } abort = false; GammaTxn old = tx; tx = txnFactory.upgradeAfterSpeculativeFailure(tx,pool); pool.put(old); transactionContainer.txn = tx; } catch (ReadWriteConflict e) { cause = e; if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a read or write conflict", txnConfig.familyName)); } } backoffPolicy.delayUninterruptible(tx.getAttempt()); } } while (tx.softReset()); } finally { if (abort) { tx.abort(); } pool.put(tx); transactionContainer.txn = null; } }catch(RuntimeException e){ throw e; }catch(Exception e){ throw new InvisibleCheckedException(e); } if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Maximum number of %s retries has been reached", txnConfig.familyName, txnConfig.getMaxRetries())); } } throw new TooManyRetriesException( format("[%s] Maximum number of %s retries has been reached", txnConfig.getFamilyName(), txnConfig.getMaxRetries()), cause); } @Override public final boolean executeChecked( final TxnBooleanCallable callable)throws Exception{ try{ return execute(callable); }catch(InvisibleCheckedException e){ throw e.getCause(); } } @Override public final boolean execute(final TxnBooleanCallable callable){ if(callable == null){ throw new NullPointerException(); } final TxnThreadLocal.Container transactionContainer = getThreadLocalTxnContainer(); GammaTxnPool pool = (GammaTxnPool) transactionContainer.txPool; if (pool == null) { pool = new GammaTxnPool(); transactionContainer.txPool = pool; } GammaTxn tx = (GammaTxn)transactionContainer.txn; if(tx == null || !tx.isAlive()){ tx = null; } Throwable cause = null; try{ if(tx != null && tx.isAlive()){ return callable.call(tx); } tx = txnFactory.newTransaction(pool); transactionContainer.txn=tx; boolean abort = true; try { do { try { cause = null; boolean result = callable.call(tx); tx.commit(); abort = false; return result; } catch (RetryError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a retry", txnConfig.familyName)); } } tx.awaitUpdate(); } catch (SpeculativeConfigurationError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a speculative configuration error", txnConfig.familyName)); } } abort = false; GammaTxn old = tx; tx = txnFactory.upgradeAfterSpeculativeFailure(tx,pool); pool.put(old); transactionContainer.txn = tx; } catch (ReadWriteConflict e) { cause = e; if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a read or write conflict", txnConfig.familyName)); } } backoffPolicy.delayUninterruptible(tx.getAttempt()); } } while (tx.softReset()); } finally { if (abort) { tx.abort(); } pool.put(tx); transactionContainer.txn = null; } }catch(RuntimeException e){ throw e; }catch(Exception e){ throw new InvisibleCheckedException(e); } if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Maximum number of %s retries has been reached", txnConfig.familyName, txnConfig.getMaxRetries())); } } throw new TooManyRetriesException( format("[%s] Maximum number of %s retries has been reached", txnConfig.getFamilyName(), txnConfig.getMaxRetries()), cause); } @Override public final void executeChecked( final TxnVoidCallable callable)throws Exception{ try{ execute(callable); }catch(InvisibleCheckedException e){ throw e.getCause(); } } @Override public final void execute(final TxnVoidCallable callable){ if(callable == null){ throw new NullPointerException(); } final TxnThreadLocal.Container transactionContainer = getThreadLocalTxnContainer(); GammaTxnPool pool = (GammaTxnPool) transactionContainer.txPool; if (pool == null) { pool = new GammaTxnPool(); transactionContainer.txPool = pool; } GammaTxn tx = (GammaTxn)transactionContainer.txn; if(tx == null || !tx.isAlive()){ tx = null; } Throwable cause = null; try{ if(tx != null && tx.isAlive()){ callable.call(tx); return; } tx = txnFactory.newTransaction(pool); transactionContainer.txn=tx; boolean abort = true; try { do { try { cause = null; callable.call(tx); tx.commit(); abort = false; return; } catch (RetryError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a retry", txnConfig.familyName)); } } tx.awaitUpdate(); } catch (SpeculativeConfigurationError e) { if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a speculative configuration error", txnConfig.familyName)); } } abort = false; GammaTxn old = tx; tx = txnFactory.upgradeAfterSpeculativeFailure(tx,pool); pool.put(old); transactionContainer.txn = tx; } catch (ReadWriteConflict e) { cause = e; if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Encountered a read or write conflict", txnConfig.familyName)); } } backoffPolicy.delayUninterruptible(tx.getAttempt()); } } while (tx.softReset()); } finally { if (abort) { tx.abort(); } pool.put(tx); transactionContainer.txn = null; } }catch(RuntimeException e){ throw e; }catch(Exception e){ throw new InvisibleCheckedException(e); } if(TRACING_ENABLED){ if (txnConfig.getTraceLevel().isLoggableFrom(TraceLevel.Coarse)) { logger.info(format("[%s] Maximum number of %s retries has been reached", txnConfig.familyName, txnConfig.getMaxRetries())); } } throw new TooManyRetriesException( format("[%s] Maximum number of %s retries has been reached", txnConfig.getFamilyName(), txnConfig.getMaxRetries()), cause); } }