mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-24 00:29:35 -05:00
implement search timeout when the remote server does not respond in the specified timeout
This commit is contained in:
parent
ecc28ff57c
commit
5a228fa87a
2 changed files with 31 additions and 5 deletions
|
|
@ -381,9 +381,7 @@ static slap_cf_aux_table timeout_table[] = {
|
|||
{ BER_BVC("modrdn="), SLAP_OP_MODRDN * sizeof( time_t ), 'u', 0, NULL },
|
||||
{ BER_BVC("modify="), SLAP_OP_MODIFY * sizeof( time_t ), 'u', 0, NULL },
|
||||
{ BER_BVC("compare="), SLAP_OP_COMPARE * sizeof( time_t ), 'u', 0, NULL },
|
||||
#if 0 /* uses timelimit instead */
|
||||
{ BER_BVC("search="), SLAP_OP_SEARCH * sizeof( time_t ), 'u', 0, NULL },
|
||||
#endif
|
||||
/* abandon makes little sense */
|
||||
#if 0 /* not implemented yet */
|
||||
{ BER_BVC("extended="), SLAP_OP_EXTENDED * sizeof( time_t ), 'u', 0, NULL },
|
||||
|
|
|
|||
|
|
@ -256,12 +256,20 @@ retry:
|
|||
}
|
||||
}
|
||||
|
||||
/* if needed, initialize timeout */
|
||||
if ( li->li_timeout[ SLAP_OP_SEARCH ] ) {
|
||||
if ( tv.tv_sec == 0 || tv.tv_sec > li->li_timeout[ SLAP_OP_SEARCH ] ) {
|
||||
tv.tv_sec = li->li_timeout[ SLAP_OP_SEARCH ];
|
||||
tv.tv_usec = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* We pull apart the ber result, stuff it into a slapd entry, and
|
||||
* let send_search_entry stuff it back into ber format. Slow & ugly,
|
||||
* but this is necessary for version matching, and for ACL processing.
|
||||
*/
|
||||
|
||||
for ( rc = 0; rc != -1; rc = ldap_result( lc->lc_ld, msgid, LDAP_MSG_ONE, &tv, &res ) )
|
||||
for ( rc = -2; rc != -1; rc = ldap_result( lc->lc_ld, msgid, LDAP_MSG_ONE, &tv, &res ) )
|
||||
{
|
||||
/* check for abandon */
|
||||
if ( op->o_abandon || LDAP_BACK_CONN_ABANDON( lc ) ) {
|
||||
|
|
@ -273,10 +281,22 @@ retry:
|
|||
goto finish;
|
||||
}
|
||||
|
||||
if ( rc == 0 ) {
|
||||
LDAP_BACK_TV_SET( &tv );
|
||||
if ( rc == 0 || rc == -2 ) {
|
||||
ldap_pvt_thread_yield();
|
||||
|
||||
/* check timeout */
|
||||
if ( li->li_timeout[ SLAP_OP_SEARCH ] ) {
|
||||
if ( rc == 0 ) {
|
||||
(void)ldap_back_cancel( lc, op, rs, msgid, LDAP_BACK_DONTSEND );
|
||||
rs->sr_text = "Operation timed out";
|
||||
rc = rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
} else {
|
||||
LDAP_BACK_TV_SET( &tv );
|
||||
}
|
||||
|
||||
/* check time limit */
|
||||
if ( op->ors_tlimit != SLAP_NO_LIMIT
|
||||
&& slap_get_time() > stoptime )
|
||||
|
|
@ -437,6 +457,14 @@ retry:
|
|||
rc = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
/* if needed, restore timeout */
|
||||
if ( li->li_timeout[ SLAP_OP_SEARCH ] ) {
|
||||
if ( tv.tv_sec == 0 || tv.tv_sec > li->li_timeout[ SLAP_OP_SEARCH ] ) {
|
||||
tv.tv_sec = li->li_timeout[ SLAP_OP_SEARCH ];
|
||||
tv.tv_usec = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( rc == -1 && dont_retry == 0 ) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue