Apache Tomcat 7.0.28

org.apache.catalina.tribes.tipis
Class AbstractReplicatedMap

java.lang.Object
  extended by java.util.AbstractMap<K,V>
      extended by java.util.concurrent.ConcurrentHashMap
          extended by org.apache.catalina.tribes.tipis.AbstractReplicatedMap
All Implemented Interfaces:
Serializable, ConcurrentMap, Map, ChannelListener, RpcCallback, Heartbeat, MembershipListener
Direct Known Subclasses:
LazyReplicatedMap, ReplicatedMap

public abstract class AbstractReplicatedMap
extends ConcurrentHashMap
implements RpcCallback, ChannelListener, MembershipListener, Heartbeat

Version:
1.0
Author:
Filip Hanik
See Also:
Serialized Form

Nested Class Summary
static class AbstractReplicatedMap.MapEntry
           
static class AbstractReplicatedMap.MapMessage
           
static interface AbstractReplicatedMap.MapOwner
           
 
Nested classes/interfaces inherited from class java.util.AbstractMap
AbstractMap.SimpleEntry<K,V>, AbstractMap.SimpleImmutableEntry<K,V>
 
Nested classes/interfaces inherited from interface java.util.Map
Map.Entry<K,V>
 
Field Summary
protected  long accessTimeout
          Since the map keeps internal membership this is the timeout for a ping message to be responded to If a remote map doesn't respond within this timeframe, its considered dead.
protected  Channel channel
          Reference to the channel for sending messages
protected  int channelSendOptions
          Our default send options
protected  int currentNode
          The node we are currently backing up data to, this index will rotate on a round robin basis
static int DEFAULT_INITIAL_CAPACITY
          The default initial capacity - MUST be a power of two.
static float DEFAULT_LOAD_FACTOR
          The load factor used when none specified in constructor.
protected  ClassLoader[] externalLoaders
          External class loaders if serialization and deserialization is to be performed successfully.
protected  byte[] mapContextName
          The Map context name makes this map unique, this allows us to have more than one map shared through one channel
protected  HashMap<Member,Long> mapMembers
          A list of members in our map
protected  String mapname
          Readable string of the mapContextName value
protected  AbstractReplicatedMap.MapOwner mapOwner
          The owner of this map, ala a SessionManager for example
protected  RpcChannel rpcChannel
          The RpcChannel to send RPC messages through
protected  long rpcTimeout
          Timeout for RPC messages, how long we will wait for a reply
protected  Object stateMutex
          Simple lock object for transfers
protected  boolean stateTransferred
          Has the state been transferred
 
Constructor Summary
AbstractReplicatedMap(AbstractReplicatedMap.MapOwner owner, Channel channel, long timeout, String mapContextName, int initialCapacity, float loadFactor, int channelSendOptions, ClassLoader[] cls)
          Creates a new map
 
Method Summary
 boolean accept(Serializable msg, Member sender)
          Invoked by the channel to determine if the listener will process this message or not.
 void breakdown()
           
protected  void broadcast(int msgtype, boolean rpc)
          Helper method to broadcast a message to all members in a channel
 void clear()
           
 void clear(boolean notify)
           
 Object clone()
           
 boolean containsKey(Object key)
          Returns true if the key has an entry in the map.
 boolean containsValue(Object value)
           
 Set<AbstractReplicatedMap.MapEntry> entrySet()
           
 Set entrySetFull()
          Returns the entire contents of the map Map.Entry.getValue() will return a LazyReplicatedMap.MapEntry object containing all the information about the object.
 boolean equals(Object o)
           
 Member[] excludeFromSet(Member[] mbrs, Member[] set)
           
 void finalize()
           
 Object get(Object key)
           
 long getAccessTimeout()
           
 Channel getChannel()
           
 int getChannelSendOptions()
           
 ClassLoader[] getExternalLoaders()
           
 AbstractReplicatedMap.MapEntry getInternal(Object key)
           
 byte[] getMapContextName()
           
 Member[] getMapMembers()
           
 Member[] getMapMembers(HashMap<Member,Long> members)
           
 Member[] getMapMembersExcl(Member[] exclude)
           
 AbstractReplicatedMap.MapOwner getMapOwner()
           
 int getNextBackupIndex()
           
 Member getNextBackupNode()
           
 RpcChannel getRpcChannel()
           
 long getRpcTimeout()
           
protected abstract  int getStateMessageType()
           
 Object getStateMutex()
           
 int hashCode()
           
 void heartbeat()
          Heartbeat invocation for resources cleanup etc
protected  void init(AbstractReplicatedMap.MapOwner owner, Channel channel, String mapContextName, long timeout, int channelSendOptions, ClassLoader[] cls)
          Initializes the map by creating the RPC channel, registering itself as a channel listener This method is also responsible for initiating the state transfer
 boolean inSet(Member m, Member[] set)
           
 boolean isEmpty()
           
 boolean isStateTransferred()
           
 Set<Object> keySet()
           
 Set keySetFull()
           
 void leftOver(Serializable msg, Member sender)
          If the reply has already been sent to the requesting thread, the rpc callback can handle any data that comes in after the fact.
 void mapMemberAdded(Member member)
           
 void memberAdded(Member member)
          A member was added to the group
protected  void memberAlive(Member member)
          We have received a member alive notification
 void memberDisappeared(Member member)
          A member was removed from the group
If the member left voluntarily, the Member.getCommand will contain the Member.SHUTDOWN_PAYLOAD data
 void messageReceived(Serializable msg, Member sender)
          Receive a message from the channel
protected  void ping(long timeout)
          Sends a ping out to all the members in the cluster, not just map members that this map is alive.
protected  void printMap(String header)
           
protected abstract  Member[] publishEntryInfo(Object key, Object value)
           
 Object put(Object key, Object value)
           
 Object put(Object key, Object value, boolean notify)
           
 void putAll(Map m)
          Copies all values from one map to this instance
 Object remove(Object key)
          Removes an object from this map, it will also remove it from
 Object remove(Object key, boolean notify)
           
 void replicate(boolean complete)
          This can be invoked by a periodic thread to replicate out any changes.
 void replicate(Object key, boolean complete)
          Replicates any changes to the object since the last time The object has to be primary, ie, if the object is a proxy or a backup, it will not be replicated
 Serializable replyRequest(Serializable msg, Member sender)
          TODO implement state transfer
 void setAccessTimeout(long accessTimeout)
           
 void setChannelSendOptions(int channelSendOptions)
           
 void setExternalLoaders(ClassLoader[] externalLoaders)
           
 void setMapOwner(AbstractReplicatedMap.MapOwner mapOwner)
           
 int size()
           
 int sizeFull()
           
 void transferState()
           
 Collection<Object> values()
           
protected  Member[] wrap(Member m)
          Helper methods, wraps a single member in an array
 
Methods inherited from class java.util.concurrent.ConcurrentHashMap
contains, elements, keys, putIfAbsent, remove, replace, replace
 
Methods inherited from class java.util.AbstractMap
toString
 
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

DEFAULT_INITIAL_CAPACITY

public static final int DEFAULT_INITIAL_CAPACITY
The default initial capacity - MUST be a power of two.

See Also:
Constant Field Values

DEFAULT_LOAD_FACTOR

public static final float DEFAULT_LOAD_FACTOR
The load factor used when none specified in constructor.

See Also:
Constant Field Values

rpcTimeout

protected transient long rpcTimeout
Timeout for RPC messages, how long we will wait for a reply


channel

protected transient Channel channel
Reference to the channel for sending messages


rpcChannel

protected transient RpcChannel rpcChannel
The RpcChannel to send RPC messages through


mapContextName

protected transient byte[] mapContextName
The Map context name makes this map unique, this allows us to have more than one map shared through one channel


stateTransferred

protected transient boolean stateTransferred
Has the state been transferred


stateMutex

protected transient Object stateMutex
Simple lock object for transfers


mapMembers

protected transient HashMap<Member,Long> mapMembers
A list of members in our map


channelSendOptions

protected transient int channelSendOptions
Our default send options


mapOwner

protected transient AbstractReplicatedMap.MapOwner mapOwner
The owner of this map, ala a SessionManager for example


externalLoaders

protected transient ClassLoader[] externalLoaders
External class loaders if serialization and deserialization is to be performed successfully.


currentNode

protected transient int currentNode
The node we are currently backing up data to, this index will rotate on a round robin basis


accessTimeout

protected transient long accessTimeout
Since the map keeps internal membership this is the timeout for a ping message to be responded to If a remote map doesn't respond within this timeframe, its considered dead.


mapname

protected transient String mapname
Readable string of the mapContextName value

Constructor Detail

AbstractReplicatedMap

public AbstractReplicatedMap(AbstractReplicatedMap.MapOwner owner,
                             Channel channel,
                             long timeout,
                             String mapContextName,
                             int initialCapacity,
                             float loadFactor,
                             int channelSendOptions,
                             ClassLoader[] cls)
Creates a new map

Parameters:
channel - The channel to use for communication
timeout - long - timeout for RPC messags
mapContextName - String - unique name for this map, to allow multiple maps per channel
initialCapacity - int - the size of this map, see HashMap
loadFactor - float - load factor, see HashMap
cls - - a list of classloaders to be used for deserialization of objects.
Method Detail

getStateMessageType

protected abstract int getStateMessageType()

wrap

protected Member[] wrap(Member m)
Helper methods, wraps a single member in an array

Parameters:
m - Member
Returns:
Member[]

init

protected void init(AbstractReplicatedMap.MapOwner owner,
                    Channel channel,
                    String mapContextName,
                    long timeout,
                    int channelSendOptions,
                    ClassLoader[] cls)
Initializes the map by creating the RPC channel, registering itself as a channel listener This method is also responsible for initiating the state transfer

Parameters:
owner - Object
channel - Channel
mapContextName - String
timeout - long
channelSendOptions - int
cls - ClassLoader[]

ping

protected void ping(long timeout)
             throws ChannelException
Sends a ping out to all the members in the cluster, not just map members that this map is alive.

Parameters:
timeout - long
Throws:
ChannelException

memberAlive

protected void memberAlive(Member member)
We have received a member alive notification

Parameters:
member - Member

broadcast

protected void broadcast(int msgtype,
                         boolean rpc)
                  throws ChannelException
Helper method to broadcast a message to all members in a channel

Parameters:
msgtype - int
rpc - boolean
Throws:
ChannelException

breakdown

public void breakdown()

finalize

public void finalize()
Overrides:
finalize in class Object

hashCode

public int hashCode()
Specified by:
hashCode in interface Map
Specified by:
hashCode in interface ChannelListener
Overrides:
hashCode in class AbstractMap
Returns:
int
See Also:
Object.hashCode()

equals

public boolean equals(Object o)
Specified by:
equals in interface Map
Specified by:
equals in interface ChannelListener
Overrides:
equals in class AbstractMap
Parameters:
o - Object
Returns:
boolean
See Also:
Object.equals(Object)

getMapMembers

public Member[] getMapMembers(HashMap<Member,Long> members)

getMapMembers

public Member[] getMapMembers()

getMapMembersExcl

public Member[] getMapMembersExcl(Member[] exclude)

replicate

public void replicate(Object key,
                      boolean complete)
Replicates any changes to the object since the last time The object has to be primary, ie, if the object is a proxy or a backup, it will not be replicated

Parameters:
complete - - if set to true, the object is replicated to its backup if set to false, only objects that implement ReplicatedMapEntry and the isDirty() returns true will be replicated

replicate

public void replicate(boolean complete)
This can be invoked by a periodic thread to replicate out any changes. For maps that don't store objects that implement ReplicatedMapEntry, this method should be used infrequently to avoid large amounts of data transfer

Parameters:
complete - boolean

transferState

public void transferState()

replyRequest

public Serializable replyRequest(Serializable msg,
                                 Member sender)
TODO implement state transfer

Specified by:
replyRequest in interface RpcCallback
Parameters:
msg - Serializable
Returns:
Serializable - null if no reply should be sent

leftOver

public void leftOver(Serializable msg,
                     Member sender)
If the reply has already been sent to the requesting thread, the rpc callback can handle any data that comes in after the fact.

Specified by:
leftOver in interface RpcCallback
Parameters:
msg - Serializable
sender - Member

messageReceived

public void messageReceived(Serializable msg,
                            Member sender)
Description copied from interface: ChannelListener
Receive a message from the channel

Specified by:
messageReceived in interface ChannelListener
Parameters:
msg - Serializable
sender - - the source of the message

accept

public boolean accept(Serializable msg,
                      Member sender)
Description copied from interface: ChannelListener
Invoked by the channel to determine if the listener will process this message or not.

Specified by:
accept in interface ChannelListener
Parameters:
msg - Serializable
sender - Member
Returns:
boolean

mapMemberAdded

public void mapMemberAdded(Member member)

inSet

public boolean inSet(Member m,
                     Member[] set)

excludeFromSet

public Member[] excludeFromSet(Member[] mbrs,
                               Member[] set)

memberAdded

public void memberAdded(Member member)
Description copied from interface: MembershipListener
A member was added to the group

Specified by:
memberAdded in interface MembershipListener
Parameters:
member - Member - the member that was added

memberDisappeared

public void memberDisappeared(Member member)
Description copied from interface: MembershipListener
A member was removed from the group
If the member left voluntarily, the Member.getCommand will contain the Member.SHUTDOWN_PAYLOAD data

Specified by:
memberDisappeared in interface MembershipListener
Parameters:
member - Member
See Also:
Member.SHUTDOWN_PAYLOAD

getNextBackupIndex

public int getNextBackupIndex()

getNextBackupNode

public Member getNextBackupNode()

publishEntryInfo

protected abstract Member[] publishEntryInfo(Object key,
                                             Object value)
                                      throws ChannelException
Throws:
ChannelException

heartbeat

public void heartbeat()
Description copied from interface: Heartbeat
Heartbeat invocation for resources cleanup etc

Specified by:
heartbeat in interface Heartbeat

remove

public Object remove(Object key)
Removes an object from this map, it will also remove it from

Specified by:
remove in interface Map
Overrides:
remove in class ConcurrentHashMap
Parameters:
key - Object
Returns:
Object

remove

public Object remove(Object key,
                     boolean notify)

getInternal

public AbstractReplicatedMap.MapEntry getInternal(Object key)

get

public Object get(Object key)
Specified by:
get in interface Map
Overrides:
get in class ConcurrentHashMap

printMap

protected void printMap(String header)

containsKey

public boolean containsKey(Object key)
Returns true if the key has an entry in the map. The entry can be a proxy or a backup entry, invoking get(key) will make this entry primary for the group

Specified by:
containsKey in interface Map
Overrides:
containsKey in class ConcurrentHashMap
Parameters:
key - Object
Returns:
boolean

put

public Object put(Object key,
                  Object value)
Specified by:
put in interface Map
Overrides:
put in class ConcurrentHashMap

put

public Object put(Object key,
                  Object value,
                  boolean notify)

putAll

public void putAll(Map m)
Copies all values from one map to this instance

Specified by:
putAll in interface Map
Overrides:
putAll in class ConcurrentHashMap
Parameters:
m - Map

clear

public void clear()
Specified by:
clear in interface Map
Overrides:
clear in class ConcurrentHashMap

clear

public void clear(boolean notify)

containsValue

public boolean containsValue(Object value)
Specified by:
containsValue in interface Map
Overrides:
containsValue in class ConcurrentHashMap

clone

public Object clone()
Overrides:
clone in class AbstractMap

entrySetFull

public Set entrySetFull()
Returns the entire contents of the map Map.Entry.getValue() will return a LazyReplicatedMap.MapEntry object containing all the information about the object.

Returns:
Set

keySetFull

public Set keySetFull()

sizeFull

public int sizeFull()

entrySet

public Set<AbstractReplicatedMap.MapEntry> entrySet()
Specified by:
entrySet in interface Map
Overrides:
entrySet in class ConcurrentHashMap

keySet

public Set<Object> keySet()
Specified by:
keySet in interface Map
Overrides:
keySet in class ConcurrentHashMap

size

public int size()
Specified by:
size in interface Map
Overrides:
size in class ConcurrentHashMap

isEmpty

public boolean isEmpty()
Specified by:
isEmpty in interface Map
Overrides:
isEmpty in class ConcurrentHashMap

values

public Collection<Object> values()
Specified by:
values in interface Map
Overrides:
values in class ConcurrentHashMap

getChannel

public Channel getChannel()

getMapContextName

public byte[] getMapContextName()

getRpcChannel

public RpcChannel getRpcChannel()

getRpcTimeout

public long getRpcTimeout()

getStateMutex

public Object getStateMutex()

isStateTransferred

public boolean isStateTransferred()

getMapOwner

public AbstractReplicatedMap.MapOwner getMapOwner()

getExternalLoaders

public ClassLoader[] getExternalLoaders()

getChannelSendOptions

public int getChannelSendOptions()

getAccessTimeout

public long getAccessTimeout()

setMapOwner

public void setMapOwner(AbstractReplicatedMap.MapOwner mapOwner)

setExternalLoaders

public void setExternalLoaders(ClassLoader[] externalLoaders)

setChannelSendOptions

public void setChannelSendOptions(int channelSendOptions)

setAccessTimeout

public void setAccessTimeout(long accessTimeout)

Apache Tomcat 7.0.28

Copyright © 2000-2012 Apache Software Foundation. All Rights Reserved.