[Pki-devel] [PATCH] 613 Fixed thread leaks during shutdown.

Endi Sukma Dewata edewata at redhat.com
Thu Jun 18 22:28:06 UTC 2015


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

-- 
Endi S. Dewata
-------------- next part --------------
From 1e6df72e52ee8a643cb85730f0e512b0cd5d73c4 Mon Sep 17 00:00:00 2001
From: "Endi S. Dewata" <edewata at redhat.com>
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<String> 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 {
      * </ul>
      */
     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<SimpleDateFormat> mFormatObject = new ThreadLocal<SimpleDateFormat>() {
-        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



More information about the Pki-devel mailing list