Skip to content
Snippets Groups Projects
Commit e5ebfe66 authored by Pierangelo Masarati's avatar Pierangelo Masarati
Browse files

improve async connect handling in case of errors

parent 34fde825
No related branches found
No related tags found
No related merge requests found
......@@ -232,10 +232,10 @@ meta_search_dobind_init(
assert( msc->msc_ld != NULL );
/* connect must be async */
retry:;
/* connect must be async only the first time... */
ldap_set_option( msc->msc_ld, LDAP_OPT_CONNECT_ASYNC, LDAP_OPT_ON );
retry:;
rc = ldap_sasl_bind( msc->msc_ld, binddn.bv_val, LDAP_SASL_SIMPLE, &cred,
NULL, NULL, &candidates[ candidate ].sr_msgid );
......@@ -1223,6 +1223,8 @@ really_bad:;
candidates[ i ].sr_type = REP_RESULT;
}
candidates[ i ].sr_msgid = META_MSGID_IGNORE;
/* NOTE: ignores response controls
* (and intermediate response controls
* as well, except for those with search
......@@ -1387,7 +1389,6 @@ really_bad:;
* When no candidates are left,
* the outer cycle finishes
*/
candidates[ i ].sr_msgid = META_MSGID_IGNORE;
assert( ncandidates > 0 );
--ncandidates;
......@@ -1444,10 +1445,16 @@ free_message:;
/* check for abandon */
if ( op->o_abandon || LDAP_BACK_CONN_ABANDON( mc ) ) {
for ( i = 0; i < mi->mi_ntargets; i++ ) {
if ( candidates[ i ].sr_msgid >= 0 ) {
if ( META_IS_BINDING( &candidates[ i ] ) ) {
if ( candidates[ i ].sr_msgid >= 0
|| candidates[ i ].sr_msgid == META_MSGID_CONNECTING )
{
if ( META_IS_BINDING( &candidates[ i ] )
|| candidates[ i ].sr_msgid == META_MSGID_CONNECTING )
{
ldap_pvt_thread_mutex_lock( &mi->mi_conninfo.lai_mutex );
if ( LDAP_BACK_CONN_BINDING( &mc->mc_conns[ i ] ) ) {
if ( LDAP_BACK_CONN_BINDING( &mc->mc_conns[ i ] )
|| candidates[ i ].sr_msgid == META_MSGID_CONNECTING )
{
/* if still binding, destroy */
#ifdef DEBUG_205
......@@ -1644,23 +1651,35 @@ finish:;
continue;
}
if ( mc && META_IS_BINDING( &candidates[ i ] ) ) {
ldap_pvt_thread_mutex_lock( &mi->mi_conninfo.lai_mutex );
if ( LDAP_BACK_CONN_BINDING( &mc->mc_conns[ i ] ) ) {
assert( candidates[ i ].sr_msgid >= 0 );
assert( mc->mc_conns[ i ].msc_ld != NULL );
if ( mc ) {
if ( META_IS_BINDING( &candidates[ i ] )
|| candidates[ i ].sr_msgid == META_MSGID_CONNECTING )
{
ldap_pvt_thread_mutex_lock( &mi->mi_conninfo.lai_mutex );
if ( LDAP_BACK_CONN_BINDING( &mc->mc_conns[ i ] )
|| candidates[ i ].sr_msgid == META_MSGID_CONNECTING )
{
assert( candidates[ i ].sr_msgid >= 0
|| candidates[ i ].sr_msgid == META_MSGID_CONNECTING );
assert( mc->mc_conns[ i ].msc_ld != NULL );
#ifdef DEBUG_205
Debug( LDAP_DEBUG_ANY, "### %s meta_back_search(cleanup) "
"ldap_unbind_ext[%ld] ld=%p\n",
op->o_log_prefix, i, (void *)mc->mc_conns[i].msc_ld );
Debug( LDAP_DEBUG_ANY, "### %s meta_back_search(cleanup) "
"ldap_unbind_ext[%ld] ld=%p\n",
op->o_log_prefix, i, (void *)mc->mc_conns[i].msc_ld );
#endif /* DEBUG_205 */
/* if still binding, destroy */
meta_clear_one_candidate( op, mc, i );
/* if still binding, destroy */
meta_clear_one_candidate( op, mc, i );
}
ldap_pvt_thread_mutex_unlock( &mi->mi_conninfo.lai_mutex );
META_BINDING_CLEAR( &candidates[ i ] );
} else if ( candidates[ i ].sr_msgid >= 0 ) {
(void)meta_back_cancel( mc, op, rs,
candidates[ i ].sr_msgid, i,
LDAP_BACK_DONTSEND );
}
ldap_pvt_thread_mutex_unlock( &mi->mi_conninfo.lai_mutex );
META_BINDING_CLEAR( &candidates[ i ] );
}
if ( candidates[ i ].sr_matched ) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment