From 66f06f3fa9c51509a6732d0a69784a81a1546310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Wed, 13 Dec 2017 15:56:10 +0000 Subject: [PATCH] Initial extension to upstream selection --- servers/lloadd/backend.c | 9 ++++++++- servers/lloadd/bind.c | 7 +++---- servers/lloadd/client.c | 7 +++---- servers/lloadd/proto-lload.h | 2 +- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/servers/lloadd/backend.c b/servers/lloadd/backend.c index 549cda8936..110b90d905 100644 --- a/servers/lloadd/backend.c +++ b/servers/lloadd/backend.c @@ -176,7 +176,7 @@ fail: } LloadConnection * -backend_select( LloadOperation *op ) +backend_select( LloadOperation *op, int *res ) { LloadBackend *b, *first, *next; @@ -184,6 +184,8 @@ backend_select( LloadOperation *op ) first = b = current_backend; ldap_pvt_thread_mutex_unlock( &backend_mutex ); + *res = LDAP_UNAVAILABLE; + if ( !first ) { return NULL; } @@ -203,6 +205,7 @@ backend_select( LloadOperation *op ) b->b_uri.bv_val ); ldap_pvt_thread_mutex_unlock( &b->b_mutex ); b = next; + *res = LDAP_BUSY; continue; } @@ -215,6 +218,9 @@ backend_select( LloadOperation *op ) } else { head = &b->b_conns; } + if ( !LDAP_CIRCLEQ_EMPTY( head ) ) { + *res = LDAP_BUSY; + } LDAP_CIRCLEQ_FOREACH ( c, head, c_next ) { ldap_pvt_thread_mutex_lock( &c->c_io_mutex ); @@ -243,6 +249,7 @@ backend_select( LloadOperation *op ) CONNECTION_UNLOCK_INCREF(c); ldap_pvt_thread_mutex_unlock( &b->b_mutex ); + *res = LDAP_SUCCESS; return c; } CONNECTION_UNLOCK(c); diff --git a/servers/lloadd/bind.c b/servers/lloadd/bind.c index 84d6a51160..612e53d498 100644 --- a/servers/lloadd/bind.c +++ b/servers/lloadd/bind.c @@ -263,7 +263,7 @@ int request_bind( LloadConnection *client, LloadOperation *op ) { LloadConnection *upstream; - int rc = LDAP_SUCCESS; + int res, rc = LDAP_SUCCESS; /* protect the Bind operation */ op->o_client_refcnt++; @@ -278,13 +278,12 @@ request_bind( LloadConnection *client, LloadOperation *op ) assert( rc == LDAP_SUCCESS ); CONNECTION_UNLOCK_INCREF(client); - upstream = backend_select( op ); + upstream = backend_select( op, &res ); if ( !upstream ) { Debug( LDAP_DEBUG_STATS, "client_bind: " "connid=%lu, msgid=%d no available connection found\n", op->o_client_connid, op->o_client_msgid ); - operation_send_reject( - op, LDAP_UNAVAILABLE, "no connections available", 1 ); + operation_send_reject( op, res, "no connections available", 1 ); CONNECTION_LOCK_DECREF(client); op->o_client_refcnt--; operation_destroy_from_client( op ); diff --git a/servers/lloadd/client.c b/servers/lloadd/client.c index dc0bf388e5..122a26d432 100644 --- a/servers/lloadd/client.c +++ b/servers/lloadd/client.c @@ -86,19 +86,18 @@ request_process( LloadConnection *client, LloadOperation *op ) BerElement *output; LloadConnection *upstream; ber_int_t msgid; - int rc = LDAP_SUCCESS; + int res, rc = LDAP_SUCCESS; op->o_client_refcnt++; CONNECTION_UNLOCK_INCREF(client); - upstream = backend_select( op ); + upstream = backend_select( op, &res ); if ( !upstream ) { Debug( LDAP_DEBUG_STATS, "request_process: " "connid=%lu, msgid=%d no available connection found\n", op->o_client_connid, op->o_client_msgid ); - operation_send_reject( - op, LDAP_UNAVAILABLE, "no connections available", 1 ); + operation_send_reject( op, res, "no connections available", 1 ); goto fail; } op->o_upstream = upstream; diff --git a/servers/lloadd/proto-lload.h b/servers/lloadd/proto-lload.h index f3cecd4c73..61b901317c 100644 --- a/servers/lloadd/proto-lload.h +++ b/servers/lloadd/proto-lload.h @@ -43,7 +43,7 @@ struct config_reply_s; /* config.h */ LDAP_SLAPD_F (void) backend_connect( evutil_socket_t s, short what, void *arg ); LDAP_SLAPD_F (void *) backend_connect_task( void *ctx, void *arg ); LDAP_SLAPD_F (void) backend_retry( LloadBackend *b ); -LDAP_SLAPD_F (LloadConnection *) backend_select( LloadOperation *op ); +LDAP_SLAPD_F (LloadConnection *) backend_select( LloadOperation *op, int *res ); LDAP_SLAPD_F (void) backends_destroy( void ); /*