Index: src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java (revision 955314) +++ src/test/java/org/apache/hadoop/hbase/HBaseTestingUtility.java (working copy) @@ -697,7 +697,9 @@ } public void expireSession(ZooKeeperWrapper nodeZK) throws Exception{ - ZooKeeperWrapper zkw = ZooKeeperWrapper.createInstance(conf, ZooKeeperWrapper.class.getName()); + ZooKeeperWrapper zkw = + ZooKeeperWrapper.createInstance(conf, + ZooKeeperWrapper.class.getName()); zkw.registerListener(EmptyWatcher.instance); String quorumServers = zkw.getQuorumServers(); int sessionTimeout = 5 * 1000; // 5 seconds Index: src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java (revision 955314) +++ src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java (working copy) @@ -91,7 +91,8 @@ throws IOException, InterruptedException { new HTable(conf, HConstants.META_TABLE_NAME); - ZooKeeperWrapper zkw = ZooKeeperWrapper.createInstance(conf, TestZooKeeper.class.getName()); + ZooKeeperWrapper zkw = + ZooKeeperWrapper.createInstance(conf, TestZooKeeper.class.getName()); zkw.registerListener(EmptyWatcher.instance); String quorumServers = zkw.getQuorumServers(); int sessionTimeout = 5 * 1000; // 5 seconds @@ -178,7 +179,8 @@ */ @Test public void testZNodeDeletes() throws Exception { - ZooKeeperWrapper zkw = ZooKeeperWrapper.createInstance(conf, TestZooKeeper.class.getName()); + ZooKeeperWrapper zkw = + ZooKeeperWrapper.createInstance(conf, TestZooKeeper.class.getName()); zkw.registerListener(EmptyWatcher.instance); zkw.ensureExists("/l1/l2/l3/l4"); try { Index: src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java (revision 955314) +++ src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java (working copy) @@ -137,20 +137,22 @@ private List listeners = Collections.synchronizedList(new ArrayList()); // return the singleton given the name of the instance - public static ZooKeeperWrapper getInstance(String name) { + public static ZooKeeperWrapper getInstance(Configuration conf, String name) { + name = getZookeeperClusterKey(conf, name); return INSTANCES.get(name); } // creates only one instance public static ZooKeeperWrapper createInstance(Configuration conf, String name) { - if (getInstance(name) != null) { - return getInstance(name); + if (getInstance(conf, name) != null) { + return getInstance(conf, name); } ZooKeeperWrapper.createLock.lock(); try { - if (getInstance(name) == null) { + if (getInstance(conf, name) == null) { try { - ZooKeeperWrapper instance = new ZooKeeperWrapper(conf, name); - INSTANCES.put(name, instance); + String fullname = getZookeeperClusterKey(conf, name); + ZooKeeperWrapper instance = new ZooKeeperWrapper(conf, fullname); + INSTANCES.put(fullname, instance); } catch (Exception e) { LOG.error("<" + name + ">" + "Error creating a ZooKeeperWrapper " + e); @@ -160,7 +162,7 @@ finally { createLock.unlock(); } - return getInstance(name); + return getInstance(conf, name); } /** @@ -822,13 +824,25 @@ } /** + * List all znodes in the specified path + * @param znode path to list + * @return a list of all the znodes + */ + public List listZnodes(String znode) { + return listZnodes(znode, this); + } + + /** * List all znodes in the specified path and set a watcher on each * @param znode path to list * @param watcher watch to set, can be null * @return a list of all the znodes */ - public List listZnodes(String znode) { + public List listZnodes(String znode, Watcher watcher) { List nodes = null; + if (watcher == null) { + watcher = this; + } try { if (checkExistenceOf(znode)) { nodes = zooKeeper.getChildren(znode, this); @@ -907,12 +921,37 @@ } } + /** + * Get the key to the ZK ensemble for this configuration without + * adding a name at the end + * @param conf Configuration to use to build the key + * @return ensemble key without a name + */ public static String getZookeeperClusterKey(Configuration conf) { - return (conf.get(HConstants.ZOOKEEPER_QUORUM) - + ":" + conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT)); + return getZookeeperClusterKey(conf, null); } /** + * Get the key to the ZK ensemble for this configuration and append + * a name at the end + * @param conf Configuration to use to build the key + * @param name Name that should be appended at the end if not empty or null + * @return ensemble key with a name (if any) + */ + public static String getZookeeperClusterKey(Configuration conf, String name) { + String quorum = conf.get(HConstants.ZOOKEEPER_QUORUM.replaceAll( + "[\\t\\n\\x0B\\f\\r]", "")); + StringBuilder builder = new StringBuilder(quorum); + builder.append(":"); + builder.append(conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT)); + if (name != null && !name.isEmpty()) { + builder.append(","); + builder.append(name); + } + return builder.toString(); + } + + /** * Get the znode that has all the regions in transition. * @return path to znode */ Index: src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 955314) +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -321,7 +321,8 @@ } private void reinitializeZooKeeper() throws IOException { - zooKeeperWrapper = ZooKeeperWrapper.createInstance(conf, serverInfo.getServerName()); + zooKeeperWrapper = + ZooKeeperWrapper.createInstance(conf, serverInfo.getServerName()); zooKeeperWrapper.registerListener(this); watchMasterAddress(); } @@ -1425,7 +1426,8 @@ Integer mapKey = Bytes.mapKey(regionInfo.getRegionName()); HRegion region = this.onlineRegions.get(mapKey); RSZookeeperUpdater zkUpdater = - new RSZookeeperUpdater(serverInfo.getServerName(), regionInfo.getEncodedName()); + new RSZookeeperUpdater(conf, serverInfo.getServerName(), + regionInfo.getEncodedName()); if (region == null) { try { zkUpdater.startRegionOpenEvent(null, true); @@ -1498,7 +1500,8 @@ throws IOException { RSZookeeperUpdater zkUpdater = null; if(reportWhenCompleted) { - zkUpdater = new RSZookeeperUpdater(serverInfo.getServerName(), hri.getEncodedName()); + zkUpdater = new RSZookeeperUpdater(conf, + serverInfo.getServerName(), hri.getEncodedName()); zkUpdater.startRegionCloseEvent(null, false); } HRegion region = this.removeFromOnlineRegions(hri); Index: src/main/java/org/apache/hadoop/hbase/regionserver/RSZookeeperUpdater.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/RSZookeeperUpdater.java (revision 955314) +++ src/main/java/org/apache/hadoop/hbase/regionserver/RSZookeeperUpdater.java (working copy) @@ -6,6 +6,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HMsg; import org.apache.hadoop.hbase.executor.RegionTransitionEventData; import org.apache.hadoop.hbase.executor.HBaseEventHandler; @@ -35,12 +37,14 @@ private int zkVersion = 0; HBaseEventType lastUpdatedState; - public RSZookeeperUpdater(String regionServerName, String regionName) { - this(regionServerName, regionName, 0); + public RSZookeeperUpdater(Configuration conf, + String regionServerName, String regionName) { + this(conf, regionServerName, regionName, 0); } - public RSZookeeperUpdater(String regionServerName, String regionName, int zkVersion) { - this.zkWrapper = ZooKeeperWrapper.getInstance(regionServerName); + public RSZookeeperUpdater(Configuration conf, String regionServerName, + String regionName, int zkVersion) { + this.zkWrapper = ZooKeeperWrapper.getInstance(conf, regionServerName); this.regionServerName = regionServerName; this.regionName = regionName; // get the region ZNode we have to create Index: src/main/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java (revision 955314) +++ src/main/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java (working copy) @@ -115,7 +115,9 @@ } else { master.getRegionManager().removeRegion(regionInfo); } - ZooKeeperWrapper zkWrapper = ZooKeeperWrapper.getInstance(HMaster.class.getName()); + ZooKeeperWrapper zkWrapper = + ZooKeeperWrapper.getInstance(master.getConfiguration(), + HMaster.class.getName()); zkWrapper.deleteUnassignedRegion(regionInfo.getEncodedName()); return true; } Index: src/main/java/org/apache/hadoop/hbase/master/ZKUnassignedWatcher.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/ZKUnassignedWatcher.java (revision 955314) +++ src/main/java/org/apache/hadoop/hbase/master/ZKUnassignedWatcher.java (working copy) @@ -24,6 +24,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.executor.HBaseEventHandler.HBaseEventType; import org.apache.hadoop.hbase.master.handler.MasterCloseRegionHandler; import org.apache.hadoop.hbase.master.handler.MasterOpenRegionHandler; @@ -39,21 +40,17 @@ */ public class ZKUnassignedWatcher implements Watcher { private static final Log LOG = LogFactory.getLog(ZKUnassignedWatcher.class); - - // TODO: Start move this to HConstants - static final String ROOT_TABLE_NAME_STR = "-ROOT-"; - static final String META_TABLE_NAME_STR = ".META."; - // TODO: End move this to HConstants private ZooKeeperWrapper zkWrapper = null; - public static void start() throws IOException { - new ZKUnassignedWatcher(); + public static void start(Configuration conf) throws IOException { + new ZKUnassignedWatcher(conf); LOG.debug("Started ZKUnassigned watcher"); } - public ZKUnassignedWatcher() throws IOException { - zkWrapper = ZooKeeperWrapper.getInstance(HMaster.class.getName()); + public ZKUnassignedWatcher(Configuration conf) throws IOException { + zkWrapper = + ZooKeeperWrapper.getInstance(conf, HMaster.class.getName()); // If the UNASSIGNED ZNode does not exist, create it. zkWrapper.createZNodeIfNotExists(zkWrapper.getRegionInTransitionZNode()); // TODO: get the outstanding changes in UNASSIGNED Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 955314) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -201,7 +201,8 @@ // We'll succeed if we are only master or if we win the race when many // masters. Otherwise we park here inside in writeAddressToZooKeeper. // TODO: Bring up the UI to redirect to active Master. - zooKeeperWrapper = ZooKeeperWrapper.createInstance(conf, HMaster.class.getName()); + zooKeeperWrapper = + ZooKeeperWrapper.createInstance(conf, HMaster.class.getName()); zooKeeperWrapper.registerListener(this); this.zkMasterAddressWatcher = new ZKMasterAddressWatcher(this.zooKeeperWrapper, this.shutdownRequested); @@ -216,7 +217,7 @@ // Start the unassigned watcher - which will create the unassgined region // in ZK. This is needed before RegionManager() constructor tries to assign // the root region. - ZKUnassignedWatcher.start(); + ZKUnassignedWatcher.start(this.conf); // init the various event handlers HBaseEventHandler.init(serverManager); // start the "close region" executor service @@ -1155,7 +1156,8 @@ zooKeeperWrapper.close(); try { - zooKeeperWrapper = ZooKeeperWrapper.createInstance(conf, HMaster.class.getName()); + zooKeeperWrapper = + ZooKeeperWrapper.createInstance(conf, HMaster.class.getName()); zooKeeperWrapper.registerListener(this); this.zkMasterAddressWatcher.setZookeeper(zooKeeperWrapper); if(!this.zkMasterAddressWatcher. Index: src/main/java/org/apache/hadoop/hbase/master/RegionManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/RegionManager.java (revision 955314) +++ src/main/java/org/apache/hadoop/hbase/master/RegionManager.java (working copy) @@ -136,7 +136,8 @@ Configuration conf = master.getConfiguration(); this.master = master; - this.zkWrapper = ZooKeeperWrapper.getInstance(HMaster.class.getName()); + this.zkWrapper = + ZooKeeperWrapper.getInstance(conf, HMaster.class.getName()); this.maxAssignInOneGo = conf.getInt("hbase.regions.percheckin", 10); this.loadBalancer = new LoadBalancer(conf); Index: src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java (revision 955314) +++ src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java (working copy) @@ -228,9 +228,8 @@ */ public synchronized ZooKeeperWrapper getZooKeeperWrapper() throws IOException { if(zooKeeperWrapper == null) { - String zkWrapperName = HConnectionManager.class.getName() + "-" + - ZooKeeperWrapper.getZookeeperClusterKey(conf); - zooKeeperWrapper = ZooKeeperWrapper.createInstance(conf, zkWrapperName); + zooKeeperWrapper = + ZooKeeperWrapper.createInstance(conf, HConnectionManager.class.getName()); zooKeeperWrapper.registerListener(this); } return zooKeeperWrapper;