You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2013/05/15 06:09:01 UTC
svn commit: r1482670 - in /hbase/branches/0.95:
hbase-client/src/main/java/org/apache/hadoop/hbase/client/
hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/
hbase-client/src/test/java/org/apache/hadoop/hbase/client/
hbase-client/src/test/r...
Author: stack
Date: Wed May 15 04:09:00 2013
New Revision: 1482670
URL: http://svn.apache.org/r1482670
Log:
HBASE-8531 TestZooKeeper fails in trunk/0.95 builds
Added:
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Registry.java
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZooKeeperRegistry.java
hbase/branches/0.95/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
hbase/branches/0.95/hbase-client/src/test/resources/
hbase/branches/0.95/hbase-client/src/test/resources/hbase-site.xml (with props)
Modified:
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ServerCallable.java
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/RegionServerStoppedException.java
hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java Wed May 15 04:09:00 2013
@@ -193,7 +193,7 @@ public class ClientScanner extends Abstr
done) {
close();
if (LOG.isDebugEnabled()) {
- LOG.debug("Finished with scanning at " + this.currentRegion);
+ LOG.debug("Finished scanning region " + this.currentRegion);
}
return false;
}
@@ -301,8 +301,9 @@ public class ClientScanner extends Abstr
} else {
Throwable cause = e.getCause();
if ((cause == null || (!(cause instanceof NotServingRegionException)
- && !(cause instanceof RegionServerStoppedException)))
- && !(e instanceof OutOfOrderScannerNextException)) {
+ && !(cause instanceof RegionServerStoppedException))) &&
+ !(e instanceof RegionServerStoppedException) &&
+ !(e instanceof OutOfOrderScannerNextException)) {
throw e;
}
}
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java Wed May 15 04:09:00 2013
@@ -333,12 +333,10 @@ public interface HConnection extends Abo
public boolean getRegionCachePrefetch(final byte[] tableName);
/**
- * Scan zookeeper to get the number of region servers
* @return the number of region servers that are currently running
* @throws IOException if a remote or network exception occurs
* @deprecated This method will be changed from public to package protected.
*/
- @Deprecated
public int getCurrentNrHRS() throws IOException;
/**
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java Wed May 15 04:09:00 2013
@@ -20,6 +20,7 @@ package org.apache.hadoop.hbase.client;
import java.io.Closeable;
import java.io.IOException;
+import java.lang.reflect.Constructor;
import java.lang.reflect.UndeclaredThrowableException;
import java.net.SocketException;
import java.util.ArrayList;
@@ -144,9 +145,6 @@ import org.apache.hadoop.hbase.util.Pair
import org.apache.hadoop.hbase.util.SoftValueSortedMap;
import org.apache.hadoop.hbase.util.Triple;
import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;
-import org.apache.hadoop.hbase.zookeeper.MetaRegionTracker;
-import org.apache.hadoop.hbase.zookeeper.ZKClusterId;
-import org.apache.hadoop.hbase.zookeeper.ZKTableReadOnly;
import org.apache.hadoop.hbase.zookeeper.ZKUtil;
import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher;
import org.apache.hadoop.ipc.RemoteException;
@@ -251,17 +249,18 @@ public class HConnectionManager {
* @return HConnection object for <code>conf</code>
* @throws ZooKeeperConnectionException
*/
+ @SuppressWarnings("resource")
public static HConnection getConnection(final Configuration conf)
throws IOException {
HConnectionKey connectionKey = new HConnectionKey(conf);
synchronized (CONNECTION_INSTANCES) {
HConnectionImplementation connection = CONNECTION_INSTANCES.get(connectionKey);
if (connection == null) {
- connection = new HConnectionImplementation(conf, true);
+ connection = (HConnectionImplementation)createConnection(conf, true);
CONNECTION_INSTANCES.put(connectionKey, connection);
} else if (connection.isClosed()) {
HConnectionManager.deleteConnection(connectionKey, true);
- connection = new HConnectionImplementation(conf, true);
+ connection = (HConnectionImplementation)createConnection(conf, true);
CONNECTION_INSTANCES.put(connectionKey, connection);
}
connection.incCount();
@@ -280,7 +279,28 @@ public class HConnectionManager {
*/
public static HConnection createConnection(Configuration conf)
throws IOException {
- return new HConnectionImplementation(conf, false);
+ return createConnection(conf, false);
+ }
+
+ static HConnection createConnection(final Configuration conf, final boolean managed)
+ throws IOException {
+ String className = conf.get("hbase.client.connection.impl",
+ HConnectionManager.HConnectionImplementation.class.getName());
+ Class<?> clazz = null;
+ try {
+ clazz = Class.forName(className);
+ } catch (ClassNotFoundException e) {
+ throw new IOException(e);
+ }
+ try {
+ // Default HCM#HCI is not accessible; make it so before invoking.
+ Constructor<?> constructor =
+ clazz.getDeclaredConstructor(Configuration.class, boolean.class);
+ constructor.setAccessible(true);
+ return (HConnection) constructor.newInstance(conf, managed);
+ } catch (Exception e) {
+ throw new IOException(e);
+ }
}
/**
@@ -418,7 +438,7 @@ public class HConnectionManager {
static final Log LOG = LogFactory.getLog(HConnectionImplementation.class);
private final long pause;
private final int numTries;
- private final int rpcTimeout;
+ final int rpcTimeout;
private final int prefetchRegionLimit;
private final boolean useServerTrackerForRetries;
private final long serverTrackerTimeout;
@@ -473,6 +493,11 @@ public class HConnectionManager {
private final boolean managed;
/**
+ * Cluster registry of basic info such as clusterid and meta region location.
+ */
+ final Registry registry;
+
+ /**
* constructor
* @param conf Configuration object
* @param managed If true, does not do full shutdown on close; i.e. cleanup of connection
@@ -512,6 +537,7 @@ public class HConnectionManager {
}
}
this.serverTrackerTimeout = serverTrackerTimeout;
+ this.registry = setupRegistry();
retrieveClusterId();
this.rpcClient = new RpcClient(this.conf, this.clusterId);
@@ -534,6 +560,23 @@ public class HConnectionManager {
}, conf, listenerClass);
}
}
+
+ /**
+ * @return The cluster registry implementation to use.
+ * @throws IOException
+ */
+ private Registry setupRegistry() throws IOException {
+ String registryClass = this.conf.get("hbase.client.registry.impl",
+ ZooKeeperRegistry.class.getName());
+ Registry registry = null;
+ try {
+ registry = (Registry)Class.forName(registryClass).newInstance();
+ } catch (Throwable t) {
+ throw new IOException(t);
+ }
+ registry.init(this);
+ return registry;
+ }
/**
* For tests only.
@@ -554,31 +597,11 @@ public class HConnectionManager {
return "hconnection-0x" + Integer.toHexString(hashCode());
}
- private String clusterId = null;
+ protected String clusterId = null;
- public final void retrieveClusterId(){
- if (clusterId != null) {
- return;
- }
-
- // No synchronized here, worse case we will retrieve it twice, that's
- // not an issue.
- ZooKeeperKeepAliveConnection zkw = null;
- try {
- zkw = getKeepAliveZooKeeperWatcher();
- clusterId = ZKClusterId.readClusterIdZNode(zkw);
- if (clusterId == null) {
- LOG.info("ClusterId read in ZooKeeper is null");
- }
- } catch (KeeperException e) {
- LOG.warn("Can't retrieve clusterId from Zookeeper", e);
- } catch (IOException e) {
- LOG.warn("Can't retrieve clusterId from Zookeeper", e);
- } finally {
- if (zkw != null) {
- zkw.close();
- }
- }
+ void retrieveClusterId() {
+ if (clusterId != null) return;
+ this.clusterId = this.registry.getClusterId();
if (clusterId == null) {
clusterId = HConstants.CLUSTER_ID_DEFAULT;
}
@@ -639,12 +662,12 @@ public class HConnectionManager {
@Override
public boolean isTableEnabled(byte[] tableName) throws IOException {
- return testTableOnlineState(tableName, true);
+ return this.registry.isTableOnlineState(tableName, true);
}
@Override
public boolean isTableDisabled(byte[] tableName) throws IOException {
- return testTableOnlineState(tableName, false);
+ return this.registry.isTableOnlineState(tableName, false);
}
@Override
@@ -716,26 +739,6 @@ public class HConnectionManager {
return available.get() && (regionCount.get() == splitKeys.length + 1);
}
- /*
- * @param enabled True if table is enabled
- */
- private boolean testTableOnlineState(byte [] tableName, boolean enabled)
- throws IOException {
- String tableNameStr = Bytes.toString(tableName);
- ZooKeeperKeepAliveConnection zkw = getKeepAliveZooKeeperWatcher();
- try {
- if (enabled) {
- return ZKTableReadOnly.isEnabledTable(zkw, tableNameStr);
- }
- return ZKTableReadOnly.isDisabledTable(zkw, tableNameStr);
- } catch (KeeperException e) {
- throw new IOException("Enable/Disable failed", e);
- }finally {
- zkw.close();
- }
- }
-
-
@Override
public HRegionLocation locateRegion(final byte[] regionName) throws IOException {
return locateRegion(HRegionInfo.getTableName(regionName),
@@ -801,26 +804,7 @@ public class HConnectionManager {
}
if (Bytes.equals(tableName, HConstants.META_TABLE_NAME)) {
- ZooKeeperKeepAliveConnection zkw = getKeepAliveZooKeeperWatcher();
- try {
- if (LOG.isTraceEnabled()) {
- LOG.trace("Looking up meta region location in ZK," + " connection=" + this);
- }
- ServerName servername =
- MetaRegionTracker.blockUntilAvailable(zkw, this.rpcTimeout);
-
- if (LOG.isTraceEnabled()) {
- LOG.debug("Looked up meta region location, connection=" + this +
- "; serverName=" + ((servername == null) ? "null" : servername));
- }
- if (servername == null) return null;
- return new HRegionLocation(HRegionInfo.FIRST_META_REGIONINFO, servername, 0);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- return null;
- } finally {
- zkw.close();
- }
+ return this.registry.getMetaRegionLocation();
} else {
// Region not in the cache - have to go to the meta RS
return locateRegionInMeta(HConstants.META_TABLE_NAME, tableName, row,
@@ -1532,7 +1516,7 @@ public class HConnectionManager {
stub = (ClientService.BlockingInterface)this.stubs.get(key);
if (stub == null) {
BlockingRpcChannel channel = this.rpcClient.createBlockingRpcChannel(sn,
- User.getCurrent(), this.rpcTimeout);
+ User.getCurrent(), this.rpcTimeout);
stub = ClientService.newBlockingStub(channel);
// In old days, after getting stub/proxy, we'd make a call. We are not doing that here.
// Just fail on first actual call rather than in here on setup.
@@ -1557,7 +1541,7 @@ public class HConnectionManager {
* Retrieve a shared ZooKeeperWatcher. You must close it it once you've have finished with it.
* @return The shared instance. Never returns null.
*/
- public ZooKeeperKeepAliveConnection getKeepAliveZooKeeperWatcher()
+ ZooKeeperKeepAliveConnection getKeepAliveZooKeeperWatcher()
throws IOException {
synchronized (masterAndZKLock) {
if (keepAliveZookeeper == null) {
@@ -1566,8 +1550,7 @@ public class HConnectionManager {
}
// We don't check that our link to ZooKeeper is still valid
// But there is a retry mechanism in the ZooKeeperWatcher itself
- keepAliveZookeeper = new ZooKeeperKeepAliveConnection(
- conf, this.toString(), this);
+ keepAliveZookeeper = new ZooKeeperKeepAliveConnection(conf, this.toString(), this);
}
keepAliveZookeeperUserCount++;
keepZooKeeperWatcherAliveUntil = Long.MAX_VALUE;
@@ -1575,20 +1558,18 @@ public class HConnectionManager {
}
}
- void releaseZooKeeperWatcher(ZooKeeperWatcher zkw) {
+ void releaseZooKeeperWatcher(final ZooKeeperWatcher zkw) {
if (zkw == null){
return;
}
synchronized (masterAndZKLock) {
--keepAliveZookeeperUserCount;
- if (keepAliveZookeeperUserCount <=0 ){
- keepZooKeeperWatcherAliveUntil =
- System.currentTimeMillis() + keepAlive;
+ if (keepAliveZookeeperUserCount <= 0 ){
+ keepZooKeeperWatcherAliveUntil = System.currentTimeMillis() + keepAlive;
}
}
}
-
/**
* Creates a Chore thread to check the connections to master & zookeeper
* and close them when they reach their closing time (
@@ -2581,17 +2562,7 @@ public class HConnectionManager {
@Override
public int getCurrentNrHRS() throws IOException {
- ZooKeeperKeepAliveConnection zkw = getKeepAliveZooKeeperWatcher();
-
- try {
- // We go to zk rather than to master to get count of regions to avoid
- // HTable having a Master dependency. See HBase-2828
- return ZKUtil.getNumberOfChildren(zkw, zkw.rsZNode);
- } catch (KeeperException ke) {
- throw new IOException("Unexpected ZooKeeper exception", ke);
- } finally {
- zkw.close();
- }
+ return this.registry.getCurrentNrHRS();
}
/**
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/MetaScanner.java Wed May 15 04:09:00 2013
@@ -37,9 +37,8 @@ import java.util.NavigableMap;
import java.util.TreeMap;
/**
- * Scanner class that contains the <code>.META.</code> table scanning logic
- * and uses a Retryable scanner. Provided visitors will be called
- * for each row.
+ * Scanner class that contains the <code>.META.</code> table scanning logic.
+ * Provided visitors will be called for each row.
*
* Although public visibility, this is not a public-facing API and may evolve in
* minor releases.
@@ -123,114 +122,58 @@ public class MetaScanner {
public static void metaScan(Configuration configuration,
final MetaScannerVisitor visitor, final byte[] tableName,
final byte[] row, final int rowLimit, final byte[] metaTableName)
- throws IOException {
- try {
- HConnectionManager.execute(new HConnectable<Void>(configuration) {
- @Override
- public Void connect(HConnection connection) throws IOException {
- metaScan(conf, connection, visitor, tableName, row, rowLimit,
- metaTableName);
- return null;
- }
- });
- } finally {
- visitor.close();
- }
- }
-
- private static void metaScan(Configuration configuration, HConnection connection,
- MetaScannerVisitor visitor, byte [] tableName, byte[] row,
- int rowLimit, final byte [] metaTableName)
throws IOException {
int rowUpperLimit = rowLimit > 0 ? rowLimit: Integer.MAX_VALUE;
-
- // if row is not null, we want to use the startKey of the row's region as
- // the startRow for the meta scan.
+ HTable metaTable = new HTable(configuration, HConstants.META_TABLE_NAME);
+ // Calculate startrow for scan.
byte[] startRow;
- if (row != null) {
- // Scan starting at a particular row in a particular table
- assert tableName != null;
- byte[] searchRow =
- HRegionInfo.createRegionName(tableName, row, HConstants.NINES,
- false);
- HTable metaTable = null;
- try {
- metaTable = new HTable(configuration, HConstants.META_TABLE_NAME);
- Result startRowResult = metaTable.getRowOrBefore(searchRow,
- HConstants.CATALOG_FAMILY);
+ try {
+ if (row != null) {
+ // Scan starting at a particular row in a particular table
+ byte[] searchRow = HRegionInfo.createRegionName(tableName, row, HConstants.NINES, false);
+ Result startRowResult = metaTable.getRowOrBefore(searchRow, HConstants.CATALOG_FAMILY);
if (startRowResult == null) {
- throw new TableNotFoundException("Cannot find row in .META. for table: "
- + Bytes.toString(tableName) + ", row=" + Bytes.toStringBinary(searchRow));
+ throw new TableNotFoundException("Cannot find row in .META. for table: " +
+ Bytes.toString(tableName) + ", row=" + Bytes.toStringBinary(searchRow));
}
HRegionInfo regionInfo = getHRegionInfo(startRowResult);
if (regionInfo == null) {
throw new IOException("HRegionInfo was null or empty in Meta for " +
Bytes.toString(tableName) + ", row=" + Bytes.toStringBinary(searchRow));
}
-
byte[] rowBefore = regionInfo.getStartKey();
- startRow = HRegionInfo.createRegionName(tableName, rowBefore,
- HConstants.ZEROES, false);
- } finally {
- if (metaTable != null) {
- metaTable.close();
- }
+ startRow = HRegionInfo.createRegionName(tableName, rowBefore, HConstants.ZEROES, false);
+ } else if (tableName == null || tableName.length == 0) {
+ // Full META scan
+ startRow = HConstants.EMPTY_START_ROW;
+ } else {
+ // Scan META for an entire table
+ startRow = HRegionInfo.createRegionName(tableName, HConstants.EMPTY_START_ROW,
+ HConstants.ZEROES, false);
}
- } else if (tableName == null || tableName.length == 0) {
- // Full META scan
- startRow = HConstants.EMPTY_START_ROW;
- } else {
- // Scan META for an entire table
- startRow = HRegionInfo.createRegionName(
- tableName, HConstants.EMPTY_START_ROW, HConstants.ZEROES, false);
- }
-
- // Scan over each meta region
- ScannerCallable callable;
- int rows = Math.min(rowLimit, configuration.getInt(
- HConstants.HBASE_META_SCANNER_CACHING,
- HConstants.DEFAULT_HBASE_META_SCANNER_CACHING));
- do {
final Scan scan = new Scan(startRow).addFamily(HConstants.CATALOG_FAMILY);
+ int rows = Math.min(rowLimit, configuration.getInt(HConstants.HBASE_META_SCANNER_CACHING,
+ HConstants.DEFAULT_HBASE_META_SCANNER_CACHING));
+ scan.setCaching(rows);
if (LOG.isDebugEnabled()) {
- LOG.debug("Scanning " + Bytes.toString(metaTableName) +
- " starting at row=" + Bytes.toStringBinary(startRow) + " for max=" +
- rowUpperLimit + " rows using " + connection.toString());
+ LOG.debug("Scanning " + Bytes.toString(metaTableName) + " starting at row=" +
+ Bytes.toStringBinary(startRow) + " for max=" + rowUpperLimit + " with caching=" + rows);
}
- callable = new ScannerCallable(connection, metaTableName, scan, null);
- // Open scanner
- callable.withRetries();
-
+ // Run the scan
+ ResultScanner scanner = metaTable.getScanner(scan);
+ Result result = null;
int processedRows = 0;
- try {
- callable.setCaching(rows);
- done: do {
- if (processedRows >= rowUpperLimit) {
- break;
- }
- //we have all the rows here
- Result [] rrs = callable.withRetries();
- if (rrs == null || rrs.length == 0 || rrs[0].size() == 0) {
- break; //exit completely
- }
- for (Result rr : rrs) {
- if (processedRows >= rowUpperLimit) {
- break done;
- }
- if (!visitor.processRow(rr))
- break done; //exit completely
- processedRows++;
- }
- //here, we didn't break anywhere. Check if we have more rows
- } while(true);
- // Advance the startRow to the end key of the current region
- startRow = callable.getHRegionInfo().getEndKey();
- } finally {
- // Close scanner
- callable.setClose();
- callable.withRetries();
+ while ((result = scanner.next()) != null) {
+ if (visitor != null) {
+ if (!visitor.processRow(result)) break;
+ }
+ processedRows++;
+ if (processedRows >= rowUpperLimit) break;
}
- } while (Bytes.compareTo(startRow, HConstants.LAST_ROW) != 0);
+ } finally {
+ if (visitor != null) visitor.close();
+ if (metaTable != null) metaTable.close();
+ }
}
/**
@@ -399,4 +342,4 @@ public class MetaScanner {
return super.processRow(rowResult);
}
}
-}
\ No newline at end of file
+}
Added: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Registry.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Registry.java?rev=1482670&view=auto
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Registry.java (added)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Registry.java Wed May 15 04:09:00 2013
@@ -0,0 +1,56 @@
+/**
+ * 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.client;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hbase.HRegionLocation;
+
+/**
+ * Cluster registry.
+ * Implemenations hold cluster information such as this cluster's id, location of .META., etc.
+ */
+interface Registry {
+ /**
+ * @param connection
+ */
+ void init(HConnection connection);
+
+ /**
+ * @return Meta region location
+ * @throws IOException
+ */
+ HRegionLocation getMetaRegionLocation() throws IOException;
+
+ /**
+ * @return Cluster id.
+ */
+ String getClusterId();
+
+ /**
+ * @param enabled Return true if table is enabled
+ * @throws IOException
+ */
+ boolean isTableOnlineState(byte [] tableName, boolean enabled) throws IOException;
+
+ /**
+ * @return Count of 'running' regionservers
+ * @throws IOException
+ */
+ int getCurrentNrHRS() throws IOException;
+}
\ No newline at end of file
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java Wed May 15 04:09:00 2013
@@ -201,12 +201,7 @@ public class ScannerCallable extends Ser
if (this.scanMetrics != null) {
this.scanMetrics.countOfNSRE.incrementAndGet();
}
- throw new DoNotRetryIOException("Reset scanner", ioe);
- } else if (ioe instanceof RegionServerStoppedException) {
- // Throw a DNRE so that we break out of cycle of calling RSSE
- // when what we need is to open scanner against new location.
- // Attach RSSE to signal client that it needs to resetup scanner.
- throw new DoNotRetryIOException("Reset scanner", ioe);
+ throw new DoNotRetryIOException("Resetting the scanner -- see exception cause", ioe);
} else {
// The outer layers will retry
throw ioe;
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ServerCallable.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ServerCallable.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ServerCallable.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ServerCallable.java Wed May 15 04:09:00 2013
@@ -169,8 +169,7 @@ public abstract class ServerCallable<T>
prepare(tries != 0); // if called with false, check table status on ZK
return call();
} catch (Throwable t) {
- LOG.warn("Received exception, tries=" + tries + ", numRetries=" + numRetries + ":" +
- t.getMessage());
+ LOG.warn("Call exception, tries=" + tries + ", numRetries=" + numRetries + ": " + t);
t = translateException(t);
// translateException throws an exception when we should not retry, i.e. when it's the
Added: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZooKeeperRegistry.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZooKeeperRegistry.java?rev=1482670&view=auto
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZooKeeperRegistry.java (added)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ZooKeeperRegistry.java Wed May 15 04:09:00 2013
@@ -0,0 +1,108 @@
+/**
+ * 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.client;
+
+import java.io.IOException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HRegionLocation;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.zookeeper.MetaRegionTracker;
+import org.apache.hadoop.hbase.zookeeper.ZKTableReadOnly;
+import org.apache.hadoop.hbase.zookeeper.ZKUtil;
+import org.apache.zookeeper.KeeperException;
+
+/**
+ * A cluster registry that stores to zookeeper.
+ */
+class ZooKeeperRegistry implements Registry {
+ static final Log LOG = LogFactory.getLog(ZooKeeperRegistry.class);
+ // Needs an instance of hci to function. Set after construct this instance.
+ HConnectionManager.HConnectionImplementation hci;
+
+ @Override
+ public void init(HConnection connection) {
+ if (!(connection instanceof HConnectionManager.HConnectionImplementation)) {
+ throw new RuntimeException("This registry depends on HConnectionImplementation");
+ }
+ this.hci = (HConnectionManager.HConnectionImplementation)connection;
+ }
+
+ @Override
+ public HRegionLocation getMetaRegionLocation() throws IOException {
+ ZooKeeperKeepAliveConnection zkw = hci.getKeepAliveZooKeeperWatcher();
+
+ try {
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Looking up meta region location in ZK," + " connection=" + this);
+ }
+ ServerName servername = MetaRegionTracker.blockUntilAvailable(zkw, hci.rpcTimeout);
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Looked up meta region location, connection=" + this +
+ "; serverName=" + ((servername == null) ? "null" : servername));
+ }
+ if (servername == null) return null;
+ return new HRegionLocation(HRegionInfo.FIRST_META_REGIONINFO, servername, 0);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ return null;
+ } finally {
+ zkw.close();
+ }
+ }
+
+ @Override
+ public String getClusterId() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isTableOnlineState(byte [] tableName, boolean enabled)
+ throws IOException {
+ String tableNameStr = Bytes.toString(tableName);
+ ZooKeeperKeepAliveConnection zkw = hci.getKeepAliveZooKeeperWatcher();
+ try {
+ if (enabled) {
+ return ZKTableReadOnly.isEnabledTable(zkw, tableNameStr);
+ }
+ return ZKTableReadOnly.isDisabledTable(zkw, tableNameStr);
+ } catch (KeeperException e) {
+ throw new IOException("Enable/Disable failed", e);
+ } finally {
+ zkw.close();
+ }
+ }
+
+ @Override
+ public int getCurrentNrHRS() throws IOException {
+ ZooKeeperKeepAliveConnection zkw = hci.getKeepAliveZooKeeperWatcher();
+ try {
+ // We go to zk rather than to master to get count of regions to avoid
+ // HTable having a Master dependency. See HBase-2828
+ return ZKUtil.getNumberOfChildren(zkw, zkw.rsZNode);
+ } catch (KeeperException ke) {
+ throw new IOException("Unexpected ZooKeeper exception", ke);
+ } finally {
+ zkw.close();
+ }
+ }
+}
\ No newline at end of file
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/RegionServerStoppedException.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/RegionServerStoppedException.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/RegionServerStoppedException.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/exceptions/RegionServerStoppedException.java Wed May 15 04:09:00 2013
@@ -20,16 +20,14 @@ package org.apache.hadoop.hbase.exceptio
import org.apache.hadoop.classification.InterfaceAudience;
-import java.io.IOException;
-
/**
* Thrown by the region server when it is in shutting down state.
*/
@SuppressWarnings("serial")
@InterfaceAudience.Private
-public class RegionServerStoppedException extends IOException {
+public class RegionServerStoppedException extends DoNotRetryIOException {
public RegionServerStoppedException(String s) {
super(s);
}
-}
+}
\ No newline at end of file
Added: hbase/branches/0.95/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java?rev=1482670&view=auto
==============================================================================
--- hbase/branches/0.95/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java (added)
+++ hbase/branches/0.95/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestClientNoCluster.java Wed May 15 04:09:00 2013
@@ -0,0 +1,143 @@
+/**
+ * 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.client;
+
+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.HBaseConfiguration;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HRegionLocation;
+import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.exceptions.RegionServerStoppedException;
+import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
+import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ClientService;
+import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ClientService.BlockingInterface;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import com.google.protobuf.RpcController;
+import com.google.protobuf.ServiceException;
+
+/**
+ * Test client behavior w/o setting up a cluster.
+ * Mock up cluster emissions.
+ */
+public class TestClientNoCluster {
+ private static final Log LOG = LogFactory.getLog(TestClientNoCluster.class);
+ private Configuration conf;
+
+ @Before
+ public void setUp() throws Exception {
+ this.conf = HBaseConfiguration.create();
+ // Run my HConnection overrides. Use my little HConnectionImplementation below which
+ // allows me insert mocks and also use my Registry below rather than the default zk based
+ // one so tests run faster and don't have zk dependency.
+ this.conf.set("hbase.client.connection.impl", NoClusterConnection.class.getName());
+ this.conf.set("hbase.client.registry.impl", SimpleRegistry.class.getName());
+ }
+
+ /**
+ * Simple cluster registry inserted in place of our usual zookeeper based one.
+ */
+ static class SimpleRegistry implements Registry {
+ final ServerName META_HOST = new ServerName("10.10.10.10", 60010, 12345);
+
+ @Override
+ public void init(HConnection connection) {
+ }
+
+ @Override
+ public HRegionLocation getMetaRegionLocation() throws IOException {
+ return new HRegionLocation(HRegionInfo.FIRST_META_REGIONINFO, META_HOST);
+ }
+
+ @Override
+ public String getClusterId() {
+ return HConstants.CLUSTER_ID_DEFAULT;
+ }
+
+ @Override
+ public boolean isTableOnlineState(byte[] tableName, boolean enabled)
+ throws IOException {
+ return enabled;
+ }
+
+ @Override
+ public int getCurrentNrHRS() throws IOException {
+ return 1;
+ }
+ }
+
+ @Test
+ public void testDoNotRetryMetaScanner() throws IOException {
+ MetaScanner.metaScan(this.conf, null);
+ }
+
+ @Test
+ public void testDoNotRetryOnScan() throws IOException {
+ // Go against meta else we will try to find first region for the table on construction which
+ // means we'll have to do a bunch more mocking. Tests that go against meta only should be
+ // good for a bit of testing.
+ HTable table = new HTable(this.conf, HConstants.META_TABLE_NAME);
+ ResultScanner scanner = table.getScanner(HConstants.CATALOG_FAMILY);
+ try {
+ Result result = null;
+ while ((result = scanner.next()) != null) {
+ LOG.info(result);
+ }
+ } finally {
+ scanner.close();
+ table.close();
+ }
+ }
+
+ /**
+ * Override to shutdown going to zookeeper for cluster id and meta location.
+ */
+ static class NoClusterConnection extends HConnectionManager.HConnectionImplementation {
+ final ClientService.BlockingInterface stub;
+
+ NoClusterConnection(Configuration conf, boolean managed) throws IOException {
+ super(conf, managed);
+ // Mock up my stub so open scanner returns a scanner id and then on next, we throw
+ // exceptions for three times and then after that, we return no more to scan.
+ this.stub = Mockito.mock(ClientService.BlockingInterface.class);
+ long sid = 12345L;
+ try {
+ Mockito.when(stub.scan((RpcController)Mockito.any(),
+ (ClientProtos.ScanRequest)Mockito.any())).
+ thenReturn(ClientProtos.ScanResponse.newBuilder().setScannerId(sid).build()).
+ thenThrow(new ServiceException(new RegionServerStoppedException("From Mockito"))).
+ thenReturn(ClientProtos.ScanResponse.newBuilder().setScannerId(sid).
+ setMoreResults(false).build());
+ } catch (ServiceException e) {
+ throw new IOException(e);
+ }
+ }
+
+ @Override
+ public BlockingInterface getClient(ServerName sn) throws IOException {
+ return this.stub;
+ }
+ }
+}
\ No newline at end of file
Added: hbase/branches/0.95/hbase-client/src/test/resources/hbase-site.xml
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/test/resources/hbase-site.xml?rev=1482670&view=auto
==============================================================================
Binary file - no diff available.
Propchange: hbase/branches/0.95/hbase-client/src/test/resources/hbase-site.xml
------------------------------------------------------------------------------
svn:mime-type = application/xml
Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Wed May 15 04:09:00 2013
@@ -798,7 +798,8 @@ public class HRegionServer implements Cl
} // for
} catch (Throwable t) {
if (!checkOOME(t)) {
- abort("Unhandled exception: " + t.getMessage(), t);
+ String prefix = t instanceof YouAreDeadException? "": "Unhandled: ";
+ abort(prefix + t.getMessage(), t);
}
}
// Run shutdown.
Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java?rev=1482670&r1=1482669&r2=1482670&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java Wed May 15 04:09:00 2013
@@ -108,12 +108,10 @@ public class TestZooKeeper {
}
- private ZooKeeperWatcher getZooKeeperWatcher(HConnection c) throws
- NoSuchMethodException, InvocationTargetException, IllegalAccessException {
-
- Method getterZK = c.getClass().getMethod("getKeepAliveZooKeeperWatcher");
+ private ZooKeeperWatcher getZooKeeperWatcher(HConnection c)
+ throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+ Method getterZK = c.getClass().getDeclaredMethod("getKeepAliveZooKeeperWatcher");
getterZK.setAccessible(true);
-
return (ZooKeeperWatcher) getterZK.invoke(c);
}
@@ -196,12 +194,12 @@ public class TestZooKeeper {
connection.close();
}
- @Test
+ @Test (timeout = 60000)
public void testRegionServerSessionExpired() throws Exception {
LOG.info("Starting testRegionServerSessionExpired");
int metaIndex = TEST_UTIL.getMiniHBaseCluster().getServerWithMeta();
TEST_UTIL.expireRegionServerSession(metaIndex);
- testSanity();
+ testSanity("testRegionServerSessionExpired");
}
// @Test Disabled because seems to make no sense expiring master session
@@ -210,7 +208,7 @@ public class TestZooKeeper {
public void testMasterSessionExpired() throws Exception {
LOG.info("Starting testMasterSessionExpired");
TEST_UTIL.expireMasterSession();
- testSanity();
+ testSanity("testMasterSessionExpired");
}
/**
@@ -220,27 +218,31 @@ public class TestZooKeeper {
*/
@Test(timeout = 60000)
public void testMasterZKSessionRecoveryFailure() throws Exception {
+ LOG.info("Starting testMasterZKSessionRecoveryFailure");
MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
HMaster m = cluster.getMaster();
m.abort("Test recovery from zk session expired",
new KeeperException.SessionExpiredException());
assertFalse(m.isStopped());
- testSanity();
+ testSanity("testMasterZKSessionRecoveryFailure");
}
/**
* Make sure we can use the cluster
* @throws Exception
*/
- private void testSanity() throws Exception{
- HBaseAdmin admin =
- new HBaseAdmin(TEST_UTIL.getConfiguration());
- String tableName = "test"+System.currentTimeMillis();
+ private void testSanity(final String testName) throws Exception{
+ String tableName = testName + "." + System.currentTimeMillis();
HTableDescriptor desc = new HTableDescriptor(tableName);
HColumnDescriptor family = new HColumnDescriptor("fam");
desc.addFamily(family);
LOG.info("Creating table " + tableName);
- admin.createTable(desc);
+ HBaseAdmin admin = new HBaseAdmin(TEST_UTIL.getConfiguration());
+ try {
+ admin.createTable(desc);
+ } finally {
+ admin.close();
+ }
HTable table =
new HTable(new Configuration(TEST_UTIL.getConfiguration()), tableName);
@@ -253,33 +255,29 @@ public class TestZooKeeper {
}
@Test
- public void testMultipleZK() {
- try {
- HTable localMeta =
- new HTable(new Configuration(TEST_UTIL.getConfiguration()), HConstants.META_TABLE_NAME);
- Configuration otherConf = new Configuration(TEST_UTIL.getConfiguration());
- otherConf.set(HConstants.ZOOKEEPER_QUORUM, "127.0.0.1");
- HTable ipMeta = new HTable(otherConf, HConstants.META_TABLE_NAME);
-
- // dummy, just to open the connection
- final byte [] row = new byte [] {'r'};
- localMeta.exists(new Get(row));
- ipMeta.exists(new Get(row));
-
- // make sure they aren't the same
- ZooKeeperWatcher z1 =
- getZooKeeperWatcher(HConnectionManager.getConnection(localMeta.getConfiguration()));
- ZooKeeperWatcher z2 =
- getZooKeeperWatcher(HConnectionManager.getConnection(otherConf));
- assertFalse(z1 == z2);
- assertFalse(z1.getQuorum().equals(z2.getQuorum()));
-
- localMeta.close();
- ipMeta.close();
- } catch (Exception e) {
- e.printStackTrace();
- fail();
- }
+ public void testMultipleZK()
+ throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+ HTable localMeta =
+ new HTable(new Configuration(TEST_UTIL.getConfiguration()), HConstants.META_TABLE_NAME);
+ Configuration otherConf = new Configuration(TEST_UTIL.getConfiguration());
+ otherConf.set(HConstants.ZOOKEEPER_QUORUM, "127.0.0.1");
+ HTable ipMeta = new HTable(otherConf, HConstants.META_TABLE_NAME);
+
+ // dummy, just to open the connection
+ final byte [] row = new byte [] {'r'};
+ localMeta.exists(new Get(row));
+ ipMeta.exists(new Get(row));
+
+ // make sure they aren't the same
+ ZooKeeperWatcher z1 =
+ getZooKeeperWatcher(HConnectionManager.getConnection(localMeta.getConfiguration()));
+ ZooKeeperWatcher z2 =
+ getZooKeeperWatcher(HConnectionManager.getConnection(otherConf));
+ assertFalse(z1 == z2);
+ assertFalse(z1.getQuorum().equals(z2.getQuorum()));
+
+ localMeta.close();
+ ipMeta.close();
}
/**
@@ -311,7 +309,7 @@ public class TestZooKeeper {
@Test
public void testZNodeDeletes() throws Exception {
ZooKeeperWatcher zkw = new ZooKeeperWatcher(
- new Configuration(TEST_UTIL.getConfiguration()),
+ new Configuration(TEST_UTIL.getConfiguration()),
TestZooKeeper.class.getName(), null);
ZKUtil.createWithParents(zkw, "/l1/l2/l3/l4");
try {
@@ -446,8 +444,11 @@ public class TestZooKeeper {
// Restore the ACL
ZooKeeper zk3 = new ZooKeeper(quorumServers, sessionTimeout, EmptyWatcher.instance);
zk3.addAuthInfo("digest", "hbase:rox".getBytes());
- zk3.setACL("/", oldACL, -1);
- zk3.close();
+ try {
+ zk3.setACL("/", oldACL, -1);
+ } finally {
+ zk3.close();
+ }
}
/**
@@ -477,23 +478,25 @@ public class TestZooKeeper {
int expectedNumOfListeners = zkw.getNumberOfListeners();
// now the cluster is up. So assign some regions.
HBaseAdmin admin = new HBaseAdmin(TEST_UTIL.getConfiguration());
- byte[][] SPLIT_KEYS = new byte[][] { Bytes.toBytes("a"), Bytes.toBytes("b"),
+ try {
+ byte[][] SPLIT_KEYS = new byte[][] { Bytes.toBytes("a"), Bytes.toBytes("b"),
Bytes.toBytes("c"), Bytes.toBytes("d"), Bytes.toBytes("e"), Bytes.toBytes("f"),
Bytes.toBytes("g"), Bytes.toBytes("h"), Bytes.toBytes("i"), Bytes.toBytes("j") };
-
- String tableName = "testRegionAssignmentAfterMasterRecoveryDueToZKExpiry";
- admin.createTable(new HTableDescriptor(tableName), SPLIT_KEYS);
- ZooKeeperWatcher zooKeeperWatcher = HBaseTestingUtility.getZooKeeperWatcher(TEST_UTIL);
- ZKAssign.blockUntilNoRIT(zooKeeperWatcher);
- m.getZooKeeperWatcher().close();
- MockLoadBalancer.retainAssignCalled = false;
- m.abort("Test recovery from zk session expired", new KeeperException.SessionExpiredException());
- assertFalse(m.isStopped());
- // The recovered master should not call retainAssignment, as it is not a
- // clean startup.
- assertFalse("Retain assignment should not be called", MockLoadBalancer.retainAssignCalled);
- // number of listeners should be same as the value before master aborted
- assertEquals(expectedNumOfListeners, zkw.getNumberOfListeners());
+ String tableName = "testRegionAssignmentAfterMasterRecoveryDueToZKExpiry";
+ admin.createTable(new HTableDescriptor(tableName), SPLIT_KEYS);
+ ZooKeeperWatcher zooKeeperWatcher = HBaseTestingUtility.getZooKeeperWatcher(TEST_UTIL);
+ ZKAssign.blockUntilNoRIT(zooKeeperWatcher);
+ m.getZooKeeperWatcher().close();
+ MockLoadBalancer.retainAssignCalled = false;
+ m.abort("Test recovery from zk session expired",
+ new KeeperException.SessionExpiredException());
+ assertFalse(m.isStopped());
+ // The recovered master should not call retainAssignment, as it is not a
+ // clean startup.
+ assertFalse("Retain assignment should not be called", MockLoadBalancer.retainAssignCalled);
+ } finally {
+ admin.close();
+ }
}
/**
@@ -508,42 +511,49 @@ public class TestZooKeeper {
HMaster m = cluster.getMaster();
// now the cluster is up. So assign some regions.
HBaseAdmin admin = new HBaseAdmin(TEST_UTIL.getConfiguration());
- byte[][] SPLIT_KEYS = new byte[][] { Bytes.toBytes("1"), Bytes.toBytes("2"),
+ HTable table = null;
+ try {
+ byte[][] SPLIT_KEYS = new byte[][] { Bytes.toBytes("1"), Bytes.toBytes("2"),
Bytes.toBytes("3"), Bytes.toBytes("4"), Bytes.toBytes("5") };
- String tableName = "testLogSplittingAfterMasterRecoveryDueToZKExpiry";
- HTableDescriptor htd = new HTableDescriptor(tableName);
- HColumnDescriptor hcd = new HColumnDescriptor("col");
- htd.addFamily(hcd);
- admin.createTable(htd, SPLIT_KEYS);
- ZooKeeperWatcher zooKeeperWatcher = HBaseTestingUtility.getZooKeeperWatcher(TEST_UTIL);
- ZKAssign.blockUntilNoRIT(zooKeeperWatcher);
- HTable table = new HTable(TEST_UTIL.getConfiguration(), tableName);
-
- Put p;
- int numberOfPuts;
- for (numberOfPuts = 0; numberOfPuts < 6; numberOfPuts++) {
- p = new Put(Bytes.toBytes(numberOfPuts));
- p.add(Bytes.toBytes("col"), Bytes.toBytes("ql"), Bytes.toBytes("value" + numberOfPuts));
- table.put(p);
- }
- m.getZooKeeperWatcher().close();
- m.abort("Test recovery from zk session expired", new KeeperException.SessionExpiredException());
- assertFalse(m.isStopped());
- cluster.getRegionServer(0).abort("Aborting");
- // Without patch for HBASE-6046 this test case will always timeout
- // with patch the test case should pass.
- Scan scan = new Scan();
- int numberOfRows = 0;
- ResultScanner scanner = table.getScanner(scan);
- Result[] result = scanner.next(1);
- while (result != null && result.length > 0) {
- numberOfRows++;
- result = scanner.next(1);
+ String tableName = "testLogSplittingAfterMasterRecoveryDueToZKExpiry";
+ HTableDescriptor htd = new HTableDescriptor(tableName);
+ HColumnDescriptor hcd = new HColumnDescriptor("col");
+ htd.addFamily(hcd);
+ admin.createTable(htd, SPLIT_KEYS);
+ ZooKeeperWatcher zooKeeperWatcher = HBaseTestingUtility.getZooKeeperWatcher(TEST_UTIL);
+ ZKAssign.blockUntilNoRIT(zooKeeperWatcher);
+ table = new HTable(TEST_UTIL.getConfiguration(), tableName);
+ Put p;
+ int numberOfPuts;
+ for (numberOfPuts = 0; numberOfPuts < 6; numberOfPuts++) {
+ p = new Put(Bytes.toBytes(numberOfPuts));
+ p.add(Bytes.toBytes("col"), Bytes.toBytes("ql"), Bytes.toBytes("value" + numberOfPuts));
+ table.put(p);
+ }
+ m.getZooKeeperWatcher().close();
+ m.abort("Test recovery from zk session expired",
+ new KeeperException.SessionExpiredException());
+ assertFalse(m.isStopped());
+ cluster.getRegionServer(0).abort("Aborting");
+ // Without patch for HBASE-6046 this test case will always timeout
+ // with patch the test case should pass.
+ Scan scan = new Scan();
+ int numberOfRows = 0;
+ ResultScanner scanner = table.getScanner(scan);
+ Result[] result = scanner.next(1);
+ while (result != null && result.length > 0) {
+ numberOfRows++;
+ result = scanner.next(1);
+ }
+ assertEquals("Number of rows should be equal to number of puts.", numberOfPuts,
+ numberOfRows);
+ } finally {
+ if (table != null) table.close();
+ admin.close();
}
- assertEquals("Number of rows should be equal to number of puts.", numberOfPuts, numberOfRows);
}
-
+
static class MockLoadBalancer extends DefaultLoadBalancer {
static boolean retainAssignCalled = false;