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);
});
}
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);
}
}
}
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());
}
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();
}
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);
}
}
Aggregations