package org.infinispan.stats; import static org.infinispan.stats.container.ExtendedStatistic.LOCAL_EXEC_NO_CONT; import static org.infinispan.stats.container.ExtendedStatistic.LOCK_WAITING_TIME; import static org.infinispan.stats.container.ExtendedStatistic.NUM_GET; import static org.infinispan.stats.container.ExtendedStatistic.NUM_GETS_RO_TX; import static org.infinispan.stats.container.ExtendedStatistic.NUM_GETS_WR_TX; import static org.infinispan.stats.container.ExtendedStatistic.NUM_HELD_LOCKS; import static org.infinispan.stats.container.ExtendedStatistic.NUM_HELD_LOCKS_SUCCESS_LOCAL_TX; import static org.infinispan.stats.container.ExtendedStatistic.NUM_PUT; import static org.infinispan.stats.container.ExtendedStatistic.NUM_PUTS_WR_TX; import static org.infinispan.stats.container.ExtendedStatistic.NUM_REMOTE_GET; import static org.infinispan.stats.container.ExtendedStatistic.NUM_REMOTE_GETS_RO_TX; import static org.infinispan.stats.container.ExtendedStatistic.NUM_REMOTE_GETS_WR_TX; import static org.infinispan.stats.container.ExtendedStatistic.NUM_REMOTE_PUT; import static org.infinispan.stats.container.ExtendedStatistic.NUM_REMOTE_PUTS_WR_TX; import static org.infinispan.stats.container.ExtendedStatistic.WR_TX_SUCCESSFUL_EXECUTION_TIME; import org.infinispan.stats.container.LocalExtendedStatisticsContainer; import org.infinispan.util.TimeService; /** * Represents the statistics collected for a local transaction * * @author Roberto Palmieri * @author Sebastiano Peluso * @author Diego Didona * @author Pedro Ruivo * @since 6.0 */ public class LocalTransactionStatistics extends TransactionStatistics { private final boolean optimisticLockingScheme; private boolean stillLocalExecution; public LocalTransactionStatistics(boolean optimisticLockingScheme, TimeService timeService) { super(new LocalExtendedStatisticsContainer(), timeService); this.optimisticLockingScheme = optimisticLockingScheme; this.stillLocalExecution = true; } @Override public final String toString() { return "LocalTransactionStatistics{" + "stillLocalExecution=" + stillLocalExecution + ", " + super.toString(); } @Override public final void onPrepareCommand() { this.stillLocalExecution = false; } @Override public final boolean isLocalTransaction() { return true; } @Override protected final void terminate() { if (isReadOnly()) { copyValue(NUM_GET, NUM_GETS_RO_TX); copyValue(NUM_REMOTE_GET, NUM_REMOTE_GETS_RO_TX); } else { copyValue(NUM_GET, NUM_GETS_WR_TX); copyValue(NUM_REMOTE_GET, NUM_REMOTE_GETS_WR_TX); copyValue(NUM_PUT, NUM_PUTS_WR_TX); copyValue(NUM_REMOTE_PUT, NUM_REMOTE_PUTS_WR_TX); if (isCommitted()) { copyValue(NUM_HELD_LOCKS, NUM_HELD_LOCKS_SUCCESS_LOCAL_TX); if (optimisticLockingScheme) { copyValue(WR_TX_SUCCESSFUL_EXECUTION_TIME, LOCAL_EXEC_NO_CONT); } else { try { double localLockAcquisitionTime = getValue(LOCK_WAITING_TIME); double totalLocalDuration = getValue(WR_TX_SUCCESSFUL_EXECUTION_TIME); this.addValue(LOCAL_EXEC_NO_CONT, (totalLocalDuration - localLockAcquisitionTime)); } catch (ExtendedStatisticNotFoundException e) { log.unableToCalculateLocalExecutionTimeWithoutContention(e); } } } } } }