From: Volker Lendecke Date: Thu, 31 Jan 2013 10:15:09 +0000 (+0100) Subject: smbd/winbindd: Do an early check if ctdbd is functional X-Git-Url: http://git.samba.org/?p=mat%2Fsamba.git;a=commitdiff_plain;h=fbee5795ab69a35c5440eb5684e4ca807b08b1e3 smbd/winbindd: Do an early check if ctdbd is functional This will avoid panic calls when smbd and winbind is started in cluster mode before ctdb is functional. It still logs something sane at debug level 0, but it does not panic and core anymore. Signed-off-by: Volker Lendecke Reviewed-by: Michael Adam --- diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h index 64cb1d5ade..ce5c8ba007 100644 --- a/source3/include/ctdbd_conn.h +++ b/source3/include/ctdbd_conn.h @@ -89,5 +89,6 @@ NTSTATUS ctdbd_control_local(struct ctdbd_connection *conn, uint32_t opcode, NTSTATUS ctdb_watch_us(struct ctdbd_connection *conn); NTSTATUS ctdb_unwatch(struct ctdbd_connection *conn); NTSTATUS register_with_ctdbd(struct ctdbd_connection *conn, uint64_t srvid); +NTSTATUS ctdbd_probe(void); #endif /* _CTDBD_CONN_H */ diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c index 70833cb91d..6ab4bbe704 100644 --- a/source3/lib/ctdbd_conn.c +++ b/source3/lib/ctdbd_conn.c @@ -1822,8 +1822,32 @@ NTSTATUS ctdb_unwatch(struct ctdbd_connection *conn) return status; } +NTSTATUS ctdbd_probe(void) +{ + /* + * Do a very early check if ctdbd is around to avoid an abort and core + * later + */ + struct ctdbd_connection *conn = NULL; + NTSTATUS status; + + status = ctdbd_messaging_connection(talloc_tos(), &conn); + + /* + * We only care if we can connect. + */ + TALLOC_FREE(conn); + + return status; +} + #else +NTSTATUS ctdbd_probe(void) +{ + return NT_STATUS_OK; +} + NTSTATUS ctdbd_messaging_send_blob(struct ctdbd_connection *conn, uint32_t dst_vnn, uint64_t dst_srvid, const uint8_t *buf, size_t buflen) diff --git a/source3/smbd/server.c b/source3/smbd/server.c index d3cd33ec90..3536f18cf4 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1214,6 +1214,17 @@ extern void build_options(bool screen); exit(1); } + if (lp_clustering()) { + NTSTATUS status; + + status = ctdbd_probe(); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("clustering=yes but ctdbd connect failed: " + "%s\n", nt_errstr(status))); + exit(1); + } + } + /* Init the security context and global current_user */ init_sec_ctx(); diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 31280c216b..b8b9c21170 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -37,6 +37,7 @@ #include "auth.h" #include "messages.h" #include "../lib/util/pidfile.h" +#include "ctdbd_conn.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_WINBIND @@ -1464,6 +1465,17 @@ int main(int argc, char **argv, char **envp) exit(1); } + if (lp_clustering()) { + NTSTATUS status; + + status = ctdbd_probe(); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("clustering=yes but ctdbd connect failed: " + "%s\n", nt_errstr(status))); + exit(1); + } + } + /* Initialise messaging system */ if (winbind_messaging_context() == NULL) {