@Override
public Object visitPrepareCommand(TxInvocationContext ctx, PrepareCommand command) throws Throwable {
GlobalTransaction globalTransaction = command.getGlobalTransaction();
if (trace) {
log.tracef("Visit Prepare command %s. Is it local?. Transaction is %s", command,
ctx.isOriginLocal(), globalTransaction.globalId());
}
initStatsIfNecessary(ctx);
cacheStatisticManager.onPrepareCommand(globalTransaction, ctx.isOriginLocal());
if (command.hasModifications()) {
cacheStatisticManager.markAsWriteTransaction(globalTransaction, ctx.isOriginLocal());
}
long start = timeService.time();
return invokeNextAndFinally(ctx, command, (rCtx, rCommand, rv, t) -> {
if (t != null) {
processWriteException(rCtx, globalTransaction, t);
} else {
long end = timeService.time();
updateTime(PREPARE_EXECUTION_TIME, NUM_PREPARE_COMMAND, start, end, globalTransaction, rCtx
.isOriginLocal());
}
if (((PrepareCommand) rCommand).isOnePhaseCommit()) {
boolean local = rCtx.isOriginLocal();
boolean success = t == null;
cacheStatisticManager.setTransactionOutcome(success, globalTransaction, rCtx.isOriginLocal());
cacheStatisticManager.terminateTransaction(globalTransaction, local, !local);
}
});
}