]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
Make timeouts common and redo connection read timeouts
authorOndřej Kuzník <ondra@mistotebe.net>
Thu, 16 Nov 2017 13:34:40 +0000 (13:34 +0000)
committerOndřej Kuzník <okuznik@symas.com>
Tue, 17 Nov 2020 17:58:14 +0000 (17:58 +0000)
doc/man/man5/lloadd.conf.5
servers/lloadd/backend.c
servers/lloadd/client.c
servers/lloadd/config.c
servers/lloadd/connection.c
servers/lloadd/extended.c
servers/lloadd/proto-slap.h
servers/lloadd/slap.h
servers/lloadd/upstream.c

index bae0fef4e923089a26d10632ea60696e430e2ebf..24044cf1519f1e3de591bb0b88b6bffcd2517fd1 100644 (file)
@@ -526,6 +526,8 @@ option. The authentication configuration is shared between them.
 .B [credentials=<passwd>]
 .B [realm=<realm>]
 .B [secprops=<properties>]
+.B [timeout=<seconds>]
+.B [network\-timeout=<seconds>]
 
 Specifies the bind credentials
 .B lloadd
@@ -564,14 +566,32 @@ option. A non default SASL realm can be set with the
 .B realm
 option.
 
+The
+.B timeout
+parameter indicates how long an operation can be pending a response (result,
+search entry, ...) from the server in seconds. Due to how timeouts are
+detected, the timeout might not be detected and handled up to
+.B timeout
+seconds after it happens.
+
+The
+.B network\-timeout
+parameter sets how long the consumer will wait to establish a
+network connection to the provider. Once a connection is
+established, the
+.B timeout
+parameter determines how long the consumer will wait for the initial
+Bind request to complete.
+
+Timeout set to 0 means no timeout is in effect and by default, no timeouts are
+in effect.
+
 .SH BACKEND OPTIONS
 
 .TP
 .B backend
 .B uri=ldap[s]://<hostname>[:port]
 .B [retry=<retry interval in ms>]
-.B [network\-timeout=<seconds>]
-.B [timeout=<seconds>]
 .B [keepalive=<idle>:<probes>:<interval>]
 .B [starttls=yes|critical]
 .B [tls_cert=<file>]
@@ -625,15 +645,6 @@ connections,
 .BR 0 ,
 the default, means no limit will be imposed for this backend.
 
-The
-.B network\-timeout
-parameter sets how long the consumer will wait to establish a
-network connection to the provider. Once a connection is
-established, the
-.B timeout
-parameter determines how long the consumer will wait for the initial
-Bind request to complete. By default no timeouts are in effect.
-
 The
 .B keepalive
 parameter sets the values of \fIidle\fP, \fIprobes\fP, and \fIinterval\fP
index d31e4b2ec8e2d047705639a89a6fb275ce96df8f..a61cbc1633f7d157cd109bd165f808a6ef3bf473 100644 (file)
@@ -143,7 +143,7 @@ upstream_name_cb( int result, struct evutil_addrinfo *res, void *arg )
             goto fail;
         }
 
-        event_add( conn->event, lload_write_timeout );
+        event_add( conn->event, lload_timeout_net );
         LDAP_LIST_INSERT_HEAD( &b->b_connecting, conn, next );
         Debug( LDAP_DEBUG_CONNS, "upstream_name_cb: "
                 "connection to backend uri=%s in progress\n",
@@ -374,7 +374,7 @@ backend_connect( evutil_socket_t s, short what, void *arg )
                 goto fail;
             }
 
-            event_add( conn->event, lload_write_timeout );
+            event_add( conn->event, lload_timeout_net );
             LDAP_LIST_INSERT_HEAD( &b->b_connecting, conn, next );
             Debug( LDAP_DEBUG_CONNS, "backend_connect: "
                     "connection to backend uri=%s in progress\n",
index 5c08041b8e23dc7a71878f7e21852e59aa78032d..fb91cde901d30b0216a988d1bb0f898bc762a7c2 100644 (file)
@@ -302,9 +302,10 @@ client_tls_handshake_cb( evutil_socket_t s, short what, void *arg )
         event_del( c->c_read_event );
         event_del( c->c_write_event );
 
+        c->c_read_timeout = NULL;
         event_assign( c->c_read_event, base, c->c_fd, EV_READ|EV_PERSIST,
                 connection_read_cb, c );
-        event_add( c->c_read_event, NULL );
+        event_add( c->c_read_event, c->c_read_timeout );
 
         event_assign( c->c_write_event, base, c->c_fd, EV_WRITE,
                 connection_write_cb, c );
@@ -374,6 +375,7 @@ client_init(
 
         if ( rc ) {
             c->c_refcnt++;
+            c->c_read_timeout = lload_timeout_net;
             read_cb = write_cb = client_tls_handshake_cb;
         }
     }
@@ -385,7 +387,7 @@ client_init(
         goto fail;
     }
     c->c_read_event = event;
-    event_add( c->c_read_event, NULL );
+    event_add( c->c_read_event, c->c_read_timeout );
 
     event = event_new( base, s, EV_WRITE, write_cb, c );
     if ( !event ) {
index 1f5897b1fa34f5758030c5668d9e0032eec22353..0431489e22301d0b2da22f4b60eb23bd30405a17 100644 (file)
@@ -69,7 +69,7 @@ char *global_host = NULL;
 static FILE *logfile;
 static char *logfileName;
 
-static struct timeval timeout_write_tv = { 10, 0 };
+static struct timeval timeout_net_tv, timeout_write_tv = { 10, 0 };
 
 lload_features_t lload_features;
 
@@ -78,6 +78,7 @@ ber_len_t sockbuf_max_incoming_upstream = LLOAD_SB_MAX_INCOMING_UPSTREAM;
 
 int slap_conn_max_pdus_per_cycle = LLOAD_CONN_MAX_PDUS_PER_CYCLE_DEFAULT;
 
+struct timeval *lload_timeout_net = NULL;
 struct timeval *lload_write_timeout = &timeout_write_tv;
 
 char *slapd_pid_file = NULL;
@@ -664,6 +665,13 @@ config_bindconf( ConfigArgs *c )
         *ptr = '\0';
     }
 
+    if ( bindconf.sb_timeout_net ) {
+        timeout_net_tv.tv_sec = bindconf.sb_timeout_net;
+        lload_timeout_net = &timeout_net_tv;
+    } else {
+        lload_timeout_net = NULL;
+    }
+
 #ifdef HAVE_TLS
     if ( bindconf.sb_tls_do_init ) {
         bindconf_tls_set( &bindconf, slap_tls_backend_ld );
index bacb93f5ebc29adb347249aa37264f9296e70428..b66316d598b8f2d41e84cb86513582c61eee8575 100644 (file)
@@ -128,7 +128,7 @@ handle_pdus( void *ctx, void *arg )
         }
     }
 
-    event_add( c->c_read_event, NULL );
+    event_add( c->c_read_event, c->c_read_timeout );
     Debug( LDAP_DEBUG_CONNS, "handle_pdus: "
             "re-enabled read event on connid=%lu\n",
             c->c_connid );
@@ -211,7 +211,7 @@ connection_read_cb( evutil_socket_t s, short what, void *arg )
             CONNECTION_DESTROY(c);
             return;
         }
-        event_add( c->c_read_event, NULL );
+        event_add( c->c_read_event, c->c_read_timeout );
         Debug( LDAP_DEBUG_CONNS, "connection_read_cb: "
                 "re-enabled read event on connid=%lu\n",
                 c->c_connid );
index 1348dd4acaa5e04e0be678f557ea36cdc55e12fe..d2ab7062e93b9034de6682a2d53f56361e491d33 100644 (file)
@@ -83,9 +83,10 @@ handle_starttls( Connection *c, Operation *op )
     ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
 
     CONNECTION_LOCK_DECREF(c);
+    c->c_read_timeout = lload_timeout_net;
     event_assign( c->c_read_event, base, c->c_fd, EV_READ|EV_PERSIST,
             client_tls_handshake_cb, c );
-    event_add( c->c_read_event, NULL );
+    event_add( c->c_read_event, c->c_read_timeout );
 
     event_assign( c->c_write_event, base, c->c_fd, EV_WRITE,
             client_tls_handshake_cb, c );
index 2a2b1c5a5febf427d328e8dab00a5965ee578c45..7fd5354b5ada02e00ccc09dc7f5608a3e270351f 100644 (file)
@@ -254,6 +254,7 @@ LDAP_SLAPD_V (const char) Versionstr[];
 LDAP_SLAPD_V (int) global_gentlehup;
 LDAP_SLAPD_V (int) global_idletimeout;
 
+LDAP_SLAPD_V (struct timeval *) lload_timeout_net;
 LDAP_SLAPD_V (struct timeval *) lload_write_timeout;
 
 LDAP_SLAPD_V (char *) global_host;
index f131687abb8c640512ff66002a93b8cee3fac797..f3ad526331dc16260a900056ba621a08d7a2001b 100644 (file)
@@ -383,6 +383,7 @@ struct Connection {
 
     /* must not be used while holding either mutex */
     struct event *c_read_event, *c_write_event;
+    struct timeval *c_read_timeout;
 
     /* can only be changed by binding thread */
     struct berval c_sasl_bind_mech; /* mech in progress */
index 18eebf95048e2fb8a23638c4017b9c6272b93201..413549fea8dc547d15c0b1fdedca7a943cec423e 100644 (file)
@@ -292,6 +292,11 @@ upstream_bind_cb( Connection *c )
             c->c_pdu_cb = handle_one_response;
             c->c_state = LLOAD_C_READY;
             c->c_type = LLOAD_C_OPEN;
+            c->c_read_timeout = NULL;
+            event_add( c->c_read_event, c->c_read_timeout );
+            Debug( LDAP_DEBUG_CONNS, "upstream_bind_cb: "
+                    "connid=%lu finished binding, now active\n",
+                    c->c_connid );
             CONNECTION_UNLOCK_INCREF(c);
             ldap_pvt_thread_mutex_lock( &b->b_mutex );
             LDAP_CIRCLEQ_REMOVE( &b->b_preparing, c, c_next );
@@ -365,6 +370,8 @@ upstream_bind( void *ctx, void *arg )
     connection_write_cb( -1, 0, c );
 
     CONNECTION_LOCK_DECREF(c);
+    c->c_read_timeout = lload_timeout_net;
+    event_add( c->c_read_event, c->c_read_timeout );
     CONNECTION_UNLOCK_OR_DESTROY(c);
 
     return NULL;
@@ -459,9 +466,10 @@ upstream_tls_handshake_cb( evutil_socket_t s, short what, void *arg )
         event_del( c->c_read_event );
         event_del( c->c_write_event );
 
+        c->c_read_timeout = NULL;
         event_assign( c->c_read_event, base, c->c_fd, EV_READ|EV_PERSIST,
                 connection_read_cb, c );
-        event_add( c->c_read_event, NULL );
+        event_add( c->c_read_event, c->c_read_timeout );
 
         event_assign( c->c_write_event, base, c->c_fd, EV_WRITE,
                 connection_write_cb, c );
@@ -581,12 +589,13 @@ upstream_starttls( Connection *c )
     event_del( c->c_read_event );
     event_del( c->c_write_event );
 
+    c->c_read_timeout = lload_timeout_net;
     event_assign( c->c_read_event, base, c->c_fd, EV_READ|EV_PERSIST,
             upstream_tls_handshake_cb, c );
     event_assign( c->c_write_event, base, c->c_fd, EV_WRITE,
             upstream_tls_handshake_cb, c );
 
-    event_add( c->c_read_event, NULL );
+    event_add( c->c_read_event, c->c_read_timeout );
     event_add( c->c_write_event, lload_write_timeout );
 
     CONNECTION_UNLOCK(c);
@@ -678,7 +687,7 @@ upstream_init( ber_socket_t s, Backend *b )
         connection_write_cb( s, 0, c );
         CONNECTION_LOCK_DECREF(c);
     }
-    event_add( c->c_read_event, NULL );
+    event_add( c->c_read_event, c->c_read_timeout );
 
     c->c_destroy = upstream_destroy;
     CONNECTION_UNLOCK_OR_DESTROY(c);