[ 
https://issues.apache.org/jira/browse/CASSANDRA-7597?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14073058#comment-14073058
 ] 

Lyuben Todorov commented on CASSANDRA-7597:
-------------------------------------------

Its better to fail-fast when a bad config is detected as it's hard to interpret 
what the config was supposed to be and attempt to fix it. My argument for -1 
here is that logging exceptions without erroring out preemptively will lead to 
further problems (further exception and a  stacktrace that might be misleading) 
and eventually a crash. 

I'll give an example just to be clear. A missing {{commitlog_sync}} option from 
cassandra.yaml would generate this error when trying to start the server:

{noformat}
ERROR 09:58:33 Fatal configuration error
org.apache.cassandra.exceptions.ConfigurationException: Missing required 
directive CommitLogSync
        at 
org.apache.cassandra.config.DatabaseDescriptor.applyConfig(DatabaseDescriptor.java:162)
 ~[main/:na]
        at 
org.apache.cassandra.config.DatabaseDescriptor.<clinit>(DatabaseDescriptor.java:128)
 ~[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:109) 
[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:454) 
[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:543) 
[main/:na]
Missing required directive CommitLogSync
Fatal configuration error; unable to start. See log for stacktrace.
{noformat}

I think that error is much clearer than what would happen if we just log the 
exception and allow cassandra to continue, the below is the final exception 
that is displayed:

{noformat}
ERROR 09:59:45 Exception encountered during startup
java.lang.NullPointerException: null
        at java.util.Arrays$ArrayList.<init>(Arrays.java:2842) ~[na:1.7.0_60]
        at java.util.Arrays.asList(Arrays.java:2828) ~[na:1.7.0_60]
        at 
org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:192) 
[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:454) 
[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:543) 
[main/:na]
java.lang.NullPointerException
        at java.util.Arrays$ArrayList.<init>(Arrays.java:2842)
        at java.util.Arrays.asList(Arrays.java:2828)
        at 
org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:192)
        at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:454)
        at 
org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:543)
Exception encountered during startup: null
{noformat}

Finally removing the {{System.exit(1|-1)}} and throwing exceptions instead 
generates a similar stacktrace to what we do now, except its not as clean:

{noformat}
ERROR 10:07:59 Fatal configuration error
org.apache.cassandra.exceptions.ConfigurationException: Missing required 
directive CommitLogSync
        at 
org.apache.cassandra.config.DatabaseDescriptor.applyConfig(DatabaseDescriptor.java:164)
 ~[main/:na]
        at 
org.apache.cassandra.config.DatabaseDescriptor.<clinit>(DatabaseDescriptor.java:128)
 ~[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:109) 
[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:454) 
[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:543) 
[main/:na]
ERROR 10:07:59 Exception encountered during startup
java.lang.ExceptionInInitializerError: null
        at 
org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:109) 
[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:454) 
[main/:na]
        at 
org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:543) 
[main/:na]
Caused by: java.lang.RuntimeException: 
org.apache.cassandra.exceptions.ConfigurationException: Missing required 
directive CommitLogSync
        at 
org.apache.cassandra.config.DatabaseDescriptor.<clinit>(DatabaseDescriptor.java:136)
 ~[main/:na]
        ... 3 common frames omitted
Caused by: org.apache.cassandra.exceptions.ConfigurationException: Missing 
required directive CommitLogSync
        at 
org.apache.cassandra.config.DatabaseDescriptor.applyConfig(DatabaseDescriptor.java:164)
 ~[main/:na]
        at 
org.apache.cassandra.config.DatabaseDescriptor.<clinit>(DatabaseDescriptor.java:128)
 ~[main/:na]
        ... 3 common frames omitted
java.lang.ExceptionInInitializerError
        at 
org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:109)
        at 
org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:454)
        at 
org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:543)
Caused by: java.lang.RuntimeException: 
org.apache.cassandra.exceptions.ConfigurationException: Missing required 
directive CommitLogSync
        at 
org.apache.cassandra.config.DatabaseDescriptor.<clinit>(DatabaseDescriptor.java:136)
        ... 3 more
Caused by: org.apache.cassandra.exceptions.ConfigurationException: Missing 
required directive CommitLogSync
        at 
org.apache.cassandra.config.DatabaseDescriptor.applyConfig(DatabaseDescriptor.java:164)
        at 
org.apache.cassandra.config.DatabaseDescriptor.<clinit>(DatabaseDescriptor.java:128)
        ... 3 more
Exception encountered during startup: null
{noformat}

> System.exit() calls should be removed from DatabaseDescriptor
> -------------------------------------------------------------
>
>                 Key: CASSANDRA-7597
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-7597
>             Project: Cassandra
>          Issue Type: Bug
>         Environment: Cassandra 2.0.9 (earlier version should be affected as 
> well)
>            Reporter: Pavel Sakun
>
> We're using SSTableSimpleUnsortedWriter API to generate SSTable to be loaded 
> into cassandra. In case of any issue with config DatabaseDescriptor calls 
> System.exit() which is apparently not the thing you expect while using API.
> Test case is simple:
> System.setProperty( "cassandra.config", "" );
> new YamlConfigurationLoader().loadConfig();
> Thread.sleep( 5000 );
> System.out.println("We're still alive"); // this will never be called



--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to