package org.infinispan.util.concurrent.locks; import java.util.Collection; import java.util.concurrent.TimeUnit; import org.infinispan.context.impl.TxInvocationContext; /** * A manager that checks and waits for older topology transaction with conflicting keys. * * @author Pedro Ruivo * @since 8.0 */ public interface PendingLockManager { /** * Same as {@link #awaitPendingTransactionsForKey(TxInvocationContext, Object, long, TimeUnit)} but non-blocking. * <p> * Multiple invocations with the same transaction returns the same {@link PendingLockPromise}. For cleanup purposes, * {@link #awaitPendingTransactionsForKey(TxInvocationContext, Object, long, TimeUnit)} must be invoked * afterwards. * * @param ctx the {@link TxInvocationContext}. * @param key the key to check. * @param time timeout. * @param unit {@link TimeUnit} of {@code time}. * @return a {@link PendingLockPromise}. */ PendingLockPromise checkPendingTransactionsForKey(TxInvocationContext<?> ctx, Object key, long time, TimeUnit unit); /** * Same as {@link #awaitPendingTransactionsForAllKeys(TxInvocationContext, Collection, long, TimeUnit)} but * non-blocking. * <p> * Multiple invocations with the same transaction returns the same {@link PendingLockPromise}. For cleanup purposes, * {@link #awaitPendingTransactionsForAllKeys(TxInvocationContext, Collection, long, TimeUnit)} must be invoked * afterwards. * * @param ctx the {@link TxInvocationContext}. * @param keys the keys to check. * @param time timeout. * @param unit {@link TimeUnit} of {@code time}. * @return a {@link PendingLockPromise}. */ PendingLockPromise checkPendingTransactionsForKeys(TxInvocationContext<?> ctx, Collection<Object> keys, long time, TimeUnit unit); /** * It waits for any transaction with older topology id to complete that may have the lock for {@code key} acquired. * * @param ctx the {@link TxInvocationContext}. * @param key the key to check. * @param time timeout. * @param unit {@link TimeUnit} of {@code time}. * @return the remaining timeout. * @throws InterruptedException if the thread is interrupted while waiting. */ long awaitPendingTransactionsForKey(TxInvocationContext<?> ctx, Object key, long time, TimeUnit unit) throws InterruptedException; /** * It waits for any transaction with older topology id to complete that may have the lock for any key in {@code keys} * acquired. * * @param ctx the {@link TxInvocationContext}. * @param keys the keys to check. * @param time timeout. * @param unit {@link TimeUnit} of {@code time}. * @return the remaining timeout. * @throws InterruptedException if the thread is interrupted while waiting. */ long awaitPendingTransactionsForAllKeys(TxInvocationContext<?> ctx, Collection<Object> keys, long time, TimeUnit unit) throws InterruptedException; }