You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2011/10/11 21:13:34 UTC
svn commit: r1182040 - in /hbase/branches/0.89/src:
main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java
test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java
test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerFileSystemFailure.java
Author: nspiegelberg
Date: Tue Oct 11 19:13:34 2011
New Revision: 1182040
URL: http://svn.apache.org/viewvc?rev=1182040&view=rev
Log:
Fixing TestRemoteTable and TestHRegionServerFileSystemFailure broken by D336813
Summary:
In D336813 I broke two unit tests, which was hard to notice because they failed
with time-outs. TestHRegionServerFileSystemFailure re-starts a master in the end
if it had crashed so that regionservers can shut down properly, but the
condition it uses to identify whether the master is still alive was no longer
valid, because there is now a thread object wrapping HMaster, and
master.isAlive() is meaningless. I replaced this with master.isClosed() and
removed hard-coded master class from the unit test.
TestRemoteTable started failing because of a bug in JVMClusterUtil.shutdown()
-- it did not call join() on master threads.
Also calling Thread.currentThread().interrupt() when handling
InterruptedException instead of simply ignoring it. This is recommended by Java
Concurrency in Practice as well as in other articles online as the proper way to
handle InterruptedException, but I must admit I don't fully understand why.
Test Plan: All 621 unit tests pass (compared to 614 without the patch).
Reviewers: pritam, kranganathan, pkhemani
Reviewed By: pritam
CC: hbase-eng@lists, pkhemani, pritam, mbautin
Differential Revision: 340934
Revert Plan: OK
Modified:
hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java
hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java
hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerFileSystemFailure.java
Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java?rev=1182040&r1=1182039&r2=1182040&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java Tue Oct 11 19:13:34 2011
@@ -210,17 +210,38 @@ public class JVMClusterUtil {
}
}
}
- // regionServerThreads can never be null because they are initialized when
- // the class is constructed.
- for(Thread t: regionservers) {
- if (t.isAlive()) {
- try {
- t.join();
- } catch (InterruptedException e) {
- // continue
+
+ boolean interrupted = false;
+ try {
+ // regionServerThreads can never be null because they are initialized when
+ // the class is constructed.
+ for (Thread t : regionservers) {
+ if (t.isAlive()) {
+ try {
+ t.join();
+ } catch (InterruptedException e) {
+ interrupted = true;
+ }
}
}
+
+ if (masters != null) {
+ for (JVMClusterUtil.MasterThread t : masters) {
+ while (t.isAlive()) {
+ try {
+ t.join();
+ } catch (InterruptedException e) {
+ interrupted = true;
+ }
+ }
+ }
+ }
+ } finally {
+ if (interrupted) {
+ Thread.currentThread().interrupt();
+ }
}
+
LOG.info("Shutdown of " +
((masters != null) ? masters.size() : "0") + " master(s) and " +
((regionservers != null) ? regionservers.size() : "0") +
Modified: hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java?rev=1182040&r1=1182039&r2=1182040&view=diff
==============================================================================
--- hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java (original)
+++ hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/MiniHBaseCluster.java Tue Oct 11 19:13:34 2011
@@ -288,6 +288,14 @@ public class MiniHBaseCluster {
}
/**
+ * Adds a new master to the cluster and starts the master thread. Useful if
+ * the existing master dies and a live master is needed for cleanup.
+ */
+ public void startNewMaster() throws IOException {
+ hbaseCluster.addMaster().start();
+ }
+
+ /**
* Cause a region server to exit doing basic clean up only on its way out.
* @param serverNumber Used as index into a list.
*/
Modified: hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerFileSystemFailure.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerFileSystemFailure.java?rev=1182040&r1=1182039&r2=1182040&view=diff
==============================================================================
--- hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerFileSystemFailure.java (original)
+++ hbase/branches/0.89/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionServerFileSystemFailure.java Tue Oct 11 19:13:34 2011
@@ -96,9 +96,9 @@ public class TestHRegionServerFileSystem
// Bring namenode, hbasemaster back up so we cleanup properly.
TEST_UTIL.getDFSCluster().restartNameNode();
HMaster master = TEST_UTIL.getMiniHBaseCluster().getMaster();
- if (!master.isAlive()) {
- master = HMaster.constructMaster(MiniHBaseCluster.MiniHBaseClusterMaster.class, conf);
- master.start();
+ if (master.isClosed()) {
+ // Master died, we need to re-start it.
+ TEST_UTIL.getMiniHBaseCluster().startNewMaster();
}
}
}