ctdb-protocol: Fix marshalling for ctdb_server_id
authorAmitay Isaacs <amitay@gmail.com>
Thu, 13 Jul 2017 05:15:25 +0000 (15:15 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:25 +0000 (14:59 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/protocol/protocol_api.h
ctdb/protocol/protocol_types.c
ctdb/tests/src/protocol_common.c
ctdb/tests/src/protocol_common.h
ctdb/tests/src/protocol_types_compat_test.c
ctdb/tests/src/protocol_types_test.c

index 6d213708b960f88e72d4a9bd2655ef55c44f7e4d..753a08ce5986bad62833eb54d0b41e8a6bc203ff 100644 (file)
@@ -58,10 +58,11 @@ int ctdb_rec_buffer_write(struct ctdb_rec_buffer *recbuf, int fd);
 int ctdb_rec_buffer_read(int fd, TALLOC_CTX *mem_ctx,
                         struct ctdb_rec_buffer **out);
 
-size_t ctdb_server_id_len(struct ctdb_server_id *sid);
-void ctdb_server_id_push(struct ctdb_server_id *sid, uint8_t *buf);
+size_t ctdb_server_id_len(struct ctdb_server_id *in);
+void ctdb_server_id_push(struct ctdb_server_id *in, uint8_t *buf,
+                        size_t *npush);
 int ctdb_server_id_pull(uint8_t *buf, size_t buflen,
-                        struct ctdb_server_id *sid);
+                       struct ctdb_server_id *out, size_t *npull);
 
 size_t ctdb_g_lock_len(struct ctdb_g_lock *lock);
 void ctdb_g_lock_push(struct ctdb_g_lock *lock, uint8_t *buf);
index e375b44184a31bf544290728133659b6b21e4381..a95795b5156c7baf91a0f3f2f14c6857122abc49 100644 (file)
@@ -4861,24 +4861,66 @@ fail:
        return ret;
 }
 
-size_t ctdb_server_id_len(struct ctdb_server_id *sid)
+size_t ctdb_server_id_len(struct ctdb_server_id *in)
 {
-       return sizeof(struct ctdb_server_id);
+       return ctdb_uint64_len(&in->pid) +
+               ctdb_uint32_len(&in->task_id) +
+               ctdb_uint32_len(&in->vnn) +
+               ctdb_uint64_len(&in->unique_id);
 }
 
-void ctdb_server_id_push(struct ctdb_server_id *sid, uint8_t *buf)
+void ctdb_server_id_push(struct ctdb_server_id *in, uint8_t *buf,
+                        size_t *npush)
 {
-       memcpy(buf, sid, sizeof(struct ctdb_server_id));
+       size_t offset = 0, np;
+
+       ctdb_uint64_push(&in->pid, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint32_push(&in->task_id, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint32_push(&in->vnn, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint64_push(&in->unique_id, buf+offset, &np);
+       offset += np;
+
+       *npush = offset;
 }
 
 int ctdb_server_id_pull(uint8_t *buf, size_t buflen,
-                       struct ctdb_server_id *sid)
+                       struct ctdb_server_id *out, size_t *npull)
 {
-       if (buflen < sizeof(struct ctdb_server_id)) {
-               return EMSGSIZE;
+       size_t offset = 0, np;
+       int ret;
+
+       ret = ctdb_uint64_pull(buf+offset, buflen-offset, &out->pid, &np);
+       if (ret != 0) {
+               return ret;
        }
+       offset += np;
+
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &out->task_id, &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
+
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &out->vnn, &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
 
-       memcpy(sid, buf, sizeof(struct ctdb_server_id));
+       ret = ctdb_uint64_pull(buf+offset, buflen-offset, &out->unique_id,
+                              &np);
+       if (ret != 0) {
+               return ret;
+       }
+       offset += np;
+
+       *npull = offset;
        return 0;
 }
 
index 015a3b78adc294e9f6a3e61faf84d983c757e878..1a74104174eb0ff6018c9bb35fc8b273d65ba07b 100644 (file)
@@ -1332,7 +1332,7 @@ void verify_ctdb_disable_message(struct ctdb_disable_message *p1,
        assert(p1->timeout == p2->timeout);
 }
 
-void fill_ctdb_server_id(TALLOC_CTX *mem_ctx, struct ctdb_server_id *p)
+void fill_ctdb_server_id(struct ctdb_server_id *p)
 {
        p->pid = rand64();
        p->task_id = rand32();
@@ -1352,7 +1352,7 @@ void verify_ctdb_server_id(struct ctdb_server_id *p1,
 void fill_ctdb_g_lock(TALLOC_CTX *mem_ctx, struct ctdb_g_lock *p)
 {
        p->type = rand_int(2);
-       fill_ctdb_server_id(mem_ctx, &p->sid);
+       fill_ctdb_server_id(&p->sid);
 }
 
 void verify_ctdb_g_lock(struct ctdb_g_lock *p1, struct ctdb_g_lock *p2)
index 4186a92785cd8c8494e4401269983aed5ebdcc8d..a14631c5f130564d074d1fc9312910679ae3f7a9 100644 (file)
@@ -358,7 +358,7 @@ void fill_ctdb_disable_message(TALLOC_CTX *mem_ctx,
 void verify_ctdb_disable_message(struct ctdb_disable_message *p1,
                                 struct ctdb_disable_message *p2);
 
-void fill_ctdb_server_id(TALLOC_CTX *mem_ctx, struct ctdb_server_id *p);
+void fill_ctdb_server_id(struct ctdb_server_id *p);
 void verify_ctdb_server_id(struct ctdb_server_id *p1,
                           struct ctdb_server_id *p2);
 
index 509550527e90a1b2d93f7de21552917be4b38fe2..53ed0e9aab4b3e64132e5faf594fdeca8e326784 100644 (file)
@@ -2167,6 +2167,27 @@ static int ctdb_disable_message_pull_old(uint8_t *buf, size_t buflen,
        return 0;
 }
 
+static size_t ctdb_server_id_len_old(struct ctdb_server_id *in)
+{
+       return sizeof(struct ctdb_server_id);
+}
+
+static void ctdb_server_id_push_old(struct ctdb_server_id *in, uint8_t *buf)
+{
+       memcpy(buf, in, sizeof(struct ctdb_server_id));
+}
+
+static int ctdb_server_id_pull_old(uint8_t *buf, size_t buflen,
+                                  struct ctdb_server_id *out)
+{
+       if (buflen < sizeof(struct ctdb_server_id)) {
+               return EMSGSIZE;
+       }
+
+       memcpy(out, buf, sizeof(struct ctdb_server_id));
+       return 0;
+}
+
 
 COMPAT_TYPE3_TEST(struct ctdb_statistics, ctdb_statistics);
 COMPAT_TYPE3_TEST(struct ctdb_vnn_map, ctdb_vnn_map);
@@ -2211,6 +2232,8 @@ COMPAT_TYPE3_TEST(struct ctdb_election_message, ctdb_election_message);
 COMPAT_TYPE3_TEST(struct ctdb_srvid_message, ctdb_srvid_message);
 COMPAT_TYPE3_TEST(struct ctdb_disable_message, ctdb_disable_message);
 
+COMPAT_TYPE1_TEST(struct ctdb_server_id, ctdb_server_id);
+
 int main(int argc, char *argv[])
 {
        if (argc == 2) {
@@ -2258,6 +2281,7 @@ int main(int argc, char *argv[])
        COMPAT_TEST_FUNC(ctdb_election_message)();
        COMPAT_TEST_FUNC(ctdb_srvid_message)();
        COMPAT_TEST_FUNC(ctdb_disable_message)();
+       COMPAT_TEST_FUNC(ctdb_server_id)();
 
        return 0;
 }
index a8660c9f24e58e68499494ac7658ae5bc3c98881..08312ef87021949defa8094e30d1760dc2c0cba9 100644 (file)
@@ -87,6 +87,7 @@ PROTOCOL_TYPE3_TEST(struct ctdb_db_statistics, ctdb_db_statistics);
 PROTOCOL_TYPE3_TEST(struct ctdb_election_message, ctdb_election_message);
 PROTOCOL_TYPE3_TEST(struct ctdb_srvid_message, ctdb_srvid_message);
 PROTOCOL_TYPE3_TEST(struct ctdb_disable_message, ctdb_disable_message);
+PROTOCOL_TYPE1_TEST(struct ctdb_server_id, ctdb_server_id);
 DEFINE_TEST(struct ctdb_g_lock_list, ctdb_g_lock_list);
 
 static void test_ctdb_rec_buffer_read_write(void)
@@ -187,6 +188,7 @@ int main(int argc, char *argv[])
        TEST_FUNC(ctdb_election_message)();
        TEST_FUNC(ctdb_srvid_message)();
        TEST_FUNC(ctdb_disable_message)();
+       TEST_FUNC(ctdb_server_id)();
        TEST_FUNC(ctdb_g_lock_list)();
 
        test_ctdb_rec_buffer_read_write();