You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by fp...@apache.org on 2012/12/14 20:26:54 UTC
svn commit: r1422054 - in /zookeeper/bookkeeper/trunk: ./
bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/
bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/
bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/
Author: fpj
Date: Fri Dec 14 19:26:51 2012
New Revision: 1422054
URL: http://svn.apache.org/viewvc?rev=1422054&view=rev
Log:
BOOKKEEPER-428: Expose command options in bookie scripts to disable/enable auto recovery temporarily (ivank via fpj)
Modified:
zookeeper/bookkeeper/trunk/CHANGES.txt
zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java
zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java
zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/AuditorLedgerCheckerTest.java
Modified: zookeeper/bookkeeper/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/CHANGES.txt?rev=1422054&r1=1422053&r2=1422054&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/CHANGES.txt (original)
+++ zookeeper/bookkeeper/trunk/CHANGES.txt Fri Dec 14 19:26:51 2012
@@ -252,6 +252,8 @@ Trunk (unreleased changes)
BOOKKEEPER-426: Make auditor Vote znode store a protobuf containing the host that voted (ivank)
+ BOOKKEEPER-428: Expose command options in bookie scripts to disable/enable auto recovery temporarily (ivank via fpj)
+
hedwig-server:
BOOKKEEPER-250: Need a ledger manager like interface to manage metadata operations in Hedwig (sijie via ivank)
Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java?rev=1422054&r1=1422053&r2=1422054&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/BookieShell.java Fri Dec 14 19:26:51 2012
@@ -27,6 +27,11 @@ import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.bookkeeper.meta.LedgerManagerFactory;
+import org.apache.bookkeeper.meta.LedgerUnderreplicationManager;
+import org.apache.bookkeeper.zookeeper.ZooKeeperWatcherBase;
+
import org.apache.bookkeeper.bookie.EntryLogger.EntryLogScanner;
import org.apache.bookkeeper.bookie.Journal.JournalScanner;
import org.apache.bookkeeper.bookie.Journal.LastLogMark;
@@ -36,6 +41,8 @@ import org.apache.bookkeeper.conf.Client
import org.apache.bookkeeper.conf.ServerConfiguration;
import org.apache.bookkeeper.util.EntryFormatter;
import org.apache.bookkeeper.util.Tool;
+import org.apache.bookkeeper.util.ZkUtils;
+
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.PropertiesConfiguration;
@@ -65,6 +72,7 @@ public class BookieShell implements Tool
static final String CMD_READLOG = "readlog";
static final String CMD_READJOURNAL = "readjournal";
static final String CMD_LASTMARK = "lastmark";
+ static final String CMD_AUTORECOVERY = "autorecovery";
static final String CMD_HELP = "help";
final ServerConfiguration bkConf = new ServerConfiguration();
@@ -493,6 +501,77 @@ public class BookieShell implements Tool
}
}
+ /**
+ * Command for administration of autorecovery
+ */
+ class AutoRecoveryCmd extends MyCommand {
+ Options opts = new Options();
+
+ public AutoRecoveryCmd() {
+ super(CMD_AUTORECOVERY);
+ opts.addOption("e", "enable", false,
+ "Enable auto recovery of underreplicated ledgers");
+ opts.addOption("d", "disable", false,
+ "Disable auto recovery of underreplicated ledgers");
+ }
+
+ @Override
+ Options getOptions() {
+ return opts;
+ }
+
+ @Override
+ String getDescription() {
+ return "Enable or disable autorecovery in the cluster.";
+ }
+
+ @Override
+ String getUsage() {
+ return "autorecovery [-enable|-disable]";
+ }
+
+ @Override
+ int runCmd(CommandLine cmdLine) throws Exception {
+ boolean disable = cmdLine.hasOption("d");
+ boolean enable = cmdLine.hasOption("e");
+
+ if ((!disable && !enable)
+ || (enable && disable)) {
+ LOG.error("One and only one of -enable and -disable must be specified");
+ printUsage();
+ return 1;
+ }
+ ZooKeeper zk = null;
+ try {
+ ZooKeeperWatcherBase w = new ZooKeeperWatcherBase(bkConf.getZkTimeout());
+ zk = ZkUtils.createConnectedZookeeperClient(bkConf.getZkServers(), w);
+ LedgerManagerFactory mFactory = LedgerManagerFactory.newLedgerManagerFactory(bkConf, zk);
+ LedgerUnderreplicationManager underreplicationManager = mFactory.newLedgerUnderreplicationManager();
+ if (enable) {
+ if (underreplicationManager.isLedgerReplicationEnabled()) {
+ LOG.warn("Autorecovery already enabled. Doing nothing");
+ } else {
+ LOG.info("Enabling autorecovery");
+ underreplicationManager.enableLedgerReplication();
+ }
+ } else {
+ if (!underreplicationManager.isLedgerReplicationEnabled()) {
+ LOG.warn("Autorecovery already disabled. Doing nothing");
+ } else {
+ LOG.info("Disabling autorecovery");
+ underreplicationManager.disableLedgerReplication();
+ }
+ }
+ } finally {
+ if (zk != null) {
+ zk.close();
+ }
+ }
+
+ return 0;
+ }
+ }
+
final Map<String, Command> commands;
{
commands = new HashMap<String, Command>();
@@ -503,6 +582,7 @@ public class BookieShell implements Tool
commands.put(CMD_READLOG, new ReadLogCmd());
commands.put(CMD_READJOURNAL, new ReadJournalCmd());
commands.put(CMD_LASTMARK, new LastMarkCmd());
+ commands.put(CMD_AUTORECOVERY, new AutoRecoveryCmd());
commands.put(CMD_HELP, new HelpCmd());
}
@@ -523,9 +603,10 @@ public class BookieShell implements Tool
System.err.println(" metaformat [-nonInteractive] [-force]");
System.err.println(" bookieformat [-nonInteractive] [-force]");
System.err.println(" recover <bookieSrc> [bookieDest]");
- System.err.println(" ledger [-meta] <ledger_id>");
- System.err.println(" readlog [-msg] <entry_log_id|entry_log_file_name>");
- System.err.println(" readjournal [-msg] <journal_id|journal_file_name>");
+ System.err.println(" ledger [-meta] <ledger_id>");
+ System.err.println(" readlog [-msg] <entry_log_id|entry_log_file_name>");
+ System.err.println(" readjournal [-msg] <journal_id|journal_file_name>");
+ System.err.println(" autorecovery [-enable|-disable]");
System.err.println(" lastmark");
System.err.println(" help");
}
Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java?rev=1422054&r1=1422053&r2=1422054&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/main/java/org/apache/bookkeeper/meta/ZkLedgerUnderreplicationManager.java Fri Dec 14 19:26:51 2012
@@ -451,14 +451,18 @@ public class ZkLedgerUnderreplicationMan
+ BookKeeperConstants.DISABLE_NODE, "".getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
LOG.info("Auto ledger re-replication is disabled!");
+ } catch (KeeperException.NodeExistsException ke) {
+ LOG.warn("AutoRecovery is already disabled!", ke);
+ throw new ReplicationException.UnavailableException(
+ "AutoRecovery is already disabled!", ke);
} catch (KeeperException ke) {
- LOG.error("Exception while stopping replication", ke);
+ LOG.error("Exception while stopping auto ledger re-replication", ke);
throw new ReplicationException.UnavailableException(
- "Error contacting zookeeper", ke);
+ "Exception while stopping auto ledger re-replication", ke);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new ReplicationException.UnavailableException(
- "Interrupted while connecting zookeeper", ie);
+ "Interrupted while stopping auto ledger re-replication", ie);
}
}
@@ -469,14 +473,18 @@ public class ZkLedgerUnderreplicationMan
try {
zkc.delete(basePath + '/' + BookKeeperConstants.DISABLE_NODE, -1);
LOG.info("Resuming automatic ledger re-replication");
+ } catch (KeeperException.NoNodeException ke) {
+ LOG.warn("AutoRecovery is already enabled!", ke);
+ throw new ReplicationException.UnavailableException(
+ "AutoRecovery is already enabled!", ke);
} catch (KeeperException ke) {
LOG.error("Exception while resuming ledger replication", ke);
throw new ReplicationException.UnavailableException(
- "Error contacting zookeeper", ke);
+ "Exception while resuming auto ledger re-replication", ke);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new ReplicationException.UnavailableException(
- "Interrupted while connecting zookeeper", ie);
+ "Interrupted while resuming auto ledger re-replication", ie);
}
}
Modified: zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/AuditorLedgerCheckerTest.java
URL: http://svn.apache.org/viewvc/zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/AuditorLedgerCheckerTest.java?rev=1422054&r1=1422053&r2=1422054&view=diff
==============================================================================
--- zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/AuditorLedgerCheckerTest.java (original)
+++ zookeeper/bookkeeper/trunk/bookkeeper-server/src/test/java/org/apache/bookkeeper/replication/AuditorLedgerCheckerTest.java Fri Dec 14 19:26:51 2012
@@ -254,7 +254,7 @@ public class AuditorLedgerCheckerTest ex
}
}
- @Test//(timeout = 30000)
+ @Test(timeout = 30000)
public void testToggleLedgerReplication() throws Exception {
LedgerHandle lh1 = createAndAddEntriesToLedger();
ledgerList.add(lh1.getId());
@@ -279,6 +279,26 @@ public class AuditorLedgerCheckerTest ex
5, TimeUnit.SECONDS));
}
+ @Test(timeout = 20000)
+ public void testDuplicateEnDisableAutoRecovery() throws Exception {
+ urLedgerMgr.disableLedgerReplication();
+ try {
+ urLedgerMgr.disableLedgerReplication();
+ fail("Must throw exception, since AutoRecovery is already disabled");
+ } catch (UnavailableException e) {
+ assertTrue("AutoRecovery is not disabled previously!",
+ e.getCause() instanceof KeeperException.NodeExistsException);
+ }
+ urLedgerMgr.enableLedgerReplication();
+ try {
+ urLedgerMgr.enableLedgerReplication();
+ fail("Must throw exception, since AutoRecovery is already enabled");
+ } catch (UnavailableException e) {
+ assertTrue("AutoRecovery is not enabled previously!",
+ e.getCause() instanceof KeeperException.NoNodeException);
+ }
+ }
+
private CountDownLatch registerUrLedgerWatcher(int count)
throws KeeperException, InterruptedException {
final CountDownLatch underReplicaLatch = new CountDownLatch(count);