X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fresult.c;h=0afad284eb9bb18b506e7eb506fdef45406b4bb4;hb=7a296e605128cc84012f9c783179453797fe2685;hp=ae6a42dd0f5cd61cdcf04eefb0b5683b02046e60;hpb=3c5068bc1fa84fc5daf1e50d4f1a929cec91b7e9;p=openldap diff --git a/servers/slapd/result.c b/servers/slapd/result.c index ae6a42dd0f..0afad284eb 100644 --- a/servers/slapd/result.c +++ b/servers/slapd/result.c @@ -54,14 +54,6 @@ int slap_freeself_cb( Operation *op, SlapReply *rs ) return SLAP_CB_CONTINUE; } -int slap_replog_cb( Operation *op, SlapReply *rs ) -{ - if ( rs->sr_err == LDAP_SUCCESS ) { - replog( op ); - } - return SLAP_CB_CONTINUE; -} - static char *v2ref( BerVarray ref, const char *text ) { size_t len = 0, i = 0; @@ -157,7 +149,6 @@ static long send_ldap_ber( /* write the pdu */ while( 1 ) { int err; - ber_socket_t sd; if ( connection_state_closing( conn ) ) { ldap_pvt_thread_mutex_unlock( &conn->c_mutex ); @@ -192,8 +183,7 @@ static long send_ldap_ber( /* wait for socket to be write-ready */ conn->c_writewaiter = 1; - ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &sd ); - slapd_set_write( sd, 1 ); + slapd_set_write( conn->c_sd, 1 ); ldap_pvt_thread_cond_wait( &conn->c_write_cv, &conn->c_mutex ); conn->c_writewaiter = 0; @@ -247,7 +237,7 @@ send_ldap_controls( Operation *o, BerElement *ber, LDAPControl **c ) if( rc == -1 ) return rc; } -#ifdef SLAP_SORTED_RESULTS +#ifdef SLAP_CONTROL_X_SORTEDRESULTS /* this is a hack to avoid having to modify op->s_ctrls */ if( o->o_sortedresults ) { BerElementBuffer berbuf; @@ -516,10 +506,10 @@ send_ldap_response( goto cleanup; } - ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex ); - ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 ); - ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes ); - ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex ); + ldap_pvt_thread_mutex_lock( &op->o_counters->sc_mutex ); + ldap_pvt_mp_add_ulong( op->o_counters->sc_pdu, 1 ); + ldap_pvt_mp_add_ulong( op->o_counters->sc_bytes, (unsigned long)bytes ); + ldap_pvt_thread_mutex_unlock( &op->o_counters->sc_mutex ); cleanup:; /* Tell caller that we did this for real, as opposed to being @@ -570,7 +560,7 @@ send_ldap_disconnect( Operation *op, SlapReply *rs ) } else { rs->sr_rspoid = LDAP_NOTICE_DISCONNECT; rs->sr_tag = LDAP_RES_EXTENDED; - rs->sr_msgid = 0; + rs->sr_msgid = LDAP_RES_UNSOLICITED; } if ( send_ldap_response( op, rs ) == SLAP_CB_CONTINUE ) { @@ -751,6 +741,14 @@ slap_send_search_entry( Operation *op, SlapReply *rs ) return LDAP_SIZELIMIT_EXCEEDED; } + /* Every 64 entries, check for thread pool pause */ + if ( ( ( rs->sr_nentries & 0x3f ) == 0x3f ) && + ldap_pvt_thread_pool_query( &connection_pool, + LDAP_PVT_THREAD_POOL_PARAM_PAUSING, &i ) == 0 && i ) + { + return LDAP_BUSY; + } + rs->sr_type = REP_SEARCH; /* eventually will loop through generated operational attribute types @@ -900,12 +898,16 @@ slap_send_search_entry( Operation *op, SlapReply *rs ) } else { /* specific attrs requested */ if ( is_at_operational( desc->ad_type ) ) { - if ( !SLAP_OPATTRS( rs->sr_attr_flags ) && - !ad_inlist( desc, rs->sr_attrs ) ) - { - continue; + /* if not explicitly requested */ + if ( !ad_inlist( desc, rs->sr_attrs )) { + /* if not all op attrs requested, skip */ + if ( !SLAP_OPATTRS( rs->sr_attr_flags )) + continue; + /* if DSA-specific and replicating, skip */ + if ( op->o_sync != SLAP_CONTROL_NONE && + desc->ad_type->sat_usage == LDAP_SCHEMA_DSA_OPERATION ) + continue; } - } else { if ( !userattrs && !ad_inlist( desc, rs->sr_attrs ) ) { continue; @@ -1195,11 +1197,11 @@ slap_send_search_entry( Operation *op, SlapReply *rs ) } rs->sr_nentries++; - ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex ); - ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes ); - ldap_pvt_mp_add_ulong( slap_counters.sc_entries, 1 ); - ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 ); - ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex ); + ldap_pvt_thread_mutex_lock( &op->o_counters->sc_mutex ); + ldap_pvt_mp_add_ulong( op->o_counters->sc_bytes, (unsigned long)bytes ); + ldap_pvt_mp_add_ulong( op->o_counters->sc_entries, 1 ); + ldap_pvt_mp_add_ulong( op->o_counters->sc_pdu, 1 ); + ldap_pvt_thread_mutex_unlock( &op->o_counters->sc_mutex ); } Statslog( LDAP_DEBUG_STATS2, "%s ENTRY dn=\"%s\"\n", @@ -1362,11 +1364,11 @@ slap_send_search_reference( Operation *op, SlapReply *rs ) if ( bytes < 0 ) { rc = LDAP_UNAVAILABLE; } else { - ldap_pvt_thread_mutex_lock( &slap_counters.sc_sent_mutex ); - ldap_pvt_mp_add_ulong( slap_counters.sc_bytes, (unsigned long)bytes ); - ldap_pvt_mp_add_ulong( slap_counters.sc_refs, 1 ); - ldap_pvt_mp_add_ulong( slap_counters.sc_pdu, 1 ); - ldap_pvt_thread_mutex_unlock( &slap_counters.sc_sent_mutex ); + ldap_pvt_thread_mutex_lock( &op->o_counters->sc_mutex ); + ldap_pvt_mp_add_ulong( op->o_counters->sc_bytes, (unsigned long)bytes ); + ldap_pvt_mp_add_ulong( op->o_counters->sc_refs, 1 ); + ldap_pvt_mp_add_ulong( op->o_counters->sc_pdu, 1 ); + ldap_pvt_thread_mutex_unlock( &op->o_counters->sc_mutex ); } #ifdef LDAP_CONNECTIONLESS }