sssd/0001-Add-reconnection-code-between-the-NSS-responder-and.patch

91 lines
2.8 KiB
Diff

From ecd411426a6c37d842b6d390c4895f34538130cf Mon Sep 17 00:00:00 2001
From: Stephen Gallagher <sgallagh@redhat.com>
Date: Tue, 14 Apr 2009 09:24:27 -0400
Subject: [PATCH] Add reconnection code between the NSS responder and the Data provider
---
server/responder/nss/nsssrv.c | 53 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 52 insertions(+), 1 deletions(-)
diff --git a/server/responder/nss/nsssrv.c b/server/responder/nss/nsssrv.c
index 58b09fb..8e72a95 100644
--- a/server/responder/nss/nsssrv.c
+++ b/server/responder/nss/nsssrv.c
@@ -219,6 +219,41 @@ done:
return ret;
}
+static void nss_shutdown(struct resp_ctx *rctx)
+{
+ /* TODO: Do clean-up here */
+
+ /* Nothing left to do but exit() */
+ exit(0);
+}
+
+
+static void nss_dp_reconnect_init(struct sbus_conn_ctx *sconn, int status, void *pvt)
+{
+ int ret;
+ struct resp_ctx *rctx = talloc_get_type(pvt, struct resp_ctx);
+
+ /* Did we reconnect successfully? */
+ if (status == SBUS_RECONNECT_SUCCESS) {
+ /* Add the methods back to the new connection */
+ ret = sbus_conn_add_method_ctx(rctx->dp_ctx->scon_ctx,
+ rctx->dp_ctx->sm_ctx);
+ if (ret != EOK) {
+ DEBUG(0, ("Could not re-add methods on reconnection.\n"));
+ nss_shutdown(rctx);
+ }
+
+ DEBUG(1, ("Reconnected to the Data Provider.\n"));
+ return;
+ }
+
+ /* Handle failure */
+ DEBUG(0, ("Could not reconnect to data provider.\n"));
+ /* Kill the backend and let the monitor restart it */
+ nss_shutdown(rctx);
+}
+
+
int nss_process_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct confdb_ctx *cdb)
@@ -226,7 +261,7 @@ int nss_process_init(TALLOC_CTX *mem_ctx,
struct sbus_method *nss_dp_methods;
struct sss_cmd_table *nss_cmds;
struct nss_ctx *nctx;
- int ret;
+ int ret, max_retries;
nctx = talloc_zero(mem_ctx, struct nss_ctx);
if (!nctx) {
@@ -261,6 +296,22 @@ int nss_process_init(TALLOC_CTX *mem_ctx,
return ret;
}
+ /* Enable automatic reconnection to the Data Provider */
+
+ /* FIXME: "retries" is too generic, either get it from a global config
+ * or specify these retries are about the sbus connections to DP */
+ ret = confdb_get_int(nctx->rctx->cdb, nctx->rctx,
+ nctx->rctx->confdb_service_path,
+ "retries", 3, &max_retries);
+ if (ret != EOK) {
+ DEBUG(0, ("Failed to set up automatic reconnection\n"));
+ return ret;
+ }
+
+ sbus_reconnect_init(nctx->rctx->dp_ctx->scon_ctx,
+ max_retries,
+ nss_dp_reconnect_init, nctx->rctx);
+
DEBUG(1, ("NSS Initialization complete\n"));
return EOK;
--
1.6.0.6