use of org.infinispan.server.hotrod.tx.table.functions.SetCompletedTransactionFunction 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.SetCompletedTransactionFunction 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.SetCompletedTransactionFunction 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.SetCompletedTransactionFunction 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