]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Record pending DNS resolution to be able to cancel
authorOndřej Kuzník <okuznik@symas.com>
Wed, 28 Mar 2018 09:19:14 +0000 (10:19 +0100)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:58:15 +0000 (17:58 +0000)
servers/lloadd/backend.c
servers/lloadd/lload.h

index ddc3df3f10f04e1c2a88f39fcf0e27cd7a7e6b13..29ef49a2fdd7f8f95d36da400980055b27b9e783 100644 (file)
@@ -95,6 +95,7 @@ upstream_name_cb( int result, struct evutil_addrinfo *res, void *arg )
 
     ldap_pvt_thread_mutex_lock( &b->b_mutex );
 
+    b->b_dns_req = NULL;
     if ( result || !res ) {
         Debug( LDAP_DEBUG_ANY, "upstream_name_cb: "
                 "name resolution failed for backend '%s': %s\n",
@@ -169,7 +170,9 @@ fail:
     b->b_opening--;
     b->b_failed++;
     ldap_pvt_thread_mutex_unlock( &b->b_mutex );
-    backend_retry( b );
+    if ( result != EVUTIL_EAI_CANCEL ) {
+        backend_retry( b );
+    }
     if ( res ) {
         evutil_freeaddrinfo( res );
     }
@@ -415,7 +418,9 @@ backend_connect( evutil_socket_t s, short what, void *arg )
     hostname = b->b_host;
     ldap_pvt_thread_mutex_unlock( &b->b_mutex );
 
-    evdns_getaddrinfo( dnsbase, hostname, NULL, &hints, upstream_name_cb, b );
+    assert( b->b_dns_req == NULL );
+    b->b_dns_req = evdns_getaddrinfo(
+            dnsbase, hostname, NULL, &hints, upstream_name_cb, b );
     return;
 
 fail:
@@ -483,6 +488,11 @@ backend_reset( LloadBackend *b )
         CONNECTION_DESTROY(c);
         assert( !c );
     }
+    if ( b->b_dns_req ) {
+        evdns_getaddrinfo_cancel( b->b_dns_req );
+        b->b_dns_req = NULL;
+        b->b_opening--;
+    }
 }
 
 void
index f764add16c3cf84a5b584473c39e47c3c82cca44..56b6dad62d77c5571f2d0113d2a3ffd96d13384c 100644 (file)
@@ -212,6 +212,8 @@ struct LloadBackend {
     monitor_subsys_t *b_monitor;
 #endif /* BALANCER_MODULE */
 
+    struct evdns_getaddrinfo_request *b_dns_req;
+
     LDAP_CIRCLEQ_ENTRY(LloadBackend) b_next;
 };