ldap/servers/slapd/back-ldbm/ldbm_search.c | 10 +++++-----
ldap/servers/slapd/opshared.c | 12 ------------
2 files changed, 5 insertions(+), 17 deletions(-)
New commits:
commit b5f77c693d50ca3acf58eb7a41d9eded59328632
Author: Rich Megginson <rmeggins(a)redhat.com>
Date: Thu Sep 1 10:30:06 2011 -0600
Bug 735121 - simple paged search + ip/dns based ACI hangs server
https://bugzilla.redhat.com/show_bug.cgi?id=735121
Resolves: bug 735121
Bug Description: simple paged search + ip/dns based ACI hangs server
Reviewed by: nhosoi (Thanks!)
Branch: master
Fix Description: The pb_conn->c_mutex lock around be->be_next_search_entry()
was too big. Other code inside be->be_next_search_entry needs to lock
the conn. In this particular case, the aci code needed to access the
client ip address from the conn object. The fix is to remove the mutex
around be->be_next_search_entry() in iterate() and instead make sure
code that accesses pb_conn locks first.
Platforms tested: RHEL6 x86_64
Flag Day: no
Doc impact: no
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_search.c
b/ldap/servers/slapd/back-ldbm/ldbm_search.c
index ddebaaf..b204428 100644
--- a/ldap/servers/slapd/back-ldbm/ldbm_search.c
+++ b/ldap/servers/slapd/back-ldbm/ldbm_search.c
@@ -1228,7 +1228,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension
)
if ( slapi_op_abandoned( pb ) || (NULL == sr) )
{
/* in case paged results, clean up the conn */
- pagedresults_set_search_result(pb->pb_conn, NULL, 1);
+ pagedresults_set_search_result(pb->pb_conn, NULL, 0);
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET, NULL );
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET_SIZE_ESTIMATE, &estimate
);
if ( use_extension ) {
@@ -1245,7 +1245,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension
)
if ( tlimit != -1 && curtime > stoptime )
{
/* in case paged results, clean up the conn */
- pagedresults_set_search_result(pb->pb_conn, NULL, 1);
+ pagedresults_set_search_result(pb->pb_conn, NULL, 0);
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET, NULL );
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET_SIZE_ESTIMATE, &estimate
);
if ( use_extension ) {
@@ -1262,7 +1262,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension
)
if ( llimit != -1 && sr->sr_lookthroughcount >= llimit )
{
/* in case paged results, clean up the conn */
- pagedresults_set_search_result(pb->pb_conn, NULL, 1);
+ pagedresults_set_search_result(pb->pb_conn, NULL, 0);
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET, NULL );
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET_SIZE_ESTIMATE, &estimate
);
if ( use_extension ) {
@@ -1282,7 +1282,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension
)
/* No more entries */
/* destroy back_search_result_set */
/* in case paged results, clean up the conn */
- pagedresults_set_search_result(pb->pb_conn, NULL, 1);
+ pagedresults_set_search_result(pb->pb_conn, NULL, 0);
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET, NULL );
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET_SIZE_ESTIMATE, &estimate
);
if ( use_extension ) {
@@ -1425,7 +1425,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension
)
if ( --slimit < 0 ) {
CACHE_RETURN( &inst->inst_cache, &e );
/* in case paged results, clean up the conn */
- pagedresults_set_search_result(pb->pb_conn, NULL, 1);
+ pagedresults_set_search_result(pb->pb_conn, NULL, 0);
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET, NULL );
slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET_SIZE_ESTIMATE,
&estimate );
delete_search_result_set( &sr );
diff --git a/ldap/servers/slapd/opshared.c b/ldap/servers/slapd/opshared.c
index b65507b..d533d01 100644
--- a/ldap/servers/slapd/opshared.c
+++ b/ldap/servers/slapd/opshared.c
@@ -1150,19 +1150,7 @@ iterate(Slapi_PBlock *pb, Slapi_Backend *be, int send_result,
slapi_pblock_get (pb, SLAPI_OPERATION, &operation);
is_paged = operation->o_flags & OP_FLAG_PAGED_RESULTS;
- /*
- * If it is paged results, the search result set could be released when
- * it reaches the timelimit. This lock protects the search result set
- * not to be released while sending a next entry.
- * (see pagedresults_cleanup called from disconnect_server_nomutex)
- */
- if ( is_paged && pb->pb_conn && pb->pb_conn->c_mutex )
{
- PR_Lock( pb->pb_conn->c_mutex );
- }
rc = be->be_next_search_entry(pb);
- if ( is_paged && pb->pb_conn && pb->pb_conn->c_mutex )
{
- PR_Unlock( pb->pb_conn->c_mutex );
- }
if (rc < 0)
{
/*