The branch, master has been updated
       via  a391e92 s3-messaging: use messaging_ctdbd_reinit() in 
messaging_reinit()
       via  f9913813 s3-messaging/ctdb: add messaging_ctdbd_reinit()
       via  c6373ab s3-messaging/ctdb: split messaging_ctdbd_init()
       via  84da49f ctdbd_conn: add ctdbd_reinit_connection()
       via  1184931 ctdbd_conn: split ctdbd_init_connection()
      from  2f95ada ctdb: fix autotest with socket-wrapper installed in the 
system

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a391e9202db6a8f64f2fe12d0ab5752f6e684f84
Author: Ralph Boehme <s...@samba.org>
Date:   Sat Jul 9 14:33:52 2016 +0200

    s3-messaging: use messaging_ctdbd_reinit() in messaging_reinit()
    
    This is the last step to fix a regression introduced by
    
      3fe3226daa8488e0fa787c40359c3401b6f05fc0 and
      3fe3226daa8488e0fa787c40359c3401b6f05fc0^
    
    where we pass the ctdb-messaging object conn to db_open() and add a
    reference to it to the private db_ctdb_ctx for later use. Unfortunately
    reinit_after_fork() destroys conn, leaving us with an invalid reference.
    
    The previous patches added new lower level functions
    messaging_ctdbd_reinit() and ctdbd_reinit_connection(), finally use them
    them from messaging_reinit(). They preserve the conn object and simply
    reinitialize the IPC fd.
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>
    
    Autobuild-User(master): Ralph Böhme <s...@samba.org>
    Autobuild-Date(master): Mon Jul 11 23:45:20 CEST 2016 on sn-devel-144

commit f991381356b09c09edf410b2659bb4f833102be7
Author: Ralph Boehme <s...@samba.org>
Date:   Sat Jul 9 14:30:35 2016 +0200

    s3-messaging/ctdb: add messaging_ctdbd_reinit()
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>

commit c6373aba00dd7a69b2e69c979510e3de04700b2d
Author: Ralph Boehme <s...@samba.org>
Date:   Sat Jul 9 13:20:01 2016 +0200

    s3-messaging/ctdb: split messaging_ctdbd_init()
    
    Split out and internal function from messaging_ctdbd_init() that does
    the connection setup. Keep the conn object allocation in
    messaging_ctdbd_init().
    
    This is in preperation of adding messaging_ctdbd_reinit() which will use
    the new internal function as well.
    
    messaging_ctdbd_init_internal() has a new reinit flag,
    messaging_ctdbd_init() calls with reinit=false resulting in unmodified
    behaviour.
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>

commit 84da49f89b905a80d82901bfc1e4c8ec534edd3d
Author: Ralph Boehme <s...@samba.org>
Date:   Sat Jul 9 08:59:09 2016 +0200

    ctdbd_conn: add ctdbd_reinit_connection()
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>

commit 1184931001be983b858f44468aeb083140d924ad
Author: Ralph Boehme <s...@samba.org>
Date:   Sat Jul 9 08:48:49 2016 +0200

    ctdbd_conn: split ctdbd_init_connection()
    
    Split ctdbd_init_connection() into an internal function that does the
    connection setup and only keep the conn object allocation in
    ctdbd_init_connection().
    
    This is in preperation of adding ctdbd_reinit_connection() which will
    use the new internal function as well.
    
    Signed-off-by: Ralph Boehme <s...@samba.org>
    Reviewed-by: Volker Lendecke <v...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/ctdbd_conn.h |  3 ++
 source3/include/messages.h   |  3 ++
 source3/lib/ctdb_dummy.c     |  7 ++++
 source3/lib/ctdbd_conn.c     | 72 +++++++++++++++++++++++++--------
 source3/lib/messages.c       |  6 +--
 source3/lib/messages_ctdbd.c | 95 +++++++++++++++++++++++++++++++-------------
 6 files changed, 139 insertions(+), 47 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h
index 11e71ba..bbebbce 100644
--- a/source3/include/ctdbd_conn.h
+++ b/source3/include/ctdbd_conn.h
@@ -33,6 +33,9 @@ struct messaging_rec;
 int ctdbd_init_connection(TALLOC_CTX *mem_ctx,
                          const char *sockname, int timeout,
                          struct ctdbd_connection **pconn);
+int ctdbd_reinit_connection(TALLOC_CTX *mem_ctx,
+                           const char *sockname, int timeout,
+                           struct ctdbd_connection *conn);
 
 uint32_t ctdbd_vnn(const struct ctdbd_connection *conn);
 
diff --git a/source3/include/messages.h b/source3/include/messages.h
index 8bbe026..2eaf146 100644
--- a/source3/include/messages.h
+++ b/source3/include/messages.h
@@ -79,6 +79,9 @@ struct messaging_backend {
 int messaging_ctdbd_init(struct messaging_context *msg_ctx,
                         TALLOC_CTX *mem_ctx,
                         struct messaging_backend **presult);
+int messaging_ctdbd_reinit(struct messaging_context *msg_ctx,
+                          TALLOC_CTX *mem_ctx,
+                          struct messaging_backend *backend);
 struct ctdbd_connection *messaging_ctdbd_connection(void);
 
 bool message_send_all(struct messaging_context *msg_ctx,
diff --git a/source3/lib/ctdb_dummy.c b/source3/lib/ctdb_dummy.c
index ec0bcc4..8b617ba 100644
--- a/source3/lib/ctdb_dummy.c
+++ b/source3/lib/ctdb_dummy.c
@@ -83,6 +83,13 @@ int messaging_ctdbd_init(struct messaging_context *msg_ctx,
        return ENOSYS;
 }
 
+int messaging_ctdbd_reinit(struct messaging_context *msg_ctx,
+                          TALLOC_CTX *mem_ctx,
+                          struct messaging_backend *backend)
+{
+       return ENOSYS;
+}
+
 struct ctdbd_connection *messaging_ctdbd_connection(void)
 {
        return NULL;
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index d073c72..1f8ac94 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -405,20 +405,13 @@ static int ctdbd_connection_destructor(struct 
ctdbd_connection *c)
  * Get us a ctdbd connection
  */
 
-int ctdbd_init_connection(TALLOC_CTX *mem_ctx,
-                         const char *sockname, int timeout,
-                         struct ctdbd_connection **pconn)
+static int ctdbd_init_connection_internal(TALLOC_CTX *mem_ctx,
+                                         const char *sockname, int timeout,
+                                         struct ctdbd_connection *conn)
 {
-       struct ctdbd_connection *conn;
        int ret;
 
-       if (!(conn = talloc_zero(mem_ctx, struct ctdbd_connection))) {
-               DEBUG(0, ("talloc failed\n"));
-               return ENOMEM;
-       }
-
        conn->timeout = timeout;
-
        if (conn->timeout == 0) {
                conn->timeout = -1;
        }
@@ -426,31 +419,53 @@ int ctdbd_init_connection(TALLOC_CTX *mem_ctx,
        ret = ctdbd_connect(sockname, &conn->fd);
        if (ret != 0) {
                DEBUG(1, ("ctdbd_connect failed: %s\n", strerror(ret)));
-               goto fail;
+               return ret;
        }
        talloc_set_destructor(conn, ctdbd_connection_destructor);
 
        ret = get_cluster_vnn(conn, &conn->our_vnn);
-
        if (ret != 0) {
                DEBUG(10, ("get_cluster_vnn failed: %s\n", strerror(ret)));
-               goto fail;
+               return ret;
        }
 
        if (!ctdbd_working(conn, conn->our_vnn)) {
                DEBUG(2, ("Node is not working, can not connect\n"));
-               ret = EIO;
-               goto fail;
+               return EIO;
        }
 
        generate_random_buffer((unsigned char *)&conn->rand_srvid,
                               sizeof(conn->rand_srvid));
 
        ret = register_with_ctdbd(conn, conn->rand_srvid, NULL, NULL);
-
        if (ret != 0) {
                DEBUG(5, ("Could not register random srvid: %s\n",
                          strerror(ret)));
+               return ret;
+       }
+
+       return 0;
+}
+
+int ctdbd_init_connection(TALLOC_CTX *mem_ctx,
+                         const char *sockname, int timeout,
+                         struct ctdbd_connection **pconn)
+{
+       struct ctdbd_connection *conn;
+       int ret;
+
+       if (!(conn = talloc_zero(mem_ctx, struct ctdbd_connection))) {
+               DEBUG(0, ("talloc failed\n"));
+               return ENOMEM;
+       }
+
+       ret = ctdbd_init_connection_internal(mem_ctx,
+                                            sockname,
+                                            timeout,
+                                            conn);
+       if (ret != 0) {
+               DBG_ERR("ctdbd_init_connection_internal failed (%s)\n",
+                       strerror(ret));
                goto fail;
        }
 
@@ -462,6 +477,31 @@ int ctdbd_init_connection(TALLOC_CTX *mem_ctx,
        return ret;
 }
 
+int ctdbd_reinit_connection(TALLOC_CTX *mem_ctx,
+                           const char *sockname, int timeout,
+                           struct ctdbd_connection *conn)
+{
+       int ret;
+
+       ret = ctdbd_connection_destructor(conn);
+       if (ret != 0) {
+               DBG_ERR("ctdbd_connection_destructor failed\n");
+               return ret;
+       }
+
+       ret = ctdbd_init_connection_internal(mem_ctx,
+                                            sockname,
+                                            timeout,
+                                            conn);
+       if (ret != 0) {
+               DBG_ERR("ctdbd_init_connection_internal failed (%s)\n",
+                       strerror(ret));
+               return ret;
+       }
+
+       return 0;
+}
+
 int ctdbd_conn_get_fd(struct ctdbd_connection *conn)
 {
        return conn->fd;
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 65e975e..5d90947 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -416,11 +416,9 @@ NTSTATUS messaging_reinit(struct messaging_context 
*msg_ctx)
                return map_nt_error_from_unix(ret);
        }
 
-       TALLOC_FREE(msg_ctx->remote);
-
        if (lp_clustering()) {
-               ret = messaging_ctdbd_init(msg_ctx, msg_ctx,
-                                          &msg_ctx->remote);
+               ret = messaging_ctdbd_reinit(msg_ctx, msg_ctx,
+                                            msg_ctx->remote);
 
                if (ret != 0) {
                        DEBUG(1, ("messaging_ctdbd_init failed: %s\n",
diff --git a/source3/lib/messages_ctdbd.c b/source3/lib/messages_ctdbd.c
index 1645ccf..5964894 100644
--- a/source3/lib/messages_ctdbd.c
+++ b/source3/lib/messages_ctdbd.c
@@ -174,41 +174,40 @@ static void messaging_ctdbd_readable(struct 
tevent_context *ev,
        ctdbd_socket_readable(conn);
 }
 
-int messaging_ctdbd_init(struct messaging_context *msg_ctx,
-                        TALLOC_CTX *mem_ctx,
-                        struct messaging_backend **presult)
+static int messaging_ctdbd_init_internal(struct messaging_context *msg_ctx,
+                                        TALLOC_CTX *mem_ctx,
+                                        struct messaging_ctdbd_context *ctx,
+                                        bool reinit)
 {
-       struct messaging_backend *result;
-       struct messaging_ctdbd_context *ctx;
        struct tevent_context *ev;
        int ret, ctdb_fd;
 
-       if (!(result = talloc(mem_ctx, struct messaging_backend))) {
-               DEBUG(0, ("talloc failed\n"));
-               return ENOMEM;
-       }
-
-       if (!(ctx = talloc(result, struct messaging_ctdbd_context))) {
-               DEBUG(0, ("talloc failed\n"));
-               TALLOC_FREE(result);
-               return ENOMEM;
-       }
-
-       ret = ctdbd_init_connection(ctx, lp_ctdbd_socket(),
-                                   lp_ctdb_timeout(), &ctx->conn);
-
-       if (ret != 0) {
-               DBG_DEBUG("ctdbd_init_connection failed: %s\n",
-                         strerror(ret));
-               TALLOC_FREE(result);
-               return ret;
+       if (reinit) {
+               ret = ctdbd_reinit_connection(ctx,
+                                             lp_ctdbd_socket(),
+                                             lp_ctdb_timeout(),
+                                             ctx->conn);
+               if (ret != 0) {
+                       DBG_ERR("ctdbd_reinit_connection failed: %s\n",
+                               strerror(ret));
+                       return ret;
+               }
+       } else {
+               ret = ctdbd_init_connection(ctx,
+                                           lp_ctdbd_socket(),
+                                           lp_ctdb_timeout(),
+                                           &ctx->conn);
+               if (ret != 0) {
+                       DBG_ERR("ctdbd_init_connection failed: %s\n",
+                               strerror(ret));
+                       return ret;
+               }
        }
 
        ret = register_with_ctdbd(ctx->conn, MSG_SRVID_SAMBA, NULL, NULL);
        if (ret != 0) {
                DBG_DEBUG("Could not register MSG_SRVID_SAMBA: %s\n",
                          strerror(ret));
-               TALLOC_FREE(result);
                return ret;
        }
 
@@ -217,7 +216,6 @@ int messaging_ctdbd_init(struct messaging_context *msg_ctx,
        if (ret != 0) {
                DEBUG(10, ("register_with_ctdbd failed: %s\n",
                           strerror(ret)));
-               TALLOC_FREE(result);
                return ret;
        }
 
@@ -227,7 +225,6 @@ int messaging_ctdbd_init(struct messaging_context *msg_ctx,
        ctx->fde = tevent_add_fd(ev, ctx, ctdb_fd, TEVENT_FD_READ,
                                 messaging_ctdbd_readable, ctx->conn);
        if (ctx->fde == NULL) {
-               TALLOC_FREE(result);
                return ENOMEM;
        }
 
@@ -237,9 +234,53 @@ int messaging_ctdbd_init(struct messaging_context *msg_ctx,
 
        set_my_vnn(ctdbd_vnn(ctx->conn));
 
+       return 0;
+}
+
+int messaging_ctdbd_init(struct messaging_context *msg_ctx,
+                        TALLOC_CTX *mem_ctx,
+                        struct messaging_backend **presult)
+{
+       struct messaging_backend *result;
+       struct messaging_ctdbd_context *ctx;
+       int ret;
+
+       if (!(result = talloc(mem_ctx, struct messaging_backend))) {
+               DEBUG(0, ("talloc failed\n"));
+               return ENOMEM;
+       }
+
+       if (!(ctx = talloc(result, struct messaging_ctdbd_context))) {
+               DEBUG(0, ("talloc failed\n"));
+               TALLOC_FREE(result);
+               return ENOMEM;
+       }
+
+       ret = messaging_ctdbd_init_internal(msg_ctx, mem_ctx, ctx, false);
+       if (ret != 0) {
+               TALLOC_FREE(result);
+               return ret;
+       }
+
        result->send_fn = messaging_ctdb_send;
        result->private_data = (void *)ctx;
 
        *presult = result;
        return 0;
 }
+
+int messaging_ctdbd_reinit(struct messaging_context *msg_ctx,
+                          TALLOC_CTX *mem_ctx,
+                          struct messaging_backend *backend)
+{
+       struct messaging_ctdbd_context *ctx = talloc_get_type_abort(
+               backend->private_data, struct messaging_ctdbd_context);
+       int ret;
+
+       ret = messaging_ctdbd_init_internal(msg_ctx, mem_ctx, ctx, true);
+       if (ret != 0) {
+               return ret;
+       }
+
+       return 0;
+}


-- 
Samba Shared Repository

Reply via email to