Class ReplicatedTree

java.lang.Object
org.jgroups.blocks.ReplicatedTree
All Implemented Interfaces:
Receiver

public class ReplicatedTree extends Object implements Receiver
A tree-like structure that is replicated across several members. Updates will be multicast to all group members reliably and in the same order.
  • Field Details

    • SEPARATOR

      public static final String SEPARATOR
      See Also:
    • INDENT

      static final int INDENT
      See Also:
    • root

    • listeners

    • channel

      JChannel channel
    • groupname

      String groupname
    • members

      final List<Address> members
    • state_fetch_timeout

      long state_fetch_timeout
    • jmx

      boolean jmx
    • log

      protected final Log log
    • remote_calls

      boolean remote_calls
      Whether or not to use remote calls. If false, all methods will be invoked directly on this instance rather than sending a message to all replicas and only then invoking the method. Useful for testing
    • props

      String props
    • send_message

      private boolean send_message
      Determines when the updates have to be sent across the network, avoids sending unnecessary messages when there are no member in the group
  • Constructor Details

    • ReplicatedTree

      public ReplicatedTree(String groupname, String props, long state_fetch_timeout) throws Exception
      Creates a channel with the given properties. Connects to the channel, then creates a PullPushAdapter and starts it
      Throws:
      Exception
    • ReplicatedTree

      public ReplicatedTree(String groupname, String props, long state_fetch_timeout, boolean jmx) throws Exception
      Throws:
      Exception
    • ReplicatedTree

      public ReplicatedTree()
    • ReplicatedTree

      public ReplicatedTree(JChannel channel) throws Exception
      Expects an already connected channel. Creates a PullPushAdapter and starts it
      Throws:
      Exception
  • Method Details

    • setRemoteCalls

      public void setRemoteCalls(boolean flag)
    • setRootNode

      public void setRootNode(ReplicatedTree.Node n)
    • getLocalAddress

      public Address getLocalAddress()
    • getMembers

      public List<Address> getMembers()
    • fetchState

      public void fetchState(long timeout) throws Exception
      Fetch the group state from the current coordinator. If successful, this will trigger setState().
      Throws:
      Exception
    • addReplicatedTreeListener

      public void addReplicatedTreeListener(ReplicatedTree.ReplicatedTreeListener listener)
    • removeReplicatedTreeListener

      public void removeReplicatedTreeListener(ReplicatedTree.ReplicatedTreeListener listener)
    • start

      public final void start() throws Exception
      Throws:
      Exception
    • stop

      public void stop()
    • put

      public void put(String fqn, HashMap data)
      Adds a new node to the tree and sets its data. If the node doesn not yet exist, it will be created. Also, parent nodes will be created if not existent. If the node already has data, then the new data will override the old one. If the node already existed, a nodeModified() notification will be generated. Otherwise a nodeCreated() motification will be emitted.
      Parameters:
      fqn - The fully qualified name of the new node
      data - The new data. May be null if no data should be set in the node.
    • put

      public void put(String fqn, String key, Object value)
      Adds a key and value to a given node. If the node doesn't exist, it will be created. If the node already existed, a nodeModified() notification will be generated. Otherwise a nodeCreated() motification will be emitted.
      Parameters:
      fqn - The fully qualified name of the node
      key - The key
      value - The value
    • remove

      public void remove(String fqn)
      Removes the node from the tree.
      Parameters:
      fqn - The fully qualified name of the node.
    • remove

      public void remove(String fqn, String key)
      Removes key from the node's hashmap
      Parameters:
      fqn - The fullly qualified name of the node
      key - The key to be removed
    • exists

      public boolean exists(String fqn)
      Checks whether a given node exists in the tree
      Parameters:
      fqn - The fully qualified name of the node
      Returns:
      boolean Whether or not the node exists
    • getKeys

      public Set getKeys(String fqn)
      Gets the keys of the data map. Returns all keys as Strings. Returns null if node does not exist.
      Parameters:
      fqn - The fully qualified name of the node
      Returns:
      Set A set of keys (as Strings)
    • get

      public Object get(String fqn, String key)
      Finds a node given its name and returns the value associated with a given key in its data map. Returns null if the node was not found in the tree or the key was not found in the hashmap.
      Parameters:
      fqn - The fully qualified name of the node.
      key - The key.
    • get

      Map<String,Object> get(String fqn)
      Returns the data hashmap for a given node. This method can only be used by callers that are inside the same package. The reason is that callers must not modify the return value, as these modifications would not be replicated, thus rendering the replicas inconsistent.
      Parameters:
      fqn - The fully qualified name of the node
      Returns:
      HashMap The data hashmap for the given node
    • print

      public String print(String fqn)
      Prints a representation of the node defined by fqn. Output includes name, fqn and data.
    • getChildrenNames

      public Set getChildrenNames(String fqn)
      Returns all children of a given node
      Parameters:
      fqn - The fully qualified name of the node
      Returns:
      Set A list of child names (as Strings)
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • getGroupName

      public String getGroupName()
      Returns the name of the group that the DistributedTree is connected to
      Returns:
      String
    • getChannel

      public JChannel getChannel()
      Returns the Channel the DistributedTree is connected to
      Returns:
      Channel
    • getGroupMembersNumber

      public int getGroupMembersNumber()
      Returns the number of current members joined to the group
      Returns:
      int
    • _put

      public void _put(String fqn, HashMap data)
    • _put

      public void _put(String fqn, String key, Object value)
    • _remove

      public void _remove(String fqn)
    • _remove

      public void _remove(String fqn, String key)
    • _removeData

      public void _removeData(String fqn)
    • receive

      public void receive(Message msg)
      Callback. Process the contents of the message; typically an _add() or _set() request
      Specified by:
      receive in interface Receiver
      Parameters:
      msg - The message
    • getState

      public void getState(OutputStream ostream) throws Exception
      Description copied from interface: Receiver
      Allows an application to write the state to an 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 Receiver
      Parameters:
      ostream - The OutputStream
      Throws:
      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
    • setState

      public void setState(InputStream istream) throws Exception
      Description copied from interface: Receiver
      Allows an application to read the state from an 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 Receiver
      Parameters:
      istream - The InputStream
      Throws:
      Exception - If the streaming fails, any exceptions should be thrown so that the state requester can catch them and thus know what happened
    • viewAccepted

      public void viewAccepted(View new_view)
      Description copied from interface: Receiver
      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 Receiver
    • findParentNode

      ReplicatedTree.Node findParentNode(String fqn, ReplicatedTree.StringHolder child_name, boolean create_if_not_exists)
      Find the node just above the one indicated by fqn. This is needed in many cases, e.g. to add a new node or remove an existing node.
      Parameters:
      fqn - The fully qualified name of the node.
      child_name - Will be filled with the name of the child when this method returns. The child name is the last relative name of the fqn, e.g. in "/a/b/c" it would be "c".
      create_if_not_exists - Create parent nodes along the way if they don't exist. Otherwise, this method will return when a node cannot be found.
    • findNode

      ReplicatedTree.Node findNode(String fqn)
      Returns the node at fqn. This method should not be used by clients (therefore it is package-private): it is only used internally (for navigation). C++ 'friend' would come in handy here...
      Parameters:
      fqn - The fully qualified name of the node
      Returns:
      Node The node at fqn
    • notifyNodeAdded

      void notifyNodeAdded(String fqn)
    • notifyNodeRemoved

      void notifyNodeRemoved(String fqn)
    • notifyNodeModified

      void notifyNodeModified(String fqn)
    • notifyViewChange

      void notifyViewChange(View v)
    • notifyAllNodesCreated

      void notifyAllNodesCreated(ReplicatedTree.Node curr)
      Generates NodeAdded notifications for all nodes of the tree. This is called whenever the tree is initially retrieved (state transfer)
    • main

      public static void main(String[] args)