package org.infinispan.partitionhandling.impl; import java.util.Collection; import java.util.List; import org.infinispan.commands.write.WriteCommand; import org.infinispan.container.versioning.EntryVersionsMap; import org.infinispan.partitionhandling.AvailabilityMode; import org.infinispan.remoting.transport.Address; import org.infinispan.topology.CacheTopology; import org.infinispan.transaction.xa.GlobalTransaction; /** * @author Dan Berindei * @since 7.0 */ public interface PartitionHandlingManager { AvailabilityMode getAvailabilityMode(); void setAvailabilityMode(AvailabilityMode availabilityMode); void checkWrite(Object key); void checkRead(Object key); void checkClear(); void checkBulkRead(); @Deprecated //test use only. it can be removed if we update the tests CacheTopology getLastStableTopology(); /** * Adds a partially aborted transaction. * <p/> * The transaction should be registered when it is not sure if the abort happens successfully in all the affected * nodes. * * @param globalTransaction the global transaction. * @param affectedNodes the nodes involved in the transaction and they must abort the transaction. * @param lockedKeys the keys locally locked. * @return {@code true} if the {@link PartitionHandlingManager} will handle it, {@code false} otherwise. */ boolean addPartialRollbackTransaction(GlobalTransaction globalTransaction, Collection<Address> affectedNodes, Collection<Object> lockedKeys); /** * Adds a partially committed transaction. * <p/> * The transaction is committed in the second phase and it is register if it is not sure that the transaction was * committed successfully in all the affected nodes. * * @param globalTransaction the global transaction. * @param affectedNodes the nodes involved in the transaction and they must commit it. * @param lockedKeys the keys locally locked. * @param newVersions the updated versions. Only used when versioning is enabled. * @return {@code true} if the {@link PartitionHandlingManager} will handle it, {@code false} otherwise. */ boolean addPartialCommit2PCTransaction(GlobalTransaction globalTransaction, Collection<Address> affectedNodes, Collection<Object> lockedKeys, EntryVersionsMap newVersions); /** * Adds a partially committed transaction. * <p/> * The transaction is committed in one phase and it is register if it is not sure that the transaction was committed * successfully in all the affected nodes. * * @param globalTransaction the global transaction. * @param affectedNodes the nodes involved in the transaction and they must commit it. * @param lockedKeys the keys locally locked. * @param modifications the transaction's modification log. * @return {@code true} if the {@link PartitionHandlingManager} will handle it, {@code false} otherwise. */ boolean addPartialCommit1PCTransaction(GlobalTransaction globalTransaction, Collection<Address> affectedNodes, Collection<Object> lockedKeys, List<WriteCommand> modifications); /** * It checks if the transaction resources (for example locks) can be released. * <p/> * The transaction resource can't be released when the transaction is partially committed. * * @param globalTransaction the transaction. * @return {@code true} if the resources can be released, {@code false} otherwise. */ boolean isTransactionPartiallyCommitted(GlobalTransaction globalTransaction); /** * @return a collection of partial committed or aborted transactions. */ Collection<GlobalTransaction> getPartialTransactions(); /** * It checks if the transaction can be aborted when the originator leaves the cluster. * <p/> * The only case in which it is not possible to abort is when partition handling is enabled and the originator didn't * leave gracefully. The transaction will complete when the partition heals. * * @param globalTransaction the global transaction. * @return {@code true} if the transaction can be aborted, {@code false} otherwise. */ boolean canRollbackTransactionAfterOriginatorLeave(GlobalTransaction globalTransaction); /** * Notifies the {@link PartitionHandlingManager} that the cache topology was update. * <p/> * It detects when the partition is merged and tries to complete all the partially completed transactions. * * @param cacheTopology the new cache topology. */ void onTopologyUpdate(CacheTopology cacheTopology); }