modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java
| 73 ++++------
modules/plugins/rhq-storage/pom.xml
| 30 ++--
modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java
| 27 ++-
3 files changed, 74 insertions(+), 56 deletions(-)
New commits:
commit f0ec56f27ca9b3871290d717232dd0fcec1b488c
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Thu Jul 25 12:16:39 2013 +0200
CassandraNodeComponent#startNode now starts C* with a short CLASSPATH to allow later
discovery on Linux
diff --git
a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java
b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java
index 70ba4b2..37aa425 100644
---
a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java
+++
b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java
@@ -47,6 +47,7 @@ import com.datastax.driver.core.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.SigarException;
import org.mc4j.ems.connection.EmsConnection;
import org.mc4j.ems.connection.bean.EmsBean;
@@ -67,7 +68,6 @@ import org.rhq.core.pluginapi.util.ProcessExecutionUtility;
import org.rhq.core.system.ProcessExecution;
import org.rhq.core.system.ProcessExecutionResults;
import org.rhq.core.system.ProcessInfo;
-import org.rhq.core.system.ProcessInfo.ProcessInfoSnapshot;
import org.rhq.core.system.SystemInfo;
import org.rhq.core.util.StringUtil;
import org.rhq.core.util.exception.ThrowableUtil;
@@ -186,16 +186,6 @@ public class CassandraNodeComponent extends
JMXServerComponent<ResourceComponent
}
}
- private ProcessInfoSnapshot getProcessInfoSnapshot() {
- ProcessInfoSnapshot processInfoSnapshot = (processInfo == null) ? null :
processInfo.freshSnapshot();
- if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) {
- processInfo = getResourceContext().getNativeProcess();
- // Safe to get prior snapshot here, we've just recreated the process info
instance
- processInfoSnapshot = (processInfo == null) ? null :
processInfo.priorSnaphot();
- }
- return processInfoSnapshot;
- }
-
@Override
public OperationResult invokeOperation(String name, Configuration parameters) throws
Exception {
if (name.equals("shutdown")) {
@@ -212,23 +202,6 @@ public class CassandraNodeComponent extends
JMXServerComponent<ResourceComponent
return null;
}
- private void waitForNodeToGoDown() throws InterruptedException {
- for (ProcessInfoSnapshot processInfoSnapshot = getProcessInfoSnapshot();;
processInfoSnapshot = getProcessInfoSnapshot()) {
- if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) {
- // Process not found, so it died, that's fine
- // OR
- // Process info says process is no longer running, that's fine as
well
- break;
- }
- if (getResourceContext().getComponentInvocationContext().isInterrupted()) {
- // Operation canceled or timed out
- throw new InterruptedException();
- }
- // Process is still running, wait a second and check again
- Thread.sleep(SECONDS.toMillis(1));
- }
- }
-
@SuppressWarnings("rawtypes")
protected OperationResult shutdownNode() {
ResourceContext<?> context = getResourceContext();
@@ -292,21 +265,19 @@ public class CassandraNodeComponent extends
JMXServerComponent<ResourceComponent
}
}
-
protected OperationResult startNode() {
- ResourceContext<?> context = getResourceContext();
- Configuration pluginConfig = context.getPluginConfiguration();
+ Configuration pluginConfig = getResourceContext().getPluginConfiguration();
String baseDir = pluginConfig.getSimpleValue("baseDir");
File binDir = new File(baseDir, "bin");
- File startScript = new File(binDir, getStartScript());
- File pidFile = new File(binDir, "cassandra.pid");
-
- ProcessExecution scriptExe =
ProcessExecutionUtility.createProcessExecution(startScript);
- scriptExe.addArguments(asList("-p", pidFile.getAbsolutePath()));
- SystemInfo systemInfo = context.getSystemInformation();
+ if (!startScriptExists(binDir)) {
+ OperationResult failure = new OperationResult("Failed to start Cassandra
daemon");
+ failure.setErrorMessage("Start script does not exists");
+ return failure;
+ }
+ ProcessExecution scriptExe = getProcessExecution(binDir);
+ SystemInfo systemInfo = getResourceContext().getSystemInformation();
ProcessExecutionResults results = systemInfo.executeProcess(scriptExe);
-
- if (results.getError() == null) {
+ if (results.getError() == null) {
return new OperationResult("Successfully started Cassandra
daemon");
} else {
OperationResult failure = new OperationResult("Failed to start Cassandra
daemon");
@@ -315,6 +286,30 @@ public class CassandraNodeComponent extends
JMXServerComponent<ResourceComponent
}
}
+ private boolean startScriptExists(File binDir) {
+ File file = new File(binDir, getStartScript());
+ return file.exists() && !file.isDirectory();
+ }
+
+ private ProcessExecution getProcessExecution(File binDir) {
+ ProcessExecution scriptExe;
+ if (OperatingSystem.getInstance().getName().equals(OperatingSystem.NAME_WIN32))
{
+ File startScript = new File(binDir, getStartScript());
+ scriptExe = ProcessExecutionUtility.createProcessExecution(startScript);
+ } else {
+ // On Linux, when Cassandra is started with an absolute path, the command
line is too long and is truncated
+ // in /proc/pid/cmdline (beacuse of a long CLASSPATH made of absolute paths)
+ // This prevents the process from being later discovered because the process
query argument criteria
+ // expects org.apache.cassandra.service.CassandraDaemon to be found
+ File startScript = new File("./" + getStartScript());
+ scriptExe = ProcessExecutionUtility.createProcessExecution(startScript);
+ scriptExe.setCheckExecutableExists(false);
+ }
+ scriptExe.setWorkingDirectory(binDir.getAbsolutePath());
+ scriptExe.addArguments(asList("-p", "cassandra.pid"));
+ return scriptExe;
+ }
+
protected OperationResult restartNode() {
OperationResult result = shutdownNode();
diff --git a/modules/plugins/rhq-storage/pom.xml b/modules/plugins/rhq-storage/pom.xml
index b1d50b8..ab97902 100644
--- a/modules/plugins/rhq-storage/pom.xml
+++ b/modules/plugins/rhq-storage/pom.xml
@@ -121,21 +121,27 @@
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.13</version>
+ <configuration>
+ <includes>
+ <include>**/*ITest.java</include>
+ </includes>
+ <argLine>-Djava.library.path=${pc.lib.dir}</argLine>
+ <systemPropertyVariables>
+ <pc.plugins.dir>${pc.plugins.dir}</pc.plugins.dir>
+ </systemPropertyVariables>
+ <properties>
+ <property>
+ <name>listener</name>
+ <value>org.rhq.test.testng.StdoutReporter</value>
+ </property>
+ </properties>
+ </configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
- <configuration>
- <includes>
- <include>**/*ITest.java</include>
- </includes>
- <argLine>-Djava.library.path=${pc.lib.dir}</argLine>
- <systemPropertyVariables>
- <pc.plugins.dir>${pc.plugins.dir}</pc.plugins.dir>
- </systemPropertyVariables>
- </configuration>
</execution>
<execution>
<id>verify</id>
@@ -155,6 +161,12 @@
<excludes>
<exclude>**/*ITest.java</exclude>
</excludes>
+ <properties>
+ <property>
+ <name>listener</name>
+ <value>org.rhq.test.testng.StdoutReporter</value>
+ </property>
+ </properties>
</configuration>
</plugin>
</plugins>
diff --git
a/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java
b/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java
index 5bc8b31..f0744a4 100644
---
a/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java
+++
b/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java
@@ -31,6 +31,7 @@ import java.util.Set;
import com.google.common.collect.Sets;
+import org.hyperic.sigar.OperatingSystem;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
@@ -113,14 +114,8 @@ public class StorageNodeComponentITest {
File binDir = new File(basedir, "bin");
SystemInfo systemInfo = SystemInfoFactory.createSystemInfo();
- File startScript = new File("./cassandra");
- ProcessExecution startScriptExe =
ProcessExecutionUtility.createProcessExecution(startScript);
- startScriptExe.setWorkingDirectory(binDir.getAbsolutePath());
- startScriptExe.setCheckExecutableExists(false);
-
- startScriptExe.addArguments(asList("-p", "cassandra.pid"));
- startScriptExe.setCaptureOutput(true);
- ProcessExecutionResults results = systemInfo.executeProcess(startScriptExe);
+ ProcessExecution processExecution = getProcessExecution(binDir);
+ ProcessExecutionResults results = systemInfo.executeProcess(processExecution);
assertEquals(results.getExitCode(), (Integer) 0, "Cassandra failed to start:
" + results.getCapturedOutput());
@@ -135,6 +130,22 @@ public class StorageNodeComponentITest {
schemaManager.updateTopology(true);
}
+ private ProcessExecution getProcessExecution(File binDir) {
+ ProcessExecution startScriptExe;
+ if (OperatingSystem.getInstance().getName().equals(OperatingSystem.NAME_WIN32))
{
+ File startScript = new File(binDir, "cassandra.bat");
+ startScriptExe =
ProcessExecutionUtility.createProcessExecution(startScript);
+ } else {
+ File startScript = new File("./cassandra");
+ startScriptExe =
ProcessExecutionUtility.createProcessExecution(startScript);
+ startScriptExe.setCheckExecutableExists(false);
+ }
+ startScriptExe.setWorkingDirectory(binDir.getAbsolutePath());
+ startScriptExe.addArguments(asList("-p", "cassandra.pid"));
+ startScriptExe.setCaptureOutput(true);
+ return startScriptExe;
+ }
+
private void initPluginContainer() {
PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
File pluginsDir = new File(System.getProperty("pc.plugins.dir"));