modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java
| 2
modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
| 18
modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/rhq.cassandra.yaml
| 2
modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
| 4
modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraNode.java
| 65 ++
modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
| 221 ++++------
modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/DeploymentOptions.java
| 20
modules/common/cassandra-ccm/cassandra-ccm-core/src/main/resources/cassandra.properties
| 11
modules/common/cassandra-ccm/cassandra-ccm-core/src/test/resources/expected.cassandra.yaml
| 2
modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
| 14
modules/common/cassandra-installer/pom.xml
| 13
modules/common/cassandra-installer/src/main/java/org/rhq/cassandra/installer/RMIContextFactory.java
| 51 --
modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
| 5
modules/common/cassandra-installer/src/main/resources/module/main/module.xml
| 3
modules/common/cassandra-jmx/pom.xml
| 28 +
modules/common/cassandra-jmx/src/main/java/org/rhq/cassandra/installer/RMIContextFactory.java
| 51 ++
modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cassandra/CassandraClusterHeartBeatJob.java
| 5
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/migrator/DataMigratorRunner.java
| 2
modules/helpers/metrics-simulator/src/main/java/org/rhq/metrics/simulator/Simulator.java
| 2
modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java
| 9
21 files changed, 310 insertions(+), 220 deletions(-)
New commits:
commit c9098345e8250829f3141a4c54d53660e0be538c
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Mon May 6 15:14:54 2013 +0200
Turning off the Thrift-based rpc by default.
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/rhq.cassandra.yaml
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/rhq.cassandra.yaml
index 23218ca..553bee7 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/rhq.cassandra.yaml
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/bundle/cassandra/conf/rhq.cassandra.yaml
@@ -339,7 +339,7 @@ native_transport_max_threads:
${rhq.cassandra.native_transport_max_threads}
# Whether to start the thrift rpc server.
-start_rpc: true
+start_rpc: false
# The address to bind the Thrift RPC service to -- clients connect
# here. Unlike ListenAddress above, you *can* specify 0.0.0.0 here if
# you want Thrift to listen on all interfaces.
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/DeploymentOptions.java
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/DeploymentOptions.java
index 1e7d1b8..e10d180 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/DeploymentOptions.java
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/DeploymentOptions.java
@@ -73,6 +73,7 @@ public class DeploymentOptions {
private String loggingLevel;
private Integer numTokens;
private Integer nativeTransportPort;
+ private Boolean startRpc;
private Integer rpcPort;
private Integer nativeTransportMaxThreads;
private String username;
@@ -152,6 +153,7 @@ public class DeploymentOptions {
setSavedCachesDir(loadProperty("rhq.cassandra.saved.caches.dir",
properties));
setLogFileName(loadProperty("rhq.cassandra.log.file", properties));
setListenAddress(loadProperty("rhq.cassandra.listen.address",
properties));
+ setStartRpc(Boolean.valueOf(loadProperty("rhq.cassandra.start_rpc",
properties)));
setRpcAddress(loadProperty("rhq.cassandra.rpc.address", properties));
setJmxPort(Integer.valueOf(loadProperty("rhq.cassandra.jmx.port",
properties)));
setStoragePort(Integer.valueOf(loadProperty("rhq.cassandra.storage.port",
properties)));
@@ -189,6 +191,7 @@ public class DeploymentOptions {
setLogFileName(other.logFileName);
setListenAddress(other.listenAddress);
setRpcAddress(other.rpcAddress);
+ setStartRpc(other.startRpc);
setRpcPort(other.rpcPort);
setJmxPort(other.jmxPort);
setStoragePort(other.storagePort);
@@ -350,6 +353,23 @@ public class DeploymentOptions {
nativeTransportPort = port;
}
}
+
+ /**
+ * @return true whether the Thrift-based RPC should be started
+ */
+ @DeploymentProperty(name = "rhq.cassandra.start_rpc")
+ public Boolean getStartRpc() {
+ return startRpc;
+ }
+
+ /**
+ * @param startRpc whether the Thrift-based RPC should be started
+ */
+ public void setStartRpc(Boolean startRpc) {
+ if (startRpc == null) {
+ this.startRpc = startRpc;
+ }
+ }
@DeploymentProperty(name = "rhq.cassandra.rpc_port")
public Integer getRpcPort() {
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/resources/cassandra.properties
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/resources/cassandra.properties
index e17520d..ce2be6c 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/resources/cassandra.properties
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/resources/cassandra.properties
@@ -38,18 +38,21 @@
rhq.cassandra.authorizer=org.apache.cassandra.auth.CassandraAuthorizer
# this node.
rhq.cassandra.listen.address=localhost
+# Set this property to true for starting the Thrift-based RPC
+rhq.cassandra.start_rpc=false
+
# The listen address for Thrift clients.
rhq.cassandra.rpc.address=localhost
+# The port to listen for Thrift clients on.
+rhq.cassandra.rpc-port=9160
+
# The maximum number of threads handling native CQL requests.
rhq.cassandra.native-transport-max-threads=64
# The port for the CQL native transport to listen for clients on.
rhq.cassandra.native-transport-port=9042
-# The port to listen for Thrift clients on.
-rhq.cassandra.rpc-port=9160
-
# The port over which Cassandra listens for JMX connections.
rhq.cassandra.jmx.port=7200
@@ -111,4 +114,4 @@ rhq.cassandra.cluster.dir=${rhq.rootDir}/cassandra
# The number of nodes in the cluster. This specifies how many nodes to install and
# configure. The top level or base directory for each node will be nodeN where N is the
# node number.
-rhq.cassandra.cluster.num-nodes=2
\ No newline at end of file
+rhq.cassandra.cluster.num-nodes=2
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/test/resources/expected.cassandra.yaml
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/test/resources/expected.cassandra.yaml
index d770d2a..7555c9c 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/test/resources/expected.cassandra.yaml
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/test/resources/expected.cassandra.yaml
@@ -339,7 +339,7 @@ native_transport_max_threads: 64
# Whether to start the thrift rpc server.
-start_rpc: true
+start_rpc: false
# The address to bind the Thrift RPC service to -- clients connect
# here. Unlike ListenAddress above, you *can* specify 0.0.0.0 here if
# you want Thrift to listen on all interfaces.
commit bee31937bdcf967f26135fbe653e59649f5eb1f5
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Mon May 6 15:13:30 2013 +0200
Replacing the Thrift code with JMX calls, this includes: refactoring of StorageNode;
cahnges to ClusterInitService; Thrift port was replaced with JMX port
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java
b/modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java
index a8db306..25bbc69 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java
+++
b/modules/common/cassandra-ccm/cassandra-ccm-arquillian/src/main/java/org/rhq/cassandra/ccm/arquillian/CCMSuiteDeploymentExtension.java
@@ -113,7 +113,7 @@ public class CCMSuiteDeploymentExtension implements LoadableExtension
{
ccm.startCluster(false);
ClusterInitService clusterInitService = new ClusterInitService();
- clusterInitService.waitForClusterToStart(nodes, nodes.size(), 1500, 20);
+ clusterInitService.waitForClusterToStart(nodes, nodes.size(), 1500, 20, 2);
SchemaManager schemaManager = new SchemaManager("cassandra",
"cassandra", nodes);
if (!schemaManager.schemaExists()) {
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
index 22a1cff..b33cc27 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraClusterManager.java
@@ -127,7 +127,7 @@ public class CassandraClusterManager {
deployer.applyConfigChanges();
deployer.updateFilePerms();
- nodes.add(new CassandraNode(address, nodeOptions.getRpcPort(),
+ nodes.add(new CassandraNode(address, deploymentOptions.getJmxPort() + i,
nodeOptions.getNativeTransportPort()));
installedNodeDirs.add(basedir);
} catch (Exception e) {
@@ -158,7 +158,7 @@ public class CassandraClusterManager {
private List<CassandraNode> calculateNodes() {
List<CassandraNode> nodes = new
ArrayList<CassandraNode>(deploymentOptions.getNumNodes());
for (int i = 0; i < deploymentOptions.getNumNodes(); ++i) {
- nodes.add(new CassandraNode(getLocalIPAddress(i + 1),
deploymentOptions.getRpcPort(),
+ nodes.add(new CassandraNode(getLocalIPAddress(i + 1),
deploymentOptions.getJmxPort() + i,
deploymentOptions.getNativeTransportPort()));
}
return nodes;
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraNode.java
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraNode.java
index 159433d..ca41db1 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraNode.java
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/CassandraNode.java
@@ -25,23 +25,36 @@
package org.rhq.cassandra;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransportException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import javax.naming.Context;
+
+import org.rhq.cassandra.installer.RMIContextFactory;
+
/**
* @author John Sanda
+ * @author Jirka Kremser
*/
public class CassandraNode {
private String hostName;
- private int thriftPort;
+ private int jmxPort;
private int nativeTransportPort;
+
+ private static final String JMX_CONNECTION_STRING =
"service:jmx:rmi:///jndi/rmi://%s:%s/jmxrmi";
- public CassandraNode(String hostName, int thriftPort, int nativeTransportPort) {
+ public CassandraNode(String hostName, int jmxPort, int nativeTransportPort) {
this.hostName = hostName;
- this.thriftPort = thriftPort;
+ this.jmxPort = jmxPort;
this.nativeTransportPort = nativeTransportPort;
}
@@ -49,23 +62,34 @@ public class CassandraNode {
return hostName;
}
- public int getThriftPort() {
- return thriftPort;
+ public int getJmxPort() {
+ return jmxPort;
}
public int getNativeTransportPort() {
return nativeTransportPort;
}
+
+ public boolean isNativeTransportRunning() throws Exception {
+ Boolean nativeTransportRunning = false;
+ String url = String.format(JMX_CONNECTION_STRING, getHostName(), getJmxPort());
+ JMXServiceURL serviceURL = new JMXServiceURL(url);
+ Map<String, String> env = new HashMap<String, String>();
+ // see
https://issues.jboss.org/browse/AS7-2138
+ env.put(Context.INITIAL_CONTEXT_FACTORY, RMIContextFactory.class.getName());
+ JMXConnector connector = null;
- public boolean isThrifPortOpen() {
- TSocket socket = new TSocket(this.hostName, this.thriftPort, 100);
try {
- socket.open();
- socket.close();
- return true;
- } catch (TTransportException e) {
- return false;
+ connector = JMXConnectorFactory.connect(serviceURL, env);
+ MBeanServerConnection serverConnection =
connector.getMBeanServerConnection();
+ ObjectName storageService = new
ObjectName("org.apache.cassandra.db:type=StorageService");
+ nativeTransportRunning = (Boolean)
serverConnection.getAttribute(storageService, "NativeTransportRunning");
+ } finally {
+ if (connector != null) {
+ connector.close();
+ }
}
+ return nativeTransportRunning;
}
@Override
@@ -75,7 +99,7 @@ public class CassandraNode {
CassandraNode that = (CassandraNode) o;
- if (thriftPort != that.thriftPort) return false;
+ if (jmxPort != that.jmxPort) return false;
if (nativeTransportPort != that.nativeTransportPort) return false;
if (!hostName.equals(that.hostName)) return false;
@@ -84,21 +108,24 @@ public class CassandraNode {
@Override
public int hashCode() {
- int result = hostName.hashCode();
- result = 41 * result + thriftPort + nativeTransportPort;
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((hostName == null) ? 0 : hostName.hashCode());
+ result = prime * result + jmxPort;
+ result = prime * result + nativeTransportPort;
return result;
}
@Override
public String toString() {
- return "CassandraNode[hostName: " + hostName + ", thriftPort:
" + thriftPort + ", nativeTransportPort: " +
+ return "CassandraNode[hostName: " + hostName + ", jmxPort: "
+ jmxPort + ", nativeTransportPort: " +
nativeTransportPort + "]";
}
public static CassandraNode parseNode(String s) {
String[] params = s.split("\\|");
if (params.length != 3) {
- throw new IllegalArgumentException("Expected string of the form,
hostname|thriftPort|nativeTransportPort");
+ throw new IllegalArgumentException("Expected string of the form,
hostname|jmxPort|nativeTransportPort");
}
return new CassandraNode(params[0], Integer.parseInt(params[1]),
Integer.parseInt(params[2]));
}
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
index 64dff7a..5851e58 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
@@ -29,7 +29,6 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
-import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.UUID;
@@ -43,16 +42,8 @@ import com.datastax.driver.core.Session;
import com.datastax.driver.core.SimpleAuthInfoProvider;
import com.datastax.driver.core.exceptions.NoHostAvailableException;
-import org.apache.cassandra.thrift.Cassandra;
-import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.thrift.TException;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.transport.TFramedTransport;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransportException;
/**
* This class provides operations to ensure a cluster is initialized and in a consistent
@@ -60,51 +51,56 @@ import org.apache.thrift.transport.TTransportException;
* sure that nodes have started up and are accepting client connections for example.
*
* @author John Sanda
+ * @author Jirka Kremser
*/
-public class ClusterInitService {
-
+public final class ClusterInitService {
+
private final Log log = LogFactory.getLog(ClusterInitService.class);
-
- /**
- * Attempts to establish a Thrift RPC connection to the hosts for the number
specified.
- * In other words, if there are four hosts and <code>numHosts</code> is
two, this
- * method will immediately return after making two successful connections.
- *
- * @param hosts The cluster nodes to which a connection should be made
- * @param numHosts The number of hosts to which a successful connection has to be
made
- * before returning.
- * @return true if connections are made to the number of specified hosts, false
- * otherwise.
- */
+
+ private Session initRhqSession(List<CassandraNode> hosts) {
+ return initSession(hosts, "rhq", "rhqadmin",
"rhqadmin");
+ }
+
+ private Session initSession(List<CassandraNode> hosts, String keySpace, String
username, String password) {
+ if (hosts == null) {
+ throw new IllegalArgumentException("No cassandra nodes were
provided.");
+ }
+ String[] addresses = new String[hosts.size()];
+ for (int i = 0; i < hosts.size(); i++) {
+ addresses[i] = hosts.get(i).getHostName();
+ }
+ Cluster cluster = Cluster.builder().addContactPoints(addresses).withoutMetrics()
+ .withAuthInfoProvider(new SimpleAuthInfoProvider().add("username",
username).add("password", password))
+ .build();
+ Session session = cluster.connect(keySpace);
+ return session;
+ }
+
public boolean ping(List<CassandraNode> hosts, int numHosts) {
- long sleep = 100;
- int timeout = 50;
int connections = 0;
+ long sleep = 100;
for (CassandraNode host : hosts) {
- TSocket socket = new TSocket(host.getHostName(), host.getThriftPort(),
timeout);
try {
- socket.open();
- if (log.isDebugEnabled()) {
- log.debug("Successfully connected to cassandra node [" +
host + "]");
+ boolean isNativeTransportRunning = host.isNativeTransportRunning();
+ if (isNativeTransportRunning) {
+ ++connections;
}
- ++connections;
- socket.close();
if (connections == numHosts) {
return true;
}
- } catch (TTransportException e) {
+ } catch (Exception e) {
if (log.isDebugEnabled()) {
- log.debug("Unable to open thrift connection to cassandra node
[" + host + "]");
+ log.debug("Unable to open JMX connection to cassandra node
[" + host + "]", e);
}
+ return false;
}
try {
Thread.sleep(sleep);
- } catch (InterruptedException e) {
+ } catch (InterruptedException ex) {
}
}
-
- return false;
+ return true;
}
/**
@@ -141,9 +137,10 @@ public class ClusterInitService {
* thrown when the number of failed connections exceeds this value.
*/
public void waitForClusterToStart(List<CassandraNode> hosts, int numHosts, int
retries) {
- waitForClusterToStart(hosts, numHosts, 250, retries);
+ waitForClusterToStart(hosts, numHosts, 250, retries, 1);
}
-
+
+
/**
* This method attempts to establish a Thrift RPC connection to each host for the
* number specified. In other words, if there are four hosts and
<code>numHosts</code>
@@ -163,9 +160,19 @@ public class ClusterInitService {
* @param delay The amount of time wait between attempts to make a connection
* @param retries The number of times to retry connecting. A runtime exception will
be
* thrown when the number of failed connections exceeds this value.
+ * @param initialWait The amount of seconds before first try.
*/
- public void waitForClusterToStart(List<CassandraNode> hosts, int numHosts, long
delay, int retries) {
- int timeout = 50;
+ public void waitForClusterToStart(List<CassandraNode> hosts, int numHosts, long
delay, int retries, int initialWait) {
+ if (initialWait > 0) {
+ try {
+ if (log.isDebugEnabled()) {
+ log.debug("Waiting before JMX calls to the storage nodes for
" + initialWait + " seconds...");
+ }
+ Thread.sleep(initialWait * 1000);
+ } catch (InterruptedException e) {
+ }
+ }
+
int connections = 0;
int failedConnections = 0;
Queue<CassandraNode> queue = new LinkedList<CassandraNode>(hosts);
@@ -173,30 +180,36 @@ public class ClusterInitService {
while (host != null) {
if (failedConnections >= retries) {
- throw new RuntimeException("Unable to verify that cluster nodes have
started after " +
- failedConnections + " failed attempts");
+ throw new RuntimeException("Unable to verify that cluster nodes have
started after "
+ + failedConnections + " failed attempts");
}
- TSocket socket = new TSocket(host.getHostName(), host.getThriftPort(),
timeout);
try {
- socket.open();
- if (log.isDebugEnabled()) {
+ boolean isNativeTransportRunning = host.isNativeTransportRunning();
+ if (log.isDebugEnabled() && isNativeTransportRunning) {
log.debug("Successfully connected to cassandra node [" +
host + "]");
}
- ++connections;
- socket.close();
+ if (isNativeTransportRunning) {
+ ++connections;
+ }
if (connections == numHosts) {
+ if (log.isDebugEnabled()) {
+ log.debug("Successdully connected to all nodes. Sleeping for
10 seconds to allow for the "
+ + "cassandra superuser set up to complete.");
+ }
try {
- log.debug("Successdully connected to all nodes. Sleeping for
10 seconds to allow for the " +
- "cassandra superuser set up to complete.");
Thread.sleep(10000);
} catch (InterruptedException e) {
}
return;
}
- } catch (TTransportException e) {
+ } catch (Exception e) {
++failedConnections;
queue.offer(host);
- log.debug("Unable to open thrift connection to cassandra node
[" + host + "]");
+ if (log.isDebugEnabled()) {
+ log.debug("Unable to open JMX connection to cassandra node
[" + host + "].", e);
+ } else if (log.isInfoEnabled()) {
+ log.debug("Unable to open connection to cassandra node.");
+ }
}
try {
Thread.sleep(delay);
@@ -256,29 +269,7 @@ public class ClusterInitService {
}
}
}
- }
- client.closeConnection();
-
- if (log.isInfoEnabled()) {
- log.info("Schema agreement has been reached at version [" +
schemaVersion + "]");
- }
- }
-
- private CassandraClient createClient(CassandraNode node) {
- TSocket socket = new TSocket(node.getHostName(), node.getThriftPort());
- TFramedTransport transport = new TFramedTransport(socket);
- TProtocol protocol = new TBinaryProtocol(transport);
-
- return new CassandraClient(socket, protocol, node);
- }
- private void logException(String msg, Exception e) {
- if (log.isDebugEnabled()) {
- log.debug(msg, e);
- } else if (log.isInfoEnabled()) {
- log.info(msg + ": " + e.getMessage());
- } else {
- log.warn(msg);
}
}
@@ -299,4 +290,4 @@ public class ClusterInitService {
}
}
-}
+}
\ No newline at end of file
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
b/modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
index 820ed63..684c2d5 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
+++
b/modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
@@ -99,15 +99,19 @@ public class CCMTestNGListener implements IInvokedMethodListener {
if (System.getProperty("rhq.cassandra.cluster.skip-shutdown") == null)
{
for (CassandraNode node : nodes) {
- if (node.isThrifPortOpen()) {
- throw new RuntimeException("A cluster is already running on the
same ports.");
+ try {
+ if (node.isNativeTransportRunning()) {
+ throw new RuntimeException("A cluster is already running on
the same ports.");
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Unable to check whether node is
running.", e);
}
}
}
ccm.startCluster(false);
- ClusterInitService clusterInitService = new ClusterInitService();
- clusterInitService.waitForClusterToStart(nodes, nodes.size(), 3000, 20);
+ ClusterInitService clusterInitService = new ClusterInitService ();
+ clusterInitService.waitForClusterToStart(nodes, nodes.size(), 1500, 20, 2);
SchemaManager schemaManager = new SchemaManager(annotation.username(),
annotation.password(), nodes);
if (!schemaManager.schemaExists()) {
diff --git
a/modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
b/modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
index 01852ab..45c85cb 100644
---
a/modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
+++
b/modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
@@ -380,7 +380,7 @@ public class StorageInstaller {
String[] hosts = seeds.split(",");
List<String> list = new ArrayList<String>(hosts.length);
for (String host : hosts) {
- list.add(host + "|" + rpcPort + "|" +
nativeTransportPort);
+ list.add(host + "|" + jmxPort + "|" +
nativeTransportPort);
}
return StringUtil.collectionToString(list);
}
diff --git a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml
b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml
index 9f160f7..e932ac7 100644
--- a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml
+++ b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml
@@ -679,7 +679,7 @@ rhq.cassandra.password=${rhq.cassandra.password}
# Each entry in the list consists of three fields that are pipe-delimited. The
# of an entry is as follows,
#
-# hostname|thriftPort|nativeTransportPort|
+# hostname|jmxPort|nativeTransportPort|
#
rhq.cassandra.seeds=
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cassandra/CassandraClusterHeartBeatJob.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cassandra/CassandraClusterHeartBeatJob.java
index 56450c0..e8a8c8d 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cassandra/CassandraClusterHeartBeatJob.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cassandra/CassandraClusterHeartBeatJob.java
@@ -25,7 +25,6 @@
package org.rhq.enterprise.server.cassandra;
-import static org.rhq.core.domain.cloud.Server.OperationMode;
import static org.rhq.core.domain.cloud.Server.OperationMode.MAINTENANCE;
import static org.rhq.core.domain.cloud.Server.OperationMode.NORMAL;
@@ -42,6 +41,7 @@ import org.quartz.JobExecutionException;
import org.rhq.cassandra.CassandraNode;
import org.rhq.cassandra.ClusterInitService;
import org.rhq.core.domain.cloud.Server;
+import org.rhq.core.domain.cloud.Server.OperationMode;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.cloud.TopologyManagerLocal;
import org.rhq.enterprise.server.cloud.instance.ServerManagerLocal;
@@ -71,7 +71,8 @@ public class CassandraClusterHeartBeatJob implements Job {
cassandraHosts.add(CassandraNode.parseNode(s));
}
- if (clusterInitService.ping(cassandraHosts, 1)) {
+ boolean pingable = clusterInitService.ping(cassandraHosts, 1);
+ if (pingable) {
if (rhqServer.getOperationMode() != NORMAL) {
changeServerMode(rhqServer, NORMAL);
}
diff --git
a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/migrator/DataMigratorRunner.java
b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/migrator/DataMigratorRunner.java
index db2732d..620145a 100644
---
a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/migrator/DataMigratorRunner.java
+++
b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/migrator/DataMigratorRunner.java
@@ -624,7 +624,7 @@ public class DataMigratorRunner {
/**
* Parse Cassandra host information submitted in the form:
- * host_addres,thrift_port,native_port|host_address_2,thrift_port,native_port
+ * host_addres,jmx_port,native_port|host_address_2,jmx_port,native_port
*
* @param stringValue
* @return
diff --git
a/modules/helpers/metrics-simulator/src/main/java/org/rhq/metrics/simulator/Simulator.java
b/modules/helpers/metrics-simulator/src/main/java/org/rhq/metrics/simulator/Simulator.java
index 4de9651..1cb5f31 100644
---
a/modules/helpers/metrics-simulator/src/main/java/org/rhq/metrics/simulator/Simulator.java
+++
b/modules/helpers/metrics-simulator/src/main/java/org/rhq/metrics/simulator/Simulator.java
@@ -210,7 +210,7 @@ public class Simulator implements ShutdownManager {
private void waitForClusterToInitialize(List<CassandraNode> nodes) {
log.info("Waiting for cluster to initialize");
ClusterInitService clusterInitService = new ClusterInitService();
- clusterInitService.waitForClusterToStart(nodes, nodes.size(), 3000, 20);
+ clusterInitService.waitForClusterToStart(nodes, nodes.size(), 1500, 20, 2);
}
private void createSchema(List<CassandraNode> nodes) {
diff --git
a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java
b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java
index 65baca8..7599303 100644
---
a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java
+++
b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java
@@ -59,12 +59,13 @@ public class StorageServiceComponent extends
ComplexConfigurationResourceCompone
AvailabilityType availability = UP;
- EmsAttribute thriftEnabledAttr =
emsBean.getAttribute("RPCServerRunning");
- Boolean thriftEnabled = (Boolean) thriftEnabledAttr.getValue();
+// EmsAttribute thriftEnabledAttr =
emsBean.getAttribute("RPCServerRunning");
+ EmsAttribute nativeTransportEnabledAttr =
emsBean.getAttribute("NativeTransportRunning");
+ Boolean nativeTransportEnabled = (Boolean)
nativeTransportEnabledAttr.getValue();
- if (!thriftEnabled) {
+ if (!nativeTransportEnabled) {
if (log.isWarnEnabled()) {
- log.warn("Thrift RPC server is disabled for " +
context.getResourceKey());
+ log.warn("Native transport is disabled for " +
context.getResourceKey());
}
availability = DOWN;
}
commit 1ac92641965e36a3683e8a7a23e02ccb914651df
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Mon May 6 15:03:29 2013 +0200
Adding the dependency to cassandra-driver-core and rewriting the
ClusterInitService.waitForSchemaAgreement() using the CQL.
diff --git a/modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
b/modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
index 98c9fa1..a83600f 100644
--- a/modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
+++ b/modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
@@ -47,7 +47,11 @@
</exclusion>
</exclusions>
</dependency>
-
+ <dependency>
+ <groupId>com.datastax.cassandra</groupId>
+ <artifactId>cassandra-driver-core</artifactId>
+ <version>${cassandra.driver.version}</version>
+ </dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
index e8ae7b1..64dff7a 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
+++
b/modules/common/cassandra-ccm/cassandra-ccm-core/src/main/java/org/rhq/cassandra/ClusterInitService.java
@@ -25,10 +25,23 @@
package org.rhq.cassandra;
+import java.util.Arrays;
+import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
+import java.util.Set;
+import java.util.UUID;
+
+import com.datastax.driver.core.BoundStatement;
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.SimpleAuthInfoProvider;
+import com.datastax.driver.core.exceptions.NoHostAvailableException;
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.InvalidRequestException;
@@ -192,30 +205,28 @@ public class ClusterInitService {
host = queue.poll();
}
}
-
+
/**
* Waits for the cluster to reach schema agreement. During cluster initialization
* before and while schema changes propagate throughout the cluster, there could be
* multiple schema versions found among nodes. Schema agreement is reached when
there
* is a single schema version and all nodes are on that version.
*
- * @param clusterName The cluster name used by underlying Hector APIs.
* @param hosts The cluster nodes
*/
- public void waitForSchemaAgreement(String clusterName, List<CassandraNode>
hosts) {
+ public void waitForSchemaAgreement(List<CassandraNode> hosts) {
+ if (hosts == null) return;
long sleep = 100L;
- CassandraClient client = createClient(hosts.get(0));
- client.openConnection();
boolean schemaInAgreement = false;
- String schemaVersion = null;
while (!schemaInAgreement) {
- Map<String, List<String>> schemaVersions = null;
+ Set<UUID> schemaVersions = new HashSet<UUID>();
try {
- schemaVersions = client.describe_schema_versions();
- } catch (InvalidRequestException e) {
- throw new RuntimeException("Unable to get schema versions from
" + hosts.get(0), e);
- } catch (TException e) {
+ for (CassandraNode host : hosts) {
+ UUID otherSchchemaVersion = getSchemaVersionForNode(host);
+ schemaVersions.add(otherSchchemaVersion);
+ }
+ } catch (NoHostAvailableException e) {
throw new RuntimeException("Unable to get schema versions from
" + hosts.get(0), e);
}
if (schemaVersions.size() > 1) {
@@ -224,25 +235,20 @@ public class ClusterInitService {
" schema versions");
}
if (log.isDebugEnabled()) {
- log.debug("Found the following schema versions: " +
schemaVersions.keySet());
+ log.debug("Found the following schema versions: " +
schemaVersions);
}
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
}
} else {
- schemaVersion = schemaVersions.keySet().iterator().next();
- List<String> hostAddresses = schemaVersions.get(schemaVersion);
- if (hostAddresses.size() == hosts.size()) {
+ UUID schemaVersion = schemaVersions.iterator().next();
+ if (schemaVersion != null) {
schemaInAgreement = true;
} else {
if (log.isInfoEnabled()) {
- log.info("Schema agreement has not been reached. Found one
schema version but only " +
- hostAddresses.size() + " of " + hosts.size() +
" nodes at version [" + schemaVersion + "]");
- }
- if (log.isDebugEnabled()) {
- log.debug("Found the following nodes at schema version
[" + schemaVersion + "]: " +
- hostAddresses);
+ log.info("Schema agreement has not been reached. Unable to
get the schema version from cassandra nodes ["
+ + hosts + "]");
}
try {
Thread.sleep(sleep);
@@ -275,27 +281,21 @@ public class ClusterInitService {
log.warn(msg);
}
}
-
- private static class CassandraClient extends Cassandra.Client {
- private TSocket socket;
- private CassandraNode node;
-
- public CassandraClient(TSocket socket, TProtocol protocol, CassandraNode node) {
- super(protocol);
- this.socket = socket;
- this.node = node;
- }
-
- public void openConnection() {
- try {
- socket.open();
- } catch (TTransportException e) {
- throw new RuntimeException("Could not open thrift connection to
" + node, e);
+
+ private UUID getSchemaVersionForNode(CassandraNode node) {
+ Session session = null;
+ try {
+ session = initRhqSession(Arrays.asList(node));
+ PreparedStatement statement = session.prepare("SELECT schema_version
from system.local");
+ BoundStatement boundStatement = statement.bind();
+ ResultSet rs = session.execute(boundStatement);
+ for (Row row : rs) {
+ return row.getUUID(0);
}
- }
-
- public void closeConnection() {
- socket.close();
+ return null;
+ } finally {
+ if (session != null)
+ session.getCluster().shutdown();
}
}
diff --git
a/modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
b/modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
index b966b60..820ed63 100644
---
a/modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
+++
b/modules/common/cassandra-ccm/cassandra-ccm-testng/src/main/java/org/rhq/cassandra/CCMTestNGListener.java
@@ -124,7 +124,7 @@ public class CCMTestNGListener implements IInvokedMethodListener {
// is no cluster name argument.
//
// jsanda
- clusterInitService.waitForSchemaAgreement("rhq", nodes);
+ clusterInitService.waitForSchemaAgreement(nodes);
}
}
commit ea1c1a1470146d78321a4fa355fe776b86298c40
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Mon May 6 14:54:22 2013 +0200
Moving the RMIContextFactory class to a separate maven module, because of the
dependency on com.sun.* package. When depending on this Maven module, adding the exclude
tag not to propagate the dependencies (on com.sun) transitively.
diff --git a/modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
b/modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
index 07163cd..98c9fa1 100644
--- a/modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
+++ b/modules/common/cassandra-ccm/cassandra-ccm-core/pom.xml
@@ -25,6 +25,18 @@
</dependency>
<dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>rhq-cassandra-jmx</artifactId>
+ <version>${project.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>com.sun</groupId>
+ <artifactId>rt</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.cassandra</groupId>
<artifactId>cassandra-thrift</artifactId>
<version>${cassandra.version}</version>
diff --git a/modules/common/cassandra-installer/pom.xml
b/modules/common/cassandra-installer/pom.xml
index 6563d2b..7919a29 100644
--- a/modules/common/cassandra-installer/pom.xml
+++ b/modules/common/cassandra-installer/pom.xml
@@ -40,14 +40,6 @@
<artifactId>commons-io</artifactId>
<version>2.1</version>
</dependency>
-
- <dependency>
- <groupId>com.sun</groupId>
- <artifactId>rt</artifactId>
- <version>1.6.0</version>
- <scope>system</scope>
- <systemPath>${java.home}/lib/rt.jar</systemPath>
- </dependency>
</dependencies>
<build>
@@ -97,6 +89,11 @@
<artifactId>rhq-core-util</artifactId>
<version>${project.version}</version>
</artifactItem>
+ <artifactItem>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>rhq-cassandra-jmx</artifactId>
+ <version>${project.version}</version>
+ </artifactItem>
</artifactItems>
</configuration>
</execution>
diff --git
a/modules/common/cassandra-installer/src/main/java/org/rhq/cassandra/installer/RMIContextFactory.java
b/modules/common/cassandra-installer/src/main/java/org/rhq/cassandra/installer/RMIContextFactory.java
deleted file mode 100644
index 34c456d..0000000
---
a/modules/common/cassandra-installer/src/main/java/org/rhq/cassandra/installer/RMIContextFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *
- * * RHQ Management Platform
- * * Copyright (C) 2005-2012 Red Hat, Inc.
- * * All rights reserved.
- * *
- * * This program is free software; you can redistribute it and/or modify
- * * it under the terms of the GNU General Public License, version 2, as
- * * published by the Free Software Foundation, and/or the GNU Lesser
- * * General Public License, version 2.1, also as published by the Free
- * * Software Foundation.
- * *
- * * This program is distributed in the hope that it will be useful,
- * * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * * GNU General Public License and the GNU Lesser General Public License
- * * for more details.
- * *
- * * You should have received a copy of the GNU General Public License
- * * and the GNU Lesser General Public License along with this program;
- * * if not, write to the Free Software Foundation, Inc.,
- * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-package org.rhq.cassandra.installer;
-
-import java.util.Hashtable;
-
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.naming.spi.InitialContextFactory;
-
-import com.sun.jndi.url.rmi.rmiURLContext;
-
-/**
- * This class is provided as part of a work around for <a
href="https://issues.jboss.org/browse/AS7-2138">AS7-2138<...;.
- *
- * @author John Sanda
- */
-public class RMIContextFactory implements InitialContextFactory {
-
- /* (non-Javadoc)
- * @see
javax.naming.spi.InitialContextFactory#getInitialContext(java.util.Hashtable)
- */
- @Override
- public Context getInitialContext(Hashtable environment) throws NamingException {
- return new rmiURLContext(environment);
- }
-
-}
diff --git
a/modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
b/modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
index adf3670..01852ab 100644
---
a/modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
+++
b/modules/common/cassandra-installer/src/main/java/org/rhq/storage/installer/StorageInstaller.java
@@ -40,6 +40,7 @@ import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
+import javax.naming.Context;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
@@ -508,7 +509,7 @@ public class StorageInstaller {
}
Map<String, String> env = new HashMap<String, String>();
- env.put("java.naming.factory.initial",
RMIContextFactory.class.getName());
+ env.put(Context.INITIAL_CONTEXT_FACTORY, RMIContextFactory.class.getName());
for (int i = 0; i < retries; ++i) {
try {
diff --git a/modules/common/cassandra-installer/src/main/resources/module/main/module.xml
b/modules/common/cassandra-installer/src/main/resources/module/main/module.xml
index a2308b2..ce4e4f8 100644
--- a/modules/common/cassandra-installer/src/main/resources/module/main/module.xml
+++ b/modules/common/cassandra-installer/src/main/resources/module/main/module.xml
@@ -7,6 +7,7 @@
<resource-root path="${project.build.finalName}.jar"/>
<resource-root
path="rhq-cassandra-ccm-core-${project.version}.jar"/>
<resource-root path="rhq-core-util-${project.version}.jar"/>
+ <resource-root path="rhq-cassandra-jmx-${project.version}.jar"/>
</resources>
<dependencies>
@@ -20,4 +21,4 @@
<module name="org.jboss.logmanager" services="import"/>
<module name="org.jboss.logging"/>
</dependencies>
-</module>
\ No newline at end of file
+</module>
diff --git a/modules/common/cassandra-jmx/pom.xml b/modules/common/cassandra-jmx/pom.xml
new file mode 100644
index 0000000..26fb831
--- /dev/null
+++ b/modules/common/cassandra-jmx/pom.xml
@@ -0,0 +1,28 @@
+<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.rhq</groupId>
+ <artifactId>rhq-common-parent</artifactId>
+ <version>4.7.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>rhq-cassandra-jmx</artifactId>
+ <name>RHQ Cassandra JMX Utility</name>
+
+ <properties>
+ <moduleName>org.rhq.${project.artifactId}</moduleName>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>com.sun</groupId>
+ <artifactId>rt</artifactId>
+ <version>1.6.0</version>
+ <scope>system</scope>
+ <systemPath>${java.home}/lib/rt.jar</systemPath>
+ </dependency>
+ </dependencies>
+</project>
diff --git
a/modules/common/cassandra-jmx/src/main/java/org/rhq/cassandra/installer/RMIContextFactory.java
b/modules/common/cassandra-jmx/src/main/java/org/rhq/cassandra/installer/RMIContextFactory.java
new file mode 100644
index 0000000..34c456d
--- /dev/null
+++
b/modules/common/cassandra-jmx/src/main/java/org/rhq/cassandra/installer/RMIContextFactory.java
@@ -0,0 +1,51 @@
+/*
+ *
+ * * RHQ Management Platform
+ * * Copyright (C) 2005-2012 Red Hat, Inc.
+ * * All rights reserved.
+ * *
+ * * This program is free software; you can redistribute it and/or modify
+ * * it under the terms of the GNU General Public License, version 2, as
+ * * published by the Free Software Foundation, and/or the GNU Lesser
+ * * General Public License, version 2.1, also as published by the Free
+ * * Software Foundation.
+ * *
+ * * This program is distributed in the hope that it will be useful,
+ * * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * * GNU General Public License and the GNU Lesser General Public License
+ * * for more details.
+ * *
+ * * You should have received a copy of the GNU General Public License
+ * * and the GNU Lesser General Public License along with this program;
+ * * if not, write to the Free Software Foundation, Inc.,
+ * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+package org.rhq.cassandra.installer;
+
+import java.util.Hashtable;
+
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
+
+import com.sun.jndi.url.rmi.rmiURLContext;
+
+/**
+ * This class is provided as part of a work around for <a
href="https://issues.jboss.org/browse/AS7-2138">AS7-2138<...;.
+ *
+ * @author John Sanda
+ */
+public class RMIContextFactory implements InitialContextFactory {
+
+ /* (non-Javadoc)
+ * @see
javax.naming.spi.InitialContextFactory#getInitialContext(java.util.Hashtable)
+ */
+ @Override
+ public Context getInitialContext(Hashtable environment) throws NamingException {
+ return new rmiURLContext(environment);
+ }
+
+}