modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/JBossASClient.java
| 7
modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/MCCHelper.java
| 16 +
modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/SecurityDomainJBossASClient.java
| 1
modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java
| 81 ++++------
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServer.java
| 14 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
| 32 +--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/service/ManagementService.java
| 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemInfoManagerBean.java
| 8
modules/enterprise/server/server-control/src/main/java/org/rhq/server/control/command/AbstractInstall.java
| 10 -
9 files changed, 91 insertions(+), 80 deletions(-)
New commits:
commit 6123befdd990458fb1564204c0ba0721c7d3b1ad
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Thu Oct 31 18:32:17 2013 +0100
[BZ 1018233] - Fix leaks of model controller client instances
This should prevent a deadlock in the java finalizer thread that
seems to be caused by an attempt to close the leaked clients
in a constrained environment where the server is (close to) unable
create new threads.
(cherry picked from commit 3e5d0121a5b383762315b6acd9557c3fd70e0106)
diff --git
a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/JBossASClient.java
b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/JBossASClient.java
index cab198c..b2b7f05 100644
---
a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/JBossASClient.java
+++
b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/JBossASClient.java
@@ -61,6 +61,13 @@ public class JBossASClient {
private ModelControllerClient client;
+ /**
+ * Constructs a new JBoss AS Client that talks to the model through the provided
client.
+ * <p/>
+ * Note that the caller is responsible to correctly close the client instance!!!
+ *
+ * @param client the client to use
+ */
public JBossASClient(ModelControllerClient client) {
this.client = client;
}
diff --git
a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/MCCHelper.java
b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/MCCHelper.java
index e5fbb27..b527d07 100644
---
a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/MCCHelper.java
+++
b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/MCCHelper.java
@@ -32,11 +32,11 @@ public class MCCHelper {
private static final int RHQ_JBOSS_MANAGEMENT_PORT_PROPERTY_DEFAULT_VALUE = 6999;
- public static ModelControllerClient getModelControllerClient() {
- return getModelControllerClient("localhost", getPort());
+ public static ModelControllerClient createModelControllerClient() {
+ return createModelControllerClient("localhost", getPort());
}
- public static ModelControllerClient getModelControllerClient(String host, int port)
{
+ public static ModelControllerClient createModelControllerClient(String host, int
port) {
ModelControllerClient client;
try {
if (host==null || host.isEmpty())
@@ -52,6 +52,16 @@ public class MCCHelper {
return client;
}
+ public static void safeClose(ModelControllerClient mcc) {
+ if (mcc != null) {
+ try {
+ mcc.close();
+ } catch (Exception e) {
+ //ignore
+ }
+ }
+ }
+
private static int getPort() {
// The property may return "" so also use "" as the default
to ensure we set it to something useful
String result = System.getProperty(RHQ_JBOSS_MANAGEMENT_PORT_PROPERTY,
"");
diff --git
a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/SecurityDomainJBossASClient.java
b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/SecurityDomainJBossASClient.java
index 99e2f4d..630f0ee 100644
---
a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/SecurityDomainJBossASClient.java
+++
b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/SecurityDomainJBossASClient.java
@@ -270,6 +270,7 @@ public class SecurityDomainJBossASClient extends JBossASClient {
* @throws Exception if failed to create security domain
*/
public void createNewSecurityDomain(String securityDomainName, LoginModuleRequest...
loginModules) throws Exception {
+ //do not close the controller client here, we're using our own..
CoreJBossASClient coreClient = new
CoreJBossASClient(getModelControllerClient());
String serverVersion = coreClient.getAppServerVersion();
if (serverVersion.startsWith("7.2")) {
diff --git
a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java
b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java
index 8758246..7c1177a 100644
---
a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java
+++
b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java
@@ -49,6 +49,7 @@ import org.rhq.cassandra.schema.exception.SchemaNotInstalledException;
import org.rhq.common.jbossas.client.controller.CoreJBossASClient;
import org.rhq.common.jbossas.client.controller.DatasourceJBossASClient;
import org.rhq.common.jbossas.client.controller.DeploymentJBossASClient;
+import org.rhq.common.jbossas.client.controller.MCCHelper;
import org.rhq.common.jbossas.client.controller.WebJBossASClient;
import org.rhq.core.db.DatabaseTypeFactory;
import org.rhq.core.domain.cloud.StorageNode;
@@ -316,7 +317,7 @@ public class InstallerServiceImpl implements InstallerService {
// perform stuff that has to get done via the JBossAS management client
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
// ensure the server info is up to date and stored in the DB
ServerInstallUtil.setSocketBindings(mcc, serverProperties);
@@ -340,7 +341,7 @@ public class InstallerServiceImpl implements InstallerService {
// make sure all necessary web connectors are configured
ServerInstallUtil.setupWebConnectors(mcc, appServerConfigDir,
serverProperties);
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
// now create our deployment services
@@ -723,12 +724,12 @@ public class InstallerServiceImpl implements InstallerService {
public String getAppServerVersion() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
final CoreJBossASClient client = new CoreJBossASClient(mcc);
final String version = client.getAppServerVersion();
return version;
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
@@ -736,72 +737,72 @@ public class InstallerServiceImpl implements InstallerService {
public String getOperatingSystem() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
final CoreJBossASClient client = new CoreJBossASClient(mcc);
final String osName = client.getOperatingSystem();
return osName;
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
private String getAppServerHomeDir() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
final CoreJBossASClient client = new CoreJBossASClient(mcc);
final String dir = client.getAppServerHomeDir();
return dir;
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
private String getAppServerDataDir() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
final CoreJBossASClient client = new CoreJBossASClient(mcc);
final String dir = client.getAppServerDataDir();
return dir;
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
private String getAppServerConfigDir() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
final CoreJBossASClient client = new CoreJBossASClient(mcc);
final String dir = client.getAppServerConfigDir();
return dir;
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
private boolean isEarDeployed() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
final DeploymentJBossASClient client = new DeploymentJBossASClient(mcc);
boolean isDeployed = client.isDeployment(EAR_NAME);
return isDeployed;
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
private boolean isExtensionDeployed() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
final CoreJBossASClient client = new CoreJBossASClient(mcc);
boolean isDeployed = client.isExtension(RHQ_EXTENSION_NAME);
return isDeployed;
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
@@ -983,12 +984,18 @@ public class InstallerServiceImpl implements InstallerService {
// Not only do we want to make sure we can connect, but we also want to
wait for the subsystems to initialize.
// Let's wait for one of the subsystems to exist; once we know this
is up, the rest are probably ready too.
- if (!(new WebJBossASClient(getModelControllerClient()).isWebSubsystem()))
{
- throw new IllegalStateException(
- "The server does not appear to be fully started yet (the web
subsystem did not start)");
- }
+ ModelControllerClient mcc = null;
+ try {
+ mcc = createModelControllerClient();
+ if (!(new WebJBossASClient(mcc).isWebSubsystem())) {
+ throw new IllegalStateException(
+ "The server does not appear to be fully started yet (the
web subsystem did not start)");
+ }
- return retVal;
+ return retVal;
+ } finally {
+ MCCHelper.safeClose(mcc);
+ }
} catch (Exception e) {
error = e;
try {
@@ -1089,14 +1096,15 @@ public class InstallerServiceImpl implements InstallerService {
// make the cause the very first exception in case it was something other
than bad host/port as the problem
throw new Exception("Cannot obtain client connection to the RHQ app
server!!", e);
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
+ mcc = null;
}
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
- private ModelControllerClient getModelControllerClient() {
+ private ModelControllerClient createModelControllerClient() {
ModelControllerClient client;
try {
String host = this.installerConfiguration.getManagementHost();
@@ -1112,7 +1120,7 @@ public class InstallerServiceImpl implements InstallerService {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
// create the security domain needed by the datasources
ServerInstallUtil.createDatasourceSecurityDomain(mcc, serverProperties);
@@ -1145,14 +1153,14 @@ public class InstallerServiceImpl implements InstallerService {
log("deployServices failed", e);
throw new Exception("Failed to deploy services: " +
ThrowableUtil.getAllMessages(e));
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
private void deployAppExtension() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
CoreJBossASClient client = new CoreJBossASClient(mcc);
boolean isDeployed = client.isExtension(RHQ_EXTENSION_NAME);
if (!isDeployed) {
@@ -1162,14 +1170,14 @@ public class InstallerServiceImpl implements InstallerService {
log("RHQ EAR startup subsystem extension is already
deployed");
}
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
private void deployAppSubsystem() throws Exception {
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
CoreJBossASClient client = new CoreJBossASClient(mcc);
boolean isDeployed = client.isSubsystem(RHQ_SUBSYSTEM_NAME);
if (!isDeployed) {
@@ -1179,16 +1187,7 @@ public class InstallerServiceImpl implements InstallerService {
log("RHQ EAR subsystem is already deployed");
}
} finally {
- safeClose(mcc);
- }
- }
-
- private static void safeClose(final ModelControllerClient mcc) {
- if (null != mcc) {
- try {
- mcc.close();
- } catch (Exception e) {
- }
+ MCCHelper.safeClose(mcc);
}
}
@@ -1196,14 +1195,14 @@ public class InstallerServiceImpl implements InstallerService {
log("Will now ask the app server to reload its configuration");
ModelControllerClient mcc = null;
try {
- mcc = getModelControllerClient();
+ mcc = createModelControllerClient();
final CoreJBossASClient client = new CoreJBossASClient(mcc);
client.reload();
log("App server has been successfully asked to reload its
configuration");
} catch (Exception e) {
log("reloadConfiguration failed - restart the server to complete the
installation", e);
} finally {
- safeClose(mcc);
+ MCCHelper.safeClose(mcc);
}
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServer.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServer.java
index edeb264..2718103 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServer.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CoreServer.java
@@ -44,6 +44,7 @@ import org.apache.commons.logging.LogFactory;
import org.jboss.as.controller.client.ModelControllerClient;
import org.rhq.common.jbossas.client.controller.DeploymentJBossASClient;
+import org.rhq.common.jbossas.client.controller.MCCHelper;
import org.rhq.core.domain.common.ProductInfo;
import org.rhq.core.util.ObjectNameFactory;
import org.rhq.enterprise.server.RHQConstants;
@@ -89,14 +90,14 @@ public class CoreServer implements CoreServerMBean {
}
- private static ModelControllerClient getModelControllerClient() {
+ private static ModelControllerClient createModelControllerClient() {
if (System.getSecurityManager() == null) {
- return ManagementService.getClient();
+ return ManagementService.createClient();
} else {
return AccessController.doPrivileged(new
PrivilegedAction<ModelControllerClient>() {
@Override
public ModelControllerClient run() {
- return ManagementService.getClient();
+ return ManagementService.createClient();
}
});
}
@@ -179,7 +180,7 @@ public class CoreServer implements CoreServerMBean {
public File getEarDeploymentDir() {
//Getting model controller client requires privs our callers might not have, but
we want to provide this
//function even to them.
- ModelControllerClient mcc = SecurityActions.getModelControllerClient();
+ ModelControllerClient mcc = SecurityActions.createModelControllerClient();
try {
DeploymentJBossASClient client = new DeploymentJBossASClient(mcc);
@@ -188,10 +189,7 @@ public class CoreServer implements CoreServerMBean {
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
- try {
- mcc.close();
- } catch (IOException ignore) {
- }
+ MCCHelper.safeClose(mcc);
}
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
index 5025044..bcf053b 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/CustomJaasDeploymentService.java
@@ -44,6 +44,7 @@ import org.apache.commons.logging.LogFactory;
import org.jboss.as.controller.client.ModelControllerClient;
+import org.rhq.common.jbossas.client.controller.MCCHelper;
import org.rhq.common.jbossas.client.controller.SecurityDomainJBossASClient;
import
org.rhq.common.jbossas.client.controller.SecurityDomainJBossASClient.LoginModuleRequest;
import org.rhq.core.domain.common.composite.SystemSetting;
@@ -97,16 +98,20 @@ public class CustomJaasDeploymentService implements
CustomJaasDeploymentServiceM
if (isLdapAuthenticationEnabled) {
ModelControllerClient mcc = null;
- mcc = ManagementService.getClient();
- final SecurityDomainJBossASClient client = new
SecurityDomainJBossASClient(mcc);
+ try {
+ mcc = ManagementService.createClient();
+ final SecurityDomainJBossASClient client = new
SecurityDomainJBossASClient(mcc);
- boolean ldapModulesPresent =
client.securityDomainHasLoginModule(RHQ_USER_SECURITY_DOMAIN,
- "org.rhq.enterprise.server.core.jaas.LdapLoginModule");
+ boolean ldapModulesPresent =
client.securityDomainHasLoginModule(RHQ_USER_SECURITY_DOMAIN,
+
"org.rhq.enterprise.server.core.jaas.LdapLoginModule");
- if (!ldapModulesPresent) {
- LOG.info("Updating RHQ Server's JAAS login modules with LDAP
support");
- updateJaasModules(systemConfig);
+ if (!ldapModulesPresent) {
+ LOG.info("Updating RHQ Server's JAAS login modules with
LDAP support");
+ updateJaasModules(systemConfig);
+ }
+ } finally {
+ MCCHelper.safeClose(mcc);
}
}
} catch (Exception e) {
@@ -137,7 +142,7 @@ public class CustomJaasDeploymentService implements
CustomJaasDeploymentServiceM
ModelControllerClient mcc = null;
try {
- mcc = ManagementService.getClient();
+ mcc = ManagementService.createClient();
final SecurityDomainJBossASClient client = new
SecurityDomainJBossASClient(mcc);
if (client.isSecurityDomain(RHQ_USER_SECURITY_DOMAIN)) {
@@ -196,16 +201,7 @@ public class CustomJaasDeploymentService implements
CustomJaasDeploymentServiceM
} catch (Exception e) {
throw new Exception("Error registering RHQ JAAS modules", e);
} finally {
- safeClose(mcc);
- }
- }
-
- private static void safeClose(final ModelControllerClient mcc) {
- if (null != mcc) {
- try {
- mcc.close();
- } catch (Exception e) {
- }
+ MCCHelper.safeClose(mcc);
}
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/service/ManagementService.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/service/ManagementService.java
index f22cff0..6f59bcd 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/service/ManagementService.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/service/ManagementService.java
@@ -55,7 +55,7 @@ public class ManagementService implements ServiceActivator {
*
* @return the ModelControllerClient
*/
- public static ModelControllerClient getClient() {
+ public static ModelControllerClient createClient() {
return controller.createClient(executor);
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemInfoManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemInfoManagerBean.java
index 328647e..70a428f 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemInfoManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/system/SystemInfoManagerBean.java
@@ -9,6 +9,8 @@ import javax.ejb.Stateless;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.jboss.as.controller.client.ModelControllerClient;
+
import org.rhq.common.jbossas.client.controller.CoreJBossASClient;
import org.rhq.common.jbossas.client.controller.MCCHelper;
import org.rhq.core.domain.alert.Alert;
@@ -61,14 +63,18 @@ public class SystemInfoManagerBean implements
SystemInfoManagerLocal{
result.put("FullName", productInfo.getFullName());
result.put("Name", productInfo.getName());
+ ModelControllerClient mcc = null;
try {
- CoreJBossASClient coreClient = new
CoreJBossASClient(MCCHelper.getModelControllerClient());
+ mcc = MCCHelper.createModelControllerClient();
+ CoreJBossASClient coreClient = new CoreJBossASClient(mcc);
result.put("AS version",coreClient.getAppServerVersion());
result.put("AS product version",
coreClient.getServerProductVersion());
result.put("AS product name", coreClient.getServerProductName());
result.put("AS config dir", coreClient.getAppServerConfigDir());
} catch (Exception e) {
result.put("AS*", "Not able to get AS props due to " +
e.getMessage());
+ } finally {
+ MCCHelper.safeClose(mcc);
}
SystemSettings systemSettings=systemManager.getSystemSettings(caller);
diff --git
a/modules/enterprise/server/server-control/src/main/java/org/rhq/server/control/command/AbstractInstall.java
b/modules/enterprise/server/server-control/src/main/java/org/rhq/server/control/command/AbstractInstall.java
index 6561c22..7d74c96 100644
---
a/modules/enterprise/server/server-control/src/main/java/org/rhq/server/control/command/AbstractInstall.java
+++
b/modules/enterprise/server/server-control/src/main/java/org/rhq/server/control/command/AbstractInstall.java
@@ -209,7 +209,7 @@ public abstract class AbstractInstall extends ControlCommand {
String host = (String) props.get("jboss.bind.address.management");
int port = Integer.valueOf((String)
props.get("jboss.management.native.port")).intValue();
- mcc = MCCHelper.getModelControllerClient(host, port);
+ mcc = MCCHelper.createModelControllerClient(host, port);
DeploymentJBossASClient client = new DeploymentJBossASClient(mcc);
boolean isDeployed = client.isDeployment("rhq.ear");
return isDeployed;
@@ -230,13 +230,7 @@ public abstract class AbstractInstall extends ControlCommand {
return false;
} finally {
- if (null != mcc) {
- try {
- mcc.close();
- } catch (Exception e) {
- // best effort
- }
- }
+ MCCHelper.safeClose(mcc);
if (null != reader) {
try {
reader.close();