diff --git a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/RegionServerStatusProtos.java b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/RegionServerStatusProtos.java index ec169d5..18d96bb 100644 --- a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/RegionServerStatusProtos.java +++ b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/RegionServerStatusProtos.java @@ -64,6 +64,33 @@ public final class RegionServerStatusProtos { * */ long getServerCurrentTime(); + + // optional string hostname = 4; + /** + * optional string hostname = 4; + * + *
+     ** hostname for region server, optional 
+     * 
+ */ + boolean hasHostname(); + /** + * optional string hostname = 4; + * + *
+     ** hostname for region server, optional 
+     * 
+ */ + java.lang.String getHostname(); + /** + * optional string hostname = 4; + * + *
+     ** hostname for region server, optional 
+     * 
+ */ + com.google.protobuf.ByteString + getHostnameBytes(); } /** * Protobuf type {@code RegionServerStartupRequest} @@ -131,6 +158,11 @@ public final class RegionServerStatusProtos { serverCurrentTime_ = input.readUInt64(); break; } + case 34: { + bitField0_ |= 0x00000008; + hostname_ = input.readBytes(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -243,10 +275,66 @@ public final class RegionServerStatusProtos { return serverCurrentTime_; } + // optional string hostname = 4; + public static final int HOSTNAME_FIELD_NUMBER = 4; + private java.lang.Object hostname_; + /** + * optional string hostname = 4; + * + *
+     ** hostname for region server, optional 
+     * 
+ */ + public boolean hasHostname() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string hostname = 4; + * + *
+     ** hostname for region server, optional 
+     * 
+ */ + public java.lang.String getHostname() { + java.lang.Object ref = hostname_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + hostname_ = s; + } + return s; + } + } + /** + * optional string hostname = 4; + * + *
+     ** hostname for region server, optional 
+     * 
+ */ + public com.google.protobuf.ByteString + getHostnameBytes() { + java.lang.Object ref = hostname_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + hostname_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + private void initFields() { port_ = 0; serverStartCode_ = 0L; serverCurrentTime_ = 0L; + hostname_ = ""; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -281,6 +369,9 @@ public final class RegionServerStatusProtos { if (((bitField0_ & 0x00000004) == 0x00000004)) { output.writeUInt64(3, serverCurrentTime_); } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + output.writeBytes(4, getHostnameBytes()); + } getUnknownFields().writeTo(output); } @@ -302,6 +393,10 @@ public final class RegionServerStatusProtos { size += com.google.protobuf.CodedOutputStream .computeUInt64Size(3, serverCurrentTime_); } + if (((bitField0_ & 0x00000008) == 0x00000008)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, getHostnameBytes()); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -340,6 +435,11 @@ public final class RegionServerStatusProtos { result = result && (getServerCurrentTime() == other.getServerCurrentTime()); } + result = result && (hasHostname() == other.hasHostname()); + if (hasHostname()) { + result = result && getHostname() + .equals(other.getHostname()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -365,6 +465,10 @@ public final class RegionServerStatusProtos { hash = (37 * hash) + SERVER_CURRENT_TIME_FIELD_NUMBER; hash = (53 * hash) + hashLong(getServerCurrentTime()); } + if (hasHostname()) { + hash = (37 * hash) + HOSTNAME_FIELD_NUMBER; + hash = (53 * hash) + getHostname().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -480,6 +584,8 @@ public final class RegionServerStatusProtos { bitField0_ = (bitField0_ & ~0x00000002); serverCurrentTime_ = 0L; bitField0_ = (bitField0_ & ~0x00000004); + hostname_ = ""; + bitField0_ = (bitField0_ & ~0x00000008); return this; } @@ -520,6 +626,10 @@ public final class RegionServerStatusProtos { to_bitField0_ |= 0x00000004; } result.serverCurrentTime_ = serverCurrentTime_; + if (((from_bitField0_ & 0x00000008) == 0x00000008)) { + to_bitField0_ |= 0x00000008; + } + result.hostname_ = hostname_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -545,6 +655,11 @@ public final class RegionServerStatusProtos { if (other.hasServerCurrentTime()) { setServerCurrentTime(other.getServerCurrentTime()); } + if (other.hasHostname()) { + bitField0_ |= 0x00000008; + hostname_ = other.hostname_; + onChanged(); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -731,6 +846,104 @@ public final class RegionServerStatusProtos { return this; } + // optional string hostname = 4; + private java.lang.Object hostname_ = ""; + /** + * optional string hostname = 4; + * + *
+       ** hostname for region server, optional 
+       * 
+ */ + public boolean hasHostname() { + return ((bitField0_ & 0x00000008) == 0x00000008); + } + /** + * optional string hostname = 4; + * + *
+       ** hostname for region server, optional 
+       * 
+ */ + public java.lang.String getHostname() { + java.lang.Object ref = hostname_; + if (!(ref instanceof java.lang.String)) { + java.lang.String s = ((com.google.protobuf.ByteString) ref) + .toStringUtf8(); + hostname_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * optional string hostname = 4; + * + *
+       ** hostname for region server, optional 
+       * 
+ */ + public com.google.protobuf.ByteString + getHostnameBytes() { + java.lang.Object ref = hostname_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + hostname_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * optional string hostname = 4; + * + *
+       ** hostname for region server, optional 
+       * 
+ */ + public Builder setHostname( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + hostname_ = value; + onChanged(); + return this; + } + /** + * optional string hostname = 4; + * + *
+       ** hostname for region server, optional 
+       * 
+ */ + public Builder clearHostname() { + bitField0_ = (bitField0_ & ~0x00000008); + hostname_ = getDefaultInstance().getHostname(); + onChanged(); + return this; + } + /** + * optional string hostname = 4; + * + *
+       ** hostname for region server, optional 
+       * 
+ */ + public Builder setHostnameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000008; + hostname_ = value; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:RegionServerStartupRequest) } @@ -8399,47 +8612,47 @@ public final class RegionServerStatusProtos { static { java.lang.String[] descriptorData = { "\n\030RegionServerStatus.proto\032\013HBase.proto\032" + - "\023ClusterStatus.proto\"b\n\032RegionServerStar" + + "\023ClusterStatus.proto\"t\n\032RegionServerStar" + "tupRequest\022\014\n\004port\030\001 \002(\r\022\031\n\021server_start" + "_code\030\002 \002(\004\022\033\n\023server_current_time\030\003 \002(\004" + - "\"C\n\033RegionServerStartupResponse\022$\n\013map_e" + - "ntries\030\001 \003(\0132\017.NameStringPair\"S\n\031RegionS" + - "erverReportRequest\022\033\n\006server\030\001 \002(\0132\013.Ser" + - "verName\022\031\n\004load\030\002 \001(\0132\013.ServerLoad\"\034\n\032Re" + - "gionServerReportResponse\"O\n\031ReportRSFata" + - "lErrorRequest\022\033\n\006server\030\001 \002(\0132\013.ServerNa", - "me\022\025\n\rerror_message\030\002 \002(\t\"\034\n\032ReportRSFat" + - "alErrorResponse\"6\n\037GetLastFlushedSequenc" + - "eIdRequest\022\023\n\013region_name\030\001 \002(\014\"D\n GetLa" + - "stFlushedSequenceIdResponse\022 \n\030last_flus" + - "hed_sequence_id\030\001 \002(\004\"\322\002\n\025RegionStateTra" + - "nsition\022>\n\017transition_code\030\001 \002(\0162%.Regio" + - "nStateTransition.TransitionCode\022 \n\013regio" + - "n_info\030\002 \003(\0132\013.RegionInfo\022\024\n\014open_seq_nu" + - "m\030\003 \001(\004\"\300\001\n\016TransitionCode\022\n\n\006OPENED\020\000\022\017" + - "\n\013FAILED_OPEN\020\001\022\n\n\006CLOSED\020\002\022\022\n\016READY_TO_", - "SPLIT\020\003\022\022\n\016READY_TO_MERGE\020\004\022\016\n\nSPLIT_PON" + - "R\020\005\022\016\n\nMERGE_PONR\020\006\022\t\n\005SPLIT\020\007\022\n\n\006MERGED" + - "\020\010\022\022\n\016SPLIT_REVERTED\020\t\022\022\n\016MERGE_REVERTED" + - "\020\n\"m\n\"ReportRegionStateTransitionRequest" + - "\022\033\n\006server\030\001 \002(\0132\013.ServerName\022*\n\ntransit" + - "ion\030\002 \003(\0132\026.RegionStateTransition\"<\n#Rep" + - "ortRegionStateTransitionResponse\022\025\n\rerro" + - "r_message\030\001 \001(\t2\326\003\n\031RegionServerStatusSe" + - "rvice\022P\n\023RegionServerStartup\022\033.RegionSer" + - "verStartupRequest\032\034.RegionServerStartupR", - "esponse\022M\n\022RegionServerReport\022\032.RegionSe" + - "rverReportRequest\032\033.RegionServerReportRe" + - "sponse\022M\n\022ReportRSFatalError\022\032.ReportRSF" + - "atalErrorRequest\032\033.ReportRSFatalErrorRes" + - "ponse\022_\n\030GetLastFlushedSequenceId\022 .GetL" + - "astFlushedSequenceIdRequest\032!.GetLastFlu" + - "shedSequenceIdResponse\022h\n\033ReportRegionSt" + - "ateTransition\022#.ReportRegionStateTransit" + - "ionRequest\032$.ReportRegionStateTransition" + - "ResponseBN\n*org.apache.hadoop.hbase.prot", - "obuf.generatedB\030RegionServerStatusProtos" + - "H\001\210\001\001\240\001\001" + "\022\020\n\010hostname\030\004 \001(\t\"C\n\033RegionServerStartu" + + "pResponse\022$\n\013map_entries\030\001 \003(\0132\017.NameStr" + + "ingPair\"S\n\031RegionServerReportRequest\022\033\n\006" + + "server\030\001 \002(\0132\013.ServerName\022\031\n\004load\030\002 \001(\0132" + + "\013.ServerLoad\"\034\n\032RegionServerReportRespon" + + "se\"O\n\031ReportRSFatalErrorRequest\022\033\n\006serve", + "r\030\001 \002(\0132\013.ServerName\022\025\n\rerror_message\030\002 " + + "\002(\t\"\034\n\032ReportRSFatalErrorResponse\"6\n\037Get" + + "LastFlushedSequenceIdRequest\022\023\n\013region_n" + + "ame\030\001 \002(\014\"D\n GetLastFlushedSequenceIdRes" + + "ponse\022 \n\030last_flushed_sequence_id\030\001 \002(\004\"" + + "\322\002\n\025RegionStateTransition\022>\n\017transition_" + + "code\030\001 \002(\0162%.RegionStateTransition.Trans" + + "itionCode\022 \n\013region_info\030\002 \003(\0132\013.RegionI" + + "nfo\022\024\n\014open_seq_num\030\003 \001(\004\"\300\001\n\016Transition" + + "Code\022\n\n\006OPENED\020\000\022\017\n\013FAILED_OPEN\020\001\022\n\n\006CLO", + "SED\020\002\022\022\n\016READY_TO_SPLIT\020\003\022\022\n\016READY_TO_ME" + + "RGE\020\004\022\016\n\nSPLIT_PONR\020\005\022\016\n\nMERGE_PONR\020\006\022\t\n" + + "\005SPLIT\020\007\022\n\n\006MERGED\020\010\022\022\n\016SPLIT_REVERTED\020\t" + + "\022\022\n\016MERGE_REVERTED\020\n\"m\n\"ReportRegionStat" + + "eTransitionRequest\022\033\n\006server\030\001 \002(\0132\013.Ser" + + "verName\022*\n\ntransition\030\002 \003(\0132\026.RegionStat" + + "eTransition\"<\n#ReportRegionStateTransiti" + + "onResponse\022\025\n\rerror_message\030\001 \001(\t2\326\003\n\031Re" + + "gionServerStatusService\022P\n\023RegionServerS" + + "tartup\022\033.RegionServerStartupRequest\032\034.Re", + "gionServerStartupResponse\022M\n\022RegionServe" + + "rReport\022\032.RegionServerReportRequest\032\033.Re" + + "gionServerReportResponse\022M\n\022ReportRSFata" + + "lError\022\032.ReportRSFatalErrorRequest\032\033.Rep" + + "ortRSFatalErrorResponse\022_\n\030GetLastFlushe" + + "dSequenceId\022 .GetLastFlushedSequenceIdRe" + + "quest\032!.GetLastFlushedSequenceIdResponse" + + "\022h\n\033ReportRegionStateTransition\022#.Report" + + "RegionStateTransitionRequest\032$.ReportReg" + + "ionStateTransitionResponseBN\n*org.apache", + ".hadoop.hbase.protobuf.generatedB\030Region" + + "ServerStatusProtosH\001\210\001\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -8451,7 +8664,7 @@ public final class RegionServerStatusProtos { internal_static_RegionServerStartupRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_RegionServerStartupRequest_descriptor, - new java.lang.String[] { "Port", "ServerStartCode", "ServerCurrentTime", }); + new java.lang.String[] { "Port", "ServerStartCode", "ServerCurrentTime", "Hostname", }); internal_static_RegionServerStartupResponse_descriptor = getDescriptor().getMessageTypes().get(1); internal_static_RegionServerStartupResponse_fieldAccessorTable = new diff --git a/hbase-protocol/src/main/protobuf/RegionServerStatus.proto b/hbase-protocol/src/main/protobuf/RegionServerStatus.proto index 75e5ae4..8a26793 100644 --- a/hbase-protocol/src/main/protobuf/RegionServerStatus.proto +++ b/hbase-protocol/src/main/protobuf/RegionServerStatus.proto @@ -36,6 +36,9 @@ message RegionServerStartupRequest { /** Current time of the region server in ms */ required uint64 server_current_time = 3; + + /** hostname for region server, optional */ + optional string hostname = 4; } message RegionServerStartupResponse { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index 0e81461..25b5ba1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -302,7 +302,8 @@ public class MasterRpcServices extends RSRpcServices master.checkServiceStarted(); InetAddress ia = master.getRemoteInetAddress( request.getPort(), request.getServerStartCode()); - ServerName rs = master.serverManager.regionServerStartup(ia, request.getPort(), + ServerName rs = master.serverManager.regionServerStartup( + request.hasHostname() ? null : ia, request.getHostname(), request.getPort(), request.getServerStartCode(), request.getServerCurrentTime()); // Send back some config info diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java index 69c29fd..bdaa256 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java @@ -230,13 +230,14 @@ public class ServerManager { /** * Let the server manager know a new regionserver has come online * @param ia The remote address + * @param hostname the hostname * @param port The remote port * @param serverStartcode * @param serverCurrentTime The current time of the region server in ms * @return The ServerName we know this server as. * @throws IOException */ - ServerName regionServerStartup(final InetAddress ia, final int port, + ServerName regionServerStartup(final InetAddress ia, final String hostname, final int port, final long serverStartcode, long serverCurrentTime) throws IOException { // Test for case where we get a region startup message from a regionserver @@ -246,7 +247,8 @@ public class ServerManager { // is, reject the server and trigger its expiration. The next time it comes // in, it should have been removed from serverAddressToServerInfo and queued // for processing by ProcessServerShutdown. - ServerName sn = ServerName.valueOf(ia.getHostName(), port, serverStartcode); + ServerName sn = ServerName.valueOf(ia != null ? ia.getHostName() : hostname, port, + serverStartcode); checkClockSkew(sn, serverCurrentTime); checkIsDead(sn, "STARTUP"); if (!checkAndRecordNewServer(sn, ServerLoad.EMPTY_SERVERLOAD)) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 409107f..96c0299 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -389,6 +389,14 @@ public class HRegionServer extends HasThread implements */ protected ServerName serverName; + /* + * hostname obtained from InetSocketAddress or, specified by hostname config + */ + protected String hostName; + + // key to the config of hostname + final static String HOSTNAME_KEY = "hbase.regionserver.hostname"; + /** * This servers startcode. */ @@ -502,8 +510,10 @@ public class HRegionServer extends HasThread implements rpcServices = createRpcServices(); this.startcode = System.currentTimeMillis(); - String hostName = rpcServices.isa.getHostName(); - serverName = ServerName.valueOf(hostName, rpcServices.isa.getPort(), startcode); + hostName = conf.get(HOSTNAME_KEY); + boolean hostnameSpecified = hostName != null && !hostName.isEmpty(); + serverName = ServerName.valueOf(hostnameSpecified ? hostName : rpcServices.isa.getHostName(), + rpcServices.isa.getPort(), startcode); // login the zookeeper client principal (if using security) ZKUtil.loginClient(this.conf, "hbase.zookeeper.client.keytab.file", @@ -1254,9 +1264,11 @@ public class HRegionServer extends HasThread implements String hostnameFromMasterPOV = e.getValue(); this.serverName = ServerName.valueOf(hostnameFromMasterPOV, rpcServices.isa.getPort(), this.startcode); - if (!hostnameFromMasterPOV.equals(rpcServices.isa.getHostName())) { + if (!hostnameFromMasterPOV.equals(rpcServices.isa.getHostName()) && + (hostName != null && !hostnameFromMasterPOV.equals(hostName))) { LOG.info("Master passed us a different hostname to use; was=" + - rpcServices.isa.getHostName() + ", but now=" + hostnameFromMasterPOV); + this.hostName == null ? rpcServices.isa.getHostName() : this.hostName + + ", but now=" + hostnameFromMasterPOV); } continue; } @@ -2137,6 +2149,9 @@ public class HRegionServer extends HasThread implements long now = EnvironmentEdgeManager.currentTime(); int port = rpcServices.isa.getPort(); RegionServerStartupRequest.Builder request = RegionServerStartupRequest.newBuilder(); + if (hostName != null && !hostName.isEmpty()) { + request.setHostname(hostName); + } request.setPort(port); request.setServerStartCode(this.startcode); request.setServerCurrentTime(now); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestClockSkewDetection.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestClockSkewDetection.java index dd733ad..b28f574 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestClockSkewDetection.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestClockSkewDetection.java @@ -103,7 +103,7 @@ public class TestClockSkewDetection { LOG.debug("regionServerStartup 1"); InetAddress ia1 = InetAddress.getLocalHost(); - sm.regionServerStartup(ia1, 1234, -1, System.currentTimeMillis()); + sm.regionServerStartup(ia1, null, 1234, -1, System.currentTimeMillis()); final Configuration c = HBaseConfiguration.create(); long maxSkew = c.getLong("hbase.master.maxclockskew", 30000); @@ -114,7 +114,7 @@ public class TestClockSkewDetection { LOG.debug("Test: Master Time > Region Server Time"); LOG.debug("regionServerStartup 2"); InetAddress ia2 = InetAddress.getLocalHost(); - sm.regionServerStartup(ia2, 1235, -1, System.currentTimeMillis() - maxSkew * 2); + sm.regionServerStartup(ia2, null, 1235, -1, System.currentTimeMillis() - maxSkew * 2); fail("HMaster should have thrown a ClockOutOfSyncException but didn't."); } catch(ClockOutOfSyncException e) { //we want an exception @@ -126,7 +126,7 @@ public class TestClockSkewDetection { LOG.debug("Test: Master Time < Region Server Time"); LOG.debug("regionServerStartup 3"); InetAddress ia3 = InetAddress.getLocalHost(); - sm.regionServerStartup(ia3, 1236, -1, System.currentTimeMillis() + maxSkew * 2); + sm.regionServerStartup(ia3, null, 1236, -1, System.currentTimeMillis() + maxSkew * 2); fail("HMaster should have thrown a ClockOutOfSyncException but didn't."); } catch (ClockOutOfSyncException e) { // we want an exception @@ -136,12 +136,12 @@ public class TestClockSkewDetection { // make sure values above warning threshold but below max threshold don't kill LOG.debug("regionServerStartup 4"); InetAddress ia4 = InetAddress.getLocalHost(); - sm.regionServerStartup(ia4, 1237, -1, System.currentTimeMillis() - warningSkew * 2); + sm.regionServerStartup(ia4, null, 1237, -1, System.currentTimeMillis() - warningSkew * 2); // make sure values above warning threshold but below max threshold don't kill LOG.debug("regionServerStartup 5"); InetAddress ia5 = InetAddress.getLocalHost(); - sm.regionServerStartup(ia5, 1238, -1, System.currentTimeMillis() + warningSkew * 2); + sm.regionServerStartup(ia5, null, 1238, -1, System.currentTimeMillis() + warningSkew * 2); }