You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@bookkeeper.apache.org by si...@apache.org on 2016/04/27 09:00:41 UTC
bookkeeper git commit: BOOKKEEPER-911: Fix TestReplicationWorker
tests in master
Repository: bookkeeper
Updated Branches:
refs/heads/master 10cab08d0 -> 91595fc04
BOOKKEEPER-911: Fix TestReplicationWorker tests in master
Author: Matteo Merli <mm...@apache.org>
Reviewers: Sijie Guo <si...@apache.org>, Flavio Junqueira <fp...@apache.org>
Closes #29 from merlimat/bk-911
Project: http://git-wip-us.apache.org/repos/asf/bookkeeper/repo
Commit: http://git-wip-us.apache.org/repos/asf/bookkeeper/commit/91595fc0
Tree: http://git-wip-us.apache.org/repos/asf/bookkeeper/tree/91595fc0
Diff: http://git-wip-us.apache.org/repos/asf/bookkeeper/diff/91595fc0
Branch: refs/heads/master
Commit: 91595fc04ac6168b5a652e803e55caadae757f74
Parents: 10cab08
Author: Matteo Merli <mm...@apache.org>
Authored: Wed Apr 27 00:00:34 2016 -0700
Committer: Sijie Guo <si...@apache.org>
Committed: Wed Apr 27 00:00:34 2016 -0700
----------------------------------------------------------------------
.../replication/ReplicationWorker.java | 10 ++++++++-
.../replication/TestReplicationWorker.java | 23 ++++++++++++--------
2 files changed, 23 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/91595fc0/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java
----------------------------------------------------------------------
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java
index e26d09a..e686e11 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/replication/ReplicationWorker.java
@@ -73,6 +73,7 @@ public class ReplicationWorker implements Runnable {
private final ServerConfiguration conf;
private final ZooKeeper zkc;
private volatile boolean workerRunning = false;
+ private volatile boolean isInReadOnlyMode = false;
final private BookKeeperAdmin admin;
private final LedgerChecker ledgerChecker;
private final BookieSocketAddress targetBookie;
@@ -186,9 +187,12 @@ public class ReplicationWorker implements Runnable {
private void waitTillTargetBookieIsWritable() {
LOG.info("Waiting for target bookie {} to be back in read/write mode", targetBookie);
- while (admin.getReadOnlyBookies().contains(targetBookie)) {
+ while (workerRunning && admin.getReadOnlyBookies().contains(targetBookie)) {
+ isInReadOnlyMode = true;
waitBackOffTime();
}
+
+ isInReadOnlyMode = false;
LOG.info("Target bookie {} is back in read/write mode", targetBookie);
}
@@ -451,6 +455,10 @@ public class ReplicationWorker implements Runnable {
return workerRunning && workerThread.isAlive();
}
+ boolean isInReadOnlyMode() {
+ return isInReadOnlyMode;
+ }
+
private boolean isTargetBookieExistsInFragmentEnsemble(LedgerHandle lh,
LedgerFragment ledgerFragment) {
List<BookieSocketAddress> ensemble = ledgerFragment.getEnsemble();
http://git-wip-us.apache.org/repos/asf/bookkeeper/blob/91595fc0/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/TestReplicationWorker.java
----------------------------------------------------------------------
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/TestReplicationWorker.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/TestReplicationWorker.java
index 8aebae4..93890fa 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/TestReplicationWorker.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/TestReplicationWorker.java
@@ -506,10 +506,10 @@ public class TestReplicationWorker extends MultiLedgerManagerTestCase {
}
/**
- * Test that if the local bookie turns out to be readonly, then no point in running RW. So RW should shutdown.
+ * Test that if the local bookie turns out to be read-only, then the replicator will pause but not shutdown.
*/
@Test(timeout = 20000)
- public void testRWShutdownOnLocalBookieReadonlyTransition() throws Exception {
+ public void testRWOnLocalBookieReadonlyTransition() throws Exception {
LedgerHandle lh = bkc.createLedger(3, 3, BookKeeper.DigestType.CRC32, TESTPASSWD);
for (int i = 0; i < 10; i++) {
@@ -537,21 +537,22 @@ public class TestReplicationWorker extends MultiLedgerManagerTestCase {
bsConfs.get(bsConfs.size() - 1).setReadOnlyModeEnabled(true);
newBk.getBookie().doTransitionToReadOnlyMode();
underReplicationManager.markLedgerUnderreplicated(lh.getId(), replicaToKill.toString());
- while (ReplicationTestUtil.isLedgerInUnderReplication(zkc, lh.getId(), basePath) && rw.isRunning()) {
+ while (ReplicationTestUtil.isLedgerInUnderReplication(zkc, lh.getId(), basePath) && rw.isRunning()
+ && !rw.isInReadOnlyMode()) {
Thread.sleep(100);
}
assertNull(zkc.exists(String.format("%s/urL%010d", baseLockPath, lh.getId()), false));
- assertFalse("RW should shutdown if the bookie is readonly", rw.isRunning());
+ assertTrue("RW should continue even if the bookie is readonly", rw.isRunning());
} finally {
rw.shutdown();
}
}
/**
- * Test that the replication worker will shutdown if it lose its zookeeper session
+ * Test that the replication worker will not shutdown on a simple ZK disconnection
*/
@Test(timeout=30000)
- public void testRWZKSessionLost() throws Exception {
+ public void testRWZKConnectionLost() throws Exception {
ZooKeeper zk = ZooKeeperClient.newBuilder()
.connectString(zkUtil.getZooKeeperConnectString())
.sessionTimeoutMs(10000)
@@ -567,15 +568,19 @@ public class TestReplicationWorker extends MultiLedgerManagerTestCase {
Thread.sleep(1000);
}
assertTrue("Replication worker should be running", rw.isRunning());
- stopZKCluster();
+ stopZKCluster();
+ // Wait for disconnection to be picked up
for (int i = 0; i < 10; i++) {
- if (!rw.isRunning()) {
+ if (!zk.getState().isConnected()) {
break;
}
Thread.sleep(1000);
}
- assertFalse("Replication worker should have shut down", rw.isRunning());
+ assertFalse(zk.getState().isConnected());
+ startZKCluster();
+
+ assertTrue("Replication worker should still be running", rw.isRunning());
} finally {
zk.close();
}