From e683fbfceeb313932834721e684a2b7ed25454e3 Mon Sep 17 00:00:00 2001 From: GeorryHuang <215175212@qq.com> Date: Tue, 24 Aug 2021 15:51:22 +0800 Subject: [PATCH 1/6] HBASE-26215 The backup master status page should use ActiveMasterManager instead of MasterAddressTracker --- .../tmpl/master/BackupMasterStatusTmpl.jamon | 20 +++------ .../hbase/master/ActiveMasterManager.java | 19 +++++++++ .../apache/hadoop/hbase/master/HMaster.java | 16 ++++++++ .../master/http/TestMasterStatusServlet.java | 41 +++++++++++++++++++ .../hbase/zookeeper/MasterAddressTracker.java | 36 ++++++++++++++++ 5 files changed, 118 insertions(+), 14 deletions(-) diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon index a49a5fae2b4f..b53a2280b57a 100644 --- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon +++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon @@ -24,25 +24,19 @@ java.util.*; org.apache.hadoop.hbase.ServerName; org.apache.hadoop.hbase.ClusterMetrics; org.apache.hadoop.hbase.master.HMaster; -org.apache.hadoop.hbase.zookeeper.MasterAddressTracker; -<%java> -MasterAddressTracker masterAddressTracker = master.getMasterAddressTracker(); - - <%if (!master.isActiveMaster()) %> <%java> - ServerName active_master = - (masterAddressTracker == null) ? null : masterAddressTracker.getMasterAddress(); - assert active_master != null : "Failed to retrieve master's ServerName!"; - int infoPort = (masterAddressTracker == null) ? 0 : masterAddressTracker.getMasterInfoPort(); + ServerName active_master = master.getActiveMaster().isPresent() ? master.getActiveMaster().get() : null; + assert active_master != null : "Failed to retrieve active master's ServerName!"; + int activeInfoPort = master.getActiveMaster().isPresent() ? master.getActiveMasterInfoPort() : 0;
-

Current Active Master: Current Active Master: <% active_master.getHostname() %>

<%else>

Backup Masters

@@ -54,13 +48,11 @@ MasterAddressTracker masterAddressTracker = master.getMasterAddressTracker(); Start Time <%java> - Collection backup_masters = master.getClusterMetricsWithoutCoprocessor( - EnumSet.of(ClusterMetrics.Option.BACKUP_MASTERS)).getBackupMasterNames(); + Collection backup_masters = master.getBackupMasters(); ServerName [] backupServerNames = backup_masters.toArray(new ServerName[backup_masters.size()]); Arrays.sort(backupServerNames); for (ServerName serverName : backupServerNames) { - int infoPort = (masterAddressTracker == null) ? 0 : masterAddressTracker - .getBackupMasterInfoPort(serverName); + int infoPort = master.getBackupMasterInfoPort(serverName); getActiveMasterServerName() { return Optional.ofNullable(activeMasterServerName); } + + public int getActiveMasterInfoPort(){ + try { + return MasterAddressTracker.getMasterInfoPort(watcher); + }catch (Exception e){ + LOG.warn("Failed to get active master's info port.", e); + return 0; + } + } + + public int getBackupMasterInfoPort(final ServerName sn){ + try { + return MasterAddressTracker.getBackupMasterInfoPort(watcher, sn); + }catch (Exception e){ + LOG.warn("Failed to get backup master: " + sn + "'s info port.", e); + return 0; + } + } + /** * Handle a change in the master node. Doesn't matter whether this was called * from a nodeCreated or nodeDeleted event because there are no guarantees diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index db6cb8600735..5e2c8614d88b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -2710,6 +2710,22 @@ public List getBackupMasters() { return activeMasterManager.getBackupMasters(); } + /** + * @return info port of active master or 0 if any exception occurs. + * */ + public int getActiveMasterInfoPort() { + return activeMasterManager.getActiveMasterInfoPort(); + } + + /** + * @param sn is ServerName of the backup master + * @return info port of backup master or 0 if any exception occurs. + * */ + public int getBackupMasterInfoPort(final ServerName sn) { + return activeMasterManager.getBackupMasterInfoPort(sn); + } + + @Override public List getRegionServers() { return serverManager.getOnlineServersList(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestMasterStatusServlet.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestMasterStatusServlet.java index c2a655ee6ed0..85fbf80ae8ce 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestMasterStatusServlet.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestMasterStatusServlet.java @@ -27,9 +27,14 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.HBaseTestingUtil; +import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.StartTestingClusterOption; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; +import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; +import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.RegionInfoBuilder; import org.apache.hadoop.hbase.client.TableDescriptor; @@ -46,6 +51,7 @@ import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl; import org.apache.hadoop.hbase.util.Bytes; +import org.apache.hadoop.hbase.util.JVMClusterUtil; import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker; import org.apache.hadoop.hbase.zookeeper.ZKWatcher; import org.apache.hadoop.hbase.zookeeper.ZNodePaths; @@ -164,4 +170,39 @@ public void testStatusTemplateWithServers() throws IOException { .setDeadServers(deadServers) .render(new StringWriter(), master); } + + + @Test + public void test() throws Exception{ + + Configuration conf = new Configuration(); +// conf.set(HConstants.MASTER_INFO_PORT, "18010"); + conf.setBoolean("hbase.snapshot.enabled",true); + conf.setBoolean(HConstants.SLOW_LOG_BUFFER_ENABLED_KEY, true); + conf.setInt("hbase.ipc.warn.response.time",50); + conf.setInt("hbase.ipc.warn.response.size",7000); + conf.set("hbase.namedqueue.provider.classes", + "org.apache.hadoop.hbase.namequeues.impl.SlowLogQueueService,org.apache.hadoop.hbase.namequeues.impl.BalancerDecisionQueueService,org.apache.hadoop.hbase.namequeues.impl.BalancerRejectionQueueService"); + HBaseTestingUtil hBaseTestingUtil = new HBaseTestingUtil(conf); + hBaseTestingUtil.startMiniCluster(StartTestingClusterOption.builder().numRegionServers(2).numAlwaysStandByMasters(1) + .build()); + List a = hBaseTestingUtil.getHBaseCluster().getMasterThreads(); + System.out.println(a.toString()); + hBaseTestingUtil.getAdmin() + .createTable(TableDescriptorBuilder.newBuilder(TableName.valueOf("test1")).setColumnFamily( + ColumnFamilyDescriptorBuilder.of("CF".getBytes())).build(), "0".getBytes(),"999999".getBytes(), 3); + hBaseTestingUtil.getAdmin() + .createTable(TableDescriptorBuilder.newBuilder(TableName.valueOf("test2")).setColumnFamily( + ColumnFamilyDescriptorBuilder.of("CF".getBytes())).build(), "0".getBytes(),"999999".getBytes(), 3); + ServerName theFirstRS = hBaseTestingUtil.getAdmin().getRegionServers().iterator().next(); + List regions = hBaseTestingUtil.getAdmin().getRegions(TableName.valueOf("test2")); + for (RegionInfo ri:regions){ + hBaseTestingUtil.getAdmin().move(ri.getEncodedNameAsBytes(), theFirstRS); + } + hBaseTestingUtil.getAdmin().balance(true); + hBaseTestingUtil.getConnection().getTable(TableName.valueOf("test1")) + .put(new Put("11".getBytes()).addColumn("CF".getBytes(), "q".getBytes(), "value".getBytes())); + while(true){} + } + } diff --git a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java index 54385f81f75c..fa8e7d4a4b05 100644 --- a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java +++ b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java @@ -222,6 +222,42 @@ public static int getMasterInfoPort(final ZKWatcher zkw) throws KeeperException, } } + /** + * Get backup master info port. + * Use this instead of {@link #getBackupMasterInfoPort(ServerName)} if you do not have an + * instance of this tracker in your context. + * @param zkw ZKWatcher to use + * @param sn ServerName of the backup master + * @return backup master info port in the the master address znode or 0 if no + * znode present. + * @throws KeeperException if a ZooKeeper operation fails + * @throws IOException if the address of the ZooKeeper master cannot be retrieved + */ + public static int getBackupMasterInfoPort(ZKWatcher zkw, final ServerName sn) + throws KeeperException, IOException { + byte[] data; + try { + data = ZKUtil.getData(zkw, + ZNodePaths.joinZNode(zkw.getZNodePaths().backupMasterAddressesZNode, sn.toString())); + } catch (InterruptedException e) { + throw new InterruptedIOException(); + } + if (data == null) { + throw new IOException("Can't get backup master address from ZooKeeper; znode data == null"); + } + try { + final ZooKeeperProtos.Master backup = parse(data); + if (backup == null) { + return 0; + } + return backup.getInfoPort(); + } catch (DeserializationException e) { + KeeperException ke = new KeeperException.DataInconsistencyException(); + ke.initCause(e); + throw ke; + } + } + /** * Set master address into the master znode or into the backup * subdirectory of backup masters; switch off the passed in znode From a387ecc58bd96b80486068de642fe61350045a7b Mon Sep 17 00:00:00 2001 From: GeorryHuang <215175212@qq.com> Date: Tue, 24 Aug 2021 15:55:59 +0800 Subject: [PATCH 2/6] Removed useless code --- .../master/http/TestMasterStatusServlet.java | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestMasterStatusServlet.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestMasterStatusServlet.java index 85fbf80ae8ce..c2a655ee6ed0 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestMasterStatusServlet.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/http/TestMasterStatusServlet.java @@ -27,14 +27,9 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseConfiguration; -import org.apache.hadoop.hbase.HBaseTestingUtil; -import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.ServerName; -import org.apache.hadoop.hbase.StartTestingClusterOption; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; -import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder; -import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.RegionInfoBuilder; import org.apache.hadoop.hbase.client.TableDescriptor; @@ -51,7 +46,6 @@ import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl; import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.hbase.util.JVMClusterUtil; import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker; import org.apache.hadoop.hbase.zookeeper.ZKWatcher; import org.apache.hadoop.hbase.zookeeper.ZNodePaths; @@ -170,39 +164,4 @@ public void testStatusTemplateWithServers() throws IOException { .setDeadServers(deadServers) .render(new StringWriter(), master); } - - - @Test - public void test() throws Exception{ - - Configuration conf = new Configuration(); -// conf.set(HConstants.MASTER_INFO_PORT, "18010"); - conf.setBoolean("hbase.snapshot.enabled",true); - conf.setBoolean(HConstants.SLOW_LOG_BUFFER_ENABLED_KEY, true); - conf.setInt("hbase.ipc.warn.response.time",50); - conf.setInt("hbase.ipc.warn.response.size",7000); - conf.set("hbase.namedqueue.provider.classes", - "org.apache.hadoop.hbase.namequeues.impl.SlowLogQueueService,org.apache.hadoop.hbase.namequeues.impl.BalancerDecisionQueueService,org.apache.hadoop.hbase.namequeues.impl.BalancerRejectionQueueService"); - HBaseTestingUtil hBaseTestingUtil = new HBaseTestingUtil(conf); - hBaseTestingUtil.startMiniCluster(StartTestingClusterOption.builder().numRegionServers(2).numAlwaysStandByMasters(1) - .build()); - List a = hBaseTestingUtil.getHBaseCluster().getMasterThreads(); - System.out.println(a.toString()); - hBaseTestingUtil.getAdmin() - .createTable(TableDescriptorBuilder.newBuilder(TableName.valueOf("test1")).setColumnFamily( - ColumnFamilyDescriptorBuilder.of("CF".getBytes())).build(), "0".getBytes(),"999999".getBytes(), 3); - hBaseTestingUtil.getAdmin() - .createTable(TableDescriptorBuilder.newBuilder(TableName.valueOf("test2")).setColumnFamily( - ColumnFamilyDescriptorBuilder.of("CF".getBytes())).build(), "0".getBytes(),"999999".getBytes(), 3); - ServerName theFirstRS = hBaseTestingUtil.getAdmin().getRegionServers().iterator().next(); - List regions = hBaseTestingUtil.getAdmin().getRegions(TableName.valueOf("test2")); - for (RegionInfo ri:regions){ - hBaseTestingUtil.getAdmin().move(ri.getEncodedNameAsBytes(), theFirstRS); - } - hBaseTestingUtil.getAdmin().balance(true); - hBaseTestingUtil.getConnection().getTable(TableName.valueOf("test1")) - .put(new Put("11".getBytes()).addColumn("CF".getBytes(), "q".getBytes(), "value".getBytes())); - while(true){} - } - } From 3530cd71e13b67fb07796c0799dfb2ccfad274f1 Mon Sep 17 00:00:00 2001 From: GeorryHuang <215175212@qq.com> Date: Tue, 24 Aug 2021 16:17:25 +0800 Subject: [PATCH 3/6] format code --- .../apache/hadoop/hbase/master/ActiveMasterManager.java | 9 ++++----- .../java/org/apache/hadoop/hbase/master/HMaster.java | 9 ++++----- .../hadoop/hbase/zookeeper/MasterAddressTracker.java | 7 ++++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java index 15daac044ea9..ebe24463ea4a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ActiveMasterManager.java @@ -158,20 +158,19 @@ public Optional getActiveMasterServerName() { return Optional.ofNullable(activeMasterServerName); } - - public int getActiveMasterInfoPort(){ + public int getActiveMasterInfoPort() { try { return MasterAddressTracker.getMasterInfoPort(watcher); - }catch (Exception e){ + } catch (Exception e) { LOG.warn("Failed to get active master's info port.", e); return 0; } } - public int getBackupMasterInfoPort(final ServerName sn){ + public int getBackupMasterInfoPort(final ServerName sn) { try { return MasterAddressTracker.getBackupMasterInfoPort(watcher, sn); - }catch (Exception e){ + } catch (Exception e) { LOG.warn("Failed to get backup master: " + sn + "'s info port.", e); return 0; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 5e2c8614d88b..3fc4cc302e56 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -2711,21 +2711,20 @@ public List getBackupMasters() { } /** - * @return info port of active master or 0 if any exception occurs. - * */ + * @return info port of active master or 0 if any exception occurs. + */ public int getActiveMasterInfoPort() { return activeMasterManager.getActiveMasterInfoPort(); } /** * @param sn is ServerName of the backup master - * @return info port of backup master or 0 if any exception occurs. - * */ + * @return info port of backup master or 0 if any exception occurs. + */ public int getBackupMasterInfoPort(final ServerName sn) { return activeMasterManager.getBackupMasterInfoPort(sn); } - @Override public List getRegionServers() { return serverManager.getOnlineServersList(); diff --git a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java index fa8e7d4a4b05..7d09a0973552 100644 --- a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java +++ b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MasterAddressTracker.java @@ -226,12 +226,13 @@ public static int getMasterInfoPort(final ZKWatcher zkw) throws KeeperException, * Get backup master info port. * Use this instead of {@link #getBackupMasterInfoPort(ServerName)} if you do not have an * instance of this tracker in your context. + * * @param zkw ZKWatcher to use - * @param sn ServerName of the backup master + * @param sn ServerName of the backup master * @return backup master info port in the the master address znode or 0 if no - * znode present. + * znode present. * @throws KeeperException if a ZooKeeper operation fails - * @throws IOException if the address of the ZooKeeper master cannot be retrieved + * @throws IOException if the address of the ZooKeeper master cannot be retrieved */ public static int getBackupMasterInfoPort(ZKWatcher zkw, final ServerName sn) throws KeeperException, IOException { From d6e8e66548948b7fcad72691f79ef84ac75887c2 Mon Sep 17 00:00:00 2001 From: GeorryHuang <215175212@qq.com> Date: Tue, 24 Aug 2021 17:04:15 +0800 Subject: [PATCH 4/6] modification --- .../hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon index b53a2280b57a..190f1dd857f0 100644 --- a/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon +++ b/hbase-server/src/main/jamon/org/apache/hadoop/hbase/tmpl/master/BackupMasterStatusTmpl.jamon @@ -27,9 +27,9 @@ org.apache.hadoop.hbase.master.HMaster; <%if (!master.isActiveMaster()) %> <%java> - ServerName active_master = master.getActiveMaster().isPresent() ? master.getActiveMaster().get() : null; + ServerName active_master = master.getActiveMaster().orElse(null); assert active_master != null : "Failed to retrieve active master's ServerName!"; - int activeInfoPort = master.getActiveMaster().isPresent() ? master.getActiveMasterInfoPort() : 0; + int activeInfoPort = active_master == null ? 0 : master.getActiveMasterInfoPort();