Class NetworkTopologyImpl

java.lang.Object
org.apache.bookkeeper.net.NetworkTopologyImpl
All Implemented Interfaces:
NetworkTopology

public class NetworkTopologyImpl extends Object implements NetworkTopology
The class represents a cluster of computer with a tree hierarchical network topology. For example, a cluster may be consists of many data centers filled with racks of computers. In a network topology, leaves represent data nodes (computers) and inner nodes represent switches/routers that manage traffic in/out of data centers or racks.
  • Field Details

  • Constructor Details

    • NetworkTopologyImpl

      public NetworkTopologyImpl()
  • Method Details

    • add

      public void add(Node node)
      Add a leaf node. Update node counter and rack counter if necessary
      Specified by:
      add in interface NetworkTopology
      Parameters:
      node - node to be added; can be null
      Throws:
      IllegalArgumentException - if add a node to a leave or node to be added is not a leaf
    • getNodeForNetworkLocation

      protected Node getNodeForNetworkLocation(Node node)
      Return a reference to the node given its string representation. Default implementation delegates to getNode(String).

      To be overridden in subclasses for specific NetworkTopology implementations, as alternative to overriding the full add(Node) method.

      Parameters:
      node - The string representation of this node's network location is used to retrieve a Node object.
      Returns:
      a reference to the node; null if the node is not in the tree
      See Also:
    • getDatanodesInRack

      public List<Node> getDatanodesInRack(String loc)
      Given a string representation of a rack, return its children.
      Parameters:
      loc - a path-like string representation of a rack
      Returns:
      a newly allocated list with all the node's children
    • remove

      public void remove(Node node)
      Remove a node. Update node counter and rack counter if necessary.
      Specified by:
      remove in interface NetworkTopology
      Parameters:
      node - node to be removed; can be null
    • contains

      public boolean contains(Node node)
      Check if the tree contains node node.
      Specified by:
      contains in interface NetworkTopology
      Parameters:
      node - a node
      Returns:
      true if node is already in the tree; false otherwise
    • getNode

      public Node getNode(String loc)
      Given a string representation of a node, return its reference.
      Specified by:
      getNode in interface NetworkTopology
      Parameters:
      loc - a path-like string representation of a node
      Returns:
      a reference to the node; null if the node is not in the tree
    • getRack

      public String getRack(String loc)
      Given a string representation of a rack for a specific network location.

      To be overridden in subclasses for specific NetworkTopology implementations, as alternative to overriding the full getRack(String) method.

      Parameters:
      loc - a path-like string representation of a network location
      Returns:
      a rack string
    • getNumOfRacks

      public int getNumOfRacks()
      Description copied from interface: NetworkTopology
      Returns number of racks in the network topology.
      Specified by:
      getNumOfRacks in interface NetworkTopology
      Returns:
      the total number of racks
    • getNumOfLeaves

      public int getNumOfLeaves()
      Returns:
      the total number of leaf nodes
    • getDistance

      public int getDistance(Node node1, Node node2)
      Return the distance between two nodes.

      It is assumed that the distance from one node to its parent is 1 The distance between two nodes is calculated by summing up their distances to their closest common ancestor.

      Parameters:
      node1 - one node
      node2 - another node
      Returns:
      the distance between node1 and node2 which is zero if they are the same or Integer.MAX_VALUE if node1 or node2 do not belong to the cluster
    • isOnSameRack

      public boolean isOnSameRack(Node node1, Node node2)
      Check if two nodes are on the same rack.
      Parameters:
      node1 - one node (can be null)
      node2 - another node (can be null)
      Returns:
      true if node1 and node2 are on the same rack; false otherwise
      Throws:
      IllegalArgumentException - when either node1 or node2 is null, or node1 or node2 do not belong to the cluster
    • isNodeGroupAware

      public boolean isNodeGroupAware()
      Check if network topology is aware of NodeGroup.
    • isOnSameNodeGroup

      public boolean isOnSameNodeGroup(Node node1, Node node2)
      Return false directly as not aware of NodeGroup, to be override in sub-class.
    • isSameParents

      protected boolean isSameParents(Node node1, Node node2)
      Compare the parents of each node for equality.

      To be overridden in subclasses for specific NetworkTopology implementations, as alternative to overriding the full isOnSameRack(Node, Node) method.

      Parameters:
      node1 - the first node to compare
      node2 - the second node to compare
      Returns:
      true if their parents are equal, false otherwise
      See Also:
    • chooseRandom

      public Node chooseRandom(String scope)
      Randomly choose one node from scope.

      If scope starts with ~, choose one from the all nodes except for the ones in scope; otherwise, choose one from scope.

      Parameters:
      scope - range of nodes from which a node will be chosen
      Returns:
      the chosen node
    • getLeaves

      public Set<Node> getLeaves(String scope)
      Description copied from interface: NetworkTopology
      Returns the nodes under a location.
      Specified by:
      getLeaves in interface NetworkTopology
      Parameters:
      scope - network location
      Returns:
      nodes under a location
    • countNumOfAvailableNodes

      public int countNumOfAvailableNodes(String scope, Collection<Node> excludedNodes)
      Description copied from interface: NetworkTopology
      Return the number of leaves in scope but not in excludedNodes.

      If scope starts with ~, return the number of nodes that are not in scope and excludedNodes;

      Specified by:
      countNumOfAvailableNodes in interface NetworkTopology
      Parameters:
      scope - a path string that may start with ~
      excludedNodes - a list of nodes
      Returns:
      number of available nodes
    • toString

      public String toString()
      Convert a network tree to a string.
      Overrides:
      toString in class Object
    • getFirstHalf

      public static String getFirstHalf(String networkLocation)
      Divide networklocation string into two parts by last separator, and get the first part here.
      Parameters:
      networkLocation -
      Returns:
    • getLastHalf

      public static String getLastHalf(String networkLocation)
      Divide networklocation string into two parts by last separator, and get the second part here.
      Parameters:
      networkLocation -
      Returns:
    • swap

      protected static void swap(Node[] nodes, int i, int j)
      Swap two array items.
    • pseudoSortByDistance

      public void pseudoSortByDistance(Node reader, Node[] nodes)
      Sort nodes array by their distances to reader It linearly scans the array, if a local node is found, swap it with the first element of the array. If a local rack node is found, swap it with the first element following the local node. If neither local node or local rack node is found, put a random replica location at position 0. It leaves the rest nodes untouched.
      Parameters:
      reader - the node that wishes to read a block from one of the nodes
      nodes - the list of nodes containing data for the reader