From a7c4220b31f1ea7736ed98bfadbba3443e5528e8 Mon Sep 17 00:00:00 2001
From: Rich Megginson <rmeggins@redhat.com>
Date: Wed, 13 Feb 2013 07:18:27 -0700
Subject: [PATCH 1/5] Ticket #565 - turbo mode and replication - allow disable of turbo mode

https://fedorahosted.org/389/ticket/565
Reviewed by: ???
Branch: master
Fix Description: Add nsslapd-enable-turbo-mode configuration attribute.
This allows the user to disable turbo mode.  The default for this setting
is on.
Platforms tested: RHEL6 x86_64
Flag Day: no
Doc impact: yes - document new config parameter
---
 ldap/servers/slapd/connection.c |   16 ++++++++++------
 ldap/servers/slapd/libglobs.c   |   34 +++++++++++++++++++++++++++++++++-
 ldap/servers/slapd/proto-slap.h |    2 ++
 ldap/servers/slapd/slap.h       |    2 ++
 4 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/ldap/servers/slapd/connection.c b/ldap/servers/slapd/connection.c
index 7750bfe..26ac20b 100644
--- a/ldap/servers/slapd/connection.c
+++ b/ldap/servers/slapd/connection.c
@@ -2253,12 +2253,16 @@ connection_threadmain()
 #if defined(DB_PERF_TURBO)
 		/* If it's been a while since we last did it ... */
 		if (curtime - conn->c_private->previous_count_check_time > CONN_TURBO_CHECK_INTERVAL) {
-			int new_turbo_flag = 0;
-			/* Check the connection's activity level */
-			connection_check_activity_level(conn);
-			/* And if appropriate, change into or out of turbo mode */
-			connection_enter_leave_turbo(conn,thread_turbo_flag,&new_turbo_flag);
-			thread_turbo_flag = new_turbo_flag;
+			if (config_get_enable_turbo_mode()) {
+				int new_turbo_flag = 0;
+				/* Check the connection's activity level */
+				connection_check_activity_level(conn);
+				/* And if appropriate, change into or out of turbo mode */
+				connection_enter_leave_turbo(conn,thread_turbo_flag,&new_turbo_flag);
+				thread_turbo_flag = new_turbo_flag;
+			} else {
+				thread_turbo_flag = 0;
+			}
 		}
 
 		/* turn off turbo mode immediately if any pb waiting in global queue */
diff --git a/ldap/servers/slapd/libglobs.c b/ldap/servers/slapd/libglobs.c
index b7bc999..fbbb4f9 100644
--- a/ldap/servers/slapd/libglobs.c
+++ b/ldap/servers/slapd/libglobs.c
@@ -256,6 +256,7 @@ slapi_onoff_t init_disk_preserve_logging;
 slapi_onoff_t init_ndn_cache_enabled;
 slapi_onoff_t init_sasl_mapping_fallback;
 slapi_onoff_t init_return_orig_type;
+slapi_onoff_t init_enable_turbo_mode;
 #ifdef MEMPOOL_EXPERIMENTAL
 slapi_onoff_t init_mempool_switch;
 #endif
@@ -1043,7 +1044,11 @@ static struct config_get_and_set {
 	{CONFIG_SEARCH_RETURN_ORIGINAL_TYPE, config_set_return_orig_type_switch,
 		NULL, 0,
 		(void**)&global_slapdFrontendConfig.return_orig_type,
-		CONFIG_ON_OFF, (ConfigGetFunc)config_get_return_orig_type_switch, &init_return_orig_type}
+		CONFIG_ON_OFF, (ConfigGetFunc)config_get_return_orig_type_switch, &init_return_orig_type},
+	{CONFIG_ENABLE_TURBO_MODE, config_set_enable_turbo_mode,
+	        NULL, 0,
+	        (void**)&global_slapdFrontendConfig.enable_turbo_mode,
+	        CONFIG_ON_OFF, (ConfigGetFunc)config_get_enable_turbo_mode, &init_enable_turbo_mode}
 #ifdef MEMPOOL_EXPERIMENTAL
 	,{CONFIG_MEMPOOL_SWITCH_ATTRIBUTE, config_set_mempool_switch,
 		NULL, 0,
@@ -1478,6 +1483,7 @@ FrontendConfig_init () {
   cfg->sasl_max_bufsize = SLAPD_DEFAULT_SASL_MAXBUFSIZE;
   cfg->unhashed_pw_switch = SLAPD_UNHASHED_PW_ON;
   init_return_orig_type = cfg->return_orig_type = LDAP_OFF;
+  init_enable_turbo_mode = cfg->enable_turbo_mode = LDAP_ON;
 
 #ifdef MEMPOOL_EXPERIMENTAL
   init_mempool_switch = cfg->mempool_switch = LDAP_ON;
@@ -6886,6 +6892,19 @@ config_set_unhashed_pw_switch(const char *attrname, char *value,
     }
 
     CFG_UNLOCK_WRITE(slapdFrontendConfig);
+
+    return retVal;
+}
+
+int
+config_get_enable_turbo_mode(void)
+{
+    int retVal;
+    slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
+    CFG_ONOFF_LOCK_READ(slapdFrontendConfig);
+    retVal = (int)slapdFrontendConfig->enable_turbo_mode;
+    CFG_ONOFF_UNLOCK_READ(slapdFrontendConfig);
+
     return retVal;
 }
 
@@ -6907,6 +6926,19 @@ config_get_unhashed_pw_switch()
     return retVal;
 }
 
+int
+config_set_enable_turbo_mode( const char *attrname, char *value,
+                            char *errorbuf, int apply )
+{
+    int retVal = LDAP_SUCCESS;
+    slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
+
+    retVal = config_set_onoff(attrname, value,
+                              &(slapdFrontendConfig->enable_turbo_mode),
+                              errorbuf, apply);
+    return retVal;
+}
+
 /*
  * This function is intended to be used from the dse code modify callback.  It
  * is "optimized" for that case because it takes a berval** of values, which is
diff --git a/ldap/servers/slapd/proto-slap.h b/ldap/servers/slapd/proto-slap.h
index 53d3569..4077daa 100644
--- a/ldap/servers/slapd/proto-slap.h
+++ b/ldap/servers/slapd/proto-slap.h
@@ -567,6 +567,8 @@ int config_set_sasl_mapping_fallback(const char *attrname, char *value, char *er
 int config_get_sasl_mapping_fallback();
 int config_get_unhashed_pw_switch();
 int config_get_sasl_maxbufsize();
+int config_get_enable_turbo_mode();
+int config_set_enable_turbo_mode(const char *attrname, char *value, char *errorbuf, int apply);
 
 PLHashNumber hashNocaseString(const void *key);
 PRIntn hashNocaseCompare(const void *v1, const void *v2);
diff --git a/ldap/servers/slapd/slap.h b/ldap/servers/slapd/slap.h
index a19e192..c8381da 100644
--- a/ldap/servers/slapd/slap.h
+++ b/ldap/servers/slapd/slap.h
@@ -2075,6 +2075,7 @@ typedef struct _slapdEntryPoints {
 #define CONFIG_SASL_MAPPING_FALLBACK "nsslapd-sasl-mapping-fallback"
 #define CONFIG_SASL_MAXBUFSIZE "nsslapd-sasl-max-buffer-size"
 #define CONFIG_SEARCH_RETURN_ORIGINAL_TYPE "nsslapd-search-return-original-type-switch"
+#define CONFIG_ENABLE_TURBO_MODE "nsslapd-enable-turbo-mode"
 
 #ifdef MEMPOOL_EXPERIMENTAL
 #define CONFIG_MEMPOOL_SWITCH_ATTRIBUTE "nsslapd-mempool"
@@ -2317,6 +2318,7 @@ typedef struct _slapdFrontendConfig {
   Slapi_Counter *ignore_vattrs;
   Slapi_Counter *sasl_mapping_fallback;
   slapi_onoff_t unhashed_pw_switch;	/* switch to on/off/nolog unhashed pw */
+  slapi_onoff_t enable_turbo_mode;
 } slapdFrontendConfig_t;
 
 /* possible values for slapdFrontendConfig_t.schemareplace */
-- 
1.7.1

