From 1e6df72e52ee8a643cb85730f0e512b0cd5d73c4 Mon Sep 17 00:00:00 2001 From: "Endi S. Dewata" Date: Tue, 16 Jun 2015 14:12:54 -0400 Subject: [PATCH] Fixed thread leaks during shutdown. Various codes have been modified to properly stop threads during shutdown. A new ID attribute has been added to the LDAP connection factory classes to help identify leaking threads. https://fedorahosted.org/pki/ticket/1327 --- .../server/ca/rest/CAInstallerService.java | 2 +- base/common/src/com/netscape/certsrv/apps/CMS.java | 12 +++++------ .../src/com/netscape/certsrv/apps/ICMSEngine.java | 6 +++--- .../certsrv/base/ISecurityDomainSessionTable.java | 2 ++ .../cms/authentication/DirBasedAuthentication.java | 2 +- .../netscape/cms/authentication/PortalEnroll.java | 2 +- .../authentication/UidPwdPinDirAuthentication.java | 2 +- .../netscape/cms/authorization/DirAclAuthz.java | 2 +- .../netscape/cms/listeners/PinRemovalListener.java | 2 +- .../cms/src/com/netscape/cms/logging/LogFile.java | 16 +++++++++------ .../com/netscape/cms/logging/RollingLogFile.java | 20 ++++++++++++------ .../constraints/AttributePresentConstraints.java | 2 +- .../cms/profile/def/nsNKeySubjectNameDefault.java | 2 +- .../def/nsTokenUserKeySubjectNameDefault.java | 2 +- .../publish/publishers/LdapCaCertPublisher.java | 2 +- .../cms/publish/publishers/LdapCrlPublisher.java | 2 +- .../publish/publishers/LdapUserCertPublisher.java | 2 +- .../cms/servlet/csadmin/ConfigurationUtils.java | 16 +++++++-------- .../servlet/csadmin/SecurityDomainProcessor.java | 2 +- .../cms/servlet/csadmin/UpdateDomainXML.java | 6 +++--- .../src/com/netscape/cmscore/apps/CMSEngine.java | 18 +++++++++++----- .../authentication/PasswdUserDBAuthentication.java | 5 +++-- .../cmscore/cert/CrossCertPairSubsystem.java | 2 +- .../src/com/netscape/cmscore/dbs/DBSubsystem.java | 2 +- .../com/netscape/cmscore/ldap/LdapConnModule.java | 2 +- .../netscape/cmscore/ldap/LdapPublishModule.java | 4 ++-- .../cmscore/ldapconn/LdapAnonConnFactory.java | 16 ++++++++++++--- .../cmscore/ldapconn/LdapBoundConnFactory.java | 18 +++++++++++++--- .../src/com/netscape/cmscore/logging/LogQueue.java | 9 ++++---- .../cmscore/profile/LDAPProfileSubsystem.java | 2 +- .../cmscore/selftests/SelfTestSubsystem.java | 2 ++ .../session/LDAPSecurityDomainSessionTable.java | 10 ++++++++- .../session/SecurityDomainSessionTable.java | 3 +++ .../com/netscape/cmscore/usrgrp/UGSubsystem.java | 2 +- .../src/com/netscape/cmscore/util/Debug.java | 24 ++++++---------------- .../netscape/cmscore/app/CMSEngineDefaultStub.java | 6 +++--- 36 files changed, 137 insertions(+), 92 deletions(-) diff --git a/base/ca/src/org/dogtagpki/server/ca/rest/CAInstallerService.java b/base/ca/src/org/dogtagpki/server/ca/rest/CAInstallerService.java index 355e744a338004f8d4c555738cac7a901377e6bb..e1b71604d69c7485c8112dc947860e9a6a3f2363 100644 --- a/base/ca/src/org/dogtagpki/server/ca/rest/CAInstallerService.java +++ b/base/ca/src/org/dogtagpki/server/ca/rest/CAInstallerService.java @@ -125,7 +125,7 @@ public class CAInstallerService extends SystemConfigService { StringTokenizer st = new StringTokenizer(profileIds, ","); IConfigStore dbCfg = cs.getSubStore("internaldb"); - ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory(); + ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory("CAInstallerService"); dbFactory.init(dbCfg); while (st.hasMoreTokens()) { diff --git a/base/common/src/com/netscape/certsrv/apps/CMS.java b/base/common/src/com/netscape/certsrv/apps/CMS.java index e301e20ef033002ca0a1115529b6cedfee650f74..3ba6d75779afa73dc7f96fe69643e5c7c86ff8de 100644 --- a/base/common/src/com/netscape/certsrv/apps/CMS.java +++ b/base/common/src/com/netscape/certsrv/apps/CMS.java @@ -626,10 +626,10 @@ public final class CMS { return _engine.getUserMessage(null /* from session context */, msgID, p1, p2, p3); } - public static LDAPConnection getBoundConnection(String host, int port, + public static LDAPConnection getBoundConnection(String id, String host, int port, int version, LDAPSSLSocketFactoryExt fac, String bindDN, String bindPW) throws LDAPException { - return _engine.getBoundConnection(host, port, version, fac, + return _engine.getBoundConnection(id, host, port, version, fac, bindDN, bindPW); } @@ -1330,9 +1330,9 @@ public final class CMS { * * @return bound LDAP connection pool */ - public static ILdapConnFactory getLdapBoundConnFactory() + public static ILdapConnFactory getLdapBoundConnFactory(String id) throws ELdapException { - return _engine.getLdapBoundConnFactory(); + return _engine.getLdapBoundConnFactory(id); } /** @@ -1340,9 +1340,9 @@ public final class CMS { * * @return anonymous LDAP connection pool */ - public static ILdapConnFactory getLdapAnonConnFactory() + public static ILdapConnFactory getLdapAnonConnFactory(String id) throws ELdapException { - return _engine.getLdapAnonConnFactory(); + return _engine.getLdapAnonConnFactory(id); } /** diff --git a/base/common/src/com/netscape/certsrv/apps/ICMSEngine.java b/base/common/src/com/netscape/certsrv/apps/ICMSEngine.java index b90c739970e993d5d46ba10b16e1bafd8836ba0a..57c2b6cb0dda60263613b02f07494e8c255fa74c 100644 --- a/base/common/src/com/netscape/certsrv/apps/ICMSEngine.java +++ b/base/common/src/com/netscape/certsrv/apps/ICMSEngine.java @@ -640,9 +640,9 @@ public interface ICMSEngine extends ISubsystem { * * @return bound LDAP connection pool */ - public ILdapConnFactory getLdapBoundConnFactory() throws ELdapException; + public ILdapConnFactory getLdapBoundConnFactory(String id) throws ELdapException; - public LDAPConnection getBoundConnection(String host, int port, + public LDAPConnection getBoundConnection(String id, String host, int port, int version, LDAPSSLSocketFactoryExt fac, String bindDN, String bindPW) throws LDAPException; @@ -651,7 +651,7 @@ public interface ICMSEngine extends ISubsystem { * * @return anonymous LDAP connection pool */ - public ILdapConnFactory getLdapAnonConnFactory() throws ELdapException; + public ILdapConnFactory getLdapAnonConnFactory(String id) throws ELdapException; /** * Retrieves the password check. diff --git a/base/common/src/com/netscape/certsrv/base/ISecurityDomainSessionTable.java b/base/common/src/com/netscape/certsrv/base/ISecurityDomainSessionTable.java index 24c55d08602a890e78ac86d812dc894e86932405..9bf3aa24bb655a146a5c7dedb16960183464f205 100644 --- a/base/common/src/com/netscape/certsrv/base/ISecurityDomainSessionTable.java +++ b/base/common/src/com/netscape/certsrv/base/ISecurityDomainSessionTable.java @@ -45,4 +45,6 @@ public interface ISecurityDomainSessionTable { public long getTimeToLive(); public Enumeration getSessionIds(); + + public void shutdown(); } diff --git a/base/server/cms/src/com/netscape/cms/authentication/DirBasedAuthentication.java b/base/server/cms/src/com/netscape/cms/authentication/DirBasedAuthentication.java index 78aa399b41263c3da1b050f1729eb48157d730e4..a8a95284df14bd287f7a9a0f5ccba43bf174c4a8 100644 --- a/base/server/cms/src/com/netscape/cms/authentication/DirBasedAuthentication.java +++ b/base/server/cms/src/com/netscape/cms/authentication/DirBasedAuthentication.java @@ -277,7 +277,7 @@ public abstract class DirBasedAuthentication mGroupUserIDName = mLdapConfig.getString(PROP_GROUP_USERID_NAME, "cn"); CMS.debug("DirBasedAuthentication: mGroupUserIDName="+ mGroupUserIDName); } - mConnFactory = CMS.getLdapAnonConnFactory(); + mConnFactory = CMS.getLdapAnonConnFactory("DirBasedAuthentication"); mConnFactory.init(mLdapConfig); /* initialize dn pattern */ diff --git a/base/server/cms/src/com/netscape/cms/authentication/PortalEnroll.java b/base/server/cms/src/com/netscape/cms/authentication/PortalEnroll.java index c94cec6172c11ade721d4f8b3bf8bd971c6b8cf5..46ce65f76205d2662c43d202d853b72af1bba24b 100644 --- a/base/server/cms/src/com/netscape/cms/authentication/PortalEnroll.java +++ b/base/server/cms/src/com/netscape/cms/authentication/PortalEnroll.java @@ -152,7 +152,7 @@ public class PortalEnroll extends DirBasedAuthentication { throw new EPropertyNotFound(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_FAILED", "objectclass")); /* Get connect parameter */ - mLdapFactory = CMS.getLdapBoundConnFactory(); + mLdapFactory = CMS.getLdapBoundConnFactory("PortalEnroll"); mLdapFactory.init(mLdapConfig); mLdapConn = mLdapFactory.getConn(); diff --git a/base/server/cms/src/com/netscape/cms/authentication/UidPwdPinDirAuthentication.java b/base/server/cms/src/com/netscape/cms/authentication/UidPwdPinDirAuthentication.java index 9e551966c3307f9b4a358c7ebd7dc60ed15b1f38..ed20740530b303b895372390c8c9ce8a40ff633d 100644 --- a/base/server/cms/src/com/netscape/cms/authentication/UidPwdPinDirAuthentication.java +++ b/base/server/cms/src/com/netscape/cms/authentication/UidPwdPinDirAuthentication.java @@ -157,7 +157,7 @@ public class UidPwdPinDirAuthentication extends DirBasedAuthentication if (mRemovePin) { removePinLdapConfigStore = config.getSubStore("ldap"); - removePinLdapFactory = CMS.getLdapBoundConnFactory(); + removePinLdapFactory = CMS.getLdapBoundConnFactory("UidPwdPinDirAuthentication"); removePinLdapFactory.init(removePinLdapConfigStore); removePinLdapConnection = removePinLdapFactory.getConn(); } diff --git a/base/server/cms/src/com/netscape/cms/authorization/DirAclAuthz.java b/base/server/cms/src/com/netscape/cms/authorization/DirAclAuthz.java index d0677875c3a69c520d8569646b720df6f624ae62..bdf3f5e9c823ebc64ac046fab3d08af678893f8a 100644 --- a/base/server/cms/src/com/netscape/cms/authorization/DirAclAuthz.java +++ b/base/server/cms/src/com/netscape/cms/authorization/DirAclAuthz.java @@ -143,7 +143,7 @@ public class DirAclAuthz extends AAclAuthz return; } - mLdapConnFactory = CMS.getLdapBoundConnFactory(); + mLdapConnFactory = CMS.getLdapBoundConnFactory("DirAclAuthz"); mLdapConnFactory.init(ldapConfig); // retrieve aclResources from the LDAP server and load diff --git a/base/server/cms/src/com/netscape/cms/listeners/PinRemovalListener.java b/base/server/cms/src/com/netscape/cms/listeners/PinRemovalListener.java index 21d69e29d21ce6c7d238a061b29569834bcb3670..dbe03ce6f6bef6be64af19df849a25bc78782e42 100644 --- a/base/server/cms/src/com/netscape/cms/listeners/PinRemovalListener.java +++ b/base/server/cms/src/com/netscape/cms/listeners/PinRemovalListener.java @@ -95,7 +95,7 @@ public class PinRemovalListener implements IRequestListener { mConfig = config; mLdapConfig = mConfig.getSubStore(PROP_LDAP); - mConnFactory = CMS.getLdapBoundConnFactory(); + mConnFactory = CMS.getLdapBoundConnFactory("PinRemovalListener"); mConnFactory.init(mLdapConfig); mRemovePinLdapConnection = mConnFactory.getConn(); diff --git a/base/server/cms/src/com/netscape/cms/logging/LogFile.java b/base/server/cms/src/com/netscape/cms/logging/LogFile.java index c465a4e53e25fede60327f0c3fc6bf2ce6ec2b59..9d19eddc6e3b3521a512780708a7274b344b369a 100644 --- a/base/server/cms/src/com/netscape/cms/logging/LogFile.java +++ b/base/server/cms/src/com/netscape/cms/logging/LogFile.java @@ -519,6 +519,8 @@ public class LogFile implements ILogEventListener, IExtendedPluginInfo { if (fileName == null) throw new ELogException(CMS.getUserMessage("CMS_LOG_INVALID_FILE_NAME", "null")); + CMS.debug("Creating " + getClass().getSimpleName() + "(" + fileName + ")"); + //If we want to reuse the old log files //mFileName = fileName + "." + mLogFileDateFormat.format(mDate); mFileName = fileName; @@ -863,10 +865,11 @@ public class LogFile implements ILogEventListener, IExtendedPluginInfo { * */ public synchronized void shutdown() { + + CMS.debug("Destroying LogFile(" + mFileName + ")"); + String auditMessage = null; - CMS.debug("LogFile:In log shutdown"); - setFlushInterval(0); // log signed audit shutdown success @@ -891,10 +894,13 @@ public class LogFile implements ILogEventListener, IExtendedPluginInfo { public synchronized void setFlushInterval(int flushInterval) { mFlushInterval = flushInterval * 1000; - if ((mFlushThread == null) && (mFlushInterval > 0)) { + if (mFlushThread == null && mFlushInterval > 0) { mFlushThread = new FlushThread(); mFlushThread.setDaemon(true); mFlushThread.start(); + + } else if (mFlushThread != null && mFlushInterval == 0) { + mFlushThread.interrupt(); } this.notify(); @@ -921,9 +927,7 @@ public class LogFile implements ILogEventListener, IExtendedPluginInfo { try { LogFile.this.wait(mFlushInterval); } catch (InterruptedException e) { - // This shouldn't happen very often - ConsoleError.send(new - SystemEvent(CMS.getUserMessage("CMS_LOG_THREAD_INTERRUPT", "flush"))); + // shutdown } } diff --git a/base/server/cms/src/com/netscape/cms/logging/RollingLogFile.java b/base/server/cms/src/com/netscape/cms/logging/RollingLogFile.java index 0a7a9f0986a6052877178ecc1b09b0043155d868..32568dac053b6ff2bc2e5d11983fc6ba55db552e 100644 --- a/base/server/cms/src/com/netscape/cms/logging/RollingLogFile.java +++ b/base/server/cms/src/com/netscape/cms/logging/RollingLogFile.java @@ -139,6 +139,7 @@ public class RollingLogFile extends LogFile { * Shutdown this log file. */ public synchronized void shutdown() { + CMS.debug("Destroying RollingLogFile(" + mFileName + ")"); setRolloverTime("0"); setExpirationTime("0"); super.shutdown(); @@ -157,6 +158,9 @@ public class RollingLogFile extends LogFile { mRolloverThread = new RolloverThread(); mRolloverThread.setDaemon(true); mRolloverThread.start(); + + } else if (mRolloverThread != null && mRolloverInterval == 0) { + mRolloverThread.interrupt(); } this.notify(); @@ -190,6 +194,10 @@ public class RollingLogFile extends LogFile { mExpirationThread.setDaemon(true); mExpirationThread.start(); } + + } else if (mExpirationThread != null && mExpirationTime == 0) { + mExpirationThread.interrupt(); + } else { mExpLock.notify(); } @@ -401,9 +409,7 @@ public class RollingLogFile extends LogFile { try { RollingLogFile.this.wait(mRolloverInterval); } catch (InterruptedException e) { - // This shouldn't happen very often - CMS.getLogger().getLogQueue().log(new - SystemEvent(CMS.getUserMessage("CMS_LOG_THREAD_INTERRUPT", "rollover"))); + // shutdown } } @@ -475,11 +481,13 @@ public class RollingLogFile extends LogFile { try { mExpLock.wait(sleepTime); } catch (InterruptedException e) { - // This shouldn't happen very often - ConsoleError.send(new - SystemEvent(CMS.getUserMessage("CMS_LOG_THREAD_INTERRUPT", "expiration"))); + // shutdown } } + + if (mExpirationTime == 0) { + break; + } } } mExpirationThread = null; diff --git a/base/server/cms/src/com/netscape/cms/policy/constraints/AttributePresentConstraints.java b/base/server/cms/src/com/netscape/cms/policy/constraints/AttributePresentConstraints.java index e12b8220fa35ec5d341535d21f8eeab9fc520a9b..fb56c67c42211d9fbd130c39f34d39310a6d77b2 100644 --- a/base/server/cms/src/com/netscape/cms/policy/constraints/AttributePresentConstraints.java +++ b/base/server/cms/src/com/netscape/cms/policy/constraints/AttributePresentConstraints.java @@ -257,7 +257,7 @@ public class AttributePresentConstraints extends APolicyRule mLdapConfig = mConfig.getSubStore(PROP_LDAP); - mConnFactory = CMS.getLdapBoundConnFactory(); + mConnFactory = CMS.getLdapBoundConnFactory("AttributePresentConstraints"); mConnFactory.init(mLdapConfig); mCheckAttrLdapConnection = mConnFactory.getConn(); diff --git a/base/server/cms/src/com/netscape/cms/profile/def/nsNKeySubjectNameDefault.java b/base/server/cms/src/com/netscape/cms/profile/def/nsNKeySubjectNameDefault.java index c90b76c5dbad504fd127fc0137e53ec56c95d4fa..49e951ae362ac79d838456285c25b28f5372841b 100644 --- a/base/server/cms/src/com/netscape/cms/profile/def/nsNKeySubjectNameDefault.java +++ b/base/server/cms/src/com/netscape/cms/profile/def/nsNKeySubjectNameDefault.java @@ -264,7 +264,7 @@ public class nsNKeySubjectNameDefault extends EnrollDefault { mParamsConfig = mInstConfig.getSubStore(PROP_PARAMS); mLdapConfig = mParamsConfig.getSubStore(PROP_LDAP); mBaseDN = mParamsConfig.getString(CONFIG_LDAP_BASEDN, null); - mConnFactory = CMS.getLdapAnonConnFactory(); + mConnFactory = CMS.getLdapAnonConnFactory("nsNKeySubjectNameDefault"); mConnFactory.init(mLdapConfig); /* initialize dn pattern */ diff --git a/base/server/cms/src/com/netscape/cms/profile/def/nsTokenUserKeySubjectNameDefault.java b/base/server/cms/src/com/netscape/cms/profile/def/nsTokenUserKeySubjectNameDefault.java index 86a2a696129ce2fe1b513b5c30e60aa14d6ba57b..0a8d9db906be0b12b58748c5eabbfa38a95020f9 100644 --- a/base/server/cms/src/com/netscape/cms/profile/def/nsTokenUserKeySubjectNameDefault.java +++ b/base/server/cms/src/com/netscape/cms/profile/def/nsTokenUserKeySubjectNameDefault.java @@ -287,7 +287,7 @@ public class nsTokenUserKeySubjectNameDefault extends EnrollDefault { return; mBaseDN = mParamsConfig.getString(CONFIG_LDAP_BASEDN, null); - mConnFactory = CMS.getLdapAnonConnFactory(); + mConnFactory = CMS.getLdapAnonConnFactory("nsTokenUserKeySubjectNameDefault"); mConnFactory.init(mLdapConfig); /* initialize dn pattern */ diff --git a/base/server/cms/src/com/netscape/cms/publish/publishers/LdapCaCertPublisher.java b/base/server/cms/src/com/netscape/cms/publish/publishers/LdapCaCertPublisher.java index 06050480e913997f1d934a41506776efcb24551f..f740ef3c42efa2fcb1c2adc69ac04e5f64e5f632 100644 --- a/base/server/cms/src/com/netscape/cms/publish/publishers/LdapCaCertPublisher.java +++ b/base/server/cms/src/com/netscape/cms/publish/publishers/LdapCaCertPublisher.java @@ -186,7 +186,7 @@ public class LdapCaCertPublisher String mgr_dn = mConfig.getString("bindDN", null); String mgr_pwd = mConfig.getString("bindPWD", null); - altConn = CMS.getBoundConnection(host, portVal, + altConn = CMS.getBoundConnection("LdapCaCertPublisher", host, portVal, version, sslSocket, mgr_dn, mgr_pwd); conn = altConn; diff --git a/base/server/cms/src/com/netscape/cms/publish/publishers/LdapCrlPublisher.java b/base/server/cms/src/com/netscape/cms/publish/publishers/LdapCrlPublisher.java index 9173f3cdf3915c5997781b0449393ac1b8d9adcf..80ffa3c4bc687735e909c927a623262ee810c390 100644 --- a/base/server/cms/src/com/netscape/cms/publish/publishers/LdapCrlPublisher.java +++ b/base/server/cms/src/com/netscape/cms/publish/publishers/LdapCrlPublisher.java @@ -177,7 +177,7 @@ public class LdapCrlPublisher implements ILdapPublisher, IExtendedPluginInfo { String mgr_dn = mConfig.getString("bindDN", null); String mgr_pwd = mConfig.getString("bindPWD", null); - altConn = CMS.getBoundConnection(host, portVal, + altConn = CMS.getBoundConnection("LdapCrlPublisher", host, portVal, version, sslSocket, mgr_dn, mgr_pwd); conn = altConn; diff --git a/base/server/cms/src/com/netscape/cms/publish/publishers/LdapUserCertPublisher.java b/base/server/cms/src/com/netscape/cms/publish/publishers/LdapUserCertPublisher.java index 020c255522b5185631b1c8830cf20de4d296b78f..a01cf80d1a6e988d48cceb49e0fe014fb6e62bb3 100644 --- a/base/server/cms/src/com/netscape/cms/publish/publishers/LdapUserCertPublisher.java +++ b/base/server/cms/src/com/netscape/cms/publish/publishers/LdapUserCertPublisher.java @@ -141,7 +141,7 @@ public class LdapUserCertPublisher implements ILdapPublisher, IExtendedPluginInf String mgr_dn = mConfig.getString("bindDN", null); String mgr_pwd = mConfig.getString("bindPWD", null); - altConn = CMS.getBoundConnection(host, portVal, + altConn = CMS.getBoundConnection("LdapUserCertPublisher", host, portVal, version, sslSocket, mgr_dn, mgr_pwd); conn = altConn; diff --git a/base/server/cms/src/com/netscape/cms/servlet/csadmin/ConfigurationUtils.java b/base/server/cms/src/com/netscape/cms/servlet/csadmin/ConfigurationUtils.java index ce9e3bf49d95379a3416e728adaca0557f8cdfc8..ee88865e6a92b649b6065a1104ee63ae7cc7807b 100644 --- a/base/server/cms/src/com/netscape/cms/servlet/csadmin/ConfigurationUtils.java +++ b/base/server/cms/src/com/netscape/cms/servlet/csadmin/ConfigurationUtils.java @@ -1350,7 +1350,7 @@ public class ConfigurationUtils { boolean setupReplication = cs.getBoolean("preop.database.setupReplication", true); IConfigStore dbCfg = cs.getSubStore("internaldb"); - ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory(); + ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory("ConfigurationUtils"); dbFactory.init(dbCfg); LDAPConnection conn = dbFactory.getConn(); @@ -1807,7 +1807,7 @@ public class ConfigurationUtils { IConfigStore cs = CMS.getConfigStore(); IConfigStore dbCfg = cs.getSubStore("internaldb"); - ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory(); + ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory("ConfigurationUtils"); dbFactory.init(dbCfg); LDAPConnection conn = dbFactory.getConn(); @@ -1826,7 +1826,7 @@ public class ConfigurationUtils { IConfigStore cs = CMS.getConfigStore(); IConfigStore dbCfg = cs.getSubStore("internaldb"); - ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory(); + ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory("ConfigurationUtils"); dbFactory.init(dbCfg); LDAPConnection conn = dbFactory.getConn(); @@ -1897,7 +1897,7 @@ public class ConfigurationUtils { ILdapConnFactory masterFactory = null; try { IConfigStore masterCfg = cs.getSubStore("preop.internaldb.master"); - masterFactory = CMS.getLdapBoundConnFactory(); + masterFactory = CMS.getLdapBoundConnFactory("ConfigurationUtils"); masterFactory.init(masterCfg); masterConn = masterFactory.getConn(); } catch (Exception e) { @@ -1912,7 +1912,7 @@ public class ConfigurationUtils { ILdapConnFactory replicaFactory = null; try { IConfigStore replicaCfg = cs.getSubStore("internaldb"); - replicaFactory = CMS.getLdapBoundConnFactory(); + replicaFactory = CMS.getLdapBoundConnFactory("ConfigurationUtils"); replicaFactory.init(replicaCfg); replicaConn = replicaFactory.getConn(); } catch (Exception e) { @@ -3616,7 +3616,7 @@ public class ConfigurationUtils { SAXException, ParserConfigurationException { IConfigStore cs = CMS.getConfigStore(); IConfigStore dbCfg = cs.getSubStore("internaldb"); - ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory(); + ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory("ConfigurationUtils"); dbFactory.init(dbCfg); LDAPConnection conn = dbFactory.getConn(); LDAPEntry entry = null; @@ -4243,7 +4243,7 @@ public class ConfigurationUtils { IConfigStore cs = CMS.getConfigStore(); String userbasedn = "ou=people, " + cs.getString("internaldb.basedn"); IConfigStore dbCfg = cs.getSubStore("internaldb"); - ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory(); + ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory("ConfigurationUtils"); dbFactory.init(dbCfg); LDAPConnection conn = dbFactory.getConn(); @@ -4309,7 +4309,7 @@ public class ConfigurationUtils { // update global next range entries IConfigStore dbCfg = cs.getSubStore("internaldb"); - ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory(); + ILdapConnFactory dbFactory = CMS.getLdapBoundConnFactory("ConfigurationUtils"); dbFactory.init(dbCfg); LDAPConnection conn = dbFactory.getConn(); diff --git a/base/server/cms/src/com/netscape/cms/servlet/csadmin/SecurityDomainProcessor.java b/base/server/cms/src/com/netscape/cms/servlet/csadmin/SecurityDomainProcessor.java index de83d20bf51b3d4f9efbd1ecf5540158c7b8da12..08b11c605ad3feb2efb30d3b754bf4dacc19a950 100644 --- a/base/server/cms/src/com/netscape/cms/servlet/csadmin/SecurityDomainProcessor.java +++ b/base/server/cms/src/com/netscape/cms/servlet/csadmin/SecurityDomainProcessor.java @@ -154,7 +154,7 @@ public class SecurityDomainProcessor extends CAProcessor { String filter = "objectclass=pkiSecurityGroup"; IConfigStore ldapConfig = cs.getSubStore("internaldb"); - connFactory = CMS.getLdapBoundConnFactory(); + connFactory = CMS.getLdapBoundConnFactory("SecurityDomainProcessor"); connFactory.init(ldapConfig); conn = connFactory.getConn(); diff --git a/base/server/cms/src/com/netscape/cms/servlet/csadmin/UpdateDomainXML.java b/base/server/cms/src/com/netscape/cms/servlet/csadmin/UpdateDomainXML.java index 9aa150475adeab6b25ead0ced9b29a624d847d97..1a23823b2efe3cf8144f0f1a6da9f59e84aaf67b 100644 --- a/base/server/cms/src/com/netscape/cms/servlet/csadmin/UpdateDomainXML.java +++ b/base/server/cms/src/com/netscape/cms/servlet/csadmin/UpdateDomainXML.java @@ -91,7 +91,7 @@ public class UpdateDomainXML extends CMSServlet { try { IConfigStore ldapConfig = cs.getSubStore("internaldb"); - connFactory = CMS.getLdapBoundConnFactory(); + connFactory = CMS.getLdapBoundConnFactory("UpdateDomainXML"); connFactory.init(ldapConfig); conn = connFactory.getConn(); conn.delete(dn); @@ -125,7 +125,7 @@ public class UpdateDomainXML extends CMSServlet { try { IConfigStore ldapConfig = cs.getSubStore("internaldb"); - connFactory = CMS.getLdapBoundConnFactory(); + connFactory = CMS.getLdapBoundConnFactory("UpdateDomainXML"); connFactory.init(ldapConfig); conn = connFactory.getConn(); conn.modify(dn, mod); @@ -160,7 +160,7 @@ public class UpdateDomainXML extends CMSServlet { try { IConfigStore ldapConfig = cs.getSubStore("internaldb"); - connFactory = CMS.getLdapBoundConnFactory(); + connFactory = CMS.getLdapBoundConnFactory("UpdateDomainXML"); connFactory.init(ldapConfig); conn = connFactory.getConn(); conn.add(entry); diff --git a/base/server/cmscore/src/com/netscape/cmscore/apps/CMSEngine.java b/base/server/cmscore/src/com/netscape/cmscore/apps/CMSEngine.java index 02c8ab41db38b781e8a1db05c7c26c8a98f2b9ac..fa2c8147f401d19836e52737b99be0ac1f108298 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/apps/CMSEngine.java +++ b/base/server/cmscore/src/com/netscape/cmscore/apps/CMSEngine.java @@ -976,14 +976,14 @@ public class CMSEngine implements ICMSEngine { return new LdapAuthInfo(); } - public ILdapConnFactory getLdapBoundConnFactory() + public ILdapConnFactory getLdapBoundConnFactory(String id) throws ELdapException { - return new LdapBoundConnFactory(); + return new LdapBoundConnFactory(id); } - public ILdapConnFactory getLdapAnonConnFactory() + public ILdapConnFactory getLdapAnonConnFactory(String id) throws ELdapException { - return new LdapAnonConnFactory(); + return new LdapAnonConnFactory(id); } public IRequestEncoder getHttpRequestEncoder() { @@ -1079,7 +1079,7 @@ public class CMSEngine implements ICMSEngine { } } - public LDAPConnection getBoundConnection(String host, int port, + public LDAPConnection getBoundConnection(String id, String host, int port, int version, LDAPSSLSocketFactoryExt fac, String bindDN, String bindPW) throws LDAPException { return new LdapBoundConnection(host, port, version, fac, @@ -1796,6 +1796,14 @@ public class CMSEngine implements ICMSEngine { shutdownSubsystems(mFinalSubsystems); shutdownSubsystems(mDynSubsystems); shutdownSubsystems(mStaticSubsystems); + + if (mSDTimer != null) { + mSDTimer.cancel(); + } + + if (mSecurityDomainSessionTable != null) { + mSecurityDomainSessionTable.shutdown(); + } } /** diff --git a/base/server/cmscore/src/com/netscape/cmscore/authentication/PasswdUserDBAuthentication.java b/base/server/cmscore/src/com/netscape/cmscore/authentication/PasswdUserDBAuthentication.java index 2905f3c758c1d96873347434bb12a5efd063c957..692dc49d62b85b3db03bd3f46059d4f94072223b 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/authentication/PasswdUserDBAuthentication.java +++ b/base/server/cmscore/src/com/netscape/cmscore/authentication/PasswdUserDBAuthentication.java @@ -95,8 +95,8 @@ public class PasswdUserDBAuthentication implements IAuthManager, IPasswdUserDBAu return; mBaseDN = dbs.getBaseDN(); - mConnFactory = new LdapBoundConnFactory(3, 20, ldapinfo, dbs.getLdapAuthInfo()); - mAnonConnFactory = new LdapAnonConnFactory(3, 20, ldapinfo); + mConnFactory = new LdapBoundConnFactory("PasswdUserDBAuthentication", 3, 20, ldapinfo, dbs.getLdapAuthInfo()); + mAnonConnFactory = new LdapAnonConnFactory("PasswdUserDBAuthentication", 3, 20, ldapinfo); log(ILogger.LL_INFO, CMS.getLogMessage("CMSCORE_AUTH_INIT_AUTH", mName)); } @@ -242,6 +242,7 @@ public class PasswdUserDBAuthentication implements IAuthManager, IPasswdUserDBAu try { // disconnect all outstanding connections in the factory if (mConnFactory != null) mConnFactory.reset(); + if (mAnonConnFactory != null) mAnonConnFactory.reset(); } catch (ELdapException e) { log(ILogger.LL_FAILURE, e.toString()); } diff --git a/base/server/cmscore/src/com/netscape/cmscore/cert/CrossCertPairSubsystem.java b/base/server/cmscore/src/com/netscape/cmscore/cert/CrossCertPairSubsystem.java index b0feca8c28d3efd13c166a88b394ea5845895ad9..29ec0f54fe68e5f1a016a9d641eeaa2352759ab6 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/cert/CrossCertPairSubsystem.java +++ b/base/server/cmscore/src/com/netscape/cmscore/cert/CrossCertPairSubsystem.java @@ -118,7 +118,7 @@ public class CrossCertPairSubsystem implements ICrossCertPairSubsystem { mBaseDN = ldapConfig.getString(PROP_BASEDN, null); - mLdapConnFactory = new LdapBoundConnFactory(); + mLdapConnFactory = new LdapBoundConnFactory("CrossCertPairSubsystem"); if (mLdapConnFactory != null) mLdapConnFactory.init(ldapConfig); diff --git a/base/server/cmscore/src/com/netscape/cmscore/dbs/DBSubsystem.java b/base/server/cmscore/src/com/netscape/cmscore/dbs/DBSubsystem.java index a6133310c6a935a3de408b7106a1eba4d5e40416..2de9945f78ad8a0417217ecf34ea04f21959c152 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/dbs/DBSubsystem.java +++ b/base/server/cmscore/src/com/netscape/cmscore/dbs/DBSubsystem.java @@ -636,7 +636,7 @@ public class DBSubsystem implements IDBSubsystem { // initialize LDAP connection factory // by default return error if server is down at startup time. - mLdapConnFactory = new LdapBoundConnFactory(true); + mLdapConnFactory = new LdapBoundConnFactory("DBSubsystem", true); tmpConfig = (IConfigStore) (((PropConfigStore) mConfig).clone()); tmpConfig.putString(PROP_BASEDN, mBaseDN); diff --git a/base/server/cmscore/src/com/netscape/cmscore/ldap/LdapConnModule.java b/base/server/cmscore/src/com/netscape/cmscore/ldap/LdapConnModule.java index 859e442faa65669479a5a3a3db7c0d0aa0c11e3b..3710b8a22b2c7e5bc3db89cd5dba0bcadb01a5dd 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/ldap/LdapConnModule.java +++ b/base/server/cmscore/src/com/netscape/cmscore/ldap/LdapConnModule.java @@ -92,7 +92,7 @@ public class LdapConnModule implements ILdapConnModule { CMS.debug("Creating LdapBoundConnFactory for LdapConnModule."); mLdapConnFactory = - new LdapBoundConnFactory(minConns, maxConns, (LdapConnInfo) connInfo, authInfo); + new LdapBoundConnFactory("LDAPConnModule", minConns, maxConns, (LdapConnInfo) connInfo, authInfo); mInited = true; diff --git a/base/server/cmscore/src/com/netscape/cmscore/ldap/LdapPublishModule.java b/base/server/cmscore/src/com/netscape/cmscore/ldap/LdapPublishModule.java index c4ff20515045f31a226ce0a6a2a8d35ef00c8c80..c7a04601d033b9e848510689da93df363974fad5 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/ldap/LdapPublishModule.java +++ b/base/server/cmscore/src/com/netscape/cmscore/ldap/LdapPublishModule.java @@ -119,7 +119,7 @@ public class LdapPublishModule implements ILdapPublishModule { mAuthority = authority; mPubProcessor = p; mConfig = config; - mLdapConnFactory = new LdapBoundConnFactory(); + mLdapConnFactory = new LdapBoundConnFactory("LdapPublishModule"); mLdapConnFactory.init(mConfig.getSubStore("ldap")); // initMappers(config); @@ -135,7 +135,7 @@ public class LdapPublishModule implements ILdapPublishModule { mAuthority = authority; mConfig = config; - mLdapConnFactory = new LdapBoundConnFactory(); + mLdapConnFactory = new LdapBoundConnFactory("LdapPublishModule"); mLdapConnFactory.init(mConfig.getSubStore("ldap")); initMappers(config); diff --git a/base/server/cmscore/src/com/netscape/cmscore/ldapconn/LdapAnonConnFactory.java b/base/server/cmscore/src/com/netscape/cmscore/ldapconn/LdapAnonConnFactory.java index dfc974e0bdfa6d2f03d49faa7d3d5aaa04d6bd10..20e0d65b1a8e13b847d24ab645d695a01a451497 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/ldapconn/LdapAnonConnFactory.java +++ b/base/server/cmscore/src/com/netscape/cmscore/ldapconn/LdapAnonConnFactory.java @@ -35,6 +35,9 @@ import com.netscape.certsrv.logging.ILogger; * authentication dn and password. */ public class LdapAnonConnFactory implements ILdapConnFactory { + + protected String id; + protected int mMinConns = 5; protected int mMaxConns = 1000; protected LdapConnInfo mConnInfo = null; @@ -60,10 +63,14 @@ public class LdapAnonConnFactory implements ILdapConnFactory { * Constructor for initializing from the config store. * must be followed by init(IConfigStore) */ - public LdapAnonConnFactory() { + public LdapAnonConnFactory(String id) { + CMS.debug("Creating LdapAnonConnFactory(" + id + ")"); + this.id = id; } - public LdapAnonConnFactory(boolean defErrorIfDown) { + public LdapAnonConnFactory(String id, boolean defErrorIfDown) { + CMS.debug("Creating LdapAnonConnFactory(" + id + ")"); + this.id = id; mDefErrorIfDown = defErrorIfDown; } @@ -75,8 +82,10 @@ public class LdapAnonConnFactory implements ILdapConnFactory { * the maximum number of clones of this connection one wants to allow. * @param serverInfo server connection info - host, port, etc. */ - public LdapAnonConnFactory(int minConns, int maxConns, + public LdapAnonConnFactory(String id, int minConns, int maxConns, LdapConnInfo connInfo) throws ELdapException { + CMS.debug("Creating LdapAnonConnFactory(" + id + ")"); + this.id = id; init(minConns, maxConns, connInfo); } @@ -405,6 +414,7 @@ public class LdapAnonConnFactory implements ILdapConnFactory { // ok only if no connections outstanding. public synchronized void reset() throws ELdapException { + CMS.debug("Destroying LdapAnonConnFactory(" + id + ")"); if (mNumConns == mTotal) { for (int i = 0; i < mNumConns; i++) { try { diff --git a/base/server/cmscore/src/com/netscape/cmscore/ldapconn/LdapBoundConnFactory.java b/base/server/cmscore/src/com/netscape/cmscore/ldapconn/LdapBoundConnFactory.java index 5be645b56ed15ccf8fb5977169270faddce73967..2ac4085c72a3d2cda36d6f16620c155e7403dfa2 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/ldapconn/LdapBoundConnFactory.java +++ b/base/server/cmscore/src/com/netscape/cmscore/ldapconn/LdapBoundConnFactory.java @@ -36,6 +36,9 @@ import com.netscape.certsrv.logging.ILogger; * be shared by multiple threads and cloned. */ public class LdapBoundConnFactory implements ILdapBoundConnFactory { + + protected String id; + protected int mMinConns = 5; protected int mMaxConns = 1000; protected LdapConnInfo mConnInfo = null; @@ -71,10 +74,14 @@ public class LdapBoundConnFactory implements ILdapBoundConnFactory { * Constructor for initializing from the config store. * must be followed by init(IConfigStore) */ - public LdapBoundConnFactory() { + public LdapBoundConnFactory(String id) { + CMS.debug("Creating LdapBoundConnFactor(" + id + ")"); + this.id = id; } - public LdapBoundConnFactory(boolean defErrorIfDown) { + public LdapBoundConnFactory(String id, boolean defErrorIfDown) { + CMS.debug("Creating LdapBoundConnFactor(" + id + ")"); + this.id = id; mDefErrorIfDown = defErrorIfDown; } @@ -98,8 +105,10 @@ public class LdapBoundConnFactory implements ILdapBoundConnFactory { * the maximum number of clones of this connection or separate connections one wants to allow. * @param serverInfo server connection info - host, port, etc. */ - public LdapBoundConnFactory(int minConns, int maxConns, + public LdapBoundConnFactory(String id, int minConns, int maxConns, LdapConnInfo connInfo, LdapAuthInfo authInfo) throws ELdapException { + CMS.debug("Creating LdapBoundConnFactory(" + id + ")"); + this.id = id; init(minConns, maxConns, connInfo, authInfo); } @@ -459,11 +468,13 @@ public class LdapBoundConnFactory implements ILdapBoundConnFactory { */ public synchronized void reset() throws ELdapException { + CMS.debug("Destroying LdapBoundConnFactory(" + id + ")"); if (mNumConns == mTotal) { for (int i = 0; i < mNumConns; i++) { try { mConns[i].disconnect(); } catch (LDAPException e) { + e.printStackTrace(); } mConns[i] = null; } @@ -472,6 +483,7 @@ public class LdapBoundConnFactory implements ILdapBoundConnFactory { log(ILogger.LL_INFO, "disconnecting masterConn"); mMasterConn.disconnect(); } catch (LDAPException e) { + e.printStackTrace(); log(ILogger.LL_FAILURE, CMS.getLogMessage("CMSCORE_LDAPCONN_CANNOT_RESET", e.toString())); diff --git a/base/server/cmscore/src/com/netscape/cmscore/logging/LogQueue.java b/base/server/cmscore/src/com/netscape/cmscore/logging/LogQueue.java index 32af1bf2c733f3495afc9b71b7b17d6d4bed25c0..751a4cd6369637c4ce192d9728ca77bf829e51fc 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/logging/LogQueue.java +++ b/base/server/cmscore/src/com/netscape/cmscore/logging/LogQueue.java @@ -64,7 +64,8 @@ public class LogQueue implements ILogQueue { if (mListeners == null) return; for (int i = 0; i < mListeners.size(); i++) { - mListeners.elementAt(i).shutdown(); + ILogEventListener listener = mListeners.elementAt(i); + listener.shutdown(); } } @@ -75,8 +76,9 @@ public class LogQueue implements ILogQueue { */ public void addLogEventListener(ILogEventListener listener) { //Make sure we don't have duplicated listener - if (!mListeners.contains(listener)) + if (!mListeners.contains(listener)) { mListeners.addElement(listener); + } } /** @@ -104,9 +106,6 @@ public class LogQueue implements ILogQueue { // incorrect log message. // ConsoleError.send(new SystemEvent(CMS.getUserMessage("CMS_LOG_EVENT_FAILED", // event.getEventType(), e.toString()))); - - // Don't do this again. - removeLogEventListener(mListeners.elementAt(i)); } } } diff --git a/base/server/cmscore/src/com/netscape/cmscore/profile/LDAPProfileSubsystem.java b/base/server/cmscore/src/com/netscape/cmscore/profile/LDAPProfileSubsystem.java index 83ae5078dc698b5ce374951beaff6f3b7191ac39..cc2e43dfa2e9b1a4eb3bdb53eeb3ace6cfd1d6ac 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/profile/LDAPProfileSubsystem.java +++ b/base/server/cmscore/src/com/netscape/cmscore/profile/LDAPProfileSubsystem.java @@ -77,7 +77,7 @@ public class LDAPProfileSubsystem IConfigStore cs = CMS.getConfigStore(); IConfigStore dbCfg = cs.getSubStore("internaldb"); - dbFactory = CMS.getLdapBoundConnFactory(); + dbFactory = CMS.getLdapBoundConnFactory("LDAPProfileSubsystem"); dbFactory.init(dbCfg); mConfig = config; diff --git a/base/server/cmscore/src/com/netscape/cmscore/selftests/SelfTestSubsystem.java b/base/server/cmscore/src/com/netscape/cmscore/selftests/SelfTestSubsystem.java index 2a2cf8b2c907e6cb540893efc2857b888c92f382..ad1a1b0b886a580edbe4afddcda997dba6126c66 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/selftests/SelfTestSubsystem.java +++ b/base/server/cmscore/src/com/netscape/cmscore/selftests/SelfTestSubsystem.java @@ -1888,6 +1888,8 @@ public class SelfTestSubsystem instance.shutdownSelfTest(); } + + mLogger.shutdown(); } /** diff --git a/base/server/cmscore/src/com/netscape/cmscore/session/LDAPSecurityDomainSessionTable.java b/base/server/cmscore/src/com/netscape/cmscore/session/LDAPSecurityDomainSessionTable.java index 064ae7ecbf253b5d4c74f15342f7c17bbe7efd93..bbc9f1a7967510295ffb1f7c6cae30f88b0cf41e 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/session/LDAPSecurityDomainSessionTable.java +++ b/base/server/cmscore/src/com/netscape/cmscore/session/LDAPSecurityDomainSessionTable.java @@ -50,7 +50,7 @@ public class LDAPSecurityDomainSessionTable m_timeToLive = timeToLive; IConfigStore cs = CMS.getConfigStore(); IConfigStore internaldb = cs.getSubStore("internaldb"); - mLdapConnFactory = CMS.getLdapBoundConnFactory(); + mLdapConnFactory = CMS.getLdapBoundConnFactory("LDAPSecurityDomainSessionTable"); mLdapConnFactory.init(internaldb); } @@ -300,4 +300,12 @@ public class LDAPSecurityDomainSessionTable return ret; } + + public void shutdown() { + try { + mLdapConnFactory.reset(); + } catch (ELdapException e) { + CMS.debug(e); + } + } } diff --git a/base/server/cmscore/src/com/netscape/cmscore/session/SecurityDomainSessionTable.java b/base/server/cmscore/src/com/netscape/cmscore/session/SecurityDomainSessionTable.java index 497f42f7a5db47097eff65b4dcfa33bc079fef38..c7fe25599bd07c8d2db5b4529976e873ebe9ea5a 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/session/SecurityDomainSessionTable.java +++ b/base/server/cmscore/src/com/netscape/cmscore/session/SecurityDomainSessionTable.java @@ -102,4 +102,7 @@ public class SecurityDomainSessionTable public int getSize() { return m_sessions.size(); } + + public void shutdown() { + } } diff --git a/base/server/cmscore/src/com/netscape/cmscore/usrgrp/UGSubsystem.java b/base/server/cmscore/src/com/netscape/cmscore/usrgrp/UGSubsystem.java index a2655bf82f32a15e775d15fa04cf057a9958886c..d1277279e5c020aa688d1dedce9230d293fe3fac 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/usrgrp/UGSubsystem.java +++ b/base/server/cmscore/src/com/netscape/cmscore/usrgrp/UGSubsystem.java @@ -137,7 +137,7 @@ public final class UGSubsystem implements IUGSubsystem { mBaseDN = ldapConfig.getString(PROP_BASEDN, null); - mLdapConnFactory = new LdapBoundConnFactory(); + mLdapConnFactory = new LdapBoundConnFactory("UGSubsystem"); mLdapConnFactory.init(ldapConfig); } catch (EBaseException e) { if (CMS.isPreOpMode()) diff --git a/base/server/cmscore/src/com/netscape/cmscore/util/Debug.java b/base/server/cmscore/src/com/netscape/cmscore/util/Debug.java index 0365734674e7211739bc9c3db1115b1d9859887c..83c0e1b06826422741e143810e701d6b78b41492 100644 --- a/base/server/cmscore/src/com/netscape/cmscore/util/Debug.java +++ b/base/server/cmscore/src/com/netscape/cmscore/util/Debug.java @@ -20,11 +20,12 @@ package com.netscape.cmscore.util; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintStream; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.Hashtable; import java.util.StringTokenizer; +import org.apache.commons.lang.time.FastDateFormat; + import com.netscape.certsrv.base.IConfigStore; import com.netscape.certsrv.base.ISubsystem; import com.netscape.cmsutil.util.Utils; @@ -35,21 +36,9 @@ public class Debug private static Debug mInstance = new Debug(); private static boolean mShowCaller = false; - /* This dateformatter is used to put the date on each - debug line. But the DateFormatter is not thread safe, - so I create a thread-local DateFormatter for each thread - */ + // FastDateFormat is a thread-safe replacement for SimpleDateFormat private static String DATE_PATTERN = "dd/MMM/yyyy:HH:mm:ss"; - private static ThreadLocal mFormatObject = new ThreadLocal() { - protected synchronized SimpleDateFormat initialValue() { - return new SimpleDateFormat(DATE_PATTERN); - } - }; - - /* the dateformatter should be accessed with this function */ - private static SimpleDateFormat getDateFormatter() { - return mFormatObject.get(); - } + private static FastDateFormat df = FastDateFormat.getInstance(DATE_PATTERN); public static final boolean ON = false; public static final int OBNOXIOUS = 1; @@ -146,9 +135,8 @@ public class Debug private static void outputTraceMessage(String t) { if (!TRACE_ON) return; - SimpleDateFormat d = getDateFormatter(); - if (mOut != null && d != null) { - mOut.println("[" + d.format(new Date()) + "][" + Thread.currentThread().getName() + "]: " + t); + if (mOut != null) { + mOut.println("[" + df.format(new Date()) + "][" + Thread.currentThread().getName() + "]: " + t); mOut.flush(); } } diff --git a/base/server/test/com/netscape/cmscore/app/CMSEngineDefaultStub.java b/base/server/test/com/netscape/cmscore/app/CMSEngineDefaultStub.java index 0b7518d81c516b2073cc54ae69a9b9fb0262c669..404832c0db799681c15039b62082da84cc0c9756 100644 --- a/base/server/test/com/netscape/cmscore/app/CMSEngineDefaultStub.java +++ b/base/server/test/com/netscape/cmscore/app/CMSEngineDefaultStub.java @@ -343,16 +343,16 @@ public class CMSEngineDefaultStub implements ICMSEngine { return null; } - public ILdapConnFactory getLdapBoundConnFactory() throws ELdapException { + public ILdapConnFactory getLdapBoundConnFactory(String id) throws ELdapException { return null; } - public LDAPConnection getBoundConnection(String host, int port, int version, LDAPSSLSocketFactoryExt fac, + public LDAPConnection getBoundConnection(String id, String host, int port, int version, LDAPSSLSocketFactoryExt fac, String bindDN, String bindPW) throws LDAPException { return null; } - public ILdapConnFactory getLdapAnonConnFactory() throws ELdapException { + public ILdapConnFactory getLdapAnonConnFactory(String id) throws ELdapException { return null; } -- 1.9.3