Search in sources :

Example 1 with TxFunction

use of org.infinispan.server.hotrod.tx.table.functions.TxFunction in project infinispan by infinispan.

the class GlobalTxTable method rollbackRemote.

private void rollbackRemote(ComponentRegistry cr, CacheXid cacheXid, TxState state) {
    RollbackCommand rpcCommand = cr.getCommandsFactory().buildRollbackCommand(state.getGlobalTransaction());
    RpcManager rpcManager = cr.getComponent(RpcManager.class);
    rpcCommand.setTopologyId(rpcManager.getTopologyId());
    rpcManager.invokeCommandOnAll(rpcCommand, VoidResponseCollector.validOnly(), rpcManager.getSyncRpcOptions()).thenRun(() -> {
        // ignore exception so the rollback can be retried.
        // if a node doesn't find the remote transaction, it returns null.
        TxFunction function = new SetCompletedTransactionFunction(false);
        rwMap.eval(cacheXid, function);
    });
}
Also used : RpcManager(org.infinispan.remoting.rpc.RpcManager) SetCompletedTransactionFunction(org.infinispan.server.hotrod.tx.table.functions.SetCompletedTransactionFunction) RollbackCommand(org.infinispan.commands.tx.RollbackCommand) TxFunction(org.infinispan.server.hotrod.tx.table.functions.TxFunction)

Example 2 with TxFunction

use of org.infinispan.server.hotrod.tx.table.functions.TxFunction in project infinispan by infinispan.

the class GlobalTxTable method onTransactionDecision.

private void onTransactionDecision(CacheXid cacheXid, TxState state, boolean commit) {
    ComponentRegistry cr = gcr.getNamedComponentRegistry(cacheXid.getCacheName());
    if (cr == null) {
        // we don't have the cache locally
        return;
    }
    RpcManager rpcManager = cr.getComponent(RpcManager.class);
    if (rpcManager == null || state.getOriginator().equals(rpcManager.getAddress())) {
        // local
        PerCacheTxTable txTable = cr.getComponent(PerCacheTxTable.class);
        EmbeddedTransaction tx = txTable.getLocalTx(cacheXid.getXid());
        if (tx == null) {
            // transaction completed
            onTransactionCompleted(cacheXid);
        } else {
            blockingManager.runBlocking(() -> completeLocal(txTable, cacheXid, tx, commit), cacheXid);
        }
    } else {
        if (commit) {
            TransactionBoundaryCommand rpcCommand;
            if (cr.getComponent(Configuration.class).transaction().lockingMode() == LockingMode.PESSIMISTIC) {
                rpcCommand = cr.getCommandsFactory().buildPrepareCommand(state.getGlobalTransaction(), state.getModifications(), true);
            } else {
                rpcCommand = cr.getCommandsFactory().buildCommitCommand(state.getGlobalTransaction());
            }
            rpcCommand.setTopologyId(rpcManager.getTopologyId());
            rpcManager.invokeCommandOnAll(rpcCommand, VoidResponseCollector.validOnly(), rpcManager.getSyncRpcOptions()).handle((aVoid, throwable) -> {
                // TODO?
                TxFunction function = new SetCompletedTransactionFunction(true);
                rwMap.eval(cacheXid, function);
                return null;
            });
        } else {
            rollbackRemote(cr, cacheXid, state);
        }
    }
}
Also used : EmbeddedTransaction(org.infinispan.transaction.tm.EmbeddedTransaction) RpcManager(org.infinispan.remoting.rpc.RpcManager) TransactionBoundaryCommand(org.infinispan.commands.tx.TransactionBoundaryCommand) Configuration(org.infinispan.configuration.cache.Configuration) SetCompletedTransactionFunction(org.infinispan.server.hotrod.tx.table.functions.SetCompletedTransactionFunction) GlobalComponentRegistry(org.infinispan.factories.GlobalComponentRegistry) ComponentRegistry(org.infinispan.factories.ComponentRegistry) TxFunction(org.infinispan.server.hotrod.tx.table.functions.TxFunction)

Example 3 with TxFunction

use of org.infinispan.server.hotrod.tx.table.functions.TxFunction in project infinispan by infinispan.

the class TxReaperAndRecoveryTest method initGlobalTxTable.

private void initGlobalTxTable(int index, XidImpl xid, Address address, boolean recoverable, Status status) {
    GlobalTxTable globalTxTable = globalTxTable(index);
    CacheXid cacheXid = new CacheXid(fromString(cacheName()), xid);
    List<TxFunction> functions = new ArrayList<>(5);
    GlobalTransaction gtx = address == null ? newGlobalTransaction(cacheName(), index) : newGlobalTransaction(cacheName(), index, address);
    switch(status) {
        case ACTIVE:
            functions.add(new CreateStateFunction(gtx, recoverable, 1));
            break;
        case PREPARING:
            functions.add(new CreateStateFunction(gtx, recoverable, 1));
            functions.add(new PreparingDecisionFunction(Collections.emptyList()));
            break;
        case PREPARED:
            functions.add(new CreateStateFunction(gtx, recoverable, 1));
            functions.add(new PreparingDecisionFunction(Collections.emptyList()));
            functions.add(new SetPreparedFunction());
            break;
        case MARK_ROLLBACK:
            functions.add(new CreateStateFunction(gtx, recoverable, 1));
            functions.add(new PreparingDecisionFunction(Collections.emptyList()));
            functions.add(new SetPreparedFunction());
            functions.add(new SetDecisionFunction(false));
            break;
        case MARK_COMMIT:
            functions.add(new CreateStateFunction(gtx, recoverable, 1));
            functions.add(new PreparingDecisionFunction(Collections.emptyList()));
            functions.add(new SetPreparedFunction());
            functions.add(new SetDecisionFunction(true));
            break;
        case ROLLED_BACK:
            functions.add(new CreateStateFunction(gtx, recoverable, 1));
            functions.add(new PreparingDecisionFunction(Collections.emptyList()));
            functions.add(new SetPreparedFunction());
            functions.add(new SetDecisionFunction(false));
            functions.add(new SetCompletedTransactionFunction(false));
            break;
        case COMMITTED:
            functions.add(new CreateStateFunction(gtx, recoverable, 1));
            functions.add(new PreparingDecisionFunction(Collections.emptyList()));
            functions.add(new SetPreparedFunction());
            functions.add(new SetDecisionFunction(true));
            functions.add(new SetCompletedTransactionFunction(true));
            break;
        default:
            throw new IllegalStateException();
    }
    for (TxFunction function : functions) {
        assertEquals(Status.OK, globalTxTable.update(cacheXid, function, 30000));
    }
    assertEquals(status, globalTxTable.getState(cacheXid).getStatus());
}
Also used : CacheXid(org.infinispan.server.hotrod.tx.table.CacheXid) SetCompletedTransactionFunction(org.infinispan.server.hotrod.tx.table.functions.SetCompletedTransactionFunction) ArrayList(java.util.ArrayList) GlobalTransaction(org.infinispan.transaction.xa.GlobalTransaction) TxFunction(org.infinispan.server.hotrod.tx.table.functions.TxFunction) CreateStateFunction(org.infinispan.server.hotrod.tx.table.functions.CreateStateFunction) PreparingDecisionFunction(org.infinispan.server.hotrod.tx.table.functions.PreparingDecisionFunction) GlobalTxTable(org.infinispan.server.hotrod.tx.table.GlobalTxTable) SetDecisionFunction(org.infinispan.server.hotrod.tx.table.functions.SetDecisionFunction) SetPreparedFunction(org.infinispan.server.hotrod.tx.table.functions.SetPreparedFunction)

Example 4 with TxFunction

use of org.infinispan.server.hotrod.tx.table.functions.TxFunction in project infinispan by infinispan.

the class TopologyChangeFunctionalTest method testOriginatorLeftBeforePrepare.

public void testOriginatorLeftBeforePrepare(Method method) {
    final byte[] k1 = k(method, "k1");
    final byte[] k2 = k(method, "k2");
    final byte[] v1 = v(method, "v1");
    final byte[] v2 = v(method, "v2");
    RemoteTransaction tx = RemoteTransaction.startTransaction(clients().get(0));
    tx.set(k1, v1);
    tx.set(k2, v2);
    tx.getAndAssert(k1, v1);
    tx.getAndAssert(k2, v2);
    tx.prepareAndAssert(XAResource.XA_OK);
    killNode(0);
    // set the tx state to running
    GlobalTxTable transactionTable = extractGlobalComponent(manager(0), GlobalTxTable.class);
    CacheXid cacheXid = new CacheXid(ByteString.fromString(cacheName()), tx.getXid());
    TxState state = transactionTable.getState(cacheXid);
    transactionTable.remove(cacheXid);
    TxFunction function = new CreateStateFunction(state.getGlobalTransaction(), false, 60000);
    transactionTable.update(cacheXid, function, 60000);
    // index 0 is removed, index 0 is the old index 1
    tx.prepareAndAssert(clients().get(0), XAResource.XA_OK);
    tx.commitAndAssert(clients().get(0), XAResource.XA_OK);
    tx.forget(clients().get(0));
    assertData(k1, v1);
    assertData(k2, v2);
    assertServerTransactionTableEmpty();
}
Also used : CacheXid(org.infinispan.server.hotrod.tx.table.CacheXid) RemoteTransaction(org.infinispan.server.hotrod.test.RemoteTransaction) TxState(org.infinispan.server.hotrod.tx.table.TxState) TxFunction(org.infinispan.server.hotrod.tx.table.functions.TxFunction) CreateStateFunction(org.infinispan.server.hotrod.tx.table.functions.CreateStateFunction) GlobalTxTable(org.infinispan.server.hotrod.tx.table.GlobalTxTable)

Example 5 with TxFunction

use of org.infinispan.server.hotrod.tx.table.functions.TxFunction in project infinispan by infinispan.

the class Util method completeLocalTransaction.

private static void completeLocalTransaction(AdvancedCache<?, ?> cache, XidImpl xid, long timeout, boolean commit) throws HeuristicRollbackException, HeuristicMixedException, RollbackException {
    PerCacheTxTable perCacheTxTable = cache.getComponentRegistry().getComponent(PerCacheTxTable.class);
    GlobalTxTable globalTxTable = cache.getComponentRegistry().getGlobalComponentRegistry().getComponent(GlobalTxTable.class);
    try {
        // local transaction
        EmbeddedTransaction tx = perCacheTxTable.getLocalTx(xid);
        tx.runCommit(!commit);
        CacheXid cacheXid = new CacheXid(ByteString.fromString(cache.getName()), xid);
        TxFunction function = new SetCompletedTransactionFunction(commit);
        globalTxTable.update(cacheXid, function, timeout);
    } finally {
        perCacheTxTable.removeLocalTx(xid);
    }
}
Also used : EmbeddedTransaction(org.infinispan.transaction.tm.EmbeddedTransaction) CacheXid(org.infinispan.server.hotrod.tx.table.CacheXid) SetCompletedTransactionFunction(org.infinispan.server.hotrod.tx.table.functions.SetCompletedTransactionFunction) TxFunction(org.infinispan.server.hotrod.tx.table.functions.TxFunction) PerCacheTxTable(org.infinispan.server.hotrod.tx.table.PerCacheTxTable) GlobalTxTable(org.infinispan.server.hotrod.tx.table.GlobalTxTable)

Aggregations

TxFunction (org.infinispan.server.hotrod.tx.table.functions.TxFunction)6 SetCompletedTransactionFunction (org.infinispan.server.hotrod.tx.table.functions.SetCompletedTransactionFunction)4 CacheXid (org.infinispan.server.hotrod.tx.table.CacheXid)3 GlobalTxTable (org.infinispan.server.hotrod.tx.table.GlobalTxTable)3 RpcManager (org.infinispan.remoting.rpc.RpcManager)2 CreateStateFunction (org.infinispan.server.hotrod.tx.table.functions.CreateStateFunction)2 EmbeddedTransaction (org.infinispan.transaction.tm.EmbeddedTransaction)2 ArrayList (java.util.ArrayList)1 RollbackCommand (org.infinispan.commands.tx.RollbackCommand)1 TransactionBoundaryCommand (org.infinispan.commands.tx.TransactionBoundaryCommand)1 Configuration (org.infinispan.configuration.cache.Configuration)1 ComponentRegistry (org.infinispan.factories.ComponentRegistry)1 GlobalComponentRegistry (org.infinispan.factories.GlobalComponentRegistry)1 RemoteTransaction (org.infinispan.server.hotrod.test.RemoteTransaction)1 PerCacheTxTable (org.infinispan.server.hotrod.tx.table.PerCacheTxTable)1 TxState (org.infinispan.server.hotrod.tx.table.TxState)1 ConditionalMarkAsRollbackFunction (org.infinispan.server.hotrod.tx.table.functions.ConditionalMarkAsRollbackFunction)1 PreparingDecisionFunction (org.infinispan.server.hotrod.tx.table.functions.PreparingDecisionFunction)1 SetDecisionFunction (org.infinispan.server.hotrod.tx.table.functions.SetDecisionFunction)1 SetPreparedFunction (org.infinispan.server.hotrod.tx.table.functions.SetPreparedFunction)1