Blame SOURCES/0052-Ticket-49257-Reject-nsslapd-cachememsize-nsslapd-cac.patch

6f51e1
From 0f04c8e7c1219940baf0ae9c1bcb2464ddf079df Mon Sep 17 00:00:00 2001
6f51e1
From: Mark Reynolds <mreynolds@redhat.com>
6f51e1
Date: Tue, 16 May 2017 13:19:43 -0400
6f51e1
Subject: [PATCH] Ticket 49257 - Reject nsslapd-cachememsize &
6f51e1
 nsslapd-cachesize when nsslapd-cache-autosize is set
6f51e1
6f51e1
Description:  We need to also reject entry cache changes when cache autosizing is being used.
6f51e1
6f51e1
              I also found out that we were not registering the ldbm instance callbacks at startup.
6f51e1
              So all those functions were only used when creating an instance, and not after it was
6f51e1
              started.
6f51e1
6f51e1
https://pagure.io/389-ds-base/issue/49257
6f51e1
6f51e1
Reviewed by: tbordaz(Thanks!)
6f51e1
---
6f51e1
 ldap/servers/slapd/back-ldbm/instance.c            | 19 +++++++++----
6f51e1
 .../servers/slapd/back-ldbm/ldbm_instance_config.c | 32 ++++++++++++++++++++--
6f51e1
 ldap/servers/slapd/back-ldbm/start.c               |  2 +-
6f51e1
 3 files changed, 44 insertions(+), 9 deletions(-)
6f51e1
6f51e1
diff --git a/ldap/servers/slapd/back-ldbm/instance.c b/ldap/servers/slapd/back-ldbm/instance.c
6f51e1
index f79d048..8b38644 100644
6f51e1
--- a/ldap/servers/slapd/back-ldbm/instance.c
6f51e1
+++ b/ldap/servers/slapd/back-ldbm/instance.c
6f51e1
@@ -302,12 +302,19 @@ ldbm_instance_startall(struct ldbminfo *li)
6f51e1
         inst = (ldbm_instance *) object_get_data(inst_obj);
6f51e1
         ldbm_instance_set_flags(inst);
6f51e1
         rc1 = ldbm_instance_start(inst->inst_be);
6f51e1
-    if (rc1 != 0) {
6f51e1
-        rc = rc1;
6f51e1
-    } else {
6f51e1
-        vlv_init(inst);
6f51e1
-        slapi_mtn_be_started(inst->inst_be);
6f51e1
-    }
6f51e1
+        if (rc1 != 0) {
6f51e1
+            rc = rc1;
6f51e1
+        } else {
6f51e1
+            if(ldbm_instance_config_load_dse_info(inst) != 0){
6f51e1
+                slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_startall",
6f51e1
+                    "Loading database instance configuration failed for (%s)\n",
6f51e1
+                    inst->inst_name);
6f51e1
+                rc = -1;
6f51e1
+            } else {
6f51e1
+                vlv_init(inst);
6f51e1
+                slapi_mtn_be_started(inst->inst_be);
6f51e1
+            }
6f51e1
+        }
6f51e1
         inst_obj = objset_next_obj(li->li_instance_set, inst_obj);
6f51e1
     }
6f51e1
 
6f51e1
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c b/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c
6f51e1
index 55f1887..49a6cac 100644
6f51e1
--- a/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c
6f51e1
+++ b/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c
6f51e1
@@ -72,6 +72,18 @@ ldbm_instance_config_cachesize_set(void *arg, void *value, char *errorbuf, int p
6f51e1
     /* Do whatever we can to make sure the data is ok. */
6f51e1
 
6f51e1
     if (apply) {
6f51e1
+        if (CONFIG_PHASE_RUNNING == phase) {
6f51e1
+            if (val > 0 && inst->inst_li->li_cache_autosize) {
6f51e1
+                /* We are auto-tuning the cache, so this change would be overwritten - return an error */
6f51e1
+                slapi_create_errormsg(errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
6f51e1
+                    "Error: \"nsslapd-cachesize\" can not be updated while \"nsslapd-cache-autosize\" is set "
6f51e1
+                    "in \"cn=config,cn=ldbm database,cn=plugins,cn=config\".");
6f51e1
+                slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_config_cachesize_set",
6f51e1
+                    "\"nsslapd-cachesize\" can not be set while \"nsslapd-cache-autosize\" is set "
6f51e1
+                    "in \"cn=config,cn=ldbm database,cn=plugins,cn=config\".\n");
6f51e1
+                return LDAP_UNWILLING_TO_PERFORM;
6f51e1
+            }
6f51e1
+        }
6f51e1
         cache_set_max_entries(&(inst->inst_cache), val);
6f51e1
     }
6f51e1
 
6f51e1
@@ -87,7 +99,11 @@ ldbm_instance_config_cachememsize_get(void *arg)
6f51e1
 }
6f51e1
 
6f51e1
 static int 
6f51e1
-ldbm_instance_config_cachememsize_set(void *arg, void *value, char *errorbuf, int phase, int apply) 
6f51e1
+ldbm_instance_config_cachememsize_set(void *arg,
6f51e1
+                                      void *value,
6f51e1
+                                      char *errorbuf,
6f51e1
+                                      int phase,
6f51e1
+                                      int apply)
6f51e1
 {
6f51e1
     ldbm_instance *inst = (ldbm_instance *) arg;
6f51e1
     int retval = LDAP_SUCCESS;
6f51e1
@@ -107,6 +123,18 @@ ldbm_instance_config_cachememsize_set(void *arg, void *value, char *errorbuf, in
6f51e1
      */
6f51e1
 
6f51e1
     if (apply) {
6f51e1
+        if (CONFIG_PHASE_RUNNING == phase) {
6f51e1
+            if (val > 0 && inst->inst_li->li_cache_autosize) {
6f51e1
+                /* We are auto-tuning the cache, so this change would be overwritten - return an error */
6f51e1
+                slapi_create_errormsg(errorbuf, SLAPI_DSE_RETURNTEXT_SIZE,
6f51e1
+                    "Error: \"nsslapd-cachememsize\" can not be updated while \"nsslapd-cache-autosize\" is set "
6f51e1
+                    "in \"cn=config,cn=ldbm database,cn=plugins,cn=config\".");
6f51e1
+                slapi_log_err(SLAPI_LOG_ERR, "ldbm_instance_config_cachememsize_set",
6f51e1
+                    "\"nsslapd-cachememsize\" can not be set while \"nsslapd-cache-autosize\" is set "
6f51e1
+                    "in \"cn=config,cn=ldbm database,cn=plugins,cn=config\".\n");
6f51e1
+                return LDAP_UNWILLING_TO_PERFORM;
6f51e1
+            }
6f51e1
+        }
6f51e1
         if (val > inst->inst_cache.c_maxsize) {
6f51e1
             delta = val - inst->inst_cache.c_maxsize;
6f51e1
             delta_original = delta;
6f51e1
@@ -825,7 +853,7 @@ ldbm_instance_modify_config_entry_callback(Slapi_PBlock *pb, Slapi_Entry* entryB
6f51e1
                 continue;
6f51e1
             }
6f51e1
 
6f51e1
-        /* This assumes there is only one bval for this mod. */
6f51e1
+            /* This assumes there is only one bval for this mod. */
6f51e1
             if (mods[i]->mod_bvalues == NULL) {
6f51e1
                 /* This avoids the null pointer deref.
6f51e1
                  * In ldbm_config.c ldbm_config_set, it checks for the NULL.
6f51e1
diff --git a/ldap/servers/slapd/back-ldbm/start.c b/ldap/servers/slapd/back-ldbm/start.c
6f51e1
index 1834a19..d4e8bb8 100644
6f51e1
--- a/ldap/servers/slapd/back-ldbm/start.c
6f51e1
+++ b/ldap/servers/slapd/back-ldbm/start.c
6f51e1
@@ -169,7 +169,7 @@ ldbm_back_start_autotune(struct ldbminfo *li) {
6f51e1
     }
6f51e1
 
6f51e1
     slapi_log_err(SLAPI_LOG_NOTICE, "ldbm_back_start", "found %luk physical memory\n", mi->system_total_bytes / 1024);
6f51e1
-    slapi_log_err(SLAPI_LOG_NOTICE, "ldbm_back_start", "found %luk avaliable\n", mi->system_available_bytes / 1024);
6f51e1
+    slapi_log_err(SLAPI_LOG_NOTICE, "ldbm_back_start", "found %luk available\n", mi->system_available_bytes / 1024);
6f51e1
 
6f51e1
     /* We've now calculated the autotuning values. Do we need to apply it?
6f51e1
      * we use the logic of "if size is 0, or autosize is > 0. This way three
6f51e1
-- 
6f51e1
2.9.4
6f51e1