You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sa...@apache.org on 2016/05/10 14:07:51 UTC

[2/6] cassandra git commit: Allow service to startup if jmx remote port configured directly

Allow service to startup if jmx remote port configured directly

Patch by Sam Tunnicliffe; reviewed by Jake Luciani for CASSANDRA-11725


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

Branch: refs/heads/cassandra-3.7
Commit: c17cbe1875a974a00822ffbfad716abde363c8da
Parents: 31cab36
Author: Sam Tunnicliffe <sa...@beobal.com>
Authored: Mon May 9 19:23:33 2016 +0100
Committer: Sam Tunnicliffe <sa...@beobal.com>
Committed: Tue May 10 14:57:25 2016 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 NEWS.txt                                        |  2 ++
 .../cassandra/service/CassandraDaemon.java      | 13 ++++++++++++
 .../apache/cassandra/service/StartupChecks.java | 21 ++++++++++++++++++--
 .../apache/cassandra/utils/JMXServerUtils.java  | 20 +++----------------
 5 files changed, 38 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c17cbe18/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index b7715ba..1690e09 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.6
+ * Allow server startup if JMX is configured directly (CASSANDRA-11725)
  * Prevent direct memory OOM on buffer pool allocations (CASSANDRA-11710)
  * Enhanced Compaction Logging (CASSANDRA-10805)
  * Make prepared statement cache size configurable (CASSANDRA-11555)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c17cbe18/NEWS.txt
----------------------------------------------------------------------
diff --git a/NEWS.txt b/NEWS.txt
index 7a29924..ac33a60 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -25,6 +25,8 @@ New features
      connections are permitted. For more details on how to enable the new options, see the
      comments in cassandra-env.sh. A new class of IResource, JMXResource, is provided for
      the purposes of GRANT/REVOKE via CQL. See CASSANDRA-10091 for more details.
+     Also, directly setting JMX remote port via the com.sun.management.jmxremote.port system
+     property at startup is deprecated. See CASSANDRA-11725 for more details.
    - JSON timestamps are now in UTC and contain the timezone information, see CASSANDRA-11137 for more details.
    - Collision checks are performed when joining the token ring, regardless of whether
      the node should bootstrap. Additionally, replace_address can legitimately be used

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c17cbe18/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 2b797fe..2bf4931 100644
--- a/src/java/org/apache/cassandra/service/CassandraDaemon.java
+++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java
@@ -97,6 +97,19 @@ public class CassandraDaemon
 
     private void maybeInitJmx()
     {
+        // If the standard com.sun.management.jmxremote.port property has been set
+        // then the JVM agent will have already started up a default JMX connector
+        // server. This behaviour is deprecated, but some clients may be relying
+        // on it, so log a warning and skip setting up the server with the settings
+        // as configured in cassandra-env.(sh|ps1)
+        // See: CASSANDRA-11540 & CASSANDRA-11725
+        if (System.getProperty("com.sun.management.jmxremote.port") != null)
+        {
+            logger.warn("JMX settings in cassandra-env.sh have been bypassed as the JMX connector server is " +
+                        "already initialized. Please refer to cassandra-env.(sh|ps1) for JMX configuration info");
+            return;
+        }
+
         System.setProperty("java.rmi.server.randomIDs", "true");
 
         // If a remote port has been specified then use that to set up a JMX

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c17cbe18/src/java/org/apache/cassandra/service/StartupChecks.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StartupChecks.java b/src/java/org/apache/cassandra/service/StartupChecks.java
index d1c1943..d837921 100644
--- a/src/java/org/apache/cassandra/service/StartupChecks.java
+++ b/src/java/org/apache/cassandra/service/StartupChecks.java
@@ -32,12 +32,16 @@ import org.slf4j.LoggerFactory;
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.Schema;
-import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.StartupException;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.utils.*;
+import org.apache.cassandra.utils.CLibrary;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.SigarLibrary;
 
 /**
  * Verifies that the system and environment is in a fit state to be started.
@@ -71,6 +75,7 @@ public class StartupChecks
     private final List<StartupCheck> DEFAULT_TESTS = ImmutableList.of(checkJemalloc,
                                                                       checkValidLaunchDate,
                                                                       checkJMXPorts,
+                                                                      checkJMXProperties,
                                                                       inspectJvmOptions,
                                                                       checkJnaInitialization,
                                                                       initSigarLibrary,
@@ -160,6 +165,18 @@ public class StartupChecks
         }
     };
 
+    public static final StartupCheck checkJMXProperties = new StartupCheck()
+    {
+        public void execute()
+        {
+            if (System.getProperty("com.sun.management.jmxremote.port") != null)
+            {
+                logger.warn("Use of com.sun.management.jmxremote.port at startup is deprecated. " +
+                            "Please use cassandra.jmx.remote.port instead.");
+            }
+        }
+    };
+
     public static final StartupCheck inspectJvmOptions = new StartupCheck()
     {
         public void execute()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c17cbe18/src/java/org/apache/cassandra/utils/JMXServerUtils.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/JMXServerUtils.java b/src/java/org/apache/cassandra/utils/JMXServerUtils.java
index b0e44a2..ad87efd 100644
--- a/src/java/org/apache/cassandra/utils/JMXServerUtils.java
+++ b/src/java/org/apache/cassandra/utils/JMXServerUtils.java
@@ -66,31 +66,17 @@ public class JMXServerUtils
         Map<String, Object> env = new HashMap<>();
 
         String urlTemplate = "service:jmx:rmi://%1$s/jndi/rmi://%1$s:%2$d/jmxrmi";
-        String url;
-        String host;
-        InetAddress serverAddress;
+        InetAddress serverAddress = null;
         if (local)
         {
             serverAddress = InetAddress.getLoopbackAddress();
-            host = serverAddress.getHostAddress();
-            System.setProperty("java.rmi.server.hostname", host);
-        }
-        else
-        {
-            // if the java.rmi.server.hostname property is set, we'll take its value
-            // and use that when creating the RMIServerSocket to which we bind the RMI
-            // registry. This allows us to effectively restrict to a single interface
-            // if required. See http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4880793
-            // for more detail. If the hostname property is not set, the registry will
-            // be bound to the wildcard address
-            host = System.getProperty("java.rmi.server.hostname");
-            serverAddress = host == null ? null : InetAddress.getByName(host);
+            System.setProperty("java.rmi.server.hostname", serverAddress.getHostAddress());
         }
 
         // Configure the RMI client & server socket factories, including SSL config.
         env.putAll(configureJmxSocketFactories(serverAddress));
 
-        url = String.format(urlTemplate, (host == null ? "0.0.0.0" : serverAddress.getHostAddress()), port);
+        String url = String.format(urlTemplate, (serverAddress != null ? serverAddress.getHostAddress() : "0.0.0.0"), port);
         LocateRegistry.createRegistry(port,
                                      (RMIClientSocketFactory) env.get(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE),
                                      (RMIServerSocketFactory) env.get(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE));