ldap/servers/slapd/back-ldbm/ldbm_search.c | 5 +++++
ldap/servers/slapd/backend.c | 11 ++++++++---
ldap/servers/slapd/slapi-plugin.h | 1 +
3 files changed, 14 insertions(+), 3 deletions(-)
New commits:
commit caddfa2d0d16357b41bf6ccccd0d8b655ae60b2a
Author: Noriko Hosoi <nhosoi(a)redhat.com>
Date: Thu Aug 14 17:54:30 2014 -0700
Ticket #47874 - Performance degradation with scope ONE after some load
Bug Description: Backend has a bit to indicate "should not bypass
the filter test". It's set if one of the search results is ALLID
in idl_intersection. Once the flag is set, it's never been unset.
It makes the following one level searches slow down.
Fix Description: Introduced slapi_be_unset_flag and unset the bit
at the end of every search.
https://fedorahosted.org/389/ticket/47874
Reviewed by rmeggins(a)redhat.com (Thank you, Rich!!)
(cherry picked from commit 8e1345ab9276d1cf9c9ac2cbd858c398235ef5ce)
(cherry picked from commit 3ff6d520ae0a15f74dc57122837627b5b73de629)
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_search.c
b/ldap/servers/slapd/back-ldbm/ldbm_search.c
index 8793a0b..dcb1490 100644
--- a/ldap/servers/slapd/back-ldbm/ldbm_search.c
+++ b/ldap/servers/slapd/back-ldbm/ldbm_search.c
@@ -181,6 +181,11 @@ ldbm_back_search_cleanup(Slapi_PBlock *pb,
slapi_pblock_get( pb, SLAPI_BACKEND, &be );
inst = (ldbm_instance *) be->be_instance_info;
+ /*
+ * In case SLAPI_BE_FLAG_DONT_BYPASS_FILTERTEST is set,
+ * clean it up for the following sessions.
+ */
+ slapi_be_unset_flag(be, SLAPI_BE_FLAG_DONT_BYPASS_FILTERTEST);
CACHE_RETURN(&inst->inst_cache, &e); /* NULL e is handled correctly */
if(sort_control!=NULL)
diff --git a/ldap/servers/slapd/backend.c b/ldap/servers/slapd/backend.c
index de852c8..d4fc580 100644
--- a/ldap/servers/slapd/backend.c
+++ b/ldap/servers/slapd/backend.c
@@ -559,13 +559,18 @@ slapi_be_setentrypoint(Slapi_Backend *be, int entrypoint, void
*ret_fnptr, Slapi
}
int slapi_be_is_flag_set(Slapi_Backend * be, int flag)
-{
+{
return be->be_flags & flag;
}
void slapi_be_set_flag(Slapi_Backend * be, int flag)
-{
- be->be_flags|= flag;
+{
+ be->be_flags |= flag;
+}
+
+void slapi_be_unset_flag(Slapi_Backend * be, int flag)
+{
+ be->be_flags &= ~flag;
}
char * slapi_be_get_name(Slapi_Backend * be)
diff --git a/ldap/servers/slapd/slapi-plugin.h b/ldap/servers/slapd/slapi-plugin.h
index 702389a..6da4f52 100644
--- a/ldap/servers/slapd/slapi-plugin.h
+++ b/ldap/servers/slapd/slapi-plugin.h
@@ -6055,6 +6055,7 @@ const char * slapi_be_gettype(Slapi_Backend *be);
int slapi_be_is_flag_set(Slapi_Backend * be, int flag);
void slapi_be_set_flag(Slapi_Backend * be, int flag);
+void slapi_be_unset_flag(Slapi_Backend * be, int flag);
#define SLAPI_BE_FLAG_REMOTE_DATA 0x1 /* entries held by backend are remote */
#define SLAPI_BE_FLAG_DONT_BYPASS_FILTERTEST 0x10 /* force to call filter_test (search
only) */