Repository: cassandra Updated Branches: refs/heads/cassandra-2.2 cccaa17e1 -> 83b9740a5
Call forceStaticInitialization first in activate and make sure offline tools properly handle DatabaseDescriptor static exceptions patch by carlyeks; reviewed by pauloricardomg for CASSANDRA-10412 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/83b9740a Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/83b9740a Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/83b9740a Branch: refs/heads/cassandra-2.2 Commit: 83b9740a5ec13142f5d4bd8fe46e86172533595c Parents: cccaa17 Author: Carl Yeksigian <[email protected]> Authored: Wed Oct 7 08:46:12 2015 -0400 Committer: Sylvain Lebresne <[email protected]> Committed: Mon Oct 12 14:45:58 2015 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/service/CassandraDaemon.java | 30 +++++----- .../cassandra/tools/SSTableExpiredBlockers.java | 4 +- .../apache/cassandra/tools/SSTableExport.java | 1 + .../apache/cassandra/tools/SSTableImport.java | 2 + .../cassandra/tools/SSTableLevelResetter.java | 2 + .../cassandra/tools/SSTableMetadataViewer.java | 2 + .../cassandra/tools/SSTableOfflineRelevel.java | 3 + .../tools/SSTableRepairedAtSetter.java | 2 + .../cassandra/tools/StandaloneScrubber.java | 2 + .../cassandra/tools/StandaloneSplitter.java | 2 + .../cassandra/tools/StandaloneUpgrader.java | 2 + .../cassandra/tools/StandaloneVerifier.java | 2 + src/java/org/apache/cassandra/tools/Util.java | 58 ++++++++++++++++++++ 14 files changed, 99 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 215bd76..efae4ab 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.2.3 + * Avoid NoClassDefFoundError during DataDescriptor initialization on windows (CASSANDRA-10412) * Preserve case of quoted Role & User names (CASSANDRA-10394) * cqlsh pg-style-strings broken (CASSANDRA-10484) * Make Hadoop CF splits more polite to custom orderered partitioners (CASSANDRA-10400) http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/service/CassandraDaemon.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index 075c8f7..2a23550 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -480,19 +480,20 @@ public class CassandraDaemon */ public void activate() { - String pidFile = System.getProperty("cassandra-pidfile"); - - if (FBUtilities.isWindows()) - { - // We need to adjust the system timer on windows from the default 15ms down to the minimum of 1ms as this - // impacts timer intervals, thread scheduling, driver interrupts, etc. - WindowsTimer.startTimerPeriod(DatabaseDescriptor.getWindowsTimerInterval()); - } - + // Do not put any references to DatabaseDescriptor above the forceStaticInitialization call. try { try { + DatabaseDescriptor.forceStaticInitialization(); + } + catch (ExceptionInInitializerError e) + { + throw e.getCause(); + } + + try + { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); mbs.registerMBean(new StandardMBean(new NativeAccess(), NativeAccessMBean.class), new ObjectName(MBEAN_NAME)); } @@ -502,14 +503,17 @@ public class CassandraDaemon //Allow the server to start even if the bean can't be registered } - try { - DatabaseDescriptor.forceStaticInitialization(); - } catch (ExceptionInInitializerError e) { - throw e.getCause(); + if (FBUtilities.isWindows()) + { + // We need to adjust the system timer on windows from the default 15ms down to the minimum of 1ms as this + // impacts timer intervals, thread scheduling, driver interrupts, etc. + WindowsTimer.startTimerPeriod(DatabaseDescriptor.getWindowsTimerInterval()); } setup(); + String pidFile = System.getProperty("cassandra-pidfile"); + if (pidFile != null) { new File(pidFile).deleteOnExit(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java b/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java index ab9305e..0d8c5e5 100644 --- a/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java +++ b/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java @@ -24,7 +24,6 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import com.google.common.base.Throwables; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -56,6 +55,9 @@ public class SSTableExpiredBlockers out.println("Usage: sstableexpiredblockers <keyspace> <table>"); System.exit(1); } + + Util.initDatabaseDescriptor(); + String keyspace = args[args.length - 2]; String columnfamily = args[args.length - 1]; Schema.instance.loadFromDisk(false); http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/SSTableExport.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableExport.java b/src/java/org/apache/cassandra/tools/SSTableExport.java index 9f833e7..46155c0 100644 --- a/src/java/org/apache/cassandra/tools/SSTableExport.java +++ b/src/java/org/apache/cassandra/tools/SSTableExport.java @@ -405,6 +405,7 @@ public class SSTableExport System.exit(1); } + Util.initDatabaseDescriptor(); String[] keys = cmd.getOptionValues(KEY_OPTION); String[] excludes = cmd.getOptionValues(EXCLUDEKEY_OPTION); http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/SSTableImport.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableImport.java b/src/java/org/apache/cassandra/tools/SSTableImport.java index b2d63aa..817dfef 100644 --- a/src/java/org/apache/cassandra/tools/SSTableImport.java +++ b/src/java/org/apache/cassandra/tools/SSTableImport.java @@ -511,6 +511,8 @@ public class SSTableImport isSorted = true; } + Util.initDatabaseDescriptor(); + Schema.instance.loadFromDisk(false); if (Schema.instance.getNonSystemKeyspaces().size() < 1) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java index d73a325..9f0af05 100644 --- a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java @@ -56,6 +56,8 @@ public class SSTableLevelResetter System.exit(1); } + Util.initDatabaseDescriptor(); + // TODO several daemon threads will run from here. // So we have to explicitly call System.exit. try http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java b/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java index 6330915..2665f40 100644 --- a/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java +++ b/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java @@ -43,6 +43,8 @@ public class SSTableMetadataViewer System.exit(1); } + Util.initDatabaseDescriptor(); + for (String fname : args) { if (new File(fname).exists()) http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java index f7e477f..71e4cfc 100644 --- a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java +++ b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java @@ -83,6 +83,9 @@ public class SSTableOfflineRelevel out.println("Usage: sstableofflinerelevel [--dry-run] <keyspace> <columnfamily>"); System.exit(1); } + + Util.initDatabaseDescriptor(); + boolean dryRun = args[0].equals("--dry-run"); String keyspace = args[args.length - 2]; String columnfamily = args[args.length - 1]; http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java index 2ddb632..ff362cc 100644 --- a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java +++ b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java @@ -63,6 +63,8 @@ public class SSTableRepairedAtSetter System.exit(1); } + Util.initDatabaseDescriptor(); + boolean setIsRepaired = args[1].equals("--is-repaired"); List<String> fileNames; http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java index cd87d8b..3551b3d 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java +++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java @@ -54,6 +54,8 @@ public class StandaloneScrubber public static void main(String args[]) { Options options = Options.parseArgs(args); + Util.initDatabaseDescriptor(); + try { // load keyspace descriptions. http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java index 4545ab6..95fed3c 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java +++ b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java @@ -52,6 +52,8 @@ public class StandaloneSplitter public static void main(String args[]) { Options options = Options.parseArgs(args); + Util.initDatabaseDescriptor(); + try { // load keyspace descriptions. http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java index c5dfba0..2c2a7e0 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java +++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java @@ -48,6 +48,8 @@ public class StandaloneUpgrader public static void main(String args[]) { Options options = Options.parseArgs(args); + Util.initDatabaseDescriptor(); + try { // load keyspace descriptions. http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java b/src/java/org/apache/cassandra/tools/StandaloneVerifier.java index f71f58d..fb7f218 100644 --- a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java +++ b/src/java/org/apache/cassandra/tools/StandaloneVerifier.java @@ -52,6 +52,8 @@ public class StandaloneVerifier public static void main(String args[]) { Options options = Options.parseArgs(args); + Util.initDatabaseDescriptor(); + try { // load keyspace descriptions. http://git-wip-us.apache.org/repos/asf/cassandra/blob/83b9740a/src/java/org/apache/cassandra/tools/Util.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/Util.java b/src/java/org/apache/cassandra/tools/Util.java new file mode 100644 index 0000000..6e23361 --- /dev/null +++ b/src/java/org/apache/cassandra/tools/Util.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.tools; + +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.exceptions.ConfigurationException; + +public final class Util +{ + private Util() + { + } + + /** + * This is used by standalone tools to force static initialization of DatabaseDescriptor, and fail if configuration + * is bad. + */ + public static void initDatabaseDescriptor() + { + try + { + DatabaseDescriptor.forceStaticInitialization(); + } + catch (ExceptionInInitializerError e) + { + Throwable cause = e.getCause(); + boolean logStackTrace = !(cause instanceof ConfigurationException) || ((ConfigurationException) cause).logStackTrace; + System.out.println("Exception (" + cause.getClass().getName() + ") encountered during startup: " + cause.getMessage()); + + if (logStackTrace) + { + cause.printStackTrace(); + System.exit(3); + } + else + { + System.err.println(cause.getMessage()); + System.exit(3); + } + } + } +}
