Class ReplicatedHashMap<K,​V>

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, java.util.concurrent.ConcurrentMap<K,​V>, java.util.Map<K,​V>, ReplicatedMap<K,​V>, MembershipListener, StateListener

    public class ReplicatedHashMap<K,​V>
    extends java.util.AbstractMap<K,​V>
    implements java.util.concurrent.ConcurrentMap<K,​V>, MembershipListener, StateListener, ReplicatedMap<K,​V>, java.io.Closeable
    Implementation of a ConcurrentMap with replication of the contents across a cluster. Any change to the hashmap (clear(), put(), remove() etc) will transparently be propagated to all replicas in the group. All read-only methods will always access the local replica.

    Keys and values added to the hashmap must be serializable, the reason being that they will be sent across the network to all replicas of the group.

    A ReplicatedHashMap allows one to implement a distributed naming service in just a couple of lines.

    An instance of this class will contact an existing member of the group to fetch its initial state.

    Author:
    Bela Ban
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      static interface  ReplicatedHashMap.Notification<K,​V>  
      • Nested classes/interfaces inherited from class java.util.AbstractMap

        java.util.AbstractMap.SimpleEntry<K extends java.lang.Object,​V extends java.lang.Object>, java.util.AbstractMap.SimpleImmutableEntry<K extends java.lang.Object,​V extends java.lang.Object>
      • Nested classes/interfaces inherited from interface java.util.Map

        java.util.Map.Entry<K extends java.lang.Object,​V extends java.lang.Object>
    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected RequestOptions call_options  
      protected RpcDispatcher disp  
      protected Log log  
      protected java.util.concurrent.ConcurrentMap<K,​V> map
      wrapped map instance
      protected static java.util.Map<java.lang.Short,​java.lang.reflect.Method> methods  
    • Constructor Summary

      Constructors 
      Constructor Description
      ReplicatedHashMap​(java.util.concurrent.ConcurrentMap<K,​V> map, JChannel channel)
      Constructs a new ReplicatedHashMap using provided map instance.
      ReplicatedHashMap​(JChannel channel)
      Constructs a new ReplicatedHashMap with channel.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void _clear()  
      V _put​(K key, V value)  
      void _putAll​(java.util.Map<? extends K,​? extends V> map)  
      V _putIfAbsent​(K key, V value)  
      V _remove​(K key)  
      boolean _remove​(K key, V value)  
      V _replace​(K key, V value)  
      boolean _replace​(K key, V oldValue, V newValue)  
      void addNotifier​(ReplicatedHashMap.Notification n)  
      void block()
      Block sending and receiving of messages until ViewAccepted is called
      void clear()
      Removes all of the mappings from this map.
      void close()  
      boolean containsKey​(java.lang.Object key)  
      boolean containsValue​(java.lang.Object value)  
      java.util.Set<java.util.Map.Entry<K,​V>> entrySet()  
      V get​(java.lang.Object key)  
      JChannel getChannel()  
      java.lang.String getClusterName()  
      Address getLocalAddress()  
      void getState​(java.io.OutputStream ostream)
      Allows an application to write a state through a provided OutputStream.
      long getTimeout()
      The timeout (in milliseconds) for blocking updates
      protected void init()  
      boolean isBlockingUpdates()  
      V put​(K key, V value)
      Maps the specified key to the specified value in this table.
      void putAll​(java.util.Map<? extends K,​? extends V> m)
      Copies all of the mappings from the specified map to this one.
      V putIfAbsent​(K key, V value)  
      V remove​(java.lang.Object key)
      Removes the key (and its corresponding value) from this map.
      boolean remove​(java.lang.Object key, java.lang.Object value)  
      void removeNotifier​(ReplicatedHashMap.Notification n)  
      V replace​(K key, V value)  
      boolean replace​(K key, V oldValue, V newValue)  
      void setBlockingUpdates​(boolean blocking_updates)
      Whether updates across the cluster should be asynchronous (default) or synchronous)
      void setState​(java.io.InputStream istream)
      Allows an application to read a state through a provided InputStream.
      void setTimeout​(long timeout)
      Sets the cluster call timeout (until all acks have been received)
      void start​(long state_timeout)
      Fetches the state
      void stop()  
      void suspect​(Address suspected_mbr)
      Called when a member is suspected
      static <K,​V>
      ReplicatedMap<K,​V>
      synchronizedMap​(ReplicatedMap<K,​V> map)
      Creates a synchronized facade for a ReplicatedMap.
      void unblock()
      Called after the FLUSH protocol has unblocked previously blocked senders, and messages can be sent again.
      void viewAccepted​(View new_view)
      Called when a change in membership has occurred.
      • Methods inherited from class java.util.AbstractMap

        clone, equals, hashCode, isEmpty, keySet, size, toString, values
      • Methods inherited from class java.lang.Object

        finalize, getClass, notify, notifyAll, wait, wait, wait
      • Methods inherited from interface java.util.concurrent.ConcurrentMap

        compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, replaceAll
      • Methods inherited from interface java.util.Map

        equals, hashCode, isEmpty, keySet, size, values
    • Field Detail

      • methods

        protected static java.util.Map<java.lang.Short,​java.lang.reflect.Method> methods
      • log

        protected final Log log
      • map

        protected java.util.concurrent.ConcurrentMap<K,​V> map
        wrapped map instance
    • Constructor Detail

      • ReplicatedHashMap

        public ReplicatedHashMap​(JChannel channel)
        Constructs a new ReplicatedHashMap with channel. Call start(long) to start this map.
      • ReplicatedHashMap

        public ReplicatedHashMap​(java.util.concurrent.ConcurrentMap<K,​V> map,
                                 JChannel channel)
        Constructs a new ReplicatedHashMap using provided map instance.
    • Method Detail

      • init

        protected final void init()
      • isBlockingUpdates

        public boolean isBlockingUpdates()
      • setBlockingUpdates

        public void setBlockingUpdates​(boolean blocking_updates)
        Whether updates across the cluster should be asynchronous (default) or synchronous)
        Parameters:
        blocking_updates -
      • getTimeout

        public long getTimeout()
        The timeout (in milliseconds) for blocking updates
      • setTimeout

        public void setTimeout​(long timeout)
        Sets the cluster call timeout (until all acks have been received)
        Parameters:
        timeout - The timeout (in milliseconds) for blocking updates
      • start

        public final void start​(long state_timeout)
                         throws java.lang.Exception
        Fetches the state
        Parameters:
        state_timeout -
        Throws:
        java.lang.Exception
      • getLocalAddress

        public Address getLocalAddress()
      • getClusterName

        public java.lang.String getClusterName()
      • getChannel

        public JChannel getChannel()
      • stop

        public void stop()
      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Throws:
        java.io.IOException
      • put

        public V put​(K key,
                     V value)
        Maps the specified key to the specified value in this table. Neither the key nor the value can be null.

        The value can be retrieved by calling the get method with a key that is equal to the original key.

        Specified by:
        put in interface java.util.Map<K,​V>
        Overrides:
        put in class java.util.AbstractMap<K,​V>
        Parameters:
        key - key with which the specified value is to be associated
        value - value to be associated with the specified key
        Returns:
        the previous value associated with key, or null if there was no mapping for key
        Throws:
        java.lang.NullPointerException - if the specified key or value is null
      • putIfAbsent

        public V putIfAbsent​(K key,
                             V value)
        Specified by:
        putIfAbsent in interface java.util.concurrent.ConcurrentMap<K,​V>
        Specified by:
        putIfAbsent in interface java.util.Map<K,​V>
        Returns:
        the previous value associated with the specified key, or null if there was no mapping for the key
        Throws:
        java.lang.NullPointerException - if the specified key or value is null
      • putAll

        public void putAll​(java.util.Map<? extends K,​? extends V> m)
        Copies all of the mappings from the specified map to this one. These mappings replace any mappings that this map had for any of the keys currently in the specified map.
        Specified by:
        putAll in interface java.util.Map<K,​V>
        Overrides:
        putAll in class java.util.AbstractMap<K,​V>
        Parameters:
        m - mappings to be stored in this map
      • clear

        public void clear()
        Removes all of the mappings from this map.
        Specified by:
        clear in interface java.util.Map<K,​V>
        Overrides:
        clear in class java.util.AbstractMap<K,​V>
      • remove

        public V remove​(java.lang.Object key)
        Removes the key (and its corresponding value) from this map. This method does nothing if the key is not in the map.
        Specified by:
        remove in interface java.util.Map<K,​V>
        Overrides:
        remove in class java.util.AbstractMap<K,​V>
        Parameters:
        key - the key that needs to be removed
        Returns:
        the previous value associated with key, or null if there was no mapping for key
        Throws:
        java.lang.NullPointerException - if the specified key is null
      • remove

        public boolean remove​(java.lang.Object key,
                              java.lang.Object value)
        Specified by:
        remove in interface java.util.concurrent.ConcurrentMap<K,​V>
        Specified by:
        remove in interface java.util.Map<K,​V>
        Throws:
        java.lang.NullPointerException - if the specified key is null
      • replace

        public boolean replace​(K key,
                               V oldValue,
                               V newValue)
        Specified by:
        replace in interface java.util.concurrent.ConcurrentMap<K,​V>
        Specified by:
        replace in interface java.util.Map<K,​V>
        Throws:
        java.lang.NullPointerException - if any of the arguments are null
      • replace

        public V replace​(K key,
                         V value)
        Specified by:
        replace in interface java.util.concurrent.ConcurrentMap<K,​V>
        Specified by:
        replace in interface java.util.Map<K,​V>
        Returns:
        the previous value associated with the specified key, or null if there was no mapping for the key
        Throws:
        java.lang.NullPointerException - if the specified key or value is null
      • _putAll

        public void _putAll​(java.util.Map<? extends K,​? extends V> map)
        Specified by:
        _putAll in interface ReplicatedMap<K,​V>
        See Also:
        Map.putAll(java.util.Map)
      • _replace

        public boolean _replace​(K key,
                                V oldValue,
                                V newValue)
        Specified by:
        _replace in interface ReplicatedMap<K,​V>
      • getState

        public void getState​(java.io.OutputStream ostream)
                      throws java.lang.Exception
        Description copied from interface: StateListener
        Allows an application to write a state through a provided OutputStream. After the state has been written the OutputStream doesn't need to be closed as stream closing is automatically done when a calling thread returns from this callback.
        Specified by:
        getState in interface StateListener
        Parameters:
        ostream - the OutputStream
        Throws:
        java.lang.Exception - if the streaming fails, any exceptions should be thrown so that the state requester can re-throw them and let the caller know what happened
        See Also:
        OutputStream.close()
      • setState

        public void setState​(java.io.InputStream istream)
                      throws java.lang.Exception
        Description copied from interface: StateListener
        Allows an application to read a state through a provided InputStream. After the state has been read the InputStream doesn't need to be closed as stream closing is automatically done when a calling thread returns from this callback.
        Specified by:
        setState in interface StateListener
        Parameters:
        istream - the InputStream
        Throws:
        java.lang.Exception - if the streaming fails, any exceptions should be thrown so that the state requester can catch them and thus know what happened
        See Also:
        InputStream.close()
      • viewAccepted

        public void viewAccepted​(View new_view)
        Description copied from interface: MembershipListener
        Called when a change in membership has occurred. No long running actions, sending of messages or anything that could block should be done in this callback. If some long running action needs to be performed, it should be done in a separate thread.

        Note that on reception of the first view (a new member just joined), the channel will not yet be in the connected state. This only happens when JChannel.connect(String) returns.

        Specified by:
        viewAccepted in interface MembershipListener
      • block

        public void block()
        Block sending and receiving of messages until ViewAccepted is called
        Specified by:
        block in interface MembershipListener
      • unblock

        public void unblock()
        Description copied from interface: MembershipListener
        Called after the FLUSH protocol has unblocked previously blocked senders, and messages can be sent again. This callback only needs to be implemented if we require a notification of that.

        Note that during new view installation we provide guarantee that unblock invocation strictly follows view installation at some node A belonging to that view . However, some other message M may squeeze in between view and unblock callbacks. For more details see https://jira.jboss.org/jira/browse/JGRP-986

        Specified by:
        unblock in interface MembershipListener
      • synchronizedMap

        public static <K,​V> ReplicatedMap<K,​V> synchronizedMap​(ReplicatedMap<K,​V> map)
        Creates a synchronized facade for a ReplicatedMap. All methods which change state are invoked through a monitor. This is similar to Collections.synchronizedMap(Map), but also includes the replication methods (starting with an underscore).
        Parameters:
        map -
        Returns:
      • containsKey

        public boolean containsKey​(java.lang.Object key)
        Specified by:
        containsKey in interface java.util.Map<K,​V>
        Overrides:
        containsKey in class java.util.AbstractMap<K,​V>
      • containsValue

        public boolean containsValue​(java.lang.Object value)
        Specified by:
        containsValue in interface java.util.Map<K,​V>
        Overrides:
        containsValue in class java.util.AbstractMap<K,​V>
      • entrySet

        public java.util.Set<java.util.Map.Entry<K,​V>> entrySet()
        Specified by:
        entrySet in interface java.util.Map<K,​V>
        Specified by:
        entrySet in class java.util.AbstractMap<K,​V>
      • get

        public V get​(java.lang.Object key)
        Specified by:
        get in interface java.util.Map<K,​V>
        Overrides:
        get in class java.util.AbstractMap<K,​V>