smbd/winbindd: Do an early check if ctdbd is functional
authorVolker Lendecke <vl@samba.org>
Thu, 31 Jan 2013 10:15:09 +0000 (11:15 +0100)
committerMichael Adam <obnox@samba.org>
Thu, 17 Oct 2013 21:20:45 +0000 (23:20 +0200)
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 <vl@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
source3/include/ctdbd_conn.h
source3/lib/ctdbd_conn.c
source3/smbd/server.c
source3/winbindd/winbindd.c

index 64cb1d5..ce5c8ba 100644 (file)
@@ -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 */
index 70833cb..6ab4bbe 100644 (file)
@@ -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)
index d3cd33e..3536f18 100644 (file)
@@ -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();
 
index 31280c2..b8b9c21 100644 (file)
@@ -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) {