diff --git a/CHANGES.txt b/CHANGES.txt index b99ea8158b0..d625cb4d8da 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -23,6 +23,8 @@ Release 0.21.0 - Unreleased HBASE-2541 Remove transactional contrib (Clint Morgan via Stack) HBASE-2542 Fold stargate contrib into core HBASE-2565 Remove contrib module from hbase + HBASE-2599 BaseScanner says "Current assignment of X is not valid" over + and over for same region BUG FIXES HBASE-1791 Timeout in IndexRecordWriter (Bradford Stephens via Andrew diff --git a/src/main/java/org/apache/hadoop/hbase/HServerInfo.java b/src/main/java/org/apache/hadoop/hbase/HServerInfo.java index 43906a5e665..3457f9e6de7 100644 --- a/src/main/java/org/apache/hadoop/hbase/HServerInfo.java +++ b/src/main/java/org/apache/hadoop/hbase/HServerInfo.java @@ -1,5 +1,5 @@ /** - * Copyright 2007 The Apache Software Foundation + * Copyright 2010 The Apache Software Foundation * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -22,26 +22,33 @@ package org.apache.hadoop.hbase; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; +import java.net.InetSocketAddress; +import java.util.Set; +import org.apache.hadoop.hbase.regionserver.HRegionServer; +import org.apache.hadoop.io.Writable; import org.apache.hadoop.io.WritableComparable; /** - * HServerInfo is meta info about an {@link HRegionServer}. - * Holds hostname, ports, regionserver startcode, and load. Each server has + * HServerInfo is meta info about an {@link HRegionServer}. It is the token + * by which a master distingushes a particular regionserver from the rest. + * It holds hostname, ports, regionserver startcode, and load. Each server has * a servername where servername is made up of a concatenation of - * hostname, port, and regionserver startcode. + * hostname, port, and regionserver startcode. This servername is used in + * various places identifying this regionserver. Its even used as part of + * a pathname in the filesystem. As part of the initialization, + * master will pass the regionserver the address that it knows this regionserver + * by. In subsequent communications, the regionserver will pass a HServerInfo + * with the master-supplied address. */ public class HServerInfo implements WritableComparable { - /** - * This character is used as separator making up the servername. - * Servername is made of host, port, and startcode formatted as - * <hostname> '{@link #SERVERNAME_SEPARATOR}' <port> '{@ink #SEPARATOR"}' <startcode> - * where {@link SEPARATOR is usually a ','. + /* + * This character is used as separator between server hostname and port and + * its startcode. Servername is formatted as + * <hostname> '{@ink #SERVERNAME_SEPARATOR"}' <port> '{@ink #SERVERNAME_SEPARATOR"}' <startcode>. */ - public static final String SERVERNAME_SEPARATOR = ","; + private static final String SERVERNAME_SEPARATOR = ","; private HServerAddress serverAddress; private long startCode; @@ -51,11 +58,23 @@ public class HServerInfo implements WritableComparable { private String serverName = null; // Hostname of the regionserver. private String hostname; - private static Map dnsCache = new HashMap(); + private String cachedHostnamePort = null; public HServerInfo() { - this(new HServerAddress(), 0, - HConstants.DEFAULT_REGIONSERVER_INFOPORT, "default name"); + this(new HServerAddress(), 0, HConstants.DEFAULT_REGIONSERVER_INFOPORT, + "default name"); + } + + /** + * Constructor that creates a HServerInfo with a generated startcode and an + * empty load. + * @param serverAddress An {@link InetSocketAddress} encased in a {@link Writable} + * @param infoPort Port the webui runs on. + * @param hostname Server hostname. + */ + public HServerInfo(HServerAddress serverAddress, final int infoPort, + final String hostname) { + this(serverAddress, System.currentTimeMillis(), infoPort, hostname); } public HServerInfo(HServerAddress serverAddress, long startCode, @@ -104,13 +123,27 @@ public class HServerInfo implements WritableComparable { return this.infoPort; } - public void setInfoPort(int infoPort) { - this.infoPort = infoPort; + public String getHostname() { + return this.hostname; } - public synchronized void setStartCode(long startCode) { - this.startCode = startCode; - this.serverName = null; + /** + * @return The hostname and port concatenated with a ':' as separator. + */ + public synchronized String getHostnamePort() { + if (this.cachedHostnamePort == null) { + this.cachedHostnamePort = getHostnamePort(this.hostname, this.serverAddress.getPort()); + } + return this.cachedHostnamePort; + } + + /** + * @param hostname + * @param port + * @return The hostname and port concatenated with a ':' as separator. + */ + public static String getHostnamePort(final String hostname, final int port) { + return hostname + ":" + port; } /** @@ -119,43 +152,18 @@ public class HServerInfo implements WritableComparable { */ public synchronized String getServerName() { if (this.serverName == null) { - // if we have the hostname of the RS, use it - if(this.hostname != null) { - this.serverName = - getServerName(this.hostname, this.serverAddress.getPort(), this.startCode); - } - // go to DNS name resolution only if we dont have the name of the RS - else { - this.serverName = getServerName(this.serverAddress, this.startCode); - } + this.serverName = getServerName(this.hostname, + this.serverAddress.getPort(), this.startCode); } return this.serverName; } - /** - * @param serverAddress In form <hostname> ':' <port> - * @param startCode Server startcode - * @return Server name made of the concatenation of hostname, port and - * startcode formatted as <hostname> ',' <port> ',' <startcode> - */ - public static String getServerName(String serverAddress, long startCode) { - String name = null; - if (serverAddress != null) { - int colonIndex = serverAddress.lastIndexOf(':'); - if(colonIndex < 0) { - throw new IllegalArgumentException("Not a host:port pair: " + serverAddress); - } - String host = serverAddress.substring(0, colonIndex); - int port = - Integer.valueOf(serverAddress.substring(colonIndex + 1)).intValue(); - if(!dnsCache.containsKey(host)) { - HServerAddress address = new HServerAddress(serverAddress); - dnsCache.put(host, address.getHostname()); - } - host = dnsCache.get(host); - name = getServerName(host, port, startCode); - } - return name; + public static synchronized String getServerName(final String hostAndPort, + final long startcode) { + int index = hostAndPort.indexOf(":"); + if (index <= 0) throw new IllegalArgumentException("Expected ':' "); + return getServerName(hostAndPort.substring(0, index), + Integer.parseInt(hostAndPort.substring(index + 1)), startcode); } /** @@ -175,7 +183,7 @@ public class HServerInfo implements WritableComparable { * @return Server name made of the concatenation of hostname, port and * startcode formatted as <hostname> ',' <port> ',' <startcode> */ - private static String getServerName(String hostName, int port, long startCode) { + public static String getServerName(String hostName, int port, long startCode) { StringBuilder name = new StringBuilder(hostName); name.append(SERVERNAME_SEPARATOR); name.append(port); @@ -233,4 +241,27 @@ public class HServerInfo implements WritableComparable { public int compareTo(HServerInfo o) { return this.getServerName().compareTo(o.getServerName()); } + + /** + * Utility method that does a find of a servername or a hostandport combination + * in the passed Set. + * @param servers Set of server names + * @param serverName Name to look for + * @param hostAndPortOnly If serverName is a + * hostname ':' port + * or hostname , port , startcode. + * @return True if serverName found in servers + */ + public static boolean isServer(final Set servers, + final String serverName, final boolean hostAndPortOnly) { + if (!hostAndPortOnly) return servers.contains(serverName); + String serverNameColonReplaced = + serverName.replaceFirst(":", SERVERNAME_SEPARATOR); + for (String hostPortStartCode: servers) { + int index = hostPortStartCode.lastIndexOf(SERVERNAME_SEPARATOR); + String hostPortStrippedOfStartCode = hostPortStartCode.substring(0, index); + if (hostPortStrippedOfStartCode.equals(serverNameColonReplaced)) return true; + } + return false; + } } diff --git a/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java b/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java index 57f745e7af3..ef349afe66b 100644 --- a/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java +++ b/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java @@ -526,32 +526,27 @@ abstract class BaseScanner extends Chore implements HConstants { * @param regionServer * @param meta * @param info - * @param serverAddress + * @param hostnameAndPort hostname ':' port as it comes out of .META. * @param startCode * @throws IOException */ protected void checkAssigned(final HRegionInterface regionServer, final MetaRegion meta, final HRegionInfo info, - final String serverAddress, final long startCode) + final String hostnameAndPort, final long startCode) throws IOException { String serverName = null; - String sa = serverAddress; + String sa = hostnameAndPort; long sc = startCode; if (sa == null || sa.length() <= 0) { - // Scans are sloppy. They don't respect row locks and they get and - // cache a row internally so may have data that is a little stale. Make - // sure that for sure this serverAddress is null. We are trying to - // avoid double-assignments. See hbase-1784. Will have to wait till - // 0.21 hbase where we use zk to mediate state transitions to do better. + // Scans are sloppy. They cache a row internally so may have data that + // is a little stale. Make sure that for sure this serverAddress is null. + // We are trying to avoid double-assignments. See hbase-1784. Get g = new Get(info.getRegionName()); g.addFamily(HConstants.CATALOG_FAMILY); Result r = regionServer.get(meta.getRegionName(), g); if (r != null && !r.isEmpty()) { sa = getServerAddress(r); - if (sa != null && sa.length() > 0) { - // Reget startcode in case its changed in the meantime too. - sc = getStartCode(r); - } + sc = getStartCode(r); } } if (sa != null && sa.length() > 0) { diff --git a/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 603159c0a93..c713245e849 100644 --- a/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -639,17 +639,18 @@ public class HMaster extends Thread implements HConstants, HMasterInterface, public MapWritable regionServerStartup(final HServerInfo serverInfo) throws IOException { - // Set the address for now even tho it will not be persisted on HRS side - // If the address given is not the default one, use IP given by the user. - if (serverInfo.getServerAddress().getBindAddress().equals(DEFAULT_HOST)) { - String rsAddress = HBaseServer.getRemoteAddress(); - serverInfo.setServerAddress(new HServerAddress(rsAddress, - serverInfo.getServerAddress().getPort())); - } + // Set the ip into the passed in serverInfo. Its ip is more than likely + // not the ip that the master sees here. See at end of this method where + // we pass it back to the regionserver by setting "hbase.regionserver.address" + String rsAddress = HBaseServer.getRemoteAddress(); + serverInfo.setServerAddress(new HServerAddress(rsAddress, + serverInfo.getServerAddress().getPort())); // Register with server manager this.serverManager.regionServerStartup(serverInfo); // Send back some config info - return createConfigurationSubset(); + MapWritable mw = createConfigurationSubset(); + mw.put(new Text("hbase.regionserver.address"), new Text(rsAddress)); + return mw; } /** @@ -658,11 +659,6 @@ public class HMaster extends Thread implements HConstants, HMasterInterface, */ protected MapWritable createConfigurationSubset() { MapWritable mw = addConfig(new MapWritable(), HConstants.HBASE_DIR); - // Get the real address of the HRS. - String rsAddress = HBaseServer.getRemoteAddress(); - if (rsAddress != null) { - mw.put(new Text("hbase.regionserver.address"), new Text(rsAddress)); - } return addConfig(mw, "fs.default.name"); } @@ -993,29 +989,26 @@ public class HMaster extends Thread implements HConstants, HMasterInterface, // Arguments are regionname and an optional server name. byte [] regionname = ((ImmutableBytesWritable)args[0]).get(); LOG.debug("Attempting to close region: " + Bytes.toStringBinary(regionname)); - String servername = null; + String hostnameAndPort = null; if (args.length == 2) { - servername = Bytes.toString(((ImmutableBytesWritable)args[1]).get()); + hostnameAndPort = Bytes.toString(((ImmutableBytesWritable)args[1]).get()); } // Need hri Result rr = getFromMETA(regionname, HConstants.CATALOG_FAMILY); HRegionInfo hri = getHRegionInfo(rr.getRow(), rr); - if (servername == null) { + if (hostnameAndPort == null) { // Get server from the .META. if it wasn't passed as argument - servername = + hostnameAndPort = Bytes.toString(rr.getValue(CATALOG_FAMILY, SERVER_QUALIFIER)); } // Take region out of the intransistions in case it got stuck there doing // an open or whatever. this.regionManager.clearFromInTransition(regionname); - // If servername is still null, then none, exit. - if (servername == null) break; - // Need to make up a HServerInfo 'servername' for that is how - // items are keyed in regionmanager Maps. - HServerAddress addr = new HServerAddress(servername); + // If hostnameAndPort is still null, then none, exit. + if (hostnameAndPort == null) break; long startCode = Bytes.toLong(rr.getValue(CATALOG_FAMILY, STARTCODE_QUALIFIER)); - String name = HServerInfo.getServerName(addr, startCode); + String name = HServerInfo.getServerName(hostnameAndPort, startCode); LOG.info("Marking " + hri.getRegionNameAsString() + " as closing on " + name + "; cleaning SERVER + STARTCODE; " + "master will tell regionserver to close region on next heartbeat"); diff --git a/src/main/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java b/src/main/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java index 14433b858fe..dc2f8317365 100644 --- a/src/main/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java +++ b/src/main/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java @@ -69,18 +69,18 @@ class ProcessRegionOpen extends ProcessRegionStatusChange { HRegionInterface server = master.getServerConnection().getHRegionConnection(getMetaRegion().getServer()); LOG.info(regionInfo.getRegionNameAsString() + " open on " + - serverInfo.getServerAddress().toString()); + serverInfo.getServerName()); // Register the newly-available Region's location. Put p = new Put(regionInfo.getRegionName()); p.add(CATALOG_FAMILY, SERVER_QUALIFIER, - Bytes.toBytes(serverInfo.getServerAddress().toString())); + Bytes.toBytes(serverInfo.getHostnamePort())); p.add(CATALOG_FAMILY, STARTCODE_QUALIFIER, Bytes.toBytes(serverInfo.getStartCode())); server.put(metaRegionName, p); LOG.info("Updated row " + regionInfo.getRegionNameAsString() + " in region " + Bytes.toString(metaRegionName) + " with startcode=" + - serverInfo.getStartCode() + ", server=" + serverInfo.getServerAddress()); + serverInfo.getStartCode() + ", server=" + serverInfo.getHostnamePort()); synchronized (master.getRegionManager()) { if (isMetaTable) { // It's a meta region. diff --git a/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java index a197b8f3a5c..a15125c2885 100644 --- a/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java +++ b/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java @@ -67,8 +67,6 @@ public class ServerManager implements HConstants { // The map of known server names to server info private final Map serversToServerInfo = new ConcurrentHashMap(); - private final Map serverAddressToServerInfo = - new ConcurrentHashMap(); /* * Set of known dead servers. On znode expiration, servers are added here. @@ -111,7 +109,7 @@ public class ServerManager implements HConstants { @Override protected void chore() { - int numServers = serverAddressToServerInfo.size(); + int numServers = serversToServerInfo.size(); int numDeadServers = deadServers.size(); double averageLoad = getAverageLoad(); String deadServersList = null; @@ -177,8 +175,7 @@ public class ServerManager implements HConstants { // for processing by ProcessServerShutdown. HServerInfo info = new HServerInfo(serverInfo); String hostAndPort = info.getServerAddress().toString(); - HServerInfo existingServer = - this.serverAddressToServerInfo.get(info.getServerAddress()); + HServerInfo existingServer = haveServerWithSameHostAndPortAlready(info.getHostnamePort()); if (existingServer != null) { LOG.info("Server start rejected; we already have " + hostAndPort + " registered; existingServer=" + existingServer + ", newServer=" + info); @@ -193,6 +190,17 @@ public class ServerManager implements HConstants { recordNewServer(info); } + private HServerInfo haveServerWithSameHostAndPortAlready(final String hostnamePort) { + synchronized (this.serversToServerInfo) { + for (Map.Entry e: this.serversToServerInfo.entrySet()) { + if (e.getValue().getHostnamePort().equals(hostnamePort)) { + return e.getValue(); + } + } + } + return null; + } + /* * If this server is on the dead list, reject it with a LeaseStillHeldException * @param serverName Server name formatted as host_port_startcode. @@ -230,7 +238,6 @@ public class ServerManager implements HConstants { Watcher watcher = new ServerExpirer(new HServerInfo(info)); this.master.getZooKeeperWrapper().updateRSLocationGetWatch(info, watcher); this.serversToServerInfo.put(serverName, info); - this.serverAddressToServerInfo.put(info.getServerAddress(), info); this.serversToLoad.put(serverName, load); synchronized (this.loadToServers) { Set servers = this.loadToServers.get(load); @@ -317,7 +324,7 @@ public class ServerManager implements HConstants { } synchronized (this.serversToServerInfo) { - removeServerInfo(info.getServerName(), info.getServerAddress()); + removeServerInfo(info.getServerName()); notifyServers(); } @@ -339,7 +346,7 @@ public class ServerManager implements HConstants { synchronized (this.serversToServerInfo) { // This method removes ROOT/META from the list and marks them to be // reassigned in addition to other housework. - if (removeServerInfo(serverInfo.getServerName(), serverInfo.getServerAddress())) { + if (removeServerInfo(serverInfo.getServerName())) { // Only process the exit message if the server still has registered info. // Otherwise we could end up processing the server exit twice. LOG.info("Region server " + serverInfo.getServerName() + @@ -391,7 +398,6 @@ public class ServerManager implements HConstants { final HRegionInfo[] mostLoadedRegions, HMsg[] msgs) throws IOException { // Refresh the info object and the load information - this.serverAddressToServerInfo.put(serverInfo.getServerAddress(), serverInfo); this.serversToServerInfo.put(serverInfo.getServerName(), serverInfo); HServerLoad load = this.serversToLoad.get(serverInfo.getServerName()); if (load != null) { @@ -659,10 +665,8 @@ public class ServerManager implements HConstants { } /** Update a server load information because it's shutting down*/ - private boolean removeServerInfo(final String serverName, - final HServerAddress serverAddress) { + private boolean removeServerInfo(final String serverName) { boolean infoUpdated = false; - this.serverAddressToServerInfo.remove(serverAddress); HServerInfo info = this.serversToServerInfo.remove(serverName); // Only update load information once. // This method can be called a couple of times during shutdown. @@ -746,11 +750,19 @@ public class ServerManager implements HConstants { } } - public Map getServerAddressToServerInfo() { - // we use this one because all the puts to this map are parallel/synced with the other map. - synchronized (this.serversToServerInfo) { - return Collections.unmodifiableMap(this.serverAddressToServerInfo); + /** + * @param hsa + * @return The HServerInfo whose HServerAddress is hsa or null + * if nothing found. + */ + public HServerInfo getHServerInfo(final HServerAddress hsa) { + synchronized(this.serversToServerInfo) { + // TODO: This is primitive. Do a better search. + for (Map.Entry e: this.serversToServerInfo.entrySet()) { + if (e.getValue().getServerAddress().equals(hsa)) return e.getValue(); + } } + return null; } /** @@ -841,7 +853,6 @@ public class ServerManager implements HConstants { return; } // Remove the server from the known servers lists and update load info - this.serverAddressToServerInfo.remove(info.getServerAddress()); this.serversToServerInfo.remove(serverName); HServerLoad load = this.serversToLoad.remove(serverName); if (load != null) { @@ -889,16 +900,8 @@ public class ServerManager implements HConstants { } static boolean isDead(final Set deadServers, - final String serverName, final boolean hostAndPortOnly) { - if (!hostAndPortOnly) return deadServers.contains(serverName); - String serverNameColonReplaced = - serverName.replaceFirst(":", HServerInfo.SERVERNAME_SEPARATOR); - for (String hostPortStartCode: deadServers) { - int index = hostPortStartCode.lastIndexOf(HServerInfo.SERVERNAME_SEPARATOR); - String hostPortStrippedOfStartCode = hostPortStartCode.substring(0, index); - if (hostPortStrippedOfStartCode.equals(serverNameColonReplaced)) return true; - } - return false; + final String serverName, final boolean hostAndPortOnly) { + return HServerInfo.isServer(deadServers, serverName, hostAndPortOnly); } Set getDeadServers() { diff --git a/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index b5ff43a3949..78f3223f889 100644 --- a/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -595,8 +595,7 @@ public class HRegionServer implements HConstants, HRegionInterface, } closeAllRegions(); // Don't leave any open file handles } - LOG.info("aborting server at: " + - serverInfo.getServerAddress().toString()); + LOG.info("aborting server at: " + this.serverInfo.getServerName()); } else { ArrayList closedRegions = closeAllRegions(); try { @@ -618,14 +617,13 @@ public class HRegionServer implements HConstants, HRegionInterface, } LOG.info("telling master that region server is shutting down at: " + - serverInfo.getServerAddress().toString()); + serverInfo.getServerName()); hbaseMaster.regionServerReport(serverInfo, exitMsg, (HRegionInfo[])null); } catch (Throwable e) { LOG.warn("Failed to send exiting message to master: ", RemoteExceptionHandler.checkThrowable(e)); } - LOG.info("stopping server at: " + - serverInfo.getServerAddress().toString()); + LOG.info("stopping server at: " + this.serverInfo.getServerName()); } // Make sure the proxy is down. @@ -900,7 +898,7 @@ public class HRegionServer implements HConstants, HRegionInterface, } if (fs.exists(logdir)) { throw new RegionServerRunningException("region server already " + - "running at " + this.serverInfo.getServerAddress().toString() + + "running at " + this.serverInfo.getServerName() + " because logdir " + logdir.toString() + " exists"); } HLog newlog = instantiateHLog(logdir, oldLogDir); @@ -1035,8 +1033,10 @@ public class HRegionServer implements HConstants, HRegionInterface, // auto bind enabled, try to use another port LOG.info("Failed binding http info server to port: " + port); port++; - // update HRS server info - this.serverInfo.setInfoPort(port); + // update HRS server info port. + this.serverInfo = new HServerInfo(this.serverInfo.getServerAddress(), + this.serverInfo.getStartCode(), port, + this.serverInfo.getHostname()); } } } @@ -1205,7 +1205,7 @@ public class HRegionServer implements HConstants, HRegionInterface, lastMsg = System.currentTimeMillis(); boolean startCodeOk = false; while(!startCodeOk) { - serverInfo.setStartCode(System.currentTimeMillis()); + this.serverInfo = createServerInfoWithNewStartCode(this.serverInfo); startCodeOk = zooKeeperWrapper.writeRSLocation(this.serverInfo); if(!startCodeOk) { LOG.debug("Start code already taken, trying another one"); @@ -1221,6 +1221,11 @@ public class HRegionServer implements HConstants, HRegionInterface, return result; } + private HServerInfo createServerInfoWithNewStartCode(final HServerInfo hsi) { + return new HServerInfo(hsi.getServerAddress(), hsi.getInfoPort(), + hsi.getHostname()); + } + /* Add to the outbound message buffer */ private void reportOpen(HRegionInfo region) { this.outboundMsgs.add(new HMsg(HMsg.Type.MSG_REPORT_OPEN, region)); diff --git a/src/main/resources/hbase-webapps/master/table.jsp b/src/main/resources/hbase-webapps/master/table.jsp index 095d6dd2054..0b945423c76 100644 --- a/src/main/resources/hbase-webapps/master/table.jsp +++ b/src/main/resources/hbase-webapps/master/table.jsp @@ -18,8 +18,6 @@ HBaseAdmin hbadmin = new HBaseAdmin(conf); String tableName = request.getParameter("name"); HTable table = new HTable(conf, tableName); - Map serverAddressToServerInfos = - master.getServerManager().getServerAddressToServerInfo(); String tableHeader = "

Table Regions

"; HServerAddress rootLocation = master.getRegionManager().getRootRegionLocation(); boolean showFragmentation = conf.getBoolean("hbase.master.ui.fragmentation.enabled", false); @@ -86,7 +84,7 @@ %> <%= tableHeader %> <% - int infoPort = serverAddressToServerInfos.get(rootLocation).getInfoPort(); + int infoPort = master.getServerManager().getHServerInfo(rootLocation).getInfoPort(); String url = "http://" + rootLocation.getHostname() + ":" + infoPort + "/"; %> @@ -104,7 +102,7 @@ <% Map onlineRegions = master.getRegionManager().getOnlineMetaRegions(); for (MetaRegion meta: onlineRegions.values()) { - int infoPort = serverAddressToServerInfos.get(meta.getServer()).getInfoPort(); + int infoPort = master.getServerManager().getHServerInfo(meta.getServer()).getInfoPort(); String url = "http://" + meta.getServer().getHostname() + ":" + infoPort + "/"; %> @@ -141,10 +139,7 @@ <%= tableHeader %> <% for(Map.Entry hriEntry : regions.entrySet()) { - - int infoPort = serverAddressToServerInfos.get( - hriEntry.getValue()).getInfoPort(); - + int infoPort = master.getServerManager().getHServerInfo(hriEntry.getValue()).getInfoPort(); String urlRegionServer = "http://" + hriEntry.getValue().getHostname().toString() + ":" + infoPort + "/"; %> diff --git a/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java b/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java index 441bb3ceaa1..e45fd690346 100644 --- a/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java +++ b/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java @@ -135,6 +135,10 @@ public class MiniHBaseCluster implements HConstants { super(setDifferentUser(conf)); } + public void setHServerInfo(final HServerInfo hsi) { + this.serverInfo = hsi; + } + /* * @param c * @param currentfs We return this if we did not make a new one. diff --git a/src/test/java/org/apache/hadoop/hbase/master/TestMasterWrongRS.java b/src/test/java/org/apache/hadoop/hbase/master/TestMasterWrongRS.java index f88feee54ff..24e075bbc6d 100644 --- a/src/test/java/org/apache/hadoop/hbase/master/TestMasterWrongRS.java +++ b/src/test/java/org/apache/hadoop/hbase/master/TestMasterWrongRS.java @@ -19,24 +19,22 @@ */ package org.apache.hadoop.hbase.master; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HServerAddress; +import org.apache.hadoop.hbase.HServerInfo; import org.apache.hadoop.hbase.MiniHBaseCluster; +import org.apache.hadoop.hbase.MiniHBaseCluster.MiniHBaseClusterRegionServer; import org.apache.hadoop.hbase.regionserver.HRegionServer; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; -import java.io.IOException; - public class TestMasterWrongRS { - - private static final Log LOG = LogFactory.getLog(TestMasterWrongRS.class); private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); @BeforeClass @@ -58,9 +56,12 @@ public class TestMasterWrongRS { @Test public void testRsReportsWrongServerName() throws Exception { MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster(); - HRegionServer firstServer = cluster.getRegionServer(0); + MiniHBaseClusterRegionServer firstServer = + (MiniHBaseClusterRegionServer)cluster.getRegionServer(0); HRegionServer secondServer = cluster.getRegionServer(1); - firstServer.getHServerInfo().setStartCode(12345); + HServerInfo hsi = firstServer.getServerInfo(); + firstServer.setHServerInfo(new HServerInfo(hsi.getServerAddress(), + hsi.getInfoPort(), hsi.getHostname())); // Sleep while the region server pings back Thread.sleep(2000); assertTrue(firstServer.isOnline());
NameRegion ServerEncoded NameStart KeyEnd Key