001/** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019package org.apache.hadoop.yarn.api.records; 020 021import org.apache.hadoop.classification.InterfaceAudience.Private; 022import org.apache.hadoop.classification.InterfaceAudience.Public; 023import org.apache.hadoop.classification.InterfaceStability.Stable; 024import org.apache.hadoop.classification.InterfaceStability.Unstable; 025import org.apache.hadoop.yarn.util.Records; 026 027/** 028 * <p><code>NodeId</code> is the unique identifier for a node.</p> 029 * 030 * <p>It includes the <em>hostname</em> and <em>port</em> to uniquely 031 * identify the node. Thus, it is unique across restarts of any 032 * <code>NodeManager</code>.</p> 033 */ 034@Public 035@Stable 036public abstract class NodeId implements Comparable<NodeId> { 037 038 @Private 039 @Unstable 040 public static NodeId newInstance(String host, int port) { 041 NodeId nodeId = Records.newRecord(NodeId.class); 042 nodeId.setHost(host); 043 nodeId.setPort(port); 044 nodeId.build(); 045 return nodeId; 046 } 047 048 /** 049 * Get the <em>hostname</em> of the node. 050 * @return <em>hostname</em> of the node 051 */ 052 @Public 053 @Stable 054 public abstract String getHost(); 055 056 @Private 057 @Unstable 058 protected abstract void setHost(String host); 059 060 /** 061 * Get the <em>port</em> for communicating with the node. 062 * @return <em>port</em> for communicating with the node 063 */ 064 @Public 065 @Stable 066 public abstract int getPort(); 067 068 @Private 069 @Unstable 070 protected abstract void setPort(int port); 071 072 @Override 073 public String toString() { 074 return this.getHost() + ":" + this.getPort(); 075 } 076 077 @Override 078 public int hashCode() { 079 final int prime = 493217; 080 int result = 8501; 081 result = prime * result + this.getHost().hashCode(); 082 result = prime * result + this.getPort(); 083 return result; 084 } 085 086 @Override 087 public boolean equals(Object obj) { 088 if (this == obj) 089 return true; 090 if (obj == null) 091 return false; 092 if (getClass() != obj.getClass()) 093 return false; 094 NodeId other = (NodeId) obj; 095 if (!this.getHost().equals(other.getHost())) 096 return false; 097 if (this.getPort() != other.getPort()) 098 return false; 099 return true; 100 } 101 102 @Override 103 public int compareTo(NodeId other) { 104 int hostCompare = this.getHost().compareTo(other.getHost()); 105 if (hostCompare == 0) { 106 if (this.getPort() > other.getPort()) { 107 return 1; 108 } else if (this.getPort() < other.getPort()) { 109 return -1; 110 } 111 return 0; 112 } 113 return hostCompare; 114 } 115 116 protected abstract void build(); 117}