You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2013/03/16 08:21:16 UTC
svn commit: r1457216 -
/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.java
Author: tedyu
Date: Sat Mar 16 07:21:16 2013
New Revision: 1457216
URL: http://svn.apache.org/r1457216
Log:
HBASE-8106 Test to check replication log znodes move is done correctly (Himanshu)
Modified:
hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.java
Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.java?rev=1457216&r1=1457215&r2=1457216&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.java Sat Mar 16 07:21:16 2013
@@ -22,7 +22,12 @@ import static org.junit.Assert.assertEqu
import java.net.URLEncoder;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -94,7 +99,10 @@ public class TestReplicationSourceManage
private static Path oldLogDir;
private static Path logDir;
+
+ private static CountDownLatch latch;
+ private static List<String> files = new ArrayList<String>();
@BeforeClass
public static void setUpBeforeClass() throws Exception {
@@ -214,8 +222,107 @@ public class TestReplicationSourceManage
// TODO Need a case with only 2 HLogs and we only want to delete the first one
}
+
+ @Test
+ public void testNodeFailoverWorkerCopyQueuesFromRSUsingMulti() throws Exception {
+ LOG.debug("testNodeFailoverWorkerCopyQueuesFromRSUsingMulti");
+ conf.setBoolean(HConstants.ZOOKEEPER_USEMULTI, true);
+ final Server server = new DummyServer("hostname0.example.org");
+ AtomicBoolean replicating = new AtomicBoolean(true);
+ ReplicationZookeeper rz = new ReplicationZookeeper(server, replicating);
+ // populate some znodes in the peer znode
+ files.add("log1");
+ files.add("log2");
+ for (String file : files) {
+ rz.addLogToList(file, "1");
+ }
+ // create 3 DummyServers
+ Server s1 = new DummyServer("dummyserver1.example.org");
+ Server s2 = new DummyServer("dummyserver2.example.org");
+ Server s3 = new DummyServer("dummyserver3.example.org");
+
+ // create 3 DummyNodeFailoverWorkers
+ DummyNodeFailoverWorker w1 = new DummyNodeFailoverWorker(
+ server.getServerName().getServerName(), s1);
+ DummyNodeFailoverWorker w2 = new DummyNodeFailoverWorker(
+ server.getServerName().getServerName(), s2);
+ DummyNodeFailoverWorker w3 = new DummyNodeFailoverWorker(
+ server.getServerName().getServerName(), s3);
+
+ latch = new CountDownLatch(3);
+ // start the threads
+ w1.start();
+ w2.start();
+ w3.start();
+ // make sure only one is successful
+ int populatedMap = 0;
+ // wait for result now... till all the workers are done.
+ latch.await();
+ populatedMap += w1.isLogZnodesMapPopulated() + w2.isLogZnodesMapPopulated()
+ + w3.isLogZnodesMapPopulated();
+ assertEquals(1, populatedMap);
+ // close out the resources.
+ rz.close();
+ server.abort("", null);
+ }
+
+ static class DummyNodeFailoverWorker extends Thread {
+ private SortedMap<String, SortedSet<String>> logZnodesMap;
+ Server server;
+ private String deadRsZnode;
+ ReplicationZookeeper rz;
+
+ public DummyNodeFailoverWorker(String znode, Server s) throws Exception {
+ this.deadRsZnode = znode;
+ this.server = s;
+ rz = new ReplicationZookeeper(server, new AtomicBoolean(true));
+ }
+ @Override
+ public void run() {
+ try {
+ logZnodesMap = rz.copyQueuesFromRSUsingMulti(deadRsZnode);
+ rz.close();
+ server.abort("Done with testing", null);
+ } catch (Exception e) {
+ LOG.error("Got exception while running NodeFailoverWorker", e);
+ } finally {
+ latch.countDown();
+ }
+ }
+
+ /**
+ * @return 1 when the map is not empty.
+ */
+ private int isLogZnodesMapPopulated() {
+ Collection<SortedSet<String>> sets = logZnodesMap.values();
+ if (sets.size() > 1) {
+ throw new RuntimeException("unexpected size of logZnodesMap: " + sets.size());
+ }
+ if (sets.size() == 1) {
+ SortedSet<String> s = sets.iterator().next();
+ for (String file : files) {
+ // at least one file was missing
+ if (!s.contains(file)) {
+ return 0;
+ }
+ }
+ return 1; // we found all the files
+ }
+ return 0;
+ }
+ }
+
static class DummyServer implements Server {
+ String hostname;
+
+ DummyServer() {
+ hostname = "hostname.example.org";
+ }
+
+ DummyServer(String hostname) {
+ this.hostname = hostname;
+ }
@Override
public Configuration getConfiguration() {
@@ -229,19 +336,19 @@ public class TestReplicationSourceManage
@Override
public CatalogTracker getCatalogTracker() {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ return null; // To change body of implemented methods use File | Settings | File Templates.
}
@Override
public ServerName getServerName() {
- return new ServerName("hostname.example.org", 1234, -1L);
+ return new ServerName(hostname, 1234, -1L);
}
@Override
public void abort(String why, Throwable e) {
- //To change body of implemented methods use File | Settings | File Templates.
+ // To change body of implemented methods use File | Settings | File Templates.
}
-
+
@Override
public boolean isAborted() {
return false;
@@ -249,15 +356,14 @@ public class TestReplicationSourceManage
@Override
public void stop(String why) {
- //To change body of implemented methods use File | Settings | File Templates.
+ // To change body of implemented methods use File | Settings | File Templates.
}
@Override
public boolean isStopped() {
- return false; //To change body of implemented methods use File | Settings | File Templates.
+ return false; // To change body of implemented methods use File | Settings | File Templates.
}
}
-
}