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 2018/06/04 22:03:55 UTC

[bookkeeper] 01/09: Provide the flag to allow ignoring startup failures on loading extra server components

This is an automated email from the ASF dual-hosted git repository.

sijie pushed a commit to branch branch-4.7
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git

commit 1ae9772a30292f378d0ca9e68e2371badc6a99f2
Author: Sijie Guo <si...@apache.org>
AuthorDate: Fri May 25 11:10:22 2018 -0700

    Provide the flag to allow ignoring startup failures on loading extra server components
    
    Descriptions of the changes in this PR:
    
    Addressed the comments in apache/bookkeeper#1420
    
    Author: Sijie Guo <si...@apache.org>
    
    Reviewers: Enrico Olivelli <eo...@gmail.com>, Jia Zhai <None>
    
    This closes #1426 from sijie/flag_to_allow_silent_failures
---
 bookkeeper-dist/src/assemble/bin-all.xml           |  6 +++
 bookkeeper-dist/src/assemble/bin-server.xml        |  6 +++
 .../bookkeeper/conf/ServerConfiguration.java       | 29 ++++++++++++-
 .../java/org/apache/bookkeeper/server/Main.java    |  8 +++-
 .../org/apache/bookkeeper/server/TestMain.java     | 49 ++++++++++++++++++++++
 conf/bk_server.conf                                |  5 +++
 site/_data/config/bk_server.yaml                   |  3 ++
 7 files changed, 103 insertions(+), 3 deletions(-)

diff --git a/bookkeeper-dist/src/assemble/bin-all.xml b/bookkeeper-dist/src/assemble/bin-all.xml
index 4a7c4dc..54cd125 100644
--- a/bookkeeper-dist/src/assemble/bin-all.xml
+++ b/bookkeeper-dist/src/assemble/bin-all.xml
@@ -114,6 +114,12 @@
         <exclude>io.netty:netty-tcnative-boringssl-static</exclude>
         <exclude>io.netty:netty-transport-native-epoll</exclude>
         <exclude>io.netty:netty-transport</exclude>
+        <!-- All these dependencies are already included in stream-storage-java-client -->
+        <exclude>org.apache.bookkeeper:stream-storage-common</exclude>
+        <exclude>org.apache.bookkeeper:stream-storage-proto</exclude>
+        <exclude>org.apache.bookkeeper:stream-storage-api</exclude>
+        <exclude>org.apache.bookkeeper:stream-storage-java-client-base</exclude>
+        <exclude>org.apache.bookkeeper:stream-storage-java-kv-client</exclude>
       </excludes>
     </dependencySet>
   </dependencySets>
diff --git a/bookkeeper-dist/src/assemble/bin-server.xml b/bookkeeper-dist/src/assemble/bin-server.xml
index ce5a646..693fda6 100644
--- a/bookkeeper-dist/src/assemble/bin-server.xml
+++ b/bookkeeper-dist/src/assemble/bin-server.xml
@@ -103,6 +103,12 @@
         <exclude>io.netty:netty-resolver-dns</exclude>
         <exclude>io.netty:netty-tcnative-boringssl-static</exclude>
         <exclude>io.netty:netty-transport</exclude>
+        <!-- All these dependencies are already included in stream-storage-java-client -->
+        <exclude>org.apache.bookkeeper:stream-storage-common</exclude>
+        <exclude>org.apache.bookkeeper:stream-storage-proto</exclude>
+        <exclude>org.apache.bookkeeper:stream-storage-api</exclude>
+        <exclude>org.apache.bookkeeper:stream-storage-java-client-base</exclude>
+        <exclude>org.apache.bookkeeper:stream-storage-java-kv-client</exclude>
       </excludes>
     </dependencySet>
   </dependencySets>
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/conf/ServerConfiguration.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/conf/ServerConfiguration.java
index 904ca3f..3e4749c 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/conf/ServerConfiguration.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/conf/ServerConfiguration.java
@@ -18,6 +18,7 @@
 package org.apache.bookkeeper.conf;
 
 import com.google.common.annotations.Beta;
+import com.google.common.base.Strings;
 import java.io.File;
 import java.util.concurrent.TimeUnit;
 import org.apache.bookkeeper.bookie.InterleavedLedgerStorage;
@@ -174,6 +175,8 @@ public class ServerConfiguration extends AbstractConfiguration<ServerConfigurati
 
     // Lifecycle Components
     protected static final String EXTRA_SERVER_COMPONENTS = "extraServerComponents";
+    protected static final String IGNORE_EXTRA_SERVER_COMPONENTS_STARTUP_FAILURES =
+        "ignoreExtraServerComponentsStartupFailures";
 
     // Registration
     protected static final String REGISTRATION_MANAGER_CLASS = "registrationManagerClass";
@@ -2653,7 +2656,8 @@ public class ServerConfiguration extends AbstractConfiguration<ServerConfigurati
      * @return the extra list of server lifecycle components to enable on a bookie server.
      */
     public String[] getExtraServerComponents() {
-        if (!this.containsKey(EXTRA_SERVER_COMPONENTS)) {
+        String extraServerComponentsStr = getString(EXTRA_SERVER_COMPONENTS);
+        if (Strings.isNullOrEmpty(extraServerComponentsStr)) {
             return null;
         }
         return this.getStringArray(EXTRA_SERVER_COMPONENTS);
@@ -2672,6 +2676,29 @@ public class ServerConfiguration extends AbstractConfiguration<ServerConfigurati
     }
 
     /**
+     * Return the flag whether to ignore startup failures on loading server components specified at
+     * {@link #getExtraServerComponents()}.
+     *
+     * @return the flag whether to ignore startup failures on loading server components specified at
+     * {@link #getExtraServerComponents()}. The default value is <tt>false</tt>.
+     */
+    public boolean getIgnoreExtraServerComponentsStartupFailures() {
+        return getBoolean(IGNORE_EXTRA_SERVER_COMPONENTS_STARTUP_FAILURES, false);
+    }
+
+    /**
+     * Set the flag whether to ignore startup failures on loading server components specified at
+     * {@link #getExtraServerComponents()}.
+     *
+     * @param enabled flag to enable/disable ignoring startup failures on loading server components.
+     * @return server configuration.
+     */
+    public ServerConfiguration setIgnoreExtraServerComponentsStartupFailures(boolean enabled) {
+        setProperty(IGNORE_EXTRA_SERVER_COMPONENTS_STARTUP_FAILURES, enabled);
+        return this;
+    }
+
+    /**
      * Set registration manager class.
      *
      * @param regManagerClass
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/Main.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/Main.java
index 1ef56de..ae92955 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/Main.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/Main.java
@@ -338,8 +338,12 @@ public class Main {
                     log.info("Load lifecycle component : {}", component.getClass().getName());
                 }
             } catch (Exception e) {
-                log.info("Failed to load extra components '{}' - {}. Continuing without those components.",
-                    StringUtils.join(extraComponents), e.getMessage());
+                if (conf.getServerConf().getIgnoreExtraServerComponentsStartupFailures()) {
+                    log.info("Failed to load extra components '{}' - {}. Continuing without those components.",
+                        StringUtils.join(extraComponents), e.getMessage());
+                } else {
+                    throw e;
+                }
             }
         }
 
diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/TestMain.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/TestMain.java
index 8027511..d5253fd 100644
--- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/TestMain.java
+++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/server/TestMain.java
@@ -22,6 +22,7 @@ package org.apache.bookkeeper.server;
 import static org.apache.bookkeeper.server.Main.buildBookieServer;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -95,4 +96,52 @@ public class TestMain {
         verify(mockServer, times(1)).shutdown();
     }
 
+    @Test
+    public void testIgnoreExtraServerComponentsStartupFailures() throws Exception {
+        ServerConfiguration serverConf = new ServerConfiguration()
+            .setAutoRecoveryDaemonEnabled(false)
+            .setHttpServerEnabled(false)
+            .setExtraServerComponents(new String[] { "bad-server-component"})
+            .setIgnoreExtraServerComponentsStartupFailures(true);
+        BookieConfiguration conf = new BookieConfiguration(serverConf);
+
+        BookieServer mockServer = PowerMockito.mock(BookieServer.class);
+        whenNew(BookieServer.class)
+            .withArguments(any(ServerConfiguration.class), any(StatsLogger.class))
+            .thenReturn(mockServer);
+
+        LifecycleComponentStack stack = buildBookieServer(conf);
+        assertEquals(2, stack.getNumComponents());
+
+        stack.start();
+        verify(mockServer, times(1)).start();
+
+        stack.stop();
+
+        stack.close();
+        verify(mockServer, times(1)).shutdown();
+    }
+
+    @Test
+    public void testExtraServerComponentsStartupFailures() throws Exception {
+        ServerConfiguration serverConf = new ServerConfiguration()
+            .setAutoRecoveryDaemonEnabled(false)
+            .setHttpServerEnabled(false)
+            .setExtraServerComponents(new String[] { "bad-server-component"})
+            .setIgnoreExtraServerComponentsStartupFailures(false);
+        BookieConfiguration conf = new BookieConfiguration(serverConf);
+
+        BookieServer mockServer = PowerMockito.mock(BookieServer.class);
+        whenNew(BookieServer.class)
+            .withArguments(any(ServerConfiguration.class), any(StatsLogger.class))
+            .thenReturn(mockServer);
+
+        try {
+            buildBookieServer(conf);
+            fail("Should fail to start bookie server if `ignoreExtraServerComponentsStartupFailures` is set to false");
+        } catch (RuntimeException re) {
+            assertTrue(re.getCause() instanceof ClassNotFoundException);
+        }
+    }
+
 }
diff --git a/conf/bk_server.conf b/conf/bk_server.conf
index 6e3c1b4..10c7783 100755
--- a/conf/bk_server.conf
+++ b/conf/bk_server.conf
@@ -97,6 +97,11 @@ bookiePort=3181
 # extraServerComponents=org.apache.bookkeeper.stream.server.StreamStorageLifecycleComponent
 extraServerComponents=
 
+# Whether the bookie should ignore startup failures on loading server components specified
+# by `extraServerComponents`. The default value is `false`.
+#
+# ignoreExtraServerComponentsStartupFailures=false
+
 #############################################################################
 ## Thread settings
 #############################################################################
diff --git a/site/_data/config/bk_server.yaml b/site/_data/config/bk_server.yaml
index fd3ab7a..01d82f3 100644
--- a/site/_data/config/bk_server.yaml
+++ b/site/_data/config/bk_server.yaml
@@ -44,6 +44,9 @@ groups:
   - param: extraServerComponents
     description: Configure a list of extra server components to enable and load on a bookie server. This provides a plugin mechanism to run extra server components along with a bookie server.
     default: ''
+  - param: ignoreExtraServerComponentsStartupFailures
+    description: Whether the bookie should ignore startup failures on loading server components specified by `extraServerComponents`.
+    default: 'false'
 
 - name: Worker thread settings
   params:

-- 
To stop receiving notification emails like this one, please contact
sijie@apache.org.