You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sn...@apache.org on 2015/01/27 13:38:27 UTC

[1/3] cassandra git commit: rpc_interface and listen_interface generate NPE on startup when specified interface doesn't exist

Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.1 33297bad0 -> 3e5edb82c
  refs/heads/trunk 6068daea8 -> dd959f0f5


rpc_interface and listen_interface generate NPE on startup when specified interface doesn't exist

Patch by Ariel Weisberg; reviewed by Robert Stupp for CASSANDRA-8677


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/3e5edb82
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/3e5edb82
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/3e5edb82

Branch: refs/heads/cassandra-2.1
Commit: 3e5edb82c73b7b7c6e1d1e970fb764c3e3158da6
Parents: 33297ba
Author: Ariel Weisberg <ar...@datastax.com>
Authored: Tue Jan 27 13:30:47 2015 +0100
Committer: Robert Stupp <sn...@snazy.de>
Committed: Tue Jan 27 13:30:47 2015 +0100

----------------------------------------------------------------------
 .../cassandra/config/DatabaseDescriptor.java    | 46 ++++++++++----------
 1 file changed, 23 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/3e5edb82/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index db33dcc..1dd1688 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -158,6 +158,27 @@ public class DatabaseDescriptor
         return loader.loadConfig();
     }
 
+    private static InetAddress getNetworkInterfaceAddress(String intf, String configName) throws ConfigurationException
+    {
+        try
+        {
+            NetworkInterface ni = NetworkInterface.getByName(intf);
+            if (ni == null)
+                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" could not be found");
+            Enumeration<InetAddress> addrs = ni.getInetAddresses();
+            if (!addrs.hasMoreElements())
+                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" was found, but had no addresses");
+            InetAddress retval = listenAddress = addrs.nextElement();
+            if (addrs.hasMoreElements())
+                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" can't have more than one address");
+            return retval;
+        }
+        catch (SocketException e)
+        {
+            throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" caused an exception", e);
+        }
+    }
+
     private static void applyConfig(Config config) throws ConfigurationException
     {
         conf = config;
@@ -326,18 +347,7 @@ public class DatabaseDescriptor
         }
         else if (conf.listen_interface != null)
         {
-            try
-            {
-                Enumeration<InetAddress> addrs = NetworkInterface.getByName(conf.listen_interface).getInetAddresses();
-                listenAddress = addrs.nextElement();
-                if (addrs.hasMoreElements())
-                    throw new ConfigurationException("Interface " + conf.listen_interface +" can't have more than one address");
-            }
-            catch (SocketException e)
-            {
-                throw new ConfigurationException("Unknown network interface in listen_interface " + conf.listen_interface);
-            }
-
+            listenAddress = getNetworkInterfaceAddress(conf.listen_interface, "listen_interface");
         }
 
         /* Gossip Address to broadcast */
@@ -374,17 +384,7 @@ public class DatabaseDescriptor
         }
         else if (conf.rpc_interface != null)
         {
-            try
-            {
-                Enumeration<InetAddress> addrs = NetworkInterface.getByName(conf.rpc_interface).getInetAddresses();
-                rpcAddress = addrs.nextElement();
-                if (addrs.hasMoreElements())
-                    throw new ConfigurationException("Interface " + conf.rpc_interface +" can't have more than one address");
-            }
-            catch (SocketException e)
-            {
-                throw new ConfigurationException("Unknown network interface in rpc_interface " + conf.rpc_interface);
-            }
+            listenAddress = getNetworkInterfaceAddress(conf.rpc_interface, "rpc_interface");
         }
         else
         {


[2/3] cassandra git commit: rpc_interface and listen_interface generate NPE on startup when specified interface doesn't exist

Posted by sn...@apache.org.
rpc_interface and listen_interface generate NPE on startup when specified interface doesn't exist

Patch by Ariel Weisberg; reviewed by Robert Stupp for CASSANDRA-8677


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/3e5edb82
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/3e5edb82
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/3e5edb82

Branch: refs/heads/trunk
Commit: 3e5edb82c73b7b7c6e1d1e970fb764c3e3158da6
Parents: 33297ba
Author: Ariel Weisberg <ar...@datastax.com>
Authored: Tue Jan 27 13:30:47 2015 +0100
Committer: Robert Stupp <sn...@snazy.de>
Committed: Tue Jan 27 13:30:47 2015 +0100

----------------------------------------------------------------------
 .../cassandra/config/DatabaseDescriptor.java    | 46 ++++++++++----------
 1 file changed, 23 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/3e5edb82/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index db33dcc..1dd1688 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -158,6 +158,27 @@ public class DatabaseDescriptor
         return loader.loadConfig();
     }
 
+    private static InetAddress getNetworkInterfaceAddress(String intf, String configName) throws ConfigurationException
+    {
+        try
+        {
+            NetworkInterface ni = NetworkInterface.getByName(intf);
+            if (ni == null)
+                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" could not be found");
+            Enumeration<InetAddress> addrs = ni.getInetAddresses();
+            if (!addrs.hasMoreElements())
+                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" was found, but had no addresses");
+            InetAddress retval = listenAddress = addrs.nextElement();
+            if (addrs.hasMoreElements())
+                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" can't have more than one address");
+            return retval;
+        }
+        catch (SocketException e)
+        {
+            throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" caused an exception", e);
+        }
+    }
+
     private static void applyConfig(Config config) throws ConfigurationException
     {
         conf = config;
@@ -326,18 +347,7 @@ public class DatabaseDescriptor
         }
         else if (conf.listen_interface != null)
         {
-            try
-            {
-                Enumeration<InetAddress> addrs = NetworkInterface.getByName(conf.listen_interface).getInetAddresses();
-                listenAddress = addrs.nextElement();
-                if (addrs.hasMoreElements())
-                    throw new ConfigurationException("Interface " + conf.listen_interface +" can't have more than one address");
-            }
-            catch (SocketException e)
-            {
-                throw new ConfigurationException("Unknown network interface in listen_interface " + conf.listen_interface);
-            }
-
+            listenAddress = getNetworkInterfaceAddress(conf.listen_interface, "listen_interface");
         }
 
         /* Gossip Address to broadcast */
@@ -374,17 +384,7 @@ public class DatabaseDescriptor
         }
         else if (conf.rpc_interface != null)
         {
-            try
-            {
-                Enumeration<InetAddress> addrs = NetworkInterface.getByName(conf.rpc_interface).getInetAddresses();
-                rpcAddress = addrs.nextElement();
-                if (addrs.hasMoreElements())
-                    throw new ConfigurationException("Interface " + conf.rpc_interface +" can't have more than one address");
-            }
-            catch (SocketException e)
-            {
-                throw new ConfigurationException("Unknown network interface in rpc_interface " + conf.rpc_interface);
-            }
+            listenAddress = getNetworkInterfaceAddress(conf.rpc_interface, "rpc_interface");
         }
         else
         {


[3/3] cassandra git commit: Merge branch 'cassandra-2.1' into trunk

Posted by sn...@apache.org.
Merge branch 'cassandra-2.1' into trunk


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/dd959f0f
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/dd959f0f
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/dd959f0f

Branch: refs/heads/trunk
Commit: dd959f0f5dd6be7006c79b3f6ed2e9dbd98a720c
Parents: 6068dae 3e5edb8
Author: Ariel Weisberg <ar...@datastax.com>
Authored: Tue Jan 27 13:34:39 2015 +0100
Committer: Robert Stupp <sn...@snazy.de>
Committed: Tue Jan 27 13:34:39 2015 +0100

----------------------------------------------------------------------
 .../cassandra/config/DatabaseDescriptor.java    | 153 ++++++++++---------
 .../exceptions/ConfigurationException.java      |  16 ++
 .../cassandra/service/CassandraDaemon.java      |  36 ++++-
 3 files changed, 123 insertions(+), 82 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/dd959f0f/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 8cc2da4,1dd1688..2891e9a
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@@ -95,16 -115,36 +95,16 @@@ public class DatabaseDescripto
      private static String localDC;
      private static Comparator<InetAddress> localComparator;
  
++    public static void forceStaticInitialization() {}
      static
      {
 -        // In client mode, we use a default configuration. Note that the fields of this class will be
 -        // left unconfigured however (the partitioner or localDC will be null for instance) so this
 -        // should be used with care.
          try
          {
 -            if (Config.isClientMode())
 -            {
 -                conf = new Config();
 -                // at least we have to set memoryAllocator to open SSTable in client mode
 -                memoryAllocator = FBUtilities.newOffHeapAllocator(conf.memory_allocator);
 -            }
 -            else
 -            {
 -                applyConfig(loadConfig());
 -            }
 -        }
 -        catch (ConfigurationException e)
 -        {
 -            logger.error("Fatal configuration error", e);
 -            System.err.println(e.getMessage() + "\nFatal configuration error; unable to start. See log for stacktrace.");
 -            System.exit(1);
 +            applyConfig(loadConfig());
          }
          catch (Exception e)
          {
 -            logger.error("Fatal error during configuration loading", e);
 -            System.err.println(e.getMessage() + "\nFatal error during configuration loading; unable to start. See log for stacktrace.");
--            JVMStabilityInspector.inspectThrowable(e);
-             throw new ExceptionInInitializerError(e.getMessage() + "\nFatal configuration error; unable to start. See log for stacktrace.");
 -            System.exit(1);
++            throw new ExceptionInInitializerError(e);
          }
      }
  
@@@ -118,24 -158,45 +118,45 @@@
          return loader.loadConfig();
      }
  
+     private static InetAddress getNetworkInterfaceAddress(String intf, String configName) throws ConfigurationException
+     {
+         try
+         {
+             NetworkInterface ni = NetworkInterface.getByName(intf);
+             if (ni == null)
 -                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" could not be found");
++                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" could not be found", false);
+             Enumeration<InetAddress> addrs = ni.getInetAddresses();
+             if (!addrs.hasMoreElements())
 -                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" was found, but had no addresses");
++                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" was found, but had no addresses", false);
+             InetAddress retval = listenAddress = addrs.nextElement();
+             if (addrs.hasMoreElements())
 -                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" can't have more than one address");
++                throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" can't have more than one address", false);
+             return retval;
+         }
+         catch (SocketException e)
+         {
+             throw new ConfigurationException("Configured " + configName + " \"" + intf + "\" caused an exception", e);
+         }
+     }
+ 
      private static void applyConfig(Config config) throws ConfigurationException
      {
          conf = config;
  
          if (conf.commitlog_sync == null)
          {
--            throw new ConfigurationException("Missing required directive CommitLogSync");
++            throw new ConfigurationException("Missing required directive CommitLogSync", false);
          }
  
          if (conf.commitlog_sync == Config.CommitLogSync.batch)
          {
              if (conf.commitlog_sync_batch_window_in_ms == null)
              {
--                throw new ConfigurationException("Missing value for commitlog_sync_batch_window_in_ms: Double expected.");
++                throw new ConfigurationException("Missing value for commitlog_sync_batch_window_in_ms: Double expected.", false);
              }
              else if (conf.commitlog_sync_period_in_ms != null)
              {
--                throw new ConfigurationException("Batch sync specified, but commitlog_sync_period_in_ms found. Only specify commitlog_sync_batch_window_in_ms when using batch sync");
++                throw new ConfigurationException("Batch sync specified, but commitlog_sync_period_in_ms found. Only specify commitlog_sync_batch_window_in_ms when using batch sync", false);
              }
              logger.debug("Syncing log with a batch window of {}", conf.commitlog_sync_batch_window_in_ms);
          }
@@@ -143,11 -204,11 +164,11 @@@
          {
              if (conf.commitlog_sync_period_in_ms == null)
              {
--                throw new ConfigurationException("Missing value for commitlog_sync_period_in_ms: Integer expected");
++                throw new ConfigurationException("Missing value for commitlog_sync_period_in_ms: Integer expected", false);
              }
              else if (conf.commitlog_sync_batch_window_in_ms != null)
              {
--                throw new ConfigurationException("commitlog_sync_period_in_ms specified, but commitlog_sync_batch_window_in_ms found.  Only specify commitlog_sync_period_in_ms when using periodic sync.");
++                throw new ConfigurationException("commitlog_sync_period_in_ms specified, but commitlog_sync_batch_window_in_ms found.  Only specify commitlog_sync_period_in_ms when using periodic sync.", false);
              }
              logger.debug("Syncing log with a period of {}", conf.commitlog_sync_period_in_ms);
          }
@@@ -193,13 -254,7 +214,13 @@@
              authorizer = FBUtilities.newAuthorizer(conf.authorizer);
  
          if (authenticator instanceof AllowAllAuthenticator && !(authorizer instanceof AllowAllAuthorizer))
--            throw new ConfigurationException("AllowAllAuthenticator can't be used with " +  conf.authorizer);
++            throw new ConfigurationException("AllowAllAuthenticator can't be used with " +  conf.authorizer, false);
 +
 +        if (conf.role_manager != null)
 +            roleManager = FBUtilities.newRoleManager(conf.role_manager);
 +
 +        if (authenticator instanceof PasswordAuthenticator && !(roleManager instanceof CassandraRoleManager))
-             throw new ConfigurationException("CassandraRoleManager must be used with PasswordAuthenticator");
++            throw new ConfigurationException("CassandraRoleManager must be used with PasswordAuthenticator", false);
  
          if (conf.internode_authenticator != null)
              internodeAuthenticator = FBUtilities.construct(conf.internode_authenticator, "internode_authenticator");
@@@ -214,7 -268,7 +235,7 @@@
          /* Hashing strategy */
          if (conf.partitioner == null)
          {
--            throw new ConfigurationException("Missing directive: partitioner");
++            throw new ConfigurationException("Missing directive: partitioner", false);
          }
          try
          {
@@@ -222,34 -276,34 +243,34 @@@
          }
          catch (Exception e)
          {
--            throw new ConfigurationException("Invalid partitioner class " + conf.partitioner);
++            throw new ConfigurationException("Invalid partitioner class " + conf.partitioner, false);
          }
          paritionerName = partitioner.getClass().getCanonicalName();
  
          if (conf.max_hint_window_in_ms == null)
          {
--            throw new ConfigurationException("max_hint_window_in_ms cannot be set to null");
++            throw new ConfigurationException("max_hint_window_in_ms cannot be set to null", false);
          }
  
          /* phi convict threshold for FailureDetector */
          if (conf.phi_convict_threshold < 5 || conf.phi_convict_threshold > 16)
          {
--            throw new ConfigurationException("phi_convict_threshold must be between 5 and 16");
++            throw new ConfigurationException("phi_convict_threshold must be between 5 and 16", false);
          }
  
          /* Thread per pool */
          if (conf.concurrent_reads != null && conf.concurrent_reads < 2)
          {
--            throw new ConfigurationException("concurrent_reads must be at least 2");
++            throw new ConfigurationException("concurrent_reads must be at least 2", false);
          }
  
          if (conf.concurrent_writes != null && conf.concurrent_writes < 2)
          {
--            throw new ConfigurationException("concurrent_writes must be at least 2");
++            throw new ConfigurationException("concurrent_writes must be at least 2", false);
          }
  
          if (conf.concurrent_counter_writes != null && conf.concurrent_counter_writes < 2)
--            throw new ConfigurationException("concurrent_counter_writes must be at least 2");
++            throw new ConfigurationException("concurrent_counter_writes must be at least 2", false);
  
          if (conf.concurrent_replicates != null)
              logger.warn("concurrent_replicates has been deprecated and should be removed from cassandra.yaml");
@@@ -260,12 -314,12 +281,12 @@@
          if (conf.memtable_offheap_space_in_mb == null)
              conf.memtable_offheap_space_in_mb = (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576));
          if (conf.memtable_offheap_space_in_mb < 0)
--            throw new ConfigurationException("memtable_offheap_space_in_mb must be positive");
++            throw new ConfigurationException("memtable_offheap_space_in_mb must be positive", false);
          // for the moment, we default to twice as much on-heap space as off-heap, as heap overhead is very large
          if (conf.memtable_heap_space_in_mb == null)
              conf.memtable_heap_space_in_mb = (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576));
          if (conf.memtable_heap_space_in_mb <= 0)
--            throw new ConfigurationException("memtable_heap_space_in_mb must be positive");
++            throw new ConfigurationException("memtable_heap_space_in_mb must be positive", false);
          logger.info("Global memtable on-heap threshold is enabled at {}MB", conf.memtable_heap_space_in_mb);
          if (conf.memtable_offheap_space_in_mb == 0)
              logger.info("Global memtable off-heap threshold is disabled, HeapAllocator will be used instead");
@@@ -275,7 -329,7 +296,7 @@@
          /* Local IP, hostname or interface to bind services to */
          if (conf.listen_address != null && conf.listen_interface != null)
          {
--            throw new ConfigurationException("Set listen_address OR listen_interface, not both");
++            throw new ConfigurationException("Set listen_address OR listen_interface, not both", false);
          }
          else if (conf.listen_address != null)
          {
@@@ -285,11 -339,11 +306,11 @@@
              }
              catch (UnknownHostException e)
              {
--                throw new ConfigurationException("Unknown listen_address '" + conf.listen_address + "'");
++                throw new ConfigurationException("Unknown listen_address '" + conf.listen_address + "'", false);
              }
  
              if (listenAddress.isAnyLocalAddress())
--                throw new ConfigurationException("listen_address cannot be a wildcard address (" + conf.listen_address + ")!");
++                throw new ConfigurationException("listen_address cannot be a wildcard address (" + conf.listen_address + ")!", false);
          }
          else if (conf.listen_interface != null)
          {
@@@ -316,17 -359,17 +326,17 @@@
              }
              catch (UnknownHostException e)
              {
--                throw new ConfigurationException("Unknown broadcast_address '" + conf.broadcast_address + "'");
++                throw new ConfigurationException("Unknown broadcast_address '" + conf.broadcast_address + "'", false);
              }
  
              if (broadcastAddress.isAnyLocalAddress())
--                throw new ConfigurationException("broadcast_address cannot be a wildcard address (" + conf.broadcast_address + ")!");
++                throw new ConfigurationException("broadcast_address cannot be a wildcard address (" + conf.broadcast_address + ")!", false);
          }
  
          /* Local IP, hostname or interface to bind RPC server to */
          if (conf.rpc_address != null && conf.rpc_interface != null)
          {
--            throw new ConfigurationException("Set rpc_address OR rpc_interface, not both");
++            throw new ConfigurationException("Set rpc_address OR rpc_interface, not both", false);
          }
          else if (conf.rpc_address != null)
          {
@@@ -336,22 -379,12 +346,12 @@@
              }
              catch (UnknownHostException e)
              {
--                throw new ConfigurationException("Unknown host in rpc_address " + conf.rpc_address);
++                throw new ConfigurationException("Unknown host in rpc_address " + conf.rpc_address, false);
              }
          }
          else if (conf.rpc_interface != null)
          {
-             try
-             {
-                 Enumeration<InetAddress> addrs = NetworkInterface.getByName(conf.rpc_interface).getInetAddresses();
-                 rpcAddress = addrs.nextElement();
-                 if (addrs.hasMoreElements())
-                     throw new ConfigurationException("Interface " + conf.rpc_interface +" can't have more than one address");
-             }
-             catch (SocketException e)
-             {
-                 throw new ConfigurationException("Unknown network interface in rpc_interface " + conf.rpc_interface);
-             }
 -            listenAddress = getNetworkInterfaceAddress(conf.rpc_interface, "rpc_interface");
++            rpcAddress = getNetworkInterfaceAddress(conf.rpc_interface, "rpc_interface");
          }
          else
          {
@@@ -367,36 -400,36 +367,37 @@@
              }
              catch (UnknownHostException e)
              {
--                throw new ConfigurationException("Unknown broadcast_rpc_address '" + conf.broadcast_rpc_address + "'");
++                throw new ConfigurationException("Unknown broadcast_rpc_address '" + conf.broadcast_rpc_address + "'", false);
              }
  
              if (broadcastRpcAddress.isAnyLocalAddress())
--                throw new ConfigurationException("broadcast_rpc_address cannot be a wildcard address (" + conf.broadcast_rpc_address + ")!");
++                throw new ConfigurationException("broadcast_rpc_address cannot be a wildcard address (" + conf.broadcast_rpc_address + ")!", false);
          }
          else
          {
              if (rpcAddress.isAnyLocalAddress())
                  throw new ConfigurationException("If rpc_address is set to a wildcard address (" + conf.rpc_address + "), then " +
--                                                 "you must set broadcast_rpc_address to a value other than " + conf.rpc_address);
++                                                 "you must set broadcast_rpc_address to a value other than " + conf.rpc_address, false);
              broadcastRpcAddress = rpcAddress;
          }
  
          if (conf.thrift_framed_transport_size_in_mb <= 0)
--            throw new ConfigurationException("thrift_framed_transport_size_in_mb must be positive");
++            throw new ConfigurationException("thrift_framed_transport_size_in_mb must be positive", false);
  
          if (conf.native_transport_max_frame_size_in_mb <= 0)
--            throw new ConfigurationException("native_transport_max_frame_size_in_mb must be positive");
++            throw new ConfigurationException("native_transport_max_frame_size_in_mb must be positive", false);
  
          // fail early instead of OOMing (see CASSANDRA-8116)
          if (ThriftServer.HSHA.equals(conf.rpc_server_type) && conf.rpc_max_threads == Integer.MAX_VALUE)
              throw new ConfigurationException("The hsha rpc_server_type is not compatible with an rpc_max_threads " +
                                               "setting of 'unlimited'.  Please see the comments in cassandra.yaml " +
--                                             "for rpc_server_type and rpc_max_threads.");
++                                             "for rpc_server_type and rpc_max_threads.",
++                                             false);
  
          /* end point snitch */
          if (conf.endpoint_snitch == null)
          {
--            throw new ConfigurationException("Missing endpoint_snitch directive");
++            throw new ConfigurationException("Missing endpoint_snitch directive", false);
          }
          snitch = createEndpointSnitch(conf.endpoint_snitch);
          EndpointSnitchInfo.create();
@@@ -431,7 -464,7 +432,7 @@@
              }
              catch (ClassNotFoundException e)
              {
--                throw new ConfigurationException("Invalid Request Scheduler class " + conf.request_scheduler);
++                throw new ConfigurationException("Invalid Request Scheduler class " + conf.request_scheduler, false);
              }
              catch (Exception e)
              {
@@@ -459,21 -492,21 +460,21 @@@
          {
              conf.commitlog_directory = System.getProperty("cassandra.storagedir", null);
              if (conf.commitlog_directory == null)
--                throw new ConfigurationException("commitlog_directory is missing and -Dcassandra.storagedir is not set");
++                throw new ConfigurationException("commitlog_directory is missing and -Dcassandra.storagedir is not set", false);
              conf.commitlog_directory += File.separator + "commitlog";
          }
          if (conf.saved_caches_directory == null)
          {
              conf.saved_caches_directory = System.getProperty("cassandra.storagedir", null);
              if (conf.saved_caches_directory == null)
--                throw new ConfigurationException("saved_caches_directory is missing and -Dcassandra.storagedir is not set");
++                throw new ConfigurationException("saved_caches_directory is missing and -Dcassandra.storagedir is not set", false);
              conf.saved_caches_directory += File.separator + "saved_caches";
          }
          if (conf.data_file_directories == null)
          {
              String defaultDataDir = System.getProperty("cassandra.storagedir", null);
              if (defaultDataDir == null)
--                throw new ConfigurationException("data_file_directories is not missing and -Dcassandra.storagedir is not set");
++                throw new ConfigurationException("data_file_directories is not missing and -Dcassandra.storagedir is not set", false);
              conf.data_file_directories = new String[]{ defaultDataDir + File.separator + "data" };
          }
  
@@@ -481,27 -514,27 +482,27 @@@
          for (String datadir : conf.data_file_directories)
          {
              if (datadir.equals(conf.commitlog_directory))
--                throw new ConfigurationException("commitlog_directory must not be the same as any data_file_directories");
++                throw new ConfigurationException("commitlog_directory must not be the same as any data_file_directories", false);
              if (datadir.equals(conf.saved_caches_directory))
--                throw new ConfigurationException("saved_caches_directory must not be the same as any data_file_directories");
++                throw new ConfigurationException("saved_caches_directory must not be the same as any data_file_directories", false);
          }
  
          if (conf.commitlog_directory.equals(conf.saved_caches_directory))
--            throw new ConfigurationException("saved_caches_directory must not be the same as the commitlog_directory");
++            throw new ConfigurationException("saved_caches_directory must not be the same as the commitlog_directory", false);
  
          if (conf.memtable_flush_writers == null)
              conf.memtable_flush_writers = Math.min(8, Math.max(2, Math.min(FBUtilities.getAvailableProcessors(), conf.data_file_directories.length)));
  
          if (conf.memtable_flush_writers < 1)
--            throw new ConfigurationException("memtable_flush_writers must be at least 1");
++            throw new ConfigurationException("memtable_flush_writers must be at least 1", false);
  
          if (conf.memtable_cleanup_threshold == null)
              conf.memtable_cleanup_threshold = (float) (1.0 / (1 + conf.memtable_flush_writers));
  
          if (conf.memtable_cleanup_threshold < 0.01f)
--            throw new ConfigurationException("memtable_cleanup_threshold must be >= 0.01");
++            throw new ConfigurationException("memtable_cleanup_threshold must be >= 0.01", false);
          if (conf.memtable_cleanup_threshold > 0.99f)
--            throw new ConfigurationException("memtable_cleanup_threshold must be <= 0.99");
++            throw new ConfigurationException("memtable_cleanup_threshold must be <= 0.99", false);
          if (conf.memtable_cleanup_threshold < 0.1f)
              logger.warn("memtable_cleanup_threshold is set very low, which may cause performance degradation");
  
@@@ -509,7 -542,7 +510,7 @@@
              conf.concurrent_compactors = Math.min(8, Math.max(2, Math.min(FBUtilities.getAvailableProcessors(), conf.data_file_directories.length)));
  
          if (conf.concurrent_compactors <= 0)
--            throw new ConfigurationException("concurrent_compactors should be strictly greater than 0");
++            throw new ConfigurationException("concurrent_compactors should be strictly greater than 0", false);
  
          if (conf.initial_token != null)
              for (String token : tokensFromString(conf.initial_token))
@@@ -518,7 -551,7 +519,7 @@@
          if (conf.num_tokens == null)
          	conf.num_tokens = 1;
          else if (conf.num_tokens > MAX_NUM_TOKENS)
--            throw new ConfigurationException(String.format("A maximum number of %d tokens per node is supported", MAX_NUM_TOKENS));
++            throw new ConfigurationException(String.format("A maximum number of %d tokens per node is supported", MAX_NUM_TOKENS), false);
  
          try
          {
@@@ -533,7 -566,7 +534,7 @@@
          catch (NumberFormatException e)
          {
              throw new ConfigurationException("key_cache_size_in_mb option was set incorrectly to '"
--                    + conf.key_cache_size_in_mb + "', supported values are <integer> >= 0.");
++                    + conf.key_cache_size_in_mb + "', supported values are <integer> >= 0.", false);
          }
  
          try
@@@ -549,7 -582,7 +550,7 @@@
          catch (NumberFormatException e)
          {
              throw new ConfigurationException("counter_cache_size_in_mb option was set incorrectly to '"
--                    + conf.counter_cache_size_in_mb + "', supported values are <integer> >= 0.");
++                    + conf.counter_cache_size_in_mb + "', supported values are <integer> >= 0.", false);
          }
  
          // if set to empty/"auto" then use 5% of Heap size
@@@ -559,7 -592,7 +560,7 @@@
  
          if (indexSummaryCapacityInMB < 0)
              throw new ConfigurationException("index_summary_capacity_in_mb option was set incorrectly to '"
--                    + conf.index_summary_capacity_in_mb + "', it should be a non-negative integer.");
++                    + conf.index_summary_capacity_in_mb + "', it should be a non-negative integer.", false);
  
          memoryAllocator = FBUtilities.newOffHeapAllocator(conf.memory_allocator);
  
@@@ -570,10 -603,16 +571,10 @@@
              conf.server_encryption_options = conf.encryption_options;
          }
  
 -        // Hardcoded system keyspaces
 -        List<KSMetaData> systemKeyspaces = Arrays.asList(KSMetaData.systemKeyspace());
 -        assert systemKeyspaces.size() == Schema.systemKeyspaceNames.size();
 -        for (KSMetaData ksmd : systemKeyspaces)
 -            Schema.instance.load(ksmd);
 -
 -        /* Load the seeds for node contact points */
 +        // load the seeds for node contact points
          if (conf.seed_provider == null)
          {
--            throw new ConfigurationException("seeds configuration is missing; a minimum of one seed is required.");
++            throw new ConfigurationException("seeds configuration is missing; a minimum of one seed is required.", false);
          }
          try
          {
@@@ -583,15 -622,12 +584,15 @@@
          // there are about 5 checked exceptions that could be thrown here.
          catch (Exception e)
          {
-             throw new ConfigurationException(e.getMessage() + "\nFatal configuration error; unable to start server.  See log for stacktrace.");
 -            logger.error("Fatal configuration error", e);
 -            System.err.println(e.getMessage() + "\nFatal configuration error; unable to start server.  See log for stacktrace.");
 -            System.exit(1);
++            throw new ConfigurationException(e.getMessage() + "\nFatal configuration error; unable to start server.  See log for stacktrace.", false);
          }
          if (seedProvider.getSeeds().size() == 0)
--            throw new ConfigurationException("The seed provider lists no seeds.");
++            throw new ConfigurationException("The seed provider lists no seeds.", false);
 +
 +        if (conf.batch_size_fail_threshold_in_kb == null)
 +        {
 +            conf.batch_size_fail_threshold_in_kb = conf.batch_size_warn_threshold_in_kb * 10;
 +        }
      }
  
      private static IEndpointSnitch createEndpointSnitch(String snitchClassName) throws ConfigurationException
@@@ -652,7 -739,7 +653,7 @@@
          try
          {
              if (conf.data_file_directories.length == 0)
--                throw new ConfigurationException("At least one DataFileDirectory must be specified");
++                throw new ConfigurationException("At least one DataFileDirectory must be specified", false);
  
              for (String dataFileDirectory : conf.data_file_directories)
              {
@@@ -660,12 -747,12 +661,12 @@@
              }
  
              if (conf.commitlog_directory == null)
--                throw new ConfigurationException("commitlog_directory must be specified");
++                throw new ConfigurationException("commitlog_directory must be specified", false);
  
              FileUtils.createDirectory(conf.commitlog_directory);
  
              if (conf.saved_caches_directory == null)
--                throw new ConfigurationException("saved_caches_directory must be specified");
++                throw new ConfigurationException("saved_caches_directory must be specified", false);
  
              FileUtils.createDirectory(conf.saved_caches_directory);
          }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/dd959f0f/src/java/org/apache/cassandra/exceptions/ConfigurationException.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/exceptions/ConfigurationException.java
index 8f0bb1a,8f0bb1a..f28fa51
--- a/src/java/org/apache/cassandra/exceptions/ConfigurationException.java
+++ b/src/java/org/apache/cassandra/exceptions/ConfigurationException.java
@@@ -19,18 -19,18 +19,34 @@@ package org.apache.cassandra.exceptions
  
  public class ConfigurationException extends RequestValidationException
  {
++    /*
++     * If the error is logged should a stack trace be included.
++     * For expected errors with an informative message no stack trace needs to be logged.
++     * This is just a suggestion to exception handlers as to how they should format the exception.
++     */
++    public final boolean logStackTrace;
++
      public ConfigurationException(String msg)
      {
          super(ExceptionCode.CONFIG_ERROR, msg);
++        logStackTrace = true;
++    }
++
++    public ConfigurationException(String msg, boolean logStackTrace)
++    {
++        super(ExceptionCode.CONFIG_ERROR, msg);
++        this.logStackTrace = logStackTrace;
      }
  
      public ConfigurationException(String msg, Throwable e)
      {
          super(ExceptionCode.CONFIG_ERROR, msg, e);
++        logStackTrace = true;
      }
  
      protected ConfigurationException(ExceptionCode code, String msg)
      {
          super(code, msg);
++        logStackTrace = true;
      }
  }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/dd959f0f/src/java/org/apache/cassandra/service/CassandraDaemon.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/CassandraDaemon.java
index edc91ab,c2b7b7d..9a6c7d7
--- a/src/java/org/apache/cassandra/service/CassandraDaemon.java
+++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java
@@@ -28,16 -28,16 +28,19 @@@ import java.util.Date
  import java.util.Map;
  import java.util.UUID;
  import java.util.concurrent.TimeUnit;
++
  import javax.management.MBeanServer;
  import javax.management.ObjectName;
  import javax.management.StandardMBean;
  
  import com.google.common.collect.Iterables;
  import com.google.common.util.concurrent.Uninterruptibles;
++
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import com.addthis.metrics.reporter.config.ReporterConfig;
++
  import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
  import org.apache.cassandra.concurrent.ScheduledExecutors;
  import org.apache.cassandra.concurrent.Stage;
@@@ -475,7 -461,7 +478,13 @@@ public class CassandraDaemo
                  logger.error("error registering MBean {}", MBEAN_NAME, e);
                  //Allow the server to start even if the bean can't be registered
              }
 -            
 +
++            try {
++                DatabaseDescriptor.forceStaticInitialization();
++            } catch (ExceptionInInitializerError e) {
++                throw e.getCause();
++            }
++
              setup();
  
              if (pidFile != null)
@@@ -493,12 -479,13 +502,27 @@@
          }
          catch (Throwable e)
          {
--            logger.error("Exception encountered during startup", e);
++            boolean logStackTrace =
++                    e instanceof ConfigurationException ? ((ConfigurationException)e).logStackTrace : true;
+ 
 -            // try to warn user on stdout too, if we haven't already detached
 -            e.printStackTrace();
 -            System.out.println("Exception encountered during startup: " + e.getMessage());
++            System.out.println("Exception (" + e.getClass().getName() + ") encountered during startup: " + e.getMessage());
  
-             // try to warn user on stdout too, if we haven't already detached
-             e.printStackTrace();
-             System.out.println("Exception encountered during startup: " + e.getMessage());
-             exitOrFail(3, "Exception encountered during startup", e);
 -            System.exit(3);
++            if (logStackTrace)
++            {
++                if (runManaged)
++                    logger.error("Exception encountered during startup", e);
++                // try to warn user on stdout too, if we haven't already detached
++                e.printStackTrace();
++                exitOrFail(3, "Exception encountered during startup", e);
++            }
++            else
++            {
++                if (runManaged)
++                    logger.error("Exception encountered during startup: " + e.getMessage());
++                // try to warn user on stdout too, if we haven't already detached
++                System.err.println(e.getMessage());
++                exitOrFail(3, "Exception encountered during startup: " + e.getMessage());
++            }
          }
      }
  
@@@ -570,23 -553,7 +594,23 @@@
      {
          instance.activate();
      }
--    
++
 +    private void exitOrFail(int code, String message) {
 +        exitOrFail(code, message, null);
 +    }
 +
 +    private void exitOrFail(int code, String message, Throwable cause) {
 +            if(runManaged) {
 +                RuntimeException t = cause!=null ? new RuntimeException(message, cause) : new RuntimeException(message);
 +                throw t;
 +            }
 +            else {
 +                logger.error(message, cause);
 +                System.exit(code);
 +            }
 +
 +        }
 +
      static class NativeAccess implements NativeAccessMBean
      {
          public boolean isAvailable()