DatanodeID.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.protocol;
  19. import java.io.DataInput;
  20. import java.io.DataOutput;
  21. import java.io.IOException;
  22. import org.apache.hadoop.io.UTF8;
  23. import org.apache.hadoop.io.WritableComparable;
  24. /**
  25.  * DatanodeID is composed of the data node 
  26.  * name (hostname:portNumber) and the data storage ID, 
  27.  * which it currently represents.
  28.  * 
  29.  */
  30. public class DatanodeID implements WritableComparable<DatanodeID> {
  31.   public static final DatanodeID[] EMPTY_ARRAY = {}; 
  32.   public String name;      /// hostname:portNumber
  33.   public String storageID; /// unique per cluster storageID
  34.   protected int infoPort;     /// the port where the infoserver is running
  35.   public int ipcPort;     /// the port where the ipc server is running
  36.   /** Equivalent to DatanodeID(""). */
  37.   public DatanodeID() {this("");}
  38.   /** Equivalent to DatanodeID(nodeName, "", -1, -1). */
  39.   public DatanodeID(String nodeName) {this(nodeName, "", -1, -1);}
  40.   /**
  41.    * DatanodeID copy constructor
  42.    * 
  43.    * @param from
  44.    */
  45.   public DatanodeID(DatanodeID from) {
  46.     this(from.getName(),
  47.         from.getStorageID(),
  48.         from.getInfoPort(),
  49.         from.getIpcPort());
  50.   }
  51.   
  52.   /**
  53.    * Create DatanodeID
  54.    * @param nodeName (hostname:portNumber) 
  55.    * @param storageID data storage ID
  56.    * @param infoPort info server port 
  57.    * @param ipcPort ipc server port
  58.    */
  59.   public DatanodeID(String nodeName, String storageID,
  60.       int infoPort, int ipcPort) {
  61.     this.name = nodeName;
  62.     this.storageID = storageID;
  63.     this.infoPort = infoPort;
  64.     this.ipcPort = ipcPort;
  65.   }
  66.   
  67.   /**
  68.    * @return hostname:portNumber.
  69.    */
  70.   public String getName() {
  71.     return name;
  72.   }
  73.   
  74.   /**
  75.    * @return data storage ID.
  76.    */
  77.   public String getStorageID() {
  78.     return this.storageID;
  79.   }
  80.   /**
  81.    * @return infoPort (the port at which the HTTP server bound to)
  82.    */
  83.   public int getInfoPort() {
  84.     return infoPort;
  85.   }
  86.   /**
  87.    * @return ipcPort (the port at which the IPC server bound to)
  88.    */
  89.   public int getIpcPort() {
  90.     return ipcPort;
  91.   }
  92.   /**
  93.    * sets the data storage ID.
  94.    */
  95.   public void setStorageID(String storageID) {
  96.     this.storageID = storageID;
  97.   }
  98.   /**
  99.    * @return hostname and no :portNumber.
  100.    */
  101.   public String getHost() {
  102.     int colon = name.indexOf(":");
  103.     if (colon < 0) {
  104.       return name;
  105.     } else {
  106.       return name.substring(0, colon);
  107.     }
  108.   }
  109.   
  110.   public int getPort() {
  111.     int colon = name.indexOf(":");
  112.     if (colon < 0) {
  113.       return 50010; // default port.
  114.     }
  115.     return Integer.parseInt(name.substring(colon+1));
  116.   }
  117.   public boolean equals(Object to) {
  118.     if (this == to) {
  119.       return true;
  120.     }
  121.     if (!(to instanceof DatanodeID)) {
  122.       return false;
  123.     }
  124.     return (name.equals(((DatanodeID)to).getName()) &&
  125.             storageID.equals(((DatanodeID)to).getStorageID()));
  126.   }
  127.   
  128.   public int hashCode() {
  129.     return name.hashCode()^ storageID.hashCode();
  130.   }
  131.   
  132.   public String toString() {
  133.     return name;
  134.   }
  135.   
  136.   /**
  137.    * Update fields when a new registration request comes in.
  138.    * Note that this does not update storageID.
  139.    */
  140.   public void updateRegInfo(DatanodeID nodeReg) {
  141.     name = nodeReg.getName();
  142.     infoPort = nodeReg.getInfoPort();
  143.     // update any more fields added in future.
  144.   }
  145.     
  146.   /** Comparable.
  147.    * Basis of compare is the String name (host:portNumber) only.
  148.    * @param that
  149.    * @return as specified by Comparable.
  150.    */
  151.   public int compareTo(DatanodeID that) {
  152.     return name.compareTo(that.getName());
  153.   }
  154.   /////////////////////////////////////////////////
  155.   // Writable
  156.   /////////////////////////////////////////////////
  157.   /** {@inheritDoc} */
  158.   public void write(DataOutput out) throws IOException {
  159.     UTF8.writeString(out, name);
  160.     UTF8.writeString(out, storageID);
  161.     out.writeShort(infoPort);
  162.   }
  163.   /** {@inheritDoc} */
  164.   public void readFields(DataInput in) throws IOException {
  165.     name = UTF8.readString(in);
  166.     storageID = UTF8.readString(in);
  167.     // the infoPort read could be negative, if the port is a large number (more
  168.     // than 15 bits in storage size (but less than 16 bits).
  169.     // So chop off the first two bytes (and hence the signed bits) before 
  170.     // setting the field.
  171.     this.infoPort = in.readShort() & 0x0000ffff;
  172.   }
  173. }