Host2NodesMap.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:5k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.hdfs.server.namenode;
  19. import java.util.*;
  20. import java.util.concurrent.locks.ReadWriteLock;
  21. import java.util.concurrent.locks.ReentrantReadWriteLock;
  22. class Host2NodesMap {
  23.   private HashMap<String, DatanodeDescriptor[]> map
  24.     = new HashMap<String, DatanodeDescriptor[]>();
  25.   private Random r = new Random();
  26.   private ReadWriteLock hostmapLock = new ReentrantReadWriteLock();
  27.                       
  28.   /** Check if node is already in the map. */
  29.   boolean contains(DatanodeDescriptor node) {
  30.     if (node==null) {
  31.       return false;
  32.     }
  33.       
  34.     String host = node.getHost();
  35.     hostmapLock.readLock().lock();
  36.     try {
  37.       DatanodeDescriptor[] nodes = map.get(host);
  38.       if (nodes != null) {
  39.         for(DatanodeDescriptor containedNode:nodes) {
  40.           if (node==containedNode) {
  41.             return true;
  42.           }
  43.         }
  44.       }
  45.     } finally {
  46.       hostmapLock.readLock().unlock();
  47.     }
  48.     return false;
  49.   }
  50.     
  51.   /** add node to the map 
  52.    * return true if the node is added; false otherwise.
  53.    */
  54.   boolean add(DatanodeDescriptor node) {
  55.     hostmapLock.writeLock().lock();
  56.     try {
  57.       if (node==null || contains(node)) {
  58.         return false;
  59.       }
  60.       
  61.       String host = node.getHost();
  62.       DatanodeDescriptor[] nodes = map.get(host);
  63.       DatanodeDescriptor[] newNodes;
  64.       if (nodes==null) {
  65.         newNodes = new DatanodeDescriptor[1];
  66.         newNodes[0]=node;
  67.       } else { // rare case: more than one datanode on the host
  68.         newNodes = new DatanodeDescriptor[nodes.length+1];
  69.         System.arraycopy(nodes, 0, newNodes, 0, nodes.length);
  70.         newNodes[nodes.length] = node;
  71.       }
  72.       map.put(host, newNodes);
  73.       return true;
  74.     } finally {
  75.       hostmapLock.writeLock().unlock();
  76.     }
  77.   }
  78.     
  79.   /** remove node from the map 
  80.    * return true if the node is removed; false otherwise.
  81.    */
  82.   boolean remove(DatanodeDescriptor node) {
  83.     if (node==null) {
  84.       return false;
  85.     }
  86.       
  87.     String host = node.getHost();
  88.     hostmapLock.writeLock().lock();
  89.     try {
  90.       DatanodeDescriptor[] nodes = map.get(host);
  91.       if (nodes==null) {
  92.         return false;
  93.       }
  94.       if (nodes.length==1) {
  95.         if (nodes[0]==node) {
  96.           map.remove(host);
  97.           return true;
  98.         } else {
  99.           return false;
  100.         }
  101.       }
  102.       //rare case
  103.       int i=0;
  104.       for(; i<nodes.length; i++) {
  105.         if (nodes[i]==node) {
  106.           break;
  107.         }
  108.       }
  109.       if (i==nodes.length) {
  110.         return false;
  111.       } else {
  112.         DatanodeDescriptor[] newNodes;
  113.         newNodes = new DatanodeDescriptor[nodes.length-1];
  114.         System.arraycopy(nodes, 0, newNodes, 0, i);
  115.         System.arraycopy(nodes, i+1, newNodes, i, nodes.length-i-1);
  116.         map.put(host, newNodes);
  117.         return true;
  118.       }
  119.     } finally {
  120.       hostmapLock.writeLock().unlock();
  121.     }
  122.   }
  123.     
  124.   /** get a data node by its host.
  125.    * @return DatanodeDescriptor if found; otherwise null.
  126.    */
  127.   DatanodeDescriptor getDatanodeByHost(String host) {
  128.     if (host==null) {
  129.       return null;
  130.     }
  131.       
  132.     hostmapLock.readLock().lock();
  133.     try {
  134.       DatanodeDescriptor[] nodes = map.get(host);
  135.       // no entry
  136.       if (nodes== null) {
  137.         return null;
  138.       }
  139.       // one node
  140.       if (nodes.length == 1) {
  141.         return nodes[0];
  142.       }
  143.       // more than one node
  144.       return nodes[r.nextInt(nodes.length)];
  145.     } finally {
  146.       hostmapLock.readLock().unlock();
  147.     }
  148.   }
  149.     
  150.   /**
  151.    * Find data node by its name.
  152.    * 
  153.    * @return DatanodeDescriptor if found or null otherwise 
  154.    */
  155.   public DatanodeDescriptor getDatanodeByName(String name) {
  156.     if (name==null) {
  157.       return null;
  158.     }
  159.       
  160.     int colon = name.indexOf(":");
  161.     String host;
  162.     if (colon < 0) {
  163.       host = name;
  164.     } else {
  165.       host = name.substring(0, colon);
  166.     }
  167.     hostmapLock.readLock().lock();
  168.     try {
  169.       DatanodeDescriptor[] nodes = map.get(host);
  170.       // no entry
  171.       if (nodes== null) {
  172.         return null;
  173.       }
  174.       for(DatanodeDescriptor containedNode:nodes) {
  175.         if (name.equals(containedNode.getName())) {
  176.           return containedNode;
  177.         }
  178.       }
  179.       return null;
  180.     } finally {
  181.       hostmapLock.readLock().unlock();
  182.     }
  183.   }
  184. }