summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/ctdbd_conn.h1
-rw-r--r--source3/lib/ctdbd_conn.c24
-rw-r--r--source3/smbd/server.c11
-rw-r--r--source3/winbindd/winbindd.c12
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) {