From 529b056b2fda91263730da1da8ac9b42b54b72f4 Mon Sep 17 00:00:00 2001 From: Noriko Hosoi Date: Tue, 14 Sep 2010 10:32:46 -0700 Subject: 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=). 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. --- ldap/servers/slapd/back-ldbm/filterindex.c | 6 ++++++ ldap/servers/slapd/back-ldbm/ldbm_search.c | 1 + ldap/servers/slapd/back-ldbm/vlv.c | 5 +++-- ldap/servers/slapd/opshared.c | 5 +++++ ldap/servers/slapd/pagedresults.c | 25 +++++++++++++++++++++++++ ldap/servers/slapd/proto-slap.h | 2 ++ ldap/servers/slapd/result.c | 3 ++- ldap/servers/slapd/slap.h | 4 ++++ ldap/servers/slapd/slapi-plugin.h | 1 + 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 @@ -300,6 +300,31 @@ pagedresults_set_with_sort(Connection *conn, int flags) return rc; } +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) { 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 -- cgit