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);