From 03c850593b685400b3dc39f5f0981968edae6730 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sun, 15 Nov 2009 18:07:36 -0500 Subject: Failover fixes and additions --- server/providers/fail_over.c | 28 ++++++++++++++++++++++------ server/providers/fail_over.h | 2 ++ server/resolv/async_resolv.c | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) (limited to 'server') diff --git a/server/providers/fail_over.c b/server/providers/fail_over.c index fa599e35..1b9e0171 100644 --- a/server/providers/fail_over.c +++ b/server/providers/fail_over.c @@ -129,8 +129,8 @@ get_server_status(struct fo_server *server) if (timeout != 0 && server->common->server_status == SERVER_NOT_WORKING) { gettimeofday(&tv, NULL); if (STATUS_DIFF(server->common, tv) > timeout) { - server->common->server_status = SERVER_NAME_RESOLVED; - server->last_status_change.tv_sec = tv.tv_sec; + server->common->server_status = SERVER_NAME_NOT_RESOLVED; + server->last_status_change.tv_sec = 0; } } @@ -196,6 +196,9 @@ fo_new_service(struct fo_ctx *ctx, const char *name, ret = fo_get_service(ctx, name, &service); if (ret == EOK) { DEBUG(1, ("Service %s already exists\n", name)); + if (_service) { + *_service = service; + } return EEXIST; } else if (ret != ENOENT) { return ret; @@ -215,7 +218,9 @@ fo_new_service(struct fo_ctx *ctx, const char *name, DLIST_ADD(ctx->service_list, service); talloc_set_destructor(service, service_destructor); - *_service = service; + if (_service) { + *_service = service; + } return EOK; } @@ -227,7 +232,7 @@ fo_get_service(struct fo_ctx *ctx, const char *name, struct fo_service *service; DLIST_FOR_EACH(service, ctx->service_list) { - if (!strcasecmp(name, service->name)) { + if (!strcmp(name, service->name)) { *_service = service; return EOK; } @@ -476,6 +481,10 @@ fo_resolve_service_done(struct tevent_req *subreq) while ((request = common->request_list) != NULL) { DLIST_REMOVE(common->request_list, request); if (resolv_status) { + /* FIXME FIXME: resolv_status is an ARES error. + * but any caller will expect classic error codes. + * also the send() function may return ENOENT, so this mix + * IS explosive (ENOENT = 2 = ARES_EFORMER) */ tevent_req_error(request->req, resolv_status); } else { tevent_req_done(request->req); @@ -490,11 +499,13 @@ fo_resolve_service_recv(struct tevent_req *req, struct fo_server **server) state = tevent_req_data(req, struct resolve_service_state); - TEVENT_REQ_RETURN_ON_ERROR(req); - + /* always return the server if asked for, otherwise the caller + * cannot mark it as faulty in case we return an error */ if (server) *server = state->server; + TEVENT_REQ_RETURN_ON_ERROR(req); + return EOK; } @@ -532,6 +543,11 @@ fo_get_server_port(struct fo_server *server) return server->port; } +const char *fo_get_server_name(struct fo_server *server) +{ + return server->common->name; +} + struct hostent * fo_get_server_hostent(struct fo_server *server) { diff --git a/server/providers/fail_over.h b/server/providers/fail_over.h index b6e2f2f7..5fa9ff0c 100644 --- a/server/providers/fail_over.h +++ b/server/providers/fail_over.h @@ -101,6 +101,8 @@ void *fo_get_server_user_data(struct fo_server *server); int fo_get_server_port(struct fo_server *server); +const char *fo_get_server_name(struct fo_server *server); + struct hostent *fo_get_server_hostent(struct fo_server *server); #endif /* !__FAIL_OVER_H__ */ diff --git a/server/resolv/async_resolv.c b/server/resolv/async_resolv.c index c05461d6..6ac5e41f 100644 --- a/server/resolv/async_resolv.c +++ b/server/resolv/async_resolv.c @@ -78,7 +78,7 @@ return_code(int ares_code) return ENOMEM; case ARES_EFILE: default: - return -1; + return EIO; } } -- cgit