package org.infinispan.commands.tx; import java.util.concurrent.CompletableFuture; import org.infinispan.commands.Visitor; import org.infinispan.context.InvocationContext; import org.infinispan.context.impl.TxInvocationContext; import org.infinispan.transaction.impl.RemoteTransaction; import org.infinispan.transaction.xa.GlobalTransaction; import org.infinispan.util.ByteString; /** * Command corresponding to a transaction rollback. * * @author Manik Surtani (<a href="mailto:manik@jboss.org">manik@jboss.org</a>) * @since 4.0 */ public class RollbackCommand extends AbstractTransactionBoundaryCommand { public static final byte COMMAND_ID = 13; private RollbackCommand() { super(null); // For command id uniqueness test } public RollbackCommand(ByteString cacheName, GlobalTransaction globalTransaction) { super(cacheName); this.globalTx = globalTransaction; } public RollbackCommand(ByteString cacheName) { super(cacheName); } @Override public CompletableFuture<Object> invokeAsync() throws Throwable { // Need to mark the transaction as completed even if the prepare command was not executed on this node txTable.markTransactionCompleted(globalTx, false); return super.invokeAsync(); } @Override public Object acceptVisitor(InvocationContext ctx, Visitor visitor) throws Throwable { return visitor.visitRollbackCommand((TxInvocationContext) ctx, this); } @Override public void visitRemoteTransaction(RemoteTransaction tx) { tx.markForRollback(true); } @Override public byte getCommandId() { return COMMAND_ID; } @Override public String toString() { return "RollbackCommand {" + super.toString(); } }