diff options
-rw-r--r-- | source3/include/ctdbd_conn.h | 1 | ||||
-rw-r--r-- | source3/lib/ctdbd_conn.c | 24 | ||||
-rw-r--r-- | source3/smbd/server.c | 11 | ||||
-rw-r--r-- | source3/winbindd/winbindd.c | 12 |
4 files changed, 48 insertions, 0 deletions
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) { |