From 1178c4b89bad28210fe8d2c207cce814d6fd9a21 Mon Sep 17 00:00:00 2001 From: tedyu Date: Tue, 24 Nov 2015 15:02:47 -0800 Subject: [PATCH] HBASE-14861 HBASE_ZNODE_FILE on master server is overwritten by regionserver process in case of master-rs collocation (Samir Ahmic) --- .../org/apache/hadoop/hbase/ZNodeClearer.java | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/ZNodeClearer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/ZNodeClearer.java index a8b966a6e63..e68a068c7d2 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ZNodeClearer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ZNodeClearer.java @@ -29,8 +29,11 @@ import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer; import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker; +import org.apache.hadoop.hbase.zookeeper.ZKUtil; import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; +import org.apache.zookeeper.KeeperException; /** *

Contains a set of methods for the collaboration between the start/stop scripts and the @@ -56,7 +59,7 @@ public class ZNodeClearer { String fileName = ZNodeClearer.getMyEphemeralNodeFileName(); if (fileName == null) { LOG.warn("Environment variable HBASE_ZNODE_FILE not set; znodes will not be cleared " + - "on crash by start scripts (Longer MTTR!)"); + "on crash by start scripts (Longer MTTR!)"); return; } @@ -121,10 +124,42 @@ public class ZNodeClearer { new File(fileName).delete(); } } + + /** + * See HBASE-14861. We are extracting master ServerName from rsZnodePath + * example: "/hbase/rs/server.example.com,16020,1448266496481" + * @param rsZnodePath from HBASE_ZNODE_FILE + * @return String representation of ServerName or null if fails + */ + + public static String parseMasterServerName(String rsZnodePath) { + String masterServerName = null; + try { + String[] rsZnodeParts = rsZnodePath.split("/"); + masterServerName = rsZnodeParts[rsZnodeParts.length -1]; + } catch (IndexOutOfBoundsException e) { + LOG.warn("String " + rsZnodePath + " has wrong fromat", e); + } + return masterServerName; + } + + /** + * + * @return true if cluster is configured with master-rs collocation + */ + private static boolean tablesOnMaster(Configuration conf) { + boolean tablesOnMaster = true; + String confValue = conf.get(BaseLoadBalancer.TABLES_ON_MASTER); + if (confValue != null && confValue.equalsIgnoreCase("none")) { + tablesOnMaster = false; + } + return tablesOnMaster; + } /** * Delete the master znode if its content (ServerName string) is the same - * as the one in the znode file. (env: HBASE_ZNODE_FILE). + * as the one in the znode file. (env: HBASE_ZNODE_FILE). I case of master-rs + * colloaction we extract ServerName string from rsZnode path.(HBASE-14861) * @return true on successful deletion, false otherwise. */ public static boolean clear(Configuration conf) { @@ -146,7 +181,14 @@ public class ZNodeClearer { String znodeFileContent; try { znodeFileContent = ZNodeClearer.readMyEphemeralNodeOnDisk(); - return MasterAddressTracker.deleteIfEquals(zkw, znodeFileContent); + if(ZNodeClearer.tablesOnMaster(conf)) { + //In case of master crash also remove rsZnode since master is also regionserver + ZKUtil.deleteNodeFailSilent(zkw, znodeFileContent); + return MasterAddressTracker.deleteIfEquals(zkw, + ZNodeClearer.parseMasterServerName(znodeFileContent)); + } else { + return MasterAddressTracker.deleteIfEquals(zkw, znodeFileContent); + } } catch (FileNotFoundException fnfe) { // If no file, just keep going -- return success. LOG.warn("Can't find the znode file; presume non-fatal", fnfe); @@ -154,6 +196,9 @@ public class ZNodeClearer { } catch (IOException e) { LOG.warn("Can't read the content of the znode file", e); return false; + } catch (KeeperException e) { + LOG.warn("Zookeeper exception deleting znode", e); + return false; } finally { zkw.close(); }