ldap/servers/slapd/abandon.c | 7 ++++++-
ldap/servers/slapd/connection.c | 11 +----------
ldap/servers/slapd/opshared.c | 2 +-
ldap/servers/slapd/pagedresults.c | 24 ++++++++++++++++++++++++
ldap/servers/slapd/proto-slap.h | 1 +
5 files changed, 33 insertions(+), 12 deletions(-)
New commits:
commit 33245d123c62594b885f23727f925f989e40ef39
Author: Noriko Hosoi <nhosoi(a)redhat.com>
Date: Wed Nov 3 11:40:13 2010 -0700
Bug 567282 - server can not abandon searchRequest of "simple paged results"
https://bugzilla.redhat.com/show_bug.cgi?id=567282
Description: Simple Paged Results search keeps the connection
per paging, but not an operation. When an abandon request is
issued, the operation referred by the request has already finished.
This patch introduces pagedresults_cleanup function to check
whether the connection is for the simple paged results or not, and
if it is, the simple paged results is cleaned up. If it is not,
pagedresults_cleanup does nothing. The function is called from
do_abandon as well as from connection_cleanup.
diff --git a/ldap/servers/slapd/abandon.c b/ldap/servers/slapd/abandon.c
index 4e87a71..52c4596 100644
--- a/ldap/servers/slapd/abandon.c
+++ b/ldap/servers/slapd/abandon.c
@@ -152,7 +152,12 @@ do_abandon( Slapi_PBlock *pb )
0 );
}
- if ( NULL == o ) {
+ if (pagedresults_cleanup(pb->pb_conn)) {
+ /* Cleaned up paged result connection */
+ slapi_log_access( LDAP_DEBUG_STATS, "conn=%" NSPRIu64 " op=%d
ABANDON"
+ " targetop=Simple Paged Results\n",
+ pb->pb_conn->c_connid, pb->pb_op->o_opid );
+ } else if ( NULL == o ) {
slapi_log_access( LDAP_DEBUG_STATS, "conn=%" NSPRIu64 " op=%d
ABANDON"
" targetop=NOTFOUND msgid=%d\n",
pb->pb_conn->c_connid, pb->pb_op->o_opid, id );
diff --git a/ldap/servers/slapd/connection.c b/ldap/servers/slapd/connection.c
index 587f422..75d9584 100644
--- a/ldap/servers/slapd/connection.c
+++ b/ldap/servers/slapd/connection.c
@@ -200,16 +200,7 @@ connection_cleanup(Connection *conn)
/* destroy any sasl context */
sasl_dispose((sasl_conn_t**)&conn->c_sasl_conn);
/* PAGED_RESULTS */
- if (conn->c_search_result_set) {
- if (conn->c_current_be->be_search_results_release) {
- conn->c_current_be->be_search_results_release(&(conn->c_search_result_set));
- }
- conn->c_search_result_set = NULL;
- }
- conn->c_current_be = NULL;
- conn->c_search_result_count = 0;
- conn->c_timelimit = 0;
- /* PAGED_RESULTS ENDS */
+ pagedresults_cleanup(conn);
/* free the connection socket buffer */
connection_free_private_buffer(conn);
diff --git a/ldap/servers/slapd/opshared.c b/ldap/servers/slapd/opshared.c
index e271137..a2684f9 100644
--- a/ldap/servers/slapd/opshared.c
+++ b/ldap/servers/slapd/opshared.c
@@ -866,7 +866,7 @@ next_be:
rc = 0;
}
- free_and_return:
+free_and_return:
if ((be_list[0] != NULL) || (referral_list[0] != NULL))
slapi_mapping_tree_free_all(be_list, referral_list);
else if (be_single)
diff --git a/ldap/servers/slapd/pagedresults.c b/ldap/servers/slapd/pagedresults.c
index 616fd11..47b3490 100644
--- a/ldap/servers/slapd/pagedresults.c
+++ b/ldap/servers/slapd/pagedresults.c
@@ -363,3 +363,27 @@ pagedresults_set_timelimit(Connection *conn, time_t timelimit)
return rc;
}
+/*
+ * return values
+ * 0: not a simple paged result connection
+ * 1: simple paged result and successfully abandoned
+ */
+int
+pagedresults_cleanup(Connection *conn)
+{
+ int rc = 0;
+
+ if (conn->c_current_be) {
+ if (conn->c_search_result_set) {
+ if (conn->c_current_be->be_search_results_release) {
+
conn->c_current_be->be_search_results_release(&(conn->c_search_result_set));
+ }
+ conn->c_search_result_set = NULL;
+ }
+ conn->c_current_be = 0;
+ conn->c_search_result_count = 0;
+ conn->c_timelimit = 0;
+ rc = 1;
+ }
+ return rc;
+}
diff --git a/ldap/servers/slapd/proto-slap.h b/ldap/servers/slapd/proto-slap.h
index 089c174..1a8c6e5 100644
--- a/ldap/servers/slapd/proto-slap.h
+++ b/ldap/servers/slapd/proto-slap.h
@@ -1379,6 +1379,7 @@ int pagedresults_set_unindexed(Connection *conn);
int pagedresults_get_sort_result_code(Connection *conn);
int pagedresults_set_sort_result_code(Connection *conn, int code);
int pagedresults_set_timelimit(Connection *conn, time_t timelimit);
+int pagedresults_cleanup(Connection *conn);
/*
* sort.c