andykimpe / rpms / 389-ds-base

Forked from rpms/389-ds-base 4 months ago
Clone
Blob Blame History Raw
From 2195ce2313fcf78a2ebff6525e399d1267665c2b Mon Sep 17 00:00:00 2001
From: Noriko Hosoi <nhosoi@redhat.com>
Date: Fri, 9 Jan 2015 16:50:12 -0800
Subject: [PATCH 300/305] Ticket #47934 - nsslapd-db-locks modify not taking
 into account.

Description: Updating the value of nsslapd-db-locks was not detected
at the server's startup time.  As suggested in
    https://fedorahosted.org/389/ticket/47934#comment:1
the value is stored in the guardian file as "locks:20000" at the shut-
down time.  When restarting the server, the nsslapd-db-locks value in
cn=config,cn=ldbm database,cn=plugins,cn=config is compared with the
stored value (20000, in this example) and if they don't match, the
lock table is recreated.  The change is logged in the error log:
    [...] - resizing max db lock count: 20000 -> 30000

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

Reviewed by mreynolds@redhat.com (Thank you, Mark!!)

(cherry picked from commit f4437defacf8812c5f95869147a99f8412dc4a07)
(cherry picked from commit dc4185ea40e1f1b8527a67a0c854fcc29b8bafe7)
(cherry picked from commit d1e4698530868532bd472c70ca8ccc4a317b4199)
(cherry picked from commit 86b728f88fe0d35f403c012166f98c3a0e69ad32)
(cherry picked from commit 295cf31602797b09a3b7a7c7e8d2feb71017522b)
---
 ldap/servers/slapd/back-ldbm/dblayer.c     | 33 ++++++++++++++++++++++--------
 ldap/servers/slapd/back-ldbm/dblayer.h     |  2 ++
 ldap/servers/slapd/back-ldbm/ldbm_config.c |  4 ++--
 3 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/ldap/servers/slapd/back-ldbm/dblayer.c b/ldap/servers/slapd/back-ldbm/dblayer.c
index 6f66a75..b25fccb 100644
--- a/ldap/servers/slapd/back-ldbm/dblayer.c
+++ b/ldap/servers/slapd/back-ldbm/dblayer.c
@@ -1069,6 +1069,8 @@ static void dblayer_dump_config_tracing(dblayer_private *priv)
     LDAPDebug(LDAP_DEBUG_TRACE,"private import mem=%d\n",priv->dblayer_private_import_mem,0,0);
     LDAPDebug(LDAP_DEBUG_TRACE,"shm_key=%ld\n",priv->dblayer_shm_key,0,0);
     LDAPDebug(LDAP_DEBUG_TRACE,"lockdown=%d\n",priv->dblayer_lockdown,0,0);
+    LDAPDebug(LDAP_DEBUG_TRACE,"locks=%d\n",priv->dblayer_lock_config,0,0);
+    LDAPDebug(LDAP_DEBUG_TRACE,"previous_locks=%d\n",priv->dblayer_previous_lock_config,0,0);
     LDAPDebug(LDAP_DEBUG_TRACE,"tx_max=%d\n",priv->dblayer_tx_max,0,0);
 }
 
@@ -1597,13 +1599,24 @@ dblayer_start(struct ldbminfo *li, int dbmode)
 
     /* Is the cache being re-sized ? (If we're just doing an archive or export,
      * we don't care if the cache is being re-sized) */
-    if ( (priv->dblayer_previous_cachesize || priv->dblayer_previous_ncache) &&
-         ((priv->dblayer_cachesize != priv->dblayer_previous_cachesize) ||
-          (priv->dblayer_ncache != priv->dblayer_previous_ncache)) &&
-         !(dbmode & (DBLAYER_ARCHIVE_MODE|DBLAYER_EXPORT_MODE)) ) {
-         LDAPDebug(LDAP_DEBUG_ANY,
-                      "I'm resizing my cache now...cache was %lu and is now %lu\n",
+    if ((priv->dblayer_previous_cachesize || priv->dblayer_previous_ncache) &&
+        (priv->dblayer_previous_lock_config) &&
+        ((priv->dblayer_cachesize != priv->dblayer_previous_cachesize) ||
+         (priv->dblayer_ncache != priv->dblayer_previous_ncache) ||
+         (priv->dblayer_lock_config != priv->dblayer_previous_lock_config)) &&
+        !(dbmode & (DBLAYER_ARCHIVE_MODE|DBLAYER_EXPORT_MODE)) ) {
+        if (priv->dblayer_cachesize != priv->dblayer_previous_cachesize) {
+            LDAPDebug(LDAP_DEBUG_ANY, "resizing db cache size: %lu -> %lu\n",
                       priv->dblayer_previous_cachesize, priv->dblayer_cachesize, 0);
+        }
+        if (priv->dblayer_ncache != priv->dblayer_previous_ncache) {
+            LDAPDebug(LDAP_DEBUG_ANY, "resizing db cache count: %d -> %d\n",
+                      priv->dblayer_previous_ncache, priv->dblayer_ncache, 0);
+        }
+        if (priv->dblayer_lock_config != priv->dblayer_previous_lock_config) {
+            LDAPDebug(LDAP_DEBUG_ANY, "resizing max db lock count: %d -> %d\n",
+                      priv->dblayer_previous_lock_config, priv->dblayer_lock_config, 0);
+        }
         dblayer_reset_env(li);
         /*
          * Once pEnv->remove (via dblayer_reset_env) has been called,
@@ -4786,8 +4799,8 @@ static int commit_good_database(dblayer_private *priv)
             filename, PR_GetError(), slapd_pr_strerror(PR_GetError()) );
         return -1;
     } 
-    PR_snprintf(line,sizeof(line),"cachesize:%lu\nncache:%d\nversion:%d\n",
-            priv->dblayer_cachesize, priv->dblayer_ncache, DB_VERSION_MAJOR);
+    PR_snprintf(line,sizeof(line),"cachesize:%lu\nncache:%d\nversion:%d\nlocks:%d\n",
+            (long unsigned int)priv->dblayer_cachesize, priv->dblayer_ncache, DB_VERSION_MAJOR, priv->dblayer_lock_config);
     num_bytes = strlen(line);
     return_value = slapi_write_buffer(prfd, line, num_bytes);
     if (return_value != num_bytes)
@@ -4833,6 +4846,7 @@ static int read_metadata(struct ldbminfo *li)
      * priv->dblayer_recovery_required = 0; */
     priv->dblayer_previous_cachesize = 0;
     priv->dblayer_previous_ncache = 0;
+    priv->dblayer_previous_lock_config = 0;
     /* Open the guard file and read stuff, then delete it */
     PR_snprintf(filename,sizeof(filename),"%s/guardian",priv->dblayer_home_directory);
 
@@ -4902,6 +4916,9 @@ static int read_metadata(struct ldbminfo *li)
                 number = atoi(value);
                 priv->dblayer_previous_ncache = number;
             } else if (0 == strcmp("version",attribute)) {
+            } else if (0 == strcmp("locks",attribute)) {
+                number = atoi(value);
+                priv->dblayer_previous_lock_config = number;
             }
             if (NULL == nextline || '\0' == *nextline) {
                 /* Nothing more to read */
diff --git a/ldap/servers/slapd/back-ldbm/dblayer.h b/ldap/servers/slapd/back-ldbm/dblayer.h
index 4ff9d53..3e4f4d8 100644
--- a/ldap/servers/slapd/back-ldbm/dblayer.h
+++ b/ldap/servers/slapd/back-ldbm/dblayer.h
@@ -178,6 +178,8 @@ struct dblayer_private
     PRCondVar *thread_count_cv;     /* condition variable for housekeeping thread shutdown */
     int dblayer_lockdown;           /* use DB_LOCKDOWN */
     int dblayer_lock_config;
+    int dblayer_previous_lock_config;/* Max lock count when we last shut down--
+                                      * used to determine if we delete the mpool */
     u_int32_t dblayer_deadlock_policy;    /* i.e. the atype to DB_ENV->lock_detect in deadlock_threadmain */
 };
 
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_config.c b/ldap/servers/slapd/back-ldbm/ldbm_config.c
index 11aa42d..462b0a1 100644
--- a/ldap/servers/slapd/back-ldbm/ldbm_config.c
+++ b/ldap/servers/slapd/back-ldbm/ldbm_config.c
@@ -948,7 +948,7 @@ static int ldbm_config_db_lock_set(void *arg, void *value, char *errorbuf, int p
     if (apply) {
         if (CONFIG_PHASE_RUNNING == phase) {
             li->li_dblayer_private->dblayer_lock_config = val;
-            LDAPDebug(LDAP_DEBUG_ANY, "New db cache size will not take affect until the server is restarted\n", 0, 0, 0);
+            LDAPDebug(LDAP_DEBUG_ANY, "New db max lock count will not take affect until the server is restarted\n", 0, 0, 0);
         } else {
             li->li_dblayer_private->dblayer_lock_config = val;
         }
@@ -1390,7 +1390,7 @@ static config_info ldbm_config[] = {
     {CONFIG_DB_VERBOSE, CONFIG_TYPE_ONOFF, "off", &ldbm_config_db_verbose_get, &ldbm_config_db_verbose_set, 0},
     {CONFIG_DB_DEBUG, CONFIG_TYPE_ONOFF, "on", &ldbm_config_db_debug_get, &ldbm_config_db_debug_set, 0},
     {CONFIG_DB_NAMED_REGIONS, CONFIG_TYPE_ONOFF, "off", &ldbm_config_db_named_regions_get, &ldbm_config_db_named_regions_set, 0},
-    {CONFIG_DB_LOCK, CONFIG_TYPE_INT, "10000", &ldbm_config_db_lock_get, &ldbm_config_db_lock_set, 0},
+    {CONFIG_DB_LOCK, CONFIG_TYPE_INT, "10000", &ldbm_config_db_lock_get, &ldbm_config_db_lock_set, CONFIG_FLAG_ALWAYS_SHOW},
     {CONFIG_DB_PRIVATE_MEM, CONFIG_TYPE_ONOFF, "off", &ldbm_config_db_private_mem_get, &ldbm_config_db_private_mem_set, 0},
     {CONFIG_DB_PRIVATE_IMPORT_MEM, CONFIG_TYPE_ONOFF, "on", &ldbm_config_db_private_import_mem_get, &ldbm_config_db_private_import_mem_set, CONFIG_FLAG_ALWAYS_SHOW|CONFIG_FLAG_ALLOW_RUNNING_CHANGE},
     {CONDIF_DB_ONLINE_IMPORT_ENCRYPT, CONFIG_TYPE_ONOFF, "on", &ldbm_config_db_online_import_encrypt_get, &ldbm_config_db_online_import_encrypt_set, 0},
-- 
1.9.3