blob: f850fb07e2dba1a959ee573d1e69f553a102bd13 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.gemfire.internal.cache;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import com.gemstone.gemfire.cache.CacheCallback;
import com.gemstone.gemfire.cache.CacheWriterException;
import com.gemstone.gemfire.cache.EntryNotFoundException;
import com.gemstone.gemfire.cache.Operation;
import com.gemstone.gemfire.cache.TimeoutException;
import com.gemstone.gemfire.cache.TransactionId;
import com.gemstone.gemfire.cache.query.internal.IndexUpdater;
import com.gemstone.gemfire.internal.cache.lru.LRUMapCallbacks;
import com.gemstone.gemfire.internal.cache.tier.sockets.ClientProxyMembershipID;
import com.gemstone.gemfire.distributed.internal.membership.InternalDistributedMember;
import com.gemstone.gemfire.internal.cache.versions.RegionVersionVector;
import com.gemstone.gemfire.internal.cache.versions.VersionHolder;
import com.gemstone.gemfire.internal.cache.versions.VersionSource;
import com.gemstone.gemfire.internal.cache.versions.VersionTag;
/**
* Internal interface used by {@link LocalRegion} to access the map that holds
* its entries. Note that the value of every entry in this map will
* implement {@link RegionEntry}.
*
* @since 3.5.1
*
* @author Darrel Schneider
*
*/
public interface RegionMap extends LRUMapCallbacks {
/**
* Parameter object used to facilitate construction of an EntriesMap.
* Modification of fields after the map is constructed has no effect.
*/
static class Attributes {
/** The initial capacity. The implementation
* performs internal sizing to accommodate this many elements. */
int initialCapacity = 16;
/** the load factor threshold, used to control resizing. */
float loadFactor = 0.75f;
/** the estimated number of concurrently
* updating threads. The implementation performs internal sizing
* to try to accommodate this many threads. */
int concurrencyLevel = 16;
/** whether "api" statistics are enabled */
boolean statisticsEnabled = false;
/** whether LRU stats are required */
// boolean lru = false;
}
public RegionEntryFactory getEntryFactory();
/**
* This method should be called before region is initialized
* to ensure there is no mix of region entries
*/
public void setEntryFactory(RegionEntryFactory f);
/**
* Gets the attributes that this map was created with.
*/
public Attributes getAttributes();
/**
* Tells this map what region owns it.
*/
public void setOwner(Object r);
public void changeOwner(LocalRegion r);
public int size();
public boolean isEmpty();
/**
* @return number of entries cached in the backing CHM
*/
public int sizeInVM();
public Set keySet();
/** Returns a collection of RegionEntry instances.
*/
public Collection<RegionEntry> regionEntries();
/**
* Returns a collection of RegionEntry instances from memory only.
*/
public Collection<RegionEntry> regionEntriesInVM();
public boolean containsKey(Object key);
/**
* fetches the entry from the backing ConcurrentHashMap
* @param key
* @return the RegionEntry from memory or disk
*/
public RegionEntry getEntry(Object key);
public RegionEntry putEntryIfAbsent(Object key, RegionEntry re);
/**
* fetches the entry from the backing ConcurrentHashMap.
* @param key
* @return the RegionEntry from memory
*/
public RegionEntry getEntryInVM(Object key);
/**
* fetches the entry from the backing ConcurrentHashMap only if the entry
* is considered to be in operational data i.e. does not have
* isMarkedForEviction() bit set.
* @param key
* @return the RegionEntry in operational data
*/
public RegionEntry getOperationalEntryInVM(Object key);
// /**
// * Removes any entry associated with <code>key</code>.
// * Do nothing if the map has no entry for key.
// */
// public void remove(Object key);
// /**
// * Removes the entry associated with <code>key</code>
// * if it is <code>entry</code>.
// * Otherwise do nothing.
// */
// public void remove(Object key, RegionEntry entry);
/**
* Clear the region and, if the parameter rvv is not null,
* return a collection of the IDs of version sources that are
* still in the map when the operation completes.
*/
public Set<VersionSource> clear(RegionVersionVector rvv);
/**
* Used by disk regions when recovering data from backup.
* Currently this "put" is done at a very low level to keep it from
* generating events or pushing updates to others.
* @return the created RegionEntry or null if entry already existed
*/
public RegionEntry initRecoveredEntry(Object key, DiskEntry.RecoveredEntry value);
/**
* Used by disk regions when recovering data from backup and
* initRecoveredEntry has already been called for the given key.
* Currently this "put" is done at a very low level to keep it from
* generating events or pushing updates to others.
* @return the updated RegionEntry
*/
public RegionEntry updateRecoveredEntry(Object key, DiskEntry.RecoveredEntry value);
/**
* Used to modify an existing RegionEntry or create a new one
* when processing the values obtained during a getInitialImage.
* @param wasRecovered true if the current entry in the cache was
* recovered from disk.
* @param entryVersion version information from InitialImageOperation or RegisterInterest
* @param sender the sender of the initial image, if IIO. Not needed on clients
* @param forceValue TODO
*/
public boolean initialImagePut(Object key,
long lastModified,
Object newValue,
boolean wasRecovered,
boolean deferLRUCallback,
VersionTag entryVersion, InternalDistributedMember sender, boolean forceValue);
/**
* Destroy an entry the map.
* @param event indicates entry to destroy as well as data for a <code>CacheCallback</code>
* @param inTokenMode true if destroy is occurring during region initialization
* @param duringRI true if destroy is occurring during register interest
* @param cacheWrite true if a cacheWriter should be called
* @param isEviction true if destroy was called in the context of an LRU Eviction
* @param expectedOldValue if non-null, only destroy if key exists and value is
* is equal to expectedOldValue
* @return true if the entry was destroyed, false otherwise
*
* @see LocalRegion
* @see AbstractRegionMap
* @see CacheCallback
* @see AbstractLRURegionMap
*/
public boolean destroy(EntryEventImpl event,
boolean inTokenMode,
boolean duringRI,
boolean cacheWrite,
boolean isEviction,
Object expectedOldValue,
boolean removeRecoveredEntry)
throws CacheWriterException, EntryNotFoundException, TimeoutException;
/**
* @param forceNewEntry
* used during GII, this forces us to leave an invalid token in the
* cache, even if the entry doesn't exist
* @param forceCallbacks
* using for PRs with eviction enabled, this forces invalidate
* callbacks and events even if the entry doesn't exist in the cache.
* This differs from the forceNewEntry mode in that it doesn't leave
* an Invalid token in the cache.
* @return true if invalidate was done
*/
public boolean invalidate(EntryEventImpl event,
boolean invokeCallbacks,
boolean forceNewEntry,
boolean forceCallbacks)
throws EntryNotFoundException;
public void evictValue(Object key);
/**
* @param event the event object for this operation, with the exception that
* the oldValue parameter is not yet filled in. The oldValue will be filled
* in by this operation.
*
* @param lastModified the lastModified time to set with the value; if 0L,
* then the lastModified time will be set to now.
* @param ifNew true if this operation must not overwrite an existing key
* @param ifOld true if this operation must not create a new entry
* @param expectedOldValue
* only succeed if old value is equal to this value. If null,
* then doesn't matter what old value is. If INVALID token,
* must be INVALID.
* @param requireOldValue if old value needs to be returned to caller in event
* (e.g. failed putIfAbsent)
* @param overwriteDestroyed true if okay to overwrite the DESTROYED token:
* when this is true has the following effect:
* even when ifNew is true will write over DESTROYED token
* when overwriteDestroyed is false and ifNew or ifOld is true
* then if the put doesn't occur because there is a DESTROYED token
* present then the entry flag blockedDestroyed is set.
* @return null if put was not done; otherwise reference to put entry
*/
public RegionEntry basicPut(EntryEventImpl event,
long lastModified,
boolean ifNew,
boolean ifOld,
Object expectedOldValue,
boolean requireOldValue,
boolean overwriteDestroyed)
throws CacheWriterException, TimeoutException;
/**
* Write synchronizes the given entry and invokes the runable
* while holding the lock. Does nothing if the entry does not exist.
*/
public void writeSyncIfPresent(Object key, Runnable runner);
/**
* Remove the entry with the given key if it has been marked as destroyed
* This is currently used in the cleanup phase of getInitialImage.
*/
public void removeIfDestroyed(Object key);
/**
* @param key the key of the entry to destroy
* @param rmtOrigin true if transaction being applied had a remote origin
* @param event filled in if operation performed
* @param inTokenMode true if caller has determined we are in destroy token
* mode and will keep us in that mode while this call is executing.
* @param inRI the region is performing registerInterest so we need a token
* @param op the destroy operation to apply
* @param eventId filled in if operation performed
* @param aCallbackArgument callback argument passed by user
* @param filterRoutingInfo
* @param isOperationRemote whether the operation is remote or originated here
* @param txEntryState when not null, txEntryState.versionTag is set (used on near-side to pass versionTag to TXCommitMessage)
* @param versionTag when not null, it is the tag generated on near-side to be associated with the entry on far-side
* @param tailKey when not -1, it is the tailKey generated on near-side to be associated with entry on far-side for WAN
*/
public void txApplyDestroy(Object key,
TransactionId rmtOrigin,
TXRmtEvent event,
boolean inTokenMode, boolean inRI,
Operation op,
EventID eventId,
Object aCallbackArgument,
List<EntryEventImpl> pendingCallbacks, FilterRoutingInfo filterRoutingInfo,
ClientProxyMembershipID bridgeContext,
boolean isOperationRemote, TXEntryState txEntryState, VersionTag versionTag, long tailKey);
/**
* @param key the key of the entry to invalidate
* @param newValue the new value of the entry
* @param didDestroy true if tx destroyed this entry at some point
* @param rmtOrigin true if transaction being applied had a remote origin
* @param event filled in if operation performed
* @param localOp true for localInvalidates, false otherwise
* @param aCallbackArgument callback argument passed by user
* @param filterRoutingInfo
* @param txEntryState when not null, txEntryState.versionTag is set (used on near-side to pass versionTag to TXCommitMessage)
* @param versionTag when not null, it is the tag generated on near-side to be associated with the entry on far-side
* @param tailKey when not -1, it is the tailKey generated on near-side to be associated with entry on far-side for WAN
*/
public void txApplyInvalidate(Object key,
Object newValue,
boolean didDestroy,
TransactionId rmtOrigin,
TXRmtEvent event,
boolean localOp,
EventID eventId,
Object aCallbackArgument,
List<EntryEventImpl> pendingCallbacks, FilterRoutingInfo filterRoutingInfo,
ClientProxyMembershipID bridgeContext, TXEntryState txEntryState, VersionTag versionTag, long tailKey);
/**
* @param putOp describes the operation that did the put
* @param key the key of the entry to put
* @param newValue the new value of the entry
* @param didDestroy true if tx destroyed this entry at some point
* @param rmtOrigin true if transaction being applied had a remote origin
* @param event filled in if operation performed
* @param aCallbackArgument callback argument passed by user
* @param filterRoutingInfo
* @param txEntryState when not null, txEntryState.versionTag is set (used on near-side to pass versionTag to TXCommitMessage)
* @param versionTag when not null, it is the tag generated on near-side to be associated with the entry on far-side
* @param tailKey when not -1, it is the tailKey generated on near-side to be associated with entry on far-side for WAN
*/
public void txApplyPut(Operation putOp,
Object key,
Object newValue,
boolean didDestroy,
TransactionId rmtOrigin,
TXRmtEvent event,
EventID eventId,
Object aCallbackArgument,
List<EntryEventImpl> pendingCallbacks, FilterRoutingInfo filterRoutingInfo,
ClientProxyMembershipID bridgeContext, TXEntryState txEntryState, VersionTag versionTag, long tailKey);
/**
* removes the given key if the enclosing RegionEntry is still in
* this map
*/
public void removeEntry(Object key, RegionEntry value, boolean updateStats);
/**
* Removes the given key if the enclosing RegionEntry is still in this map for
* the given EntryEvent and updating the given {@link IndexUpdater} of the
* region ({@link #getIndexUpdater()}) for the event.
*/
public void removeEntry(Object key, RegionEntry re, boolean updateStat,
EntryEventImpl event, LocalRegion owner, IndexUpdater indexUpdater);
public void copyRecoveredEntries(RegionMap rm);
public IndexUpdater getIndexUpdater();
/**
* Removes an entry that was previously destroyed and made into a tombstone.
*
* @param re the entry that was destroyed
* @param destroyedVersion the version that was destroyed
* @param isEviction true if the tombstone is being evicted by LRU
* @param isScheduledTombstone TODO
* @return true if the tombstone entry was removed from the entry map
*/
public boolean removeTombstone(RegionEntry re, VersionHolder destroyedVersion, boolean isEviction, boolean isScheduledTombstone);
/**
* Checks to see if the given version is still the version in the map
* @param re the entry that was destroyed
* @param destroyedVersion the version that was destroyed
* @return true of the tombstone is no longer needed (entry was resurrected or evicted)
*/
public boolean isTombstoneNotNeeded(RegionEntry re, int destroyedVersion);
/**
* a tombstone has been unscheduled - update LRU stats if necessary
*/
public void unscheduleTombstone(RegionEntry re);
public void updateEntryVersion(EntryEventImpl event);
/**
* Decrements the transaction reference count.
* Some features, like eviction and expiration, will
* not modify an entry while it is referenced by a transaction.
*/
public void decTxRefCount(RegionEntry e);
public void close();
}