Return-Path: Delivered-To: apmail-hadoop-hbase-commits-archive@minotaur.apache.org Received: (qmail 98733 invoked from network); 31 Jan 2009 21:06:03 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 31 Jan 2009 21:06:03 -0000 Received: (qmail 36061 invoked by uid 500); 31 Jan 2009 21:06:03 -0000 Delivered-To: apmail-hadoop-hbase-commits-archive@hadoop.apache.org Received: (qmail 36042 invoked by uid 500); 31 Jan 2009 21:06:03 -0000 Mailing-List: contact hbase-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hbase-dev@hadoop.apache.org Delivered-To: mailing list hbase-commits@hadoop.apache.org Received: (qmail 36032 invoked by uid 99); 31 Jan 2009 21:06:03 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 31 Jan 2009 13:06:03 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 31 Jan 2009 21:05:56 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 5439D2388892; Sat, 31 Jan 2009 21:05:36 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r739612 - in /hadoop/hbase/trunk: ./ src/java/org/apache/hadoop/hbase/ src/java/org/apache/hadoop/hbase/master/ src/java/org/apache/hadoop/hbase/regionserver/ src/java/org/apache/hadoop/hbase/zookeeper/ src/test/org/apache/hadoop/hbase/ src... Date: Sat, 31 Jan 2009 21:05:35 -0000 To: hbase-commits@hadoop.apache.org From: jdcryans@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090131210536.5439D2388892@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jdcryans Date: Sat Jan 31 21:05:35 2009 New Revision: 739612 URL: http://svn.apache.org/viewvc?rev=739612&view=rev Log: HBASE-1146 Replace the HRS leases with Zookeeper Modified: hadoop/hbase/trunk/CHANGES.txt hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HConstants.java hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestHBaseCluster.java hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/filter/TestRowFilterAfterWrite.java hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestLogRolling.java Modified: hadoop/hbase/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/CHANGES.txt (original) +++ hadoop/hbase/trunk/CHANGES.txt Sat Jan 31 21:05:35 2009 @@ -4,6 +4,7 @@ HBASE-1147 Modify the scripts to use Zookeeper HBASE-1144 Store the ROOT region location in Zookeeper (Nitay Joffe via Stack) + HBASE-1146 Replace the HRS leases with Zookeeper BUG FIXES HBASE-1140 "ant clean test" fails (Nitay Joffe via Stack) Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HConstants.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HConstants.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HConstants.java (original) +++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/HConstants.java Sat Jan 31 21:05:35 2009 @@ -110,6 +110,11 @@ static final String ZOOKEEPER_SAFE_MODE_ZNODE = "zookeeper.znode.safemode"; /** Default ZooKeeper ZNode storing safe mode. */ static final String DEFAULT_ZOOKEEPER_SAFE_MODE_ZNODE = "safe-mode"; + + /** Parameter name for ZooKeeper ZNode storing safe mode. */ + static final String ZOOKEEPER_RS_ZNODE = "zookeeper.znode.rs"; + /** Default ZooKeeper ZNode storing safe mode. */ + static final String DEFAULT_ZOOKEEPER_RS_ZNODE = "rs"; /** Parameter name for hbase.regionserver address. */ static final String REGIONSERVER_ADDRESS = "hbase.regionserver"; Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java (original) +++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/HMaster.java Sat Jan 31 21:05:35 2009 @@ -73,6 +73,7 @@ import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.Sleeper; import org.apache.hadoop.hbase.util.Writables; +import org.apache.hadoop.hbase.zookeeper.ZooKeeperWrapper; import org.apache.hadoop.hdfs.DistributedFileSystem; import org.apache.hadoop.hdfs.protocol.FSConstants; import org.apache.hadoop.io.MapWritable; @@ -114,6 +115,7 @@ final int numRetries; final long maxRegionOpenTime; final int leaseTimeout; + private final ZooKeeperWrapper zooKeeperWrapper; volatile DelayQueue delayedToDoQueue = new DelayQueue(); @@ -239,7 +241,8 @@ conf.getInt("hbase.master.meta.thread.rescanfrequency", 60 * 1000); this.sleeper = new Sleeper(this.threadWakeFrequency, this.closed); - + + zooKeeperWrapper = new ZooKeeperWrapper(conf); serverManager = new ServerManager(this); regionManager = new RegionManager(this); @@ -396,7 +399,6 @@ } } server.stop(); // Stop server - serverManager.stop(); regionManager.stop(); // Join up with all threads @@ -498,7 +500,6 @@ this.metrics = new MasterMetrics(); try { regionManager.start(); - serverManager.start(); // Put up info server. int port = this.conf.getInt("hbase.master.info.port", 60010); if (port >= 0) { @@ -926,6 +927,14 @@ } } } + + /** + * Get the ZK wrapper object + * @return + */ + public ZooKeeperWrapper getZooKeeperWrapper() { + return zooKeeperWrapper; + } /* * Main program Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java (original) +++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/RegionManager.java Sat Jan 31 21:05:35 2009 @@ -146,7 +146,7 @@ // Scans the meta table metaScannerThread = new MetaScanner(master); - zooKeeperWrapper = new ZooKeeperWrapper(conf); + zooKeeperWrapper = master.getZooKeeperWrapper(); zooKeeperNumRetries = conf.getInt(ZOOKEEPER_RETRIES, DEFAULT_ZOOKEEPER_RETRIES); zooKeeperPause = conf.getInt(ZOOKEEPER_PAUSE, DEFAULT_ZOOKEEPER_PAUSE); Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java (original) +++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/master/ServerManager.java Sat Jan 31 21:05:35 2009 @@ -39,12 +39,13 @@ import org.apache.hadoop.hbase.HServerAddress; import org.apache.hadoop.hbase.HMsg; import org.apache.hadoop.hbase.HRegionInfo; -import org.apache.hadoop.hbase.LeaseException; -import org.apache.hadoop.hbase.Leases; -import org.apache.hadoop.hbase.LeaseListener; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.HMsg.Type; +import org.apache.hadoop.hbase.zookeeper.ZooKeeperWrapper; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.EventType; /** * The ServerManager class manages info about region servers - HServerInfo, @@ -62,13 +63,14 @@ private static final HMsg [] EMPTY_HMSG_ARRAY = new HMsg[0]; private final AtomicInteger quiescedServers = new AtomicInteger(0); + private final ZooKeeperWrapper zooKeeperWrapper; /** The map of known server names to server info */ final Map serversToServerInfo = new ConcurrentHashMap(); /** - * Set of known dead servers. On lease expiration, servers are added here. + * Set of known dead servers. On znode expiration, servers are added here. * Boolean holds whether its logs have been split or not. Initially set to * false. */ @@ -84,7 +86,6 @@ new ConcurrentHashMap(); private HMaster master; - private final Leases serverLeases; // Last time we logged average load. private volatile long lastLogOfAverageLaod = 0; @@ -100,9 +101,7 @@ */ public ServerManager(HMaster master) { this.master = master; - serverLeases = new Leases(master.leaseTimeout, - master.getConfiguration().getInt("hbase.master.lease.thread.wakefrequency", - 15 * 1000)); + zooKeeperWrapper = master.getZooKeeperWrapper(); this.loggingPeriodForAverageLoad = master.getConfiguration(). getLong("hbase.master.avgload.logging.period", 60000); this.nobalancingCount = master.getConfiguration(). @@ -111,8 +110,7 @@ /** * Look to see if we have ghost references to this regionserver such as - * still-existing leases or if regionserver is on the dead servers list - * getting its logs processed. + * if regionserver is on the dead servers list getting its logs processed. * @param serverInfo * @return True if still ghost references and we have not been able to clear * them or the server is shutting down. @@ -120,7 +118,6 @@ private boolean checkForGhostReferences(final HServerInfo serverInfo) { String s = serverInfo.getServerAddress().toString().trim(); boolean result = false; - boolean lease = false; for (long sleepTime = -1; !master.closed.get() && !result;) { if (sleepTime != -1) { try { @@ -129,28 +126,12 @@ // Continue } } - if (!lease) { - try { - this.serverLeases.createLease(s, new ServerExpirer(s)); - } catch (Leases.LeaseStillHeldException e) { - LOG.debug("Waiting on current lease to expire for " + e.getName()); - sleepTime = this.master.leaseTimeout / 4; - continue; - } - lease = true; - } // May be on list of dead servers. If so, wait till we've cleared it. String addr = serverInfo.getServerAddress().toString(); if (isDead(addr)) { LOG.debug("Waiting on " + addr + " removal from dead list before " + "processing report-for-duty request"); sleepTime = this.master.threadWakeFrequency; - try { - // Keep up lease. May be here > lease expiration. - this.serverLeases.renewLease(s); - } catch (LeaseException e) { - LOG.warn("Failed renewal. Retrying.", e); - } continue; } result = true; @@ -164,6 +145,10 @@ */ public void regionServerStartup(final HServerInfo serverInfo) { String s = serverInfo.getServerAddress().toString().trim(); + Watcher watcher = new ServerExpirer(serverInfo.getServerAddress() + .toString().trim()); + zooKeeperWrapper.updateRSLocationGetWatch(serverInfo, watcher); + LOG.info("Received start message from: " + s); if (!checkForGhostReferences(serverInfo)) { return; @@ -291,7 +276,7 @@ } synchronized (serversToServerInfo) { - cancelLease(serverName); + removeServerInfo(serverName); serversToServerInfo.notifyAll(); } @@ -306,14 +291,11 @@ private void processRegionServerExit(String serverName, HMsg[] msgs) { synchronized (serversToServerInfo) { try { - // HRegionServer is shutting down. Cancel the server's lease. - // Note that canceling the server's lease takes care of updating - // serversToServerInfo, etc. - if (cancelLease(serverName)) { - // Only process the exit message if the server still has a lease. + // HRegionServer is shutting down. + if (removeServerInfo(serverName)) { + // 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 " + serverName + - ": MSG_REPORT_EXITING -- lease cancelled"); + LOG.info("Region server " + serverName + ": MSG_REPORT_EXITING"); // Get all the regions the server was serving reassigned // (if we are not shutting down). if (!master.closed.get()) { @@ -357,10 +339,6 @@ private HMsg[] processRegionServerAllsWell(String serverName, HServerInfo serverInfo, HRegionInfo[] mostLoadedRegions, HMsg[] msgs) throws IOException { - // All's well. Renew the server's lease. - // This will always succeed; otherwise, the fetch of serversToServerInfo - // would have failed above. - serverLeases.renewLease(serverName); // Refresh the info object and the load information serversToServerInfo.put(serverName, serverInfo); @@ -608,27 +586,19 @@ } } - /** Cancel a server's lease and update its load information */ - private boolean cancelLease(final String serverName) { - boolean leaseCancelled = false; + /** Update a server load information because it's shutting down*/ + private boolean removeServerInfo(final String serverName) { + boolean infoUpdated = false; HServerInfo info = serversToServerInfo.remove(serverName); - // Only cancel lease and update load information once. + // Only update load information once. // This method can be called a couple of times during shutdown. if (info != null) { - LOG.info("Cancelling lease for " + serverName); + LOG.info("Removing server's info " + serverName); if (master.getRootRegionLocation() != null && info.getServerAddress().equals(master.getRootRegionLocation())) { master.regionManager.unsetRootRegion(); } - try { - serverLeases.cancelLease(serverName); - } catch (LeaseException e) { - if (LOG.isDebugEnabled()) { - LOG.debug("Cancelling " + serverName + " got " + e.getMessage() + - "...continuing"); - } - } - leaseCancelled = true; + infoUpdated = true; // update load information HServerLoad load = serversToLoad.remove(serverName); @@ -642,7 +612,7 @@ } } } - return leaseCancelled; + return infoUpdated; } /** @@ -726,8 +696,7 @@ * Wait on regionservers to report in * with {@link #regionServerReport(HServerInfo, HMsg[])} so they get notice * the master is going down. Waits until all region servers come back with - * a MSG_REGIONSERVER_STOP which will cancel their lease or until leases held - * by remote region servers have expired. + * a MSG_REGIONSERVER_STOP. */ void letRegionServersShutdown() { if (!master.fsOk) { @@ -737,8 +706,7 @@ } synchronized (serversToServerInfo) { while (serversToServerInfo.size() > 0) { - LOG.info("Waiting on following regionserver(s) to go down (or " + - "region server lease expiration, whichever happens first): " + + LOG.info("Waiting on following regionserver(s) to go down " + serversToServerInfo.values()); try { serversToServerInfo.wait(master.threadWakeFrequency); @@ -749,65 +717,55 @@ } } - /** Instantiated to monitor the health of a region server */ - private class ServerExpirer implements LeaseListener { + /** Watcher triggered when a RS znode is deleted */ + private class ServerExpirer implements Watcher { private String server; ServerExpirer(String server) { this.server = server; } - public void leaseExpired() { - LOG.info(server + " lease expired"); - // Remove the server from the known servers list and update load info - HServerInfo info = serversToServerInfo.remove(server); - boolean rootServer = false; - if (info != null) { - HServerAddress root = master.getRootRegionLocation(); - if (root != null && root.equals(info.getServerAddress())) { - // NOTE: If the server was serving the root region, we cannot reassign - // it here because the new server will start serving the root region - // before ProcessServerShutdown has a chance to split the log file. - master.regionManager.unsetRootRegion(); - rootServer = true; - } - String serverName = info.getServerAddress().toString(); - HServerLoad load = serversToLoad.remove(serverName); - if (load != null) { - synchronized (loadToServers) { - Set servers = loadToServers.get(load); - if (servers != null) { - servers.remove(serverName); - loadToServers.put(load, servers); + public void process(WatchedEvent event) { + if(event.getType().equals(EventType.NodeDeleted)) { + LOG.info(server + " znode expired"); + // Remove the server from the known servers list and update load info + HServerInfo info = serversToServerInfo.remove(server); + boolean rootServer = false; + if (info != null) { + HServerAddress root = master.getRootRegionLocation(); + if (root != null && root.equals(info.getServerAddress())) { + // NOTE: If the server was serving the root region, we cannot + // reassign + // it here because the new server will start serving the root region + // before ProcessServerShutdown has a chance to split the log file. + master.regionManager.unsetRootRegion(); + rootServer = true; + } + String serverName = info.getServerAddress().toString(); + HServerLoad load = serversToLoad.remove(serverName); + if (load != null) { + synchronized (loadToServers) { + Set servers = loadToServers.get(load); + if (servers != null) { + servers.remove(serverName); + loadToServers.put(load, servers); + } } } + deadServers.put(server, Boolean.FALSE); + try { + master.toDoQueue.put(new ProcessServerShutdown(master, info, + rootServer)); + } catch (InterruptedException e) { + LOG.error("insert into toDoQueue was interrupted", e); + } } - deadServers.put(server, Boolean.FALSE); - try { - master.toDoQueue.put( - new ProcessServerShutdown(master, info, rootServer)); - } catch (InterruptedException e) { - LOG.error("insert into toDoQueue was interrupted", e); + synchronized (serversToServerInfo) { + serversToServerInfo.notifyAll(); } } - synchronized (serversToServerInfo) { - serversToServerInfo.notifyAll(); - } } } - - /** Start up the server manager */ - public void start() { - // Leases are not the same as Chore threads. Set name differently. - this.serverLeases.setName("ServerManager.leaseChecker"); - this.serverLeases.start(); - } - - /** Shut down the server manager */ - public void stop() { - // stop monitor lease monitor - serverLeases.close(); - } /** * @param serverName Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original) +++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Sat Jan 31 21:05:35 2009 @@ -284,6 +284,16 @@ throw new NullPointerException("Server address cannot be null; " + "hbase-958 debugging"); } + this.zooKeeperWrapper = new ZooKeeperWrapper(conf); + boolean startCodeOk = false; + while(!startCodeOk) { + serverInfo.setStartCode(System.currentTimeMillis()); + startCodeOk = zooKeeperWrapper.writeRSLocation(serverInfo); + if(!startCodeOk) { + LOG.debug("Start code already taken, trying another one"); + } + } + this.numRegionsToReport = conf.getInt("hbase.regionserver.numregionstoreport", 10); @@ -295,8 +305,7 @@ for(int i = 0; i < nbBlocks; i++) { reservedSpace.add(new byte[DEFAULT_SIZE_RESERVATION_BLOCK]); } - - this.zooKeeperWrapper = new ZooKeeperWrapper(conf); + } /** Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java (original) +++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java Sat Jan 31 21:05:35 2009 @@ -31,6 +31,7 @@ import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HServerAddress; +import org.apache.hadoop.hbase.HServerInfo; import org.apache.hadoop.hbase.util.Bytes; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; @@ -64,6 +65,7 @@ private final String parentZNode; private final String rootRegionZNode; private final String outOfSafeModeZNode; + private final String rsZNode; /** * Create a ZooKeeperWrapper. @@ -103,20 +105,14 @@ String rootServerZNodeName = conf.get(ZOOKEEPER_ROOT_SERVER_ZNODE, DEFAULT_ZOOKEEPER_ROOT_SERVER_ZNODE); - if (rootServerZNodeName.startsWith(ZNODE_PATH_SEPARATOR)) { - rootRegionZNode = rootServerZNodeName; - } else { - rootRegionZNode = parentZNode + ZNODE_PATH_SEPARATOR + rootServerZNodeName; - } - String outOfSafeModeZNodeName = conf.get(ZOOKEEPER_SAFE_MODE_ZNODE, - DEFAULT_ZOOKEEPER_SAFE_MODE_ZNODE); - if (outOfSafeModeZNodeName.startsWith(ZNODE_PATH_SEPARATOR)) { - outOfSafeModeZNode = outOfSafeModeZNodeName; - } else { - outOfSafeModeZNode = parentZNode + ZNODE_PATH_SEPARATOR + - outOfSafeModeZNodeName; - } + DEFAULT_ZOOKEEPER_SAFE_MODE_ZNODE); + String rsZNodeName = conf.get(ZOOKEEPER_RS_ZNODE, + DEFAULT_ZOOKEEPER_RS_ZNODE); + + rootRegionZNode = getZNode(rootServerZNodeName); + outOfSafeModeZNode = getZNode(outOfSafeModeZNodeName); + rsZNode = getZNode(rsZNodeName); } /** @@ -218,11 +214,11 @@ return address; } - private boolean ensureParentZNodeExists() { + private boolean ensureZNodeExists(String path) { try { - zooKeeper.create(parentZNode, new byte[0], + zooKeeper.create(path, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); - LOG.debug("Created ZNode " + parentZNode); + LOG.debug("Created ZNode " + path); return true; } catch (KeeperException.NodeExistsException e) { return true; // ok, move on. @@ -240,7 +236,7 @@ * @return true if operation succeeded, false otherwise. */ public boolean deleteRootRegionLocation() { - if (!ensureParentZNodeExists()) { + if (!ensureZNodeExists(parentZNode)) { return false; } @@ -301,7 +297,7 @@ return deleteRootRegionLocation(); } - if (!ensureParentZNodeExists()) { + if (!ensureZNodeExists(parentZNode)) { return false; } @@ -320,7 +316,7 @@ * @return true if we're out of safe mode, false otherwise. */ public boolean checkOutOfSafeMode() { - if (!ensureParentZNodeExists()) { + if (!ensureZNodeExists(parentZNode)) { return false; } @@ -332,7 +328,7 @@ * @return true if ephemeral ZNode created successfully, false otherwise. */ public boolean writeOutOfSafeMode() { - if (!ensureParentZNodeExists()) { + if (!ensureZNodeExists(parentZNode)) { return false; } @@ -349,7 +345,55 @@ return false; } + + /** + * Write in ZK this RS startCode and address. + * Ensures that the full path exists. + * @param info The RS info + * @return true if the location was written, false if it failed + */ + public boolean writeRSLocation(HServerInfo info) { + ensureZNodeExists(parentZNode); + ensureZNodeExists(rsZNode); + byte[] data = Bytes.toBytes(info.getServerAddress().getBindAddress()); + String znode = rsZNode + ZNODE_PATH_SEPARATOR + info.getStartCode(); + try { + zooKeeper.create(znode, data, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + LOG.debug("Created ZNode " + znode + + " with data " + info.getServerAddress().getBindAddress()); + return true; + } catch (KeeperException e) { + LOG.warn("Failed to create " + znode + " znode in ZooKeeper: " + e); + } catch (InterruptedException e) { + LOG.warn("Failed to create " + znode + " znode in ZooKeeper: " + e); + } + return false; + } + /** + * Update the RS address and set a watcher on the znode + * @param info The RS info + * @param watcher The watcher to put on the znode + * @return true if the update is done, false if it failed + */ + public boolean updateRSLocationGetWatch(HServerInfo info, Watcher watcher) { + byte[] data = Bytes.toBytes(info.getServerAddress().getBindAddress()); + String znode = rsZNode + "/" + info.getStartCode(); + try { + zooKeeper.setData(znode, data, -1); + LOG.debug("Updated ZNode " + znode + + " with data " + info.getServerAddress().getBindAddress()); + zooKeeper.getData(znode, watcher, null); + return true; + } catch (KeeperException e) { + LOG.warn("Failed to update " + znode + " znode in ZooKeeper: " + e); + } catch (InterruptedException e) { + LOG.warn("Failed to update " + znode + " znode in ZooKeeper: " + e); + } + + return false; + } + private boolean checkExistenceOf(String path) { Stat stat = null; try { @@ -374,4 +418,10 @@ LOG.warn("Failed to close connection with ZooKeeper"); } } + + private String getZNode(String znodeName) { + return znodeName.startsWith(ZNODE_PATH_SEPARATOR) ? + znodeName : + parentZNode + ZNODE_PATH_SEPARATOR + znodeName; + } } Modified: hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestHBaseCluster.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestHBaseCluster.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestHBaseCluster.java (original) +++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestHBaseCluster.java Sat Jan 31 21:05:35 2009 @@ -55,7 +55,6 @@ // Make lease timeout longer, lease checks less frequent conf.setInt("hbase.master.lease.period", 10 * 1000); - conf.setInt("hbase.master.lease.thread.wakefrequency", 5 * 1000); // Increase the amount of time between client retries conf.setLong("hbase.client.pause", 15 * 1000); Modified: hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/filter/TestRowFilterAfterWrite.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/filter/TestRowFilterAfterWrite.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/filter/TestRowFilterAfterWrite.java (original) +++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/filter/TestRowFilterAfterWrite.java Sat Jan 31 21:05:35 2009 @@ -81,7 +81,6 @@ // Make lease timeout longer, lease checks less frequent conf.setInt("hbase.master.lease.period", 10 * 1000); - conf.setInt("hbase.master.lease.thread.wakefrequency", 5 * 1000); // For debugging conf.setInt("hbase.regionserver.lease.period", 20 * 60 * 1000); Modified: hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestLogRolling.java URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestLogRolling.java?rev=739612&r1=739611&r2=739612&view=diff ============================================================================== --- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestLogRolling.java (original) +++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/regionserver/TestLogRolling.java Sat Jan 31 21:05:35 2009 @@ -88,7 +88,6 @@ // Make lease timeout longer, lease checks less frequent conf.setInt("hbase.master.lease.period", 10 * 1000); - conf.setInt("hbase.master.lease.thread.wakefrequency", 5 * 1000); // Increase the amount of time between client retries conf.setLong("hbase.client.pause", 15 * 1000);