HBASE-12863 Master info port on RS UI is always 0

Signed-off-by: Enis Soztutar <enis@apache.org>
This commit is contained in:
zhangduo 2015-01-16 08:28:32 +08:00 committed by Enis Soztutar
parent f1d1dbfaa4
commit 7309bb4317
4 changed files with 76 additions and 18 deletions

View File

@ -56,7 +56,7 @@ public class ActiveMasterManager extends ZooKeeperListener {
final AtomicBoolean clusterShutDown = new AtomicBoolean(false); final AtomicBoolean clusterShutDown = new AtomicBoolean(false);
private final ServerName sn; private final ServerName sn;
private final int infoPort; private int infoPort;
private final Server master; private final Server master;
/** /**
@ -64,14 +64,18 @@ public class ActiveMasterManager extends ZooKeeperListener {
* @param sn ServerName * @param sn ServerName
* @param master In an instance of a Master. * @param master In an instance of a Master.
*/ */
ActiveMasterManager(ZooKeeperWatcher watcher, ServerName sn, int infoPort, Server master) { ActiveMasterManager(ZooKeeperWatcher watcher, ServerName sn, Server master) {
super(watcher); super(watcher);
watcher.registerListener(this); watcher.registerListener(this);
this.sn = sn; this.sn = sn;
this.infoPort = infoPort;
this.master = master; this.master = master;
} }
// will be set after jetty server is started
public void setInfoPort(int infoPort) {
this.infoPort = infoPort;
}
@Override @Override
public void nodeCreated(String path) { public void nodeCreated(String path) {
handle(path); handle(path);

View File

@ -20,7 +20,6 @@ package org.apache.hadoop.hbase.master;
import java.io.IOException; import java.io.IOException;
import java.io.InterruptedIOException; import java.io.InterruptedIOException;
import java.io.PrintWriter;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress; import java.net.InetAddress;
@ -222,7 +221,7 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
public static final String MASTER = "master"; public static final String MASTER = "master";
// Manager and zk listener for master election // Manager and zk listener for master election
private ActiveMasterManager activeMasterManager; private final ActiveMasterManager activeMasterManager;
// Region server tracker // Region server tracker
RegionServerTracker regionServerTracker; RegionServerTracker regionServerTracker;
// Draining region server tracker // Draining region server tracker
@ -303,7 +302,6 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
/** jetty server for master to redirect requests to regionserver infoServer */ /** jetty server for master to redirect requests to regionserver infoServer */
private org.mortbay.jetty.Server masterJettyServer; private org.mortbay.jetty.Server masterJettyServer;
private int masterInfoPort;
public static class RedirectServlet extends HttpServlet { public static class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 2894774810058302472L; private static final long serialVersionUID = 2894774810058302472L;
private static int regionServerInfoPort; private static int regionServerInfoPort;
@ -380,19 +378,21 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
Threads.setDaemonThreadRunning(clusterStatusPublisherChore.getThread()); Threads.setDaemonThreadRunning(clusterStatusPublisherChore.getThread());
} }
} }
startActiveMasterManager(); activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);
putUpJettyServer(); int infoPort = putUpJettyServer();
startActiveMasterManager(infoPort);
} }
private void putUpJettyServer() throws IOException { // return the actual infoPort, -1 means disable info server.
private int putUpJettyServer() throws IOException {
if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) { if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {
return; return -1;
} }
int infoPort = conf.getInt("hbase.master.info.port.orig", int infoPort = conf.getInt("hbase.master.info.port.orig",
HConstants.DEFAULT_MASTER_INFOPORT); HConstants.DEFAULT_MASTER_INFOPORT);
// -1 is for disabling info server, so no redirecting // -1 is for disabling info server, so no redirecting
if (infoPort < 0 || infoServer == null) { if (infoPort < 0 || infoServer == null) {
return; return -1;
} }
String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0"); String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");
if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) { if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {
@ -418,7 +418,7 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
} catch (Exception e) { } catch (Exception e) {
throw new IOException("Failed to start redirecting jetty server", e); throw new IOException("Failed to start redirecting jetty server", e);
} }
masterInfoPort = connector.getPort(); return connector.getLocalPort();
} }
/** /**
@ -1357,7 +1357,7 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
} }
} }
private void startActiveMasterManager() throws KeeperException { private void startActiveMasterManager(int infoPort) throws KeeperException {
String backupZNode = ZKUtil.joinZNode( String backupZNode = ZKUtil.joinZNode(
zooKeeper.backupMasterAddressesZNode, serverName.toString()); zooKeeper.backupMasterAddressesZNode, serverName.toString());
/* /*
@ -1372,12 +1372,11 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
*/ */
LOG.info("Adding backup master ZNode " + backupZNode); LOG.info("Adding backup master ZNode " + backupZNode);
if (!MasterAddressTracker.setMasterAddress(zooKeeper, backupZNode, if (!MasterAddressTracker.setMasterAddress(zooKeeper, backupZNode,
serverName, masterInfoPort)) { serverName, infoPort)) {
LOG.warn("Failed create of " + backupZNode + " by " + serverName); LOG.warn("Failed create of " + backupZNode + " by " + serverName);
} }
activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, activeMasterManager.setInfoPort(infoPort);
masterInfoPort, this);
// Start a thread to try to become the active master, so we won't block here // Start a thread to try to become the active master, so we won't block here
Threads.setDaemonThreadRunning(new Thread(new Runnable() { Threads.setDaemonThreadRunning(new Thread(new Runnable() {
@Override @Override
@ -2203,7 +2202,7 @@ public class HMaster extends HRegionServer implements MasterServices, Server {
} }
} }
List<TableName> result = new ArrayList(descriptors.size()); List<TableName> result = new ArrayList<TableName>(descriptors.size());
for (HTableDescriptor htd: descriptors) { for (HTableDescriptor htd: descriptors) {
result.add(htd.getTableName()); result.add(htd.getTableName());
} }

View File

@ -261,7 +261,7 @@ public class TestActiveMasterManager {
clusterStatusTracker.start(); clusterStatusTracker.start();
this.activeMasterManager = this.activeMasterManager =
new ActiveMasterManager(zk, master, 0, this); new ActiveMasterManager(zk, master, this);
zk.registerListener(activeMasterManager); zk.registerListener(activeMasterManager);
} }

View File

@ -0,0 +1,55 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hbase.master;
import static org.junit.Assert.assertTrue;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HConstants;
import org.apache.hadoop.hbase.testclassification.MasterTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Trivial test to confirm that we do not get 0 infoPort. See HBASE-12863.
*/
@Category({ MasterTests.class, MediumTests.class })
public class TestGetInfoPort {
private final HBaseTestingUtility testUtil = new HBaseTestingUtility();
@Before
public void setUp() throws Exception {
testUtil.getConfiguration().setInt(HConstants.MASTER_INFO_PORT, 0);
testUtil.startMiniCluster(1, 1);
}
@After
public void tearDown() throws Exception {
testUtil.shutdownMiniCluster();
}
@Test
public void test() {
assertTrue(testUtil.getMiniHBaseCluster().getRegionServer(0).getMasterAddressTracker()
.getMasterInfoPort() > 0);
}
}