From: Pierangelo Masarati Date: Fri, 26 Jan 2007 01:39:05 +0000 (+0000) Subject: implement search timeout when the remote server does not respond in the specified... X-Git-Tag: OPENLDAP_REL_ENG_2_4_4ALPHA~8^2~130 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=cf226fb029ef6ea2cb74e8e9c3eeb08d25ca4f9b;p=openldap implement search timeout when the remote server does not respond in the specified timeout --- diff --git a/servers/slapd/back-meta/config.c b/servers/slapd/back-meta/config.c index 00b6302731..bb60979931 100644 --- a/servers/slapd/back-meta/config.c +++ b/servers/slapd/back-meta/config.c @@ -973,10 +973,8 @@ meta_back_db_config( t = &tv[ SLAP_OP_MODIFY ]; } else if ( strncasecmp( argv[ c ], "compare", len ) == 0 ) { t = &tv[ SLAP_OP_COMPARE ]; -#if 0 /* uses timelimit instead */ } else if ( strncasecmp( argv[ c ], "search", len ) == 0 ) { t = &tv[ SLAP_OP_SEARCH ]; -#endif /* abandon makes little sense */ #if 0 /* not implemented yet */ } else if ( strncasecmp( argv[ c ], "extended", len ) == 0 ) { diff --git a/servers/slapd/back-meta/search.c b/servers/slapd/back-meta/search.c index f6dbad8018..618c5224fa 100644 --- a/servers/slapd/back-meta/search.c +++ b/servers/slapd/back-meta/search.c @@ -665,7 +665,8 @@ meta_back_search( Operation *op, SlapReply *rs ) metaconn_t *mc; struct timeval save_tv = { 0, 0 }, tv; - time_t stoptime = (time_t)-1; + time_t stoptime = (time_t)(-1), + lastres_time = slap_get_time(); int rc = 0, sres = LDAP_SUCCESS; char *matched = NULL; int last = 0, ncandidates = 0, @@ -861,6 +862,22 @@ getconn:; int gotit = 0, doabandon = 0, alreadybound = ncandidates; + time_t curr_time = 0; + + /* check timeout */ + if ( mi->mi_timeout[ SLAP_OP_SEARCH ] + && lastres_time > 0 + && ( slap_get_time() - lastres_time ) > mi->mi_timeout[ SLAP_OP_SEARCH ] ) + { + doabandon = 1; + rs->sr_text = "Operation timed out"; + rc = rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED; + savepriv = op->o_private; + op->o_private = (void *)i; + send_ldap_result( op, rs ); + op->o_private = savepriv; + goto finish; + } /* check time limit */ if ( op->ors_tlimit != SLAP_NO_LIMIT @@ -1072,9 +1089,11 @@ really_bad:; continue; default: + lastres_time = slap_get_time(); + /* only touch when activity actually took place... */ - if ( mi->mi_idle_timeout != 0 && msc->msc_time < op->o_time ) { - msc->msc_time = op->o_time; + if ( mi->mi_idle_timeout != 0 && msc->msc_time < lastres_time ) { + msc->msc_time = lastres_time; } break; }