package org.infinispan.distribution;
import java.util.Collection;
import java.util.concurrent.Future;
import org.infinispan.factories.scopes.Scope;
import org.infinispan.factories.scopes.Scopes;
import org.infinispan.interceptors.distribution.L1WriteSynchronizer;
import org.infinispan.remoting.transport.Address;
/**
* Manages the L1 Cache, in particular recording anyone who is going to cache an
* a command that a node responds to so that a unicast invalidation can be sent
* later if needed.
*
* @author Pete Muir
*
*/
@Scope(Scopes.NAMED_CACHE)
public interface L1Manager {
/**
* Records a request that will be cached in another nodes L1
*/
void addRequestor(Object key, Address requestor);
Future<?> flushCache(Collection<Object> key, Address origin, boolean assumeOriginKeptEntryInL1);
/**
* Registers the given write synchronizer to be notified whenever a remote value is looked up for the given key.
* If the synchronizer is no longer needed to be signaled, the user should unregister it using
* {@link L1Manager#unregisterL1WriteSynchronizer(Object, org.infinispan.interceptors.distribution.L1WriteSynchronizer)}
* @param key The key that that when looked up will trigger the synchronizer
* @param sync The synchronizer to run the update when the key is looked up
*/
void registerL1WriteSynchronizer(Object key, L1WriteSynchronizer sync);
/**
* Unregister the given write synchronizer if present. Note the synchronizer is only unregistered if it matches
* using instance equality (==) due to possibly concurrent usage of write synchronizers
* @param key The key to unregister the given synchronizer for.
* @param sync The synchronizer to be removed if it is still present.
*/
void unregisterL1WriteSynchronizer(Object key, L1WriteSynchronizer sync);
}