andykimpe / rpms / 389-ds-base

Forked from rpms/389-ds-base 5 months ago
Clone
Blob Blame History Raw
From 5b5f57e8f008a342d82c7aa2d6a6574df7a3f14e Mon Sep 17 00:00:00 2001
From: Mark Reynolds <mreynolds@redhat.com>
Date: Thu, 6 Jun 2013 15:30:41 -0400
Subject: [PATCH] Ticket 47385 - DS not shutting down when disk monitoring threshold is reached

Bug Description:  If verbose logging is enabled, it fails to correctly
                  identify that the logging was disabled, and it gets
                  stuck in an endless loop - never shutting the server down.

                  Also, whe the server does shutdown due to a disk full, the
                  pid file is not removed.

Fix Description:  Check for the two possible error log levels that indicate
                  verbose logging is disabled.  There were also logic errors
                  when determining if it was ok to disable access/audit logging,
                  and if to delete rotated logs.

                  Also removed the "nsslapd-disk-monitoring-preserve-logging"
                  setting, as it really didn't served a purpose because it was
                  basically the same as "nsslapd-disk-monitoring-logging-critical".

                  Lastly, if the server is being shutdown from a "disk full"
                  condition, then we need to manually remove the pidfile.

https://fedorahosted.org/389/ticket/47385

Reviewed by: Noriko(Thanks!)
---
 ldap/servers/slapd/daemon.c     |   31 ++++++++++++++++++++-----------
 ldap/servers/slapd/libglobs.c   |   28 ----------------------------
 ldap/servers/slapd/proto-slap.h |    2 --
 ldap/servers/slapd/slap.h       |    2 --
 4 files changed, 20 insertions(+), 43 deletions(-)

diff --git a/ldap/servers/slapd/daemon.c b/ldap/servers/slapd/daemon.c
index b611f5c..5cc643a 100644
--- a/ldap/servers/slapd/daemon.c
+++ b/ldap/servers/slapd/daemon.c
@@ -711,7 +711,6 @@ disk_monitoring_thread(void *nothing)
     time_t now = 0;
     int deleted_rotated_logs = 0;
     int logging_critical = 0;
-    int preserve_logging = 0;
     int passed_threshold = 0;
     int verbose_logging = 0;
     int using_accesslog = 0;
@@ -741,7 +740,6 @@ disk_monitoring_thread(void *nothing)
          *  Get the config settings, as they could have changed
          */
         logging_critical = config_get_disk_logging_critical();
-        preserve_logging = config_get_disk_preserve_logging();
         grace_period = 60 * config_get_disk_grace_period(); /* convert it to seconds */
         verbose_logging = config_get_errorlog_level();
         threshold = config_get_disk_threshold();
@@ -798,18 +796,21 @@ disk_monitoring_thread(void *nothing)
         }
         /*
          *  If we are low, see if we are using verbose error logging, and turn it off
+         *  if logging is not critical
          */
-        if(verbose_logging){
+        if(verbose_logging != 0 && verbose_logging != LDAP_DEBUG_ANY){
             LDAPDebug(LDAP_DEBUG_ANY, "Disk space is low on disk (%s), remaining space: %d Kb, "
-                "setting error loglevel to zero.\n", dirstr, (disk_space / 1024), 0);
-            config_set_errorlog_level(CONFIG_LOGLEVEL_ATTRIBUTE, 0, errorbuf, CONFIG_APPLY);
+                "temporarily setting error loglevel to zero.\n", dirstr,
+                (disk_space / 1024), 0);
+            /* Setting the log level back to zero, actually sets the value to LDAP_DEBUG_ANY */
+            config_set_errorlog_level(CONFIG_LOGLEVEL_ATTRIBUTE, "0", errorbuf, CONFIG_APPLY);
             continue;
         }
         /*
          *  If we are low, there's no verbose logging, logs are not critical, then disable the
          *  access/audit logs, log another error, and continue.
          */
-        if(!logs_disabled && (!preserve_logging || !logging_critical)){
+        if(!logs_disabled && !logging_critical){
             if(disk_space < previous_mark){
                 LDAPDebug(LDAP_DEBUG_ANY, "Disk space is too low on disk (%s), remaining space: %d Kb, "
                     "disabling access and audit logging.\n", dirstr, (disk_space / 1024), 0);
@@ -823,7 +824,7 @@ disk_monitoring_thread(void *nothing)
          *  If we are low, we turned off verbose logging, logs are not critical, and we disabled
          *  access/audit logging, then delete the rotated logs, log another error, and continue.
          */
-        if(!deleted_rotated_logs && (!preserve_logging || !logging_critical)){
+        if(!deleted_rotated_logs && !logging_critical){
             if(disk_space < previous_mark){
                 LDAPDebug(LDAP_DEBUG_ANY, "Disk space is too low on disk (%s), remaining space: %d Kb, "
                     "deleting rotated logs.\n", dirstr, (disk_space / 1024), 0);
@@ -872,10 +873,10 @@ disk_monitoring_thread(void *nothing)
                      */
                     LDAPDebug(LDAP_DEBUG_ANY, "Available disk space is now acceptable (%d bytes).  Aborting"
                                               " shutdown, and restoring the log settings.\n",disk_space,0,0);
-                    if(!preserve_logging && using_accesslog){
+                    if(logs_disabled && using_accesslog){
                         config_set_accesslog_enabled(LOGGING_ON);
                     }
-                    if(!preserve_logging && using_auditlog){
+                    if(logs_disabled && using_auditlog){
                         config_set_auditlog_enabled(LOGGING_ON);
                     }
                     deleted_rotated_logs = 0;
@@ -892,7 +893,7 @@ disk_monitoring_thread(void *nothing)
                      */
                     LDAPDebug(LDAP_DEBUG_ANY, "Disk space is critically low on disk (%s), remaining space: %d Kb."
                         "  Signaling slapd for shutdown...\n", dirstr, (disk_space / 1024), 0);
-                    g_set_shutdown( SLAPI_SHUTDOWN_EXIT );
+                    g_set_shutdown( SLAPI_SHUTDOWN_DISKFULL );
                     return;
                 }
                 time(&now);
@@ -909,7 +910,8 @@ disk_monitoring_thread(void *nothing)
              */
             LDAPDebug(LDAP_DEBUG_ANY, "Disk space is still too low (%d Kb).  Signaling slapd for shutdown...\n",
                 (disk_space / 1024), 0, 0);
-            g_set_shutdown( SLAPI_SHUTDOWN_EXIT );
+            g_set_shutdown( SLAPI_SHUTDOWN_DISKFULL );
+
             return;
         }
     }
@@ -1379,6 +1381,13 @@ void slapd_daemon( daemon_ports_t *ports )
 
 #ifdef _WIN32
 	WSACleanup();
+#else
+	if ( g_get_shutdown() == SLAPI_SHUTDOWN_DISKFULL ){
+		/* This is a server-induced shutdown, we need to manually remove the pid file */
+		if( unlink(get_pid_file()) ){
+			LDAPDebug( LDAP_DEBUG_ANY, "Failed to remove pid file %s\n", get_pid_file(), 0, 0 );
+		}
+	}
 #endif
 }
 
diff --git a/ldap/servers/slapd/libglobs.c b/ldap/servers/slapd/libglobs.c
index 3226ede..02e9df1 100644
--- a/ldap/servers/slapd/libglobs.c
+++ b/ldap/servers/slapd/libglobs.c
@@ -687,10 +687,6 @@ static struct config_get_and_set {
 		NULL, 0,
 		(void**)&global_slapdFrontendConfig.disk_logging_critical,
 		CONFIG_ON_OFF, (ConfigGetFunc)config_get_disk_logging_critical},
-	{CONFIG_DISK_PRESERVE_LOGGING, config_set_disk_preserve_logging,
-		NULL, 0,
-		(void**)&global_slapdFrontendConfig.disk_preserve_logging,
-		CONFIG_ON_OFF, (ConfigGetFunc)config_get_disk_preserve_logging},
 #ifdef MEMPOOL_EXPERIMENTAL
 	,{CONFIG_MEMPOOL_SWITCH_ATTRIBUTE, config_set_mempool_switch,
 		NULL, 0,
@@ -1090,7 +1086,6 @@ FrontendConfig_init () {
   cfg->disk_monitoring = LDAP_OFF;
   cfg->disk_threshold = 2097152;  /* 2 mb */
   cfg->disk_grace_period = 60; /* 1 hour */
-  cfg->disk_preserve_logging = LDAP_OFF;
   cfg->disk_logging_critical = LDAP_OFF;
 
 #ifdef MEMPOOL_EXPERIMENTAL
@@ -1259,17 +1254,6 @@ config_set_disk_threshold( const char *attrname, char *value, char *errorbuf, in
 }
 
 int
-config_set_disk_preserve_logging( const char *attrname, char *value, char *errorbuf, int apply )
-{
-    slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
-    int retVal = LDAP_SUCCESS;
-
-    retVal = config_set_onoff ( attrname, value, &(slapdFrontendConfig->disk_preserve_logging),
-                                errorbuf, apply);
-    return retVal;
-}
-
-int
 config_set_disk_logging_critical( const char *attrname, char *value, char *errorbuf, int apply )
 {
     slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
@@ -3742,18 +3726,6 @@ config_get_disk_monitoring(){
 }
 
 int
-config_get_disk_preserve_logging(){
-    slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
-    int retVal;
-
-    CFG_LOCK_READ(slapdFrontendConfig);
-    retVal = slapdFrontendConfig->disk_preserve_logging;
-    CFG_UNLOCK_READ(slapdFrontendConfig);
-
-    return retVal;
-}
-
-int
 config_get_disk_logging_critical(){
     slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
     int retVal;
diff --git a/ldap/servers/slapd/proto-slap.h b/ldap/servers/slapd/proto-slap.h
index 5112471..17b1e99 100644
--- a/ldap/servers/slapd/proto-slap.h
+++ b/ldap/servers/slapd/proto-slap.h
@@ -388,7 +388,6 @@ int config_set_default_naming_context( const char *attrname, char *value, char *
 int config_set_disk_monitoring( const char *attrname, char *value, char *errorbuf, int apply );
 int config_set_disk_threshold( const char *attrname, char *value, char *errorbuf, int apply );
 int config_set_disk_grace_period( const char *attrname, char *value, char *errorbuf, int apply );
-int config_set_disk_preserve_logging( const char *attrname, char *value, char *errorbuf, int apply );
 int config_set_disk_logging_critical( const char *attrname, char *value, char *errorbuf, int apply );
 int config_set_auditlog_unhashed_pw(const char *attrname, char *value, char *errorbuf, int apply);
 
@@ -544,7 +543,6 @@ int config_get_accesslog_logging_enabled();
 int config_get_disk_monitoring();
 long config_get_disk_threshold();
 int config_get_disk_grace_period();
-int config_get_disk_preserve_logging();
 int config_get_disk_logging_critical();
 
 int is_abspath(const char *);
diff --git a/ldap/servers/slapd/slap.h b/ldap/servers/slapd/slap.h
index eea025a..e0b261d 100644
--- a/ldap/servers/slapd/slap.h
+++ b/ldap/servers/slapd/slap.h
@@ -2001,7 +2001,6 @@ typedef struct _slapdEntryPoints {
 #define CONFIG_DISK_MONITORING "nsslapd-disk-monitoring"
 #define CONFIG_DISK_THRESHOLD "nsslapd-disk-monitoring-threshold"
 #define CONFIG_DISK_GRACE_PERIOD "nsslapd-disk-monitoring-grace-period"
-#define CONFIG_DISK_PRESERVE_LOGGING "nsslapd-disk-monitoring-preserve-logging"
 #define CONFIG_DISK_LOGGING_CRITICAL "nsslapd-disk-monitoring-logging-critical"
 
 #ifdef MEMPOOL_EXPERIMENTAL
@@ -2236,7 +2235,6 @@ typedef struct _slapdFrontendConfig {
   int disk_monitoring;
   int disk_threshold;
   int disk_grace_period;
-  int disk_preserve_logging;
   int disk_logging_critical;
 } slapdFrontendConfig_t;
 
-- 
1.7.1