dbwrap_ctdb: Use messaging_ctdbd_connection
authorVolker Lendecke <vl@samba.org>
Fri, 16 Jun 2017 15:11:48 +0000 (17:11 +0200)
committerRalph Boehme <slow@samba.org>
Tue, 25 Jul 2017 15:43:18 +0000 (17:43 +0200)
With messages_ctdb, the global ctdb connection will change after fork.

Don't store the wrong parent connection across a fork. The alternative would
be to do a reinit on all dbwrap_ctdb databases, but that seems overkill
given that we only have one "standard" ctdb connection anyway.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
source3/lib/ctdb_dummy.c
source3/lib/dbwrap/dbwrap_ctdb.c
source3/lib/dbwrap/dbwrap_ctdb.h
source3/lib/dbwrap/dbwrap_open.c
source3/torture/test_dbwrap_ctdb.c

index 2d7ba251b3809a6d2df727df0ad20624f4ecafcd..891e7c33dc5824bb1da661818f8bf29fa05a7a4c 100644 (file)
@@ -70,7 +70,6 @@ bool ctdbd_process_exists(struct ctdbd_connection *conn, uint32_t vnn, pid_t pid
 
 struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
                                struct messaging_context *msg_ctx,
-                               struct ctdbd_connection *conn,
                                const char *name,
                                int hash_size, int tdb_flags,
                                int open_flags, mode_t mode,
index ebfe2c3066a27f0d8221a951c5dab4d3e04f1f90..b81c1321d7259e2e50a35e4cdeaee05edb4a0fed 100644 (file)
@@ -34,6 +34,7 @@
 #include "dbwrap/dbwrap_ctdb.h"
 #include "g_lock.h"
 #include "messages.h"
+#include "messages_ctdbd.h"
 #include "lib/cluster_support.h"
 #include "lib/util/tevent_ntstatus.h"
 
@@ -50,7 +51,6 @@ struct db_ctdb_transaction_handle {
 
 struct db_ctdb_ctx {
        struct db_context *db;
-       struct ctdbd_connection *conn;
        struct tdb_wrap *wtdb;
        uint32_t db_id;
        struct db_ctdb_transaction_handle *transaction;
@@ -640,7 +640,7 @@ static NTSTATUS db_ctdb_transaction_store(struct db_ctdb_transaction_handle *h,
                SAFE_FREE(rec.dptr);
        }
 
-       header.dmaster = ctdbd_vnn(h->ctx->conn);
+       header.dmaster = get_my_vnn();
        header.rsn++;
 
        h->m_write = db_ctdb_marshall_add(h, h->m_write, h->ctx->db_id, 0, key, &header, data);
@@ -821,7 +821,8 @@ static int db_ctdb_transaction_commit(struct db_context *db)
 
 again:
        /* tell ctdbd to commit to the other nodes */
-       ret = ctdbd_control_local(ctx->conn, CTDB_CONTROL_TRANS3_COMMIT,
+       ret = ctdbd_control_local(messaging_ctdbd_connection(),
+                                 CTDB_CONTROL_TRANS3_COMMIT,
                                  h->ctx->db_id, 0,
                                  db_ctdb_marshall_finish(h->m_write),
                                  NULL, NULL, &status);
@@ -937,7 +938,7 @@ static NTSTATUS db_ctdb_send_schedule_for_deletion(struct db_record *rec)
        dd->keylen = rec->key.dsize;
        memcpy(dd->key, rec->key.dptr, rec->key.dsize);
 
-       ret = ctdbd_control_local(ctx->conn,
+       ret = ctdbd_control_local(messaging_ctdbd_connection(),
                                  CTDB_CONTROL_SCHEDULE_FOR_DELETION,
                                  crec->ctdb_ctx->db_id,
                                  CTDB_CTRL_FLAG_NOREPLY, /* flags */
@@ -1152,8 +1153,7 @@ again:
         * take the shortcut and just return it.
         */
 
-       if (!db_ctdb_can_use_local_copy(ctdb_data, ctdbd_vnn(ctx->conn),
-                                       false)) {
+       if (!db_ctdb_can_use_local_copy(ctdb_data, get_my_vnn(), false)) {
                SAFE_FREE(ctdb_data.dptr);
                tdb_chainunlock(ctx->wtdb->tdb, key);
                talloc_set_destructor(result, NULL);
@@ -1171,12 +1171,13 @@ again:
                           ctdb_data.dptr, ctdb_data.dptr ?
                           ((struct ctdb_ltdb_header *)ctdb_data.dptr)->dmaster :
                           UINT32_MAX,
-                          ctdbd_vnn(ctx->conn),
+                          get_my_vnn(),
                           ctdb_data.dptr ?
                           ((struct ctdb_ltdb_header *)ctdb_data.dptr)->flags : 0));
 
                GetTimeOfDay(&ctdb_start_time);
-               ret = ctdbd_migrate(ctx->conn, ctx->db_id, key);
+               ret = ctdbd_migrate(messaging_ctdbd_connection(), ctx->db_id,
+                                   key);
                ctdb_time += timeval_elapsed(&ctdb_start_time);
 
                if (ret != 0) {
@@ -1396,7 +1397,7 @@ static NTSTATUS db_ctdb_parse_record(struct db_context *db, TDB_DATA key,
 
        state.parser = parser;
        state.private_data = private_data;
-       state.my_vnn = ctdbd_vnn(ctx->conn);
+       state.my_vnn = get_my_vnn();
        state.empty_record = false;
 
        status = db_ctdb_try_parse_local_record(ctx, key, &state);
@@ -1404,7 +1405,7 @@ static NTSTATUS db_ctdb_parse_record(struct db_context *db, TDB_DATA key,
                return status;
        }
 
-       ret = ctdbd_parse(ctx->conn, ctx->db_id, key,
+       ret = ctdbd_parse(messaging_ctdbd_connection(), ctx->db_id, key,
                          state.ask_for_readonly_copy, parser, private_data);
        if (ret != 0) {
                if (ret == ENOENT) {
@@ -1453,7 +1454,7 @@ static struct tevent_req *db_ctdb_parse_record_send(
        *state = (struct db_ctdb_parse_record_state) {
                .parser = parser,
                .private_data = private_data,
-               .my_vnn = ctdbd_vnn(ctx->conn),
+               .my_vnn = get_my_vnn(),
                .empty_record = false,
        };
 
@@ -1785,7 +1786,6 @@ static size_t db_ctdb_id(struct db_context *db, uint8_t *id, size_t idlen)
 
 struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
                                struct messaging_context *msg_ctx,
-                               struct ctdbd_connection *conn,
                                const char *name,
                                int hash_size, int tdb_flags,
                                int open_flags, mode_t mode,
@@ -1827,9 +1827,9 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
 
        db_ctdb->transaction = NULL;
        db_ctdb->db = result;
-       db_ctdb->conn = conn;
 
-       ret = ctdbd_db_attach(db_ctdb->conn, name, &db_ctdb->db_id, persistent);
+       ret = ctdbd_db_attach(messaging_ctdbd_connection(), name,
+                             &db_ctdb->db_id, persistent);
        if (ret != 0) {
                DEBUG(0, ("ctdbd_db_attach failed for %s: %s\n", name,
                          strerror(ret)));
@@ -1841,7 +1841,8 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
                data.dptr = (uint8_t *)&db_ctdb->db_id;
                data.dsize = sizeof(db_ctdb->db_id);
 
-               ret = ctdbd_control_local(conn, CTDB_CONTROL_ENABLE_SEQNUM,
+               ret = ctdbd_control_local(messaging_ctdbd_connection(),
+                                         CTDB_CONTROL_ENABLE_SEQNUM,
                                          0, 0, data,
                                          NULL, NULL, &cstatus);
                if ((ret != 0) || cstatus != 0) {
@@ -1852,7 +1853,8 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
                }
        }
 
-       db_path = ctdbd_dbpath(db_ctdb->conn, db_ctdb, db_ctdb->db_id);
+       db_path = ctdbd_dbpath(messaging_ctdbd_connection(), db_ctdb,
+                              db_ctdb->db_id);
 
        result->persistent = persistent;
        result->lock_order = lock_order;
@@ -1860,7 +1862,8 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
        data.dptr = (uint8_t *)&db_ctdb->db_id;
        data.dsize = sizeof(db_ctdb->db_id);
 
-       ret = ctdbd_control_local(conn, CTDB_CONTROL_DB_OPEN_FLAGS,
+       ret = ctdbd_control_local(messaging_ctdbd_connection(),
+                                 CTDB_CONTROL_DB_OPEN_FLAGS,
                                  0, 0, data, NULL, &data, &cstatus);
        if (ret != 0) {
                DBG_ERR(" ctdb control for db_open_flags "
@@ -1895,7 +1898,8 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
                                       sizeof(db_ctdb->db_id));
 
                ret = ctdbd_control_local(
-                       db_ctdb->conn, CTDB_CONTROL_SET_DB_READONLY, 0, 0,
+                       messaging_ctdbd_connection(),
+                       CTDB_CONTROL_SET_DB_READONLY, 0, 0,
                        indata, NULL, NULL, &cstatus);
                if ((ret != 0) || (cstatus != 0)) {
                        DEBUG(1, ("CTDB_CONTROL_SET_DB_READONLY failed: "
index 42c831fbcf132bf84b8935dba5853d2c73a7d64e..0b8247996361afb3716fdf286ff16cdf76aed76c 100644 (file)
@@ -30,7 +30,6 @@ struct ctdbd_connection;
 
 struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
                                struct messaging_context *msg_ctx,
-                               struct ctdbd_connection *conn,
                                const char *name,
                                int hash_size, int tdb_flags,
                                int open_flags, mode_t mode,
index 801ebcbde4ca3b56c24d4a4604f0117d23c03a29..6ecf8565abd277c28c1046a1f9000c038530476e 100644 (file)
@@ -156,7 +156,7 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
                        }
                        msg_ctx = server_messaging_context();
 
-                       result = db_open_ctdb(mem_ctx, msg_ctx, conn, partname,
+                       result = db_open_ctdb(mem_ctx, msg_ctx, partname,
                                              hash_size,
                                              tdb_flags, open_flags, mode,
                                              lock_order, dbwrap_flags);
index 4512358bd93e822a3926932731d07ec1d6b311ea..cc6fd0c1e99006d0ab4cd698fc90213901dddf17 100644 (file)
@@ -33,16 +33,10 @@ bool run_local_dbwrap_ctdb(int dummy)
        NTSTATUS status;
        uint32_t val;
        struct messaging_context *msg_ctx;
-       struct ctdbd_connection *conn;
 
        msg_ctx = server_messaging_context();
-       conn = messaging_ctdbd_connection();
-       if (conn == NULL) {
-               fprintf(stderr, "no ctdbd connection\n");
-               goto fail;
-       }
 
-       db = db_open_ctdb(talloc_tos(), msg_ctx, conn, "torture.tdb",
+       db = db_open_ctdb(talloc_tos(), msg_ctx, "torture.tdb",
                          0, TDB_DEFAULT,
                          O_RDWR, 0755, DBWRAP_LOCK_ORDER_1, DBWRAP_FLAG_NONE);
        if (db == NULL) {