summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNoriko Hosoi <nhosoi@redhat.com>2010-09-14 10:32:46 -0700
committerNoriko Hosoi <nhosoi@redhat.com>2010-09-15 10:29:34 -0700
commit529b056b2fda91263730da1da8ac9b42b54b72f4 (patch)
tree32565ec3ea975a9af2617eba667201345af7a631
parent20d1e7c8e9280e2175ca843f60a50addc096f134 (diff)
downloadds-529b056b2fda91263730da1da8ac9b42b54b72f4.tar.gz
ds-529b056b2fda91263730da1da8ac9b42b54b72f4.tar.xz
ds-529b056b2fda91263730da1da8ac9b42b54b72f4.zip
Bug 558099 - Enhancement request: Log more information about the search result being a paged one
https://bugzilla.redhat.com/show_bug.cgi?id=558099 Description: searched entry count is logged in the access log as (nentries=<num>). When RFC 2696 page results control is passed, the nentries logs the page size instead of the total searched count. andrey.ivanov@polytechnique.fr proposed to log the control info as follows: [..] conn=# op=#RESULT err=0 tag=101 nentries=# etime=0 notes=P This patch implemented the spec. Also, there was a bug regarding unindexed note "notes=U" when the paged results control is received. Only the first page logs it, but not the rest. The bug was fixed.
-rw-r--r--ldap/servers/slapd/back-ldbm/filterindex.c6
-rw-r--r--ldap/servers/slapd/back-ldbm/ldbm_search.c1
-rw-r--r--ldap/servers/slapd/back-ldbm/vlv.c5
-rw-r--r--ldap/servers/slapd/opshared.c5
-rw-r--r--ldap/servers/slapd/pagedresults.c25
-rw-r--r--ldap/servers/slapd/proto-slap.h2
-rw-r--r--ldap/servers/slapd/result.c3
-rw-r--r--ldap/servers/slapd/slap.h4
-rw-r--r--ldap/servers/slapd/slapi-plugin.h1
9 files changed, 49 insertions, 3 deletions
diff --git a/ldap/servers/slapd/back-ldbm/filterindex.c b/ldap/servers/slapd/back-ldbm/filterindex.c
index 03123ca6..e2377494 100644
--- a/ldap/servers/slapd/back-ldbm/filterindex.c
+++ b/ldap/servers/slapd/back-ldbm/filterindex.c
@@ -287,6 +287,7 @@ ava_candidates(
if ( unindexed ) {
unsigned int opnote = SLAPI_OP_NOTE_UNINDEXED;
slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
+ pagedresults_set_unindexed( pb->pb_conn );
}
/* We don't use valuearray_free here since the valueset, berval
@@ -318,6 +319,7 @@ ava_candidates(
if ( unindexed ) {
unsigned int opnote = SLAPI_OP_NOTE_UNINDEXED;
slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
+ pagedresults_set_unindexed( pb->pb_conn );
}
valuearray_free( &ivals );
LDAPDebug( LDAP_DEBUG_TRACE, "<= ava_candidates %lu\n",
@@ -353,6 +355,7 @@ presence_candidates(
if ( unindexed ) {
unsigned int opnote = SLAPI_OP_NOTE_UNINDEXED;
slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
+ pagedresults_set_unindexed( pb->pb_conn );
}
if (idl != NULL && ALLIDS(idl) && strcasecmp(type, "nscpentrydn") == 0) {
@@ -458,6 +461,7 @@ extensible_candidates(
unsigned int opnote = SLAPI_OP_NOTE_UNINDEXED;
slapi_pblock_set( glob_pb,
SLAPI_OPERATION_NOTES, &opnote );
+ pagedresults_set_unindexed( glob_pb->pb_conn );
}
if (idl2 == NULL)
{
@@ -864,6 +868,7 @@ substring_candidates(
attr_done(&sattr);
if ( ivals == NULL || *ivals == NULL ) {
slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
+ pagedresults_set_unindexed( pb->pb_conn );
LDAPDebug( LDAP_DEBUG_TRACE,
"<= sub_candidates ALLIDS (no keys)\n", 0, 0, 0 );
return( idl_allids( be ) );
@@ -876,6 +881,7 @@ substring_candidates(
idl = keys2idl( be, type, indextype_SUB, ivals, err, &unindexed );
if ( unindexed ) {
slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
+ pagedresults_set_unindexed( pb->pb_conn );
}
valuearray_free( &ivals );
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_search.c b/ldap/servers/slapd/back-ldbm/ldbm_search.c
index 0f97d861..9a8dd0fd 100644
--- a/ldap/servers/slapd/back-ldbm/ldbm_search.c
+++ b/ldap/servers/slapd/back-ldbm/ldbm_search.c
@@ -675,6 +675,7 @@ ldbm_back_search( Slapi_PBlock *pb )
}
slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
+ pagedresults_set_unindexed( pb->pb_conn );
}
sr->sr_candidates = candidates;
diff --git a/ldap/servers/slapd/back-ldbm/vlv.c b/ldap/servers/slapd/back-ldbm/vlv.c
index 0d282400..163d8a64 100644
--- a/ldap/servers/slapd/back-ldbm/vlv.c
+++ b/ldap/servers/slapd/back-ldbm/vlv.c
@@ -1150,8 +1150,9 @@ vlv_search_build_candidate_list(Slapi_PBlock *pb, const Slapi_DN *base, int *vlv
if((pi=vlv_find_search(be, base, scope, fstr, sort_control)) == NULL) {
unsigned int opnote = SLAPI_OP_NOTE_UNINDEXED;
PR_RWLock_Unlock(be->vlvSearchList_lock);
- slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
- rc = VLV_FIND_SEARCH_FAILED;
+ slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
+ pagedresults_set_unindexed( pb->pb_conn );
+ rc = VLV_FIND_SEARCH_FAILED;
} else if((*vlv_rc=vlvIndex_accessallowed(pi, pb)) != LDAP_SUCCESS) {
PR_RWLock_Unlock(be->vlvSearchList_lock);
rc = VLV_ACCESS_DENIED;
diff --git a/ldap/servers/slapd/opshared.c b/ldap/servers/slapd/opshared.c
index cd33d576..858bc8f7 100644
--- a/ldap/servers/slapd/opshared.c
+++ b/ldap/servers/slapd/opshared.c
@@ -372,6 +372,7 @@ op_shared_search (Slapi_PBlock *pb, int send_result)
rc = pagedresults_parse_control_value(ctl_value,
&pagesize, &curr_search_count);
if (LDAP_SUCCESS == rc) {
+ unsigned int opnote = SLAPI_OP_NOTE_SIMPLEPAGED;
operation->o_flags |= OP_FLAG_PAGED_RESULTS;
pr_be = pagedresults_get_current_be(pb->pb_conn);
pr_search_result = pagedresults_get_search_result(pb->pb_conn);
@@ -379,6 +380,10 @@ op_shared_search (Slapi_PBlock *pb, int send_result)
pagedresults_get_search_result_count(pb->pb_conn);
estimate =
pagedresults_get_search_result_set_size_estimate(pb->pb_conn);
+ if (pagedresults_get_unindexed(pb->pb_conn)) {
+ opnote |= SLAPI_OP_NOTE_UNINDEXED;
+ }
+ slapi_pblock_set( pb, SLAPI_OPERATION_NOTES, &opnote );
} else {
/* parse paged-results-control failed */
if (iscritical) { /* return an error since it's critical */
diff --git a/ldap/servers/slapd/pagedresults.c b/ldap/servers/slapd/pagedresults.c
index fdda938e..616fd11f 100644
--- a/ldap/servers/slapd/pagedresults.c
+++ b/ldap/servers/slapd/pagedresults.c
@@ -301,6 +301,31 @@ pagedresults_set_with_sort(Connection *conn, int flags)
}
int
+pagedresults_get_unindexed(Connection *conn)
+{
+ int flags = 0;
+ if (conn) {
+ PR_Lock(conn->c_mutex);
+ flags = conn->c_flags&CONN_FLAG_PAGEDRESULTS_UNINDEXED;
+ PR_Unlock(conn->c_mutex);
+ }
+ return flags;
+}
+
+int
+pagedresults_set_unindexed(Connection *conn)
+{
+ int rc = -1;
+ if (conn) {
+ PR_Lock(conn->c_mutex);
+ conn->c_flags |= CONN_FLAG_PAGEDRESULTS_UNINDEXED;
+ PR_Unlock(conn->c_mutex);
+ rc = 0;
+ }
+ return rc;
+}
+
+int
pagedresults_get_sort_result_code(Connection *conn)
{
int code = 0;
diff --git a/ldap/servers/slapd/proto-slap.h b/ldap/servers/slapd/proto-slap.h
index 6524c800..6f5ae54d 100644
--- a/ldap/servers/slapd/proto-slap.h
+++ b/ldap/servers/slapd/proto-slap.h
@@ -1372,6 +1372,8 @@ int pagedresults_get_search_result_set_size_estimate(Connection *conn);
int pagedresults_set_search_result_set_size_estimate(Connection *conn, int cnt);
int pagedresults_get_with_sort(Connection *conn);
int pagedresults_set_with_sort(Connection *conn, int flags);
+int pagedresults_get_unindexed(Connection *conn);
+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);
diff --git a/ldap/servers/slapd/result.c b/ldap/servers/slapd/result.c
index ca42de52..218b7b98 100644
--- a/ldap/servers/slapd/result.c
+++ b/ldap/servers/slapd/result.c
@@ -1576,7 +1576,8 @@ struct slapi_note_map {
};
static struct slapi_note_map notemap[] = {
- { SLAPI_OP_NOTE_UNINDEXED, "U" },
+ { SLAPI_OP_NOTE_UNINDEXED, "U" },
+ { SLAPI_OP_NOTE_SIMPLEPAGED, "P" }
};
#define SLAPI_NOTEMAP_COUNT ( sizeof(notemap) / sizeof(struct slapi_note_map))
diff --git a/ldap/servers/slapd/slap.h b/ldap/servers/slapd/slap.h
index 8a405926..1f4afd91 100644
--- a/ldap/servers/slapd/slap.h
+++ b/ldap/servers/slapd/slap.h
@@ -1392,6 +1392,10 @@ typedef struct conn {
#define CONN_FLAG_PAGEDRESULTS_WITH_SORT 64 /* paged results control is
* sent with server side sorting
*/
+
+#define CONN_FLAG_PAGEDRESULTS_UNINDEXED 128 /* If the search is unindexed,
+ * store the info in c_flags
+ */
#define CONN_GET_SORT_RESULT_CODE (-1)
#define START_TLS_OID "1.3.6.1.4.1.1466.20037"
diff --git a/ldap/servers/slapd/slapi-plugin.h b/ldap/servers/slapd/slapi-plugin.h
index 3dd92e0f..893359c9 100644
--- a/ldap/servers/slapd/slapi-plugin.h
+++ b/ldap/servers/slapd/slapi-plugin.h
@@ -5854,6 +5854,7 @@ typedef struct slapi_plugindesc {
/* Extra notes to be logged within access log RESULT lines */
#define SLAPI_OPERATION_NOTES 57
#define SLAPI_OP_NOTE_UNINDEXED 0x01
+#define SLAPI_OP_NOTE_SIMPLEPAGED 0x02
/* Allows controls to be passed before operation object is created */
#define SLAPI_CONTROLS_ARG 58