PERFORCE change 115062 for review
Michael Bushkov
bushman at FreeBSD.org
Mon Feb 26 14:45:05 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=115062
Change 115062 by bushman at bushman_nss_ldap_cached on 2007/02/26 14:44:10
+ more configuration options are now accessible from the config
file (sleep and connection tries related options)
+ reconnection logic was changed so that one global reconnection
counter is consulted for each connection session
+ ldap_msgtype() now used to properly identify the result
message and not give it to the parser
Affected files ...
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/ldapconf.c#20 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/ldapconf.h#17 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/ldapsearch.c#19 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/nss_ldap.c#23 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/nss_ldap.h#17 edit
Differences ...
==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/ldapconf.c#20 (text+ko) ====
@@ -415,9 +415,28 @@
}
}
break;
+ case 'm':
+ case 'M':
+ if (strcasecmp(fields[0], "max_conntries") == 0) {
+ if ((field_count == 2) &&
+ (get_number(fields[1], 0, -1, &value) ==
+ NSS_LDAP_SUCCESS)) {
+ conf->max_conntries = value;
+ return (NSS_LDAP_SUCCESS);
+ }
+ } else if (strcasecmp(fields[0],
+ "max_reconnect_conntries") == 0) {
+ if ((field_count == 2) &&
+ (get_number(fields[1], 0, -1, &value) ==
+ NSS_LDAP_SUCCESS)) {
+ conf->max_reconnect_conntries = value;
+ return (NSS_LDAP_SUCCESS);
+ }
+ }
+ break;
case 'n':
case 'N':
- if (strncmp(fields[0], NSS_BASE_PREFIX,
+ if (strncasecmp(fields[0], NSS_BASE_PREFIX,
NSS_BASE_PREFIX_SIZE) == 0) {
if ((field_count == 2) && (set_base_map(conf,
@@ -559,7 +578,14 @@
break;
case 'r':
case 'R':
- if (strcasecmp(fields[0], "rootbinddn") == 0) {
+ if (strcasecmp(fields[0], "reconnect_sleeptime") == 0) {
+ if ((field_count == 2) &&
+ (get_number(fields[1], 0, -1, &value) ==
+ NSS_LDAP_SUCCESS)) {
+ conf->reconnect_sleeptime = value;
+ return (NSS_LDAP_SUCCESS);
+ }
+ } else if (strcasecmp(fields[0], "rootbinddn") == 0) {
if (field_count == 2) {
free(conf->root_bind_dn);
conf->root_bind_dn = strdup(fields[1]);
@@ -730,7 +756,6 @@
conf->idle_timelimit = 0;
conf->search_timelimit = 0;
conf->reconnect_sleeptime = 4;
- conf->max_reconnect_sleeptime = 8;
conf->max_conntries = 5;
conf->max_reconnect_conntries = 2;
conf->deref = NSS_LDAP_DEREF_NEVER;
@@ -738,7 +763,7 @@
conf->bind_policy = NSS_LDAP_BIND_POLICY_HARD;
conf->connect_policy = NSS_LDAP_CONNECT_POLICY_PERSIST_PERTHREAD;
conf->restart = 0;
- conf->debug = 0;
+ conf->debug = NSS_LDAP_LL_ERR;
conf->page_results = NSS_LDAP_OPTION_YES;
conf->results_page_size = NSS_LDAP_DEFAULT_RESULTS_PAGE_SIZE;
==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/ldapconf.h#17 (text+ko) ====
@@ -89,7 +89,6 @@
time_t idle_timelimit;
time_t search_timelimit;
time_t reconnect_sleeptime;
- time_t max_reconnect_sleeptime;
int max_conntries;
int max_reconnect_conntries;
int port;
==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/ldapsearch.c#19 (text+ko) ====
@@ -517,9 +517,8 @@
case LDAP_RES_SEARCH_RESULT:
case LDAP_RES_SEARCH_ENTRY:
ctx->msg = ldap_first_message(ctx->conn->ld,
- ctx->msg_first);
-
- return (NSS_LDAP_SUCCESS);
+ ctx->msg_first);
+ break;
case LDAP_RES_SEARCH_REFERENCE:
/* NOT IMPLEMENTED */
__nss_ldap_log(NSS_LDAP_LL_ERR_INT, "search_next_def: "
@@ -539,72 +538,74 @@
ctx->search_request.filter);
return (NSS_LDAP_GENERIC_ERROR);
}
- } else {
-// printf("== %s %d\n", __FILE__, __LINE__);
+ } else
+ ctx->msg = ldap_next_message(ctx->conn->ld, ctx->msg);
+
+ /*
+ * Cycling through the list of results, until we find the appropriate
+ * one
+ */
+ while (ctx->msg != NULL &&
+ ldap_msgtype(ctx->msg) != LDAP_RES_SEARCH_ENTRY)
ctx->msg = ldap_next_message(ctx->conn->ld, ctx->msg);
- if (ctx->msg != NULL) {
-// printf("== %s %d\n", __FILE__, __LINE__);
- return (NSS_LDAP_SUCCESS);
- } else {
-// printf("== %s %d\n", __FILE__, __LINE__);
- rv = ldap_parse_result(ctx->conn->ld,
- ctx->msg_first, &errcode, &matcheddn,
- &errmsg, &referrals, &server_controls,
- 0);
-
- ldap_msgfree(ctx->msg_first);
- ctx->msg_first = NULL;
+
+ if (ctx->msg != NULL)
+ return (NSS_LDAP_SUCCESS);
+ else {
+ rv = ldap_parse_result(ctx->conn->ld,
+ ctx->msg_first, &errcode, &matcheddn,
+ &errmsg, &referrals, &server_controls,
+ 0);
+ ldap_msgfree(ctx->msg_first);
+ ctx->msg_first = NULL;
+
// printf("== %s %d\n", __FILE__, __LINE__);
- if (rv == LDAP_SUCCESS) {
+ if (rv == LDAP_SUCCESS) {
// printf("== %s %d\n", __FILE__, __LINE__);
- if (server_controls != NULL) {
- if (ctx->cookie != NULL) {
- ber_bvfree(ctx->cookie);
- ctx->cookie = NULL;
- }
-
-// printf("== %s %d\n", __FILE__, __LINE__);
- rv = __nss_ldap_parse_page_control(
- ctx->conn->ld, server_controls,
- &abs_rescount, &ctx->cookie);
-
- if (rv != LDAP_SUCCESS) {
-// printf("== %s %d\n", __FILE__, __LINE__);
- // TODO: write to logs smth scary
- }
-
- ldap_controls_free(server_controls);
+ if (server_controls != NULL) {
+ if (ctx->cookie != NULL) {
+ ber_bvfree(ctx->cookie);
+ ctx->cookie = NULL;
}
-// printf("== %s %d\n", __FILE__, __LINE__);
- if (errmsg != NULL)
- ldap_memfree(errmsg);
- if (matcheddn != NULL)
- ldap_memfree(matcheddn);
- if (referrals != NULL)
- ldap_value_free(referrals);
- } else {
// printf("== %s %d\n", __FILE__, __LINE__);
- // TODO: signal to logs
- }
-
- if (ctx->cookie && ctx->cookie->bv_val != NULL &&
- (strlen(ctx->cookie->bv_val) > 0)) {
- rv = do_ldap_search_ext(ctx->conn, ctx->conf,
- &ctx->search_request, ctx, &ctx->msgid);
+ rv = __nss_ldap_parse_page_control(
+ ctx->conn->ld, server_controls,
+ &abs_rescount, &ctx->cookie);
+
if (rv != LDAP_SUCCESS) {
// printf("== %s %d\n", __FILE__, __LINE__);
- /* TODO: check this place */
- return (NSS_LDAP_SUCCESS);
- }
-
- goto st;
- } else {
+ // TODO: write to logs smth scary
+ }
+
+ ldap_controls_free(server_controls);
+ }
+
+// printf("== %s %d\n", __FILE__, __LINE__);
+ if (errmsg != NULL)
+ ldap_memfree(errmsg);
+ if (matcheddn != NULL)
+ ldap_memfree(matcheddn);
+ if (referrals != NULL)
+ ldap_value_free(referrals);
+ } else {
// printf("== %s %d\n", __FILE__, __LINE__);
+ // TODO: signal to logs
+ }
+
+ if (ctx->cookie && ctx->cookie->bv_val != NULL &&
+ (strlen(ctx->cookie->bv_val) > 0)) {
+ rv = do_ldap_search_ext(ctx->conn, ctx->conf,
+ &ctx->search_request, ctx, &ctx->msgid);
+ if (rv != LDAP_SUCCESS) {
+ /* TODO: check this place */
return (NSS_LDAP_SUCCESS);
- }
- }
+ }
+
+ goto st;
+ } else
+ return (NSS_LDAP_GENERIC_ERROR);
}
return (NSS_LDAP_GENERIC_ERROR);
==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/nss_ldap.c#23 (text+ko) ====
@@ -120,29 +120,38 @@
struct nss_ldap_configuration *__nss_ldap_conf = NULL;
int __nss_ldap_debug_level = 1;
-static int nss_ldap_configure();
-static void nss_ldap_atexit();
static void connection_destroy_func(struct nss_ldap_connection *);
-static void parse_context_destroy_func(struct nss_ldap_parse_context *);
-
+static int init_connection_with_reconnect(
+ struct nss_ldap_connection_method *, struct nss_ldap_connection **,
+ int *, struct nss_ldap_connection_error *);
+static int fill_conn_request_with_host(struct nss_ldap_connection_request *,
+ char const *, struct nss_ldap_configuration *);
+static int fill_conn_request_with_uri(struct nss_ldap_connection_request *,
+ char const *, struct nss_ldap_configuration *);
+static void nss_ldap_atexit();
+static int nss_ldap_configure();
static int nss_ldap_connection_init(struct nss_ldap_connection_method *,
struct nss_ldap_tls_method *, struct nss_ldap_connection **,
- struct nss_ldap_connection_error *);
+ int *, struct nss_ldap_connection_error *);
static int nss_ldap_connection_done(struct nss_ldap_tls_method *,
struct nss_ldap_connection *);
-
+static int nss_ldap_connection_reset(struct nss_ldap_tls_method *,
+ struct nss_ldap_connection *);
static int nss_ldap_parse_context_init(struct nss_ldap_search_method *,
struct nss_ldap_tls_method *, int, char const *,
struct nss_ldap_parse_context **, struct nss_ldap_connection *,
struct nss_ldap_parse_context *);
static void nss_ldap_parse_context_done(struct nss_ldap_search_method *,
struct nss_ldap_tls_method *, struct nss_ldap_parse_context *,
- int);
-
+ int);
static int nss_ldap_get_common(int, char const *, void *, char *,
size_t, nss_ldap_parse_next_fn, nss_ldap_parse_destroy_fn, int);
+static int nss_ldap_set_sigpipe_mask(sigset_t *);
+static int nss_ldap_unset_sigpipe_mask(sigset_t *);
+static void parse_context_destroy_func(struct nss_ldap_parse_context *);
+
static int
nss_ldap_configure()
{
@@ -293,28 +302,30 @@
static int
init_connection_with_reconnect(
struct nss_ldap_connection_method *connection_method,
- struct nss_ldap_connection **conn,
+ struct nss_ldap_connection **conn, int *conn_tries,
struct nss_ldap_connection_error *conn_error)
{
struct nss_ldap_connection_request conn_request;
struct nss_ldap_connection_error l_conn_err;
StringList *cur_sl;
size_t k;
- time_t sleep_time;
- int tries, sleep_tries;
+ int sleep_tries;
int rv;
- tries = 0;
- sleep_time = __nss_ldap_conf->reconnect_sleeptime;
+ /*
+ * We don't set
+ * *conn_tries = 0;
+ * here so that we can keep one connection counter for each connection
+ * session.
+ */
if (__nss_ldap_conf->hosts != NULL)
cur_sl = __nss_ldap_conf->hosts;
else
cur_sl = __nss_ldap_conf->uris;
- sleep_time = __nss_ldap_conf->reconnect_sleeptime;
rv = NSS_LDAP_CONNECTION_ERROR;
- while (tries++ < __nss_ldap_conf->max_conntries) {
+ while ((*conn_tries)++ < __nss_ldap_conf->max_conntries) {
sleep_tries = 0;
while (sleep_tries++ < __nss_ldap_conf->max_reconnect_conntries) {
for (k = 0; k < cur_sl->sl_cur; ++k) {
@@ -385,12 +396,11 @@
if (__nss_ldap_conf->bind_policy == NSS_LDAP_BIND_POLICY_SOFT)
break;
- if (sleep_time < __nss_ldap_conf->max_reconnect_sleeptime) {
+ if (*conn_tries < __nss_ldap_conf->max_conntries) {
__nss_ldap_log(NSS_LDAP_LL_DEBUG_INT,
"init_connection_with_reconnect: sleeping for"
- " %d secs", sleep_time);
- sleep(sleep_time);
- sleep_time *= 2;
+ " %d secs", __nss_ldap_conf->reconnect_sleeptime);
+ sleep(__nss_ldap_conf->reconnect_sleeptime);
}
}
@@ -401,7 +411,7 @@
static int
nss_ldap_connection_init(struct nss_ldap_connection_method *connection_method,
struct nss_ldap_tls_method *tls_method,
- struct nss_ldap_connection **conn,
+ struct nss_ldap_connection **conn, int *conn_tries,
struct nss_ldap_connection_error *conn_error)
{
int rv;
@@ -436,7 +446,7 @@
if (*conn == NULL) { /* connection is not established yet */
rv = init_connection_with_reconnect(connection_method,
- conn, conn_error);
+ conn, conn_tries, conn_error);
if (rv != NSS_LDAP_SUCCESS) {
*conn = NULL;
rv = NS_UNAVAIL;
@@ -661,7 +671,7 @@
struct nss_ldap_connection_error conn_error;
struct nss_ldap_connection *conn;
struct nss_ldap_parse_context *pctx, pctx_model;
- int rv, conn_flag, signals_rv;
+ int conn_tries, rv, signals_rv;
assert(map_id < NSS_LDAP_MAP_MAX);
assert(filter != NULL);
@@ -678,11 +688,11 @@
pctx = NULL;
conn = NULL;
- conn_flag = 0;
+ conn_tries = 0;
memset(&conn_error, 0, sizeof(struct nss_ldap_connection_error));
- while (conn_flag < 2) {
+ while (conn_tries < __nss_ldap_conf->max_conntries) {
rv = nss_ldap_connection_init(connection_method, tls_method,
- &conn, &conn_error);
+ &conn, &conn_tries, &conn_error);
if (rv != NS_SUCCESS) {
__nss_ldap_log(NSS_LDAP_LL_ERR,
"nss_ldap_get_common: can't initialize the connection "
@@ -770,7 +780,7 @@
nss_ldap_connection_reset(tls_method, conn);
conn = NULL;
- ++conn_flag;
+ ++conn_tries;
} else
break;
}
==== //depot/projects/soc2006/nss_ldap_cached/src/lib/nss_ldap/nss_ldap.h#17 (text+ko) ====
More information about the p4-projects
mailing list