ctdb-protocol: Fix marshalling for ctdb_pulldb_ext
authorAmitay Isaacs <amitay@gmail.com>
Thu, 29 Jun 2017 09:55:15 +0000 (19:55 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:22 +0000 (14:59 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/protocol/protocol_control.c
ctdb/protocol/protocol_private.h
ctdb/protocol/protocol_types.c
ctdb/tests/src/protocol_types_compat_test.c
ctdb/tests/src/protocol_types_test.c

index 6b5c25435f8f798863e4127a285c13b879a760ba..21f58ceb891eca5e6d23127bb782f284d772f0e7 100644 (file)
@@ -696,11 +696,11 @@ static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
                break;
 
        case CTDB_CONTROL_DB_PULL:
-               ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
+               ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf, &np);
                break;
 
        case CTDB_CONTROL_DB_PUSH_START:
-               ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf);
+               ctdb_pulldb_ext_push(cd->data.pulldb_ext, buf, &np);
                break;
 
        case CTDB_CONTROL_DB_PUSH_CONFIRM:
@@ -1019,12 +1019,12 @@ static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
 
        case CTDB_CONTROL_DB_PULL:
                ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
-                                          &cd->data.pulldb_ext);
+                                          &cd->data.pulldb_ext, &np);
                break;
 
        case CTDB_CONTROL_DB_PUSH_START:
                ret = ctdb_pulldb_ext_pull(buf, buflen, mem_ctx,
-                                          &cd->data.pulldb_ext);
+                                          &cd->data.pulldb_ext, &np);
                break;
 
        case CTDB_CONTROL_DB_PUSH_CONFIRM:
index 5124953c07bcffa1dd82ff260ba878834bce1107..17bdc27cbaff1119d4b311630b2ec8f639e4a310 100644 (file)
@@ -138,10 +138,11 @@ void ctdb_pulldb_push(struct ctdb_pulldb *in, uint8_t *buf, size_t *npush);
 int ctdb_pulldb_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
                     struct ctdb_pulldb **out, size_t *npull);
 
-size_t ctdb_pulldb_ext_len(struct ctdb_pulldb_ext *pulldb);
-void ctdb_pulldb_ext_push(struct ctdb_pulldb_ext *pulldb, uint8_t *buf);
+size_t ctdb_pulldb_ext_len(struct ctdb_pulldb_ext *in);
+void ctdb_pulldb_ext_push(struct ctdb_pulldb_ext *in, uint8_t *buf,
+                         size_t *npush);
 int ctdb_pulldb_ext_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
-                        struct ctdb_pulldb_ext **out);
+                        struct ctdb_pulldb_ext **out, size_t *npull);
 
 size_t ctdb_traverse_start_len(struct ctdb_traverse_start *traverse);
 void ctdb_traverse_start_push(struct ctdb_traverse_start *traverse,
index 2025e34820b3fe5599af6e0853d22ba6e1e78c1c..c5c08e6f10c003405748cc507c2f6e75ff781701 100644 (file)
@@ -1134,32 +1134,67 @@ int ctdb_pulldb_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
        return 0;
 }
 
-size_t ctdb_pulldb_ext_len(struct ctdb_pulldb_ext *pulldb)
+size_t ctdb_pulldb_ext_len(struct ctdb_pulldb_ext *in)
 {
-       return sizeof(struct ctdb_pulldb_ext);
+       return ctdb_uint32_len(&in->db_id) +
+               ctdb_uint32_len(&in->lmaster) +
+               ctdb_uint64_len(&in->srvid);
 }
 
-void ctdb_pulldb_ext_push(struct ctdb_pulldb_ext *pulldb, uint8_t *buf)
+void ctdb_pulldb_ext_push(struct ctdb_pulldb_ext *in, uint8_t *buf,
+                         size_t *npush)
 {
-       memcpy(buf, pulldb, sizeof(struct ctdb_pulldb_ext));
+       size_t offset = 0, np;
+
+       ctdb_uint32_push(&in->db_id, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint32_push(&in->lmaster, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint64_push(&in->srvid, buf+offset, &np);
+       offset += np;
+
+       *npush = offset;
 }
 
 int ctdb_pulldb_ext_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
-                        struct ctdb_pulldb_ext **out)
+                        struct ctdb_pulldb_ext **out, size_t *npull)
 {
-       struct ctdb_pulldb_ext *pulldb;
+       struct ctdb_pulldb_ext *val;
+       size_t offset = 0, np;
+       int ret;
 
-       if (buflen < sizeof(struct ctdb_pulldb_ext)) {
-               return EMSGSIZE;
+       val = talloc(mem_ctx, struct ctdb_pulldb_ext);
+       if (val == NULL) {
+               return ENOMEM;
        }
 
-       pulldb = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_pulldb_ext));
-       if (pulldb == NULL) {
-               return ENOMEM;
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &val->db_id, &np);
+       if (ret != 0) {
+               goto fail;
+       }
+       offset += np;
+
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &val->lmaster, &np);
+       if (ret != 0) {
+               goto fail;
+       }
+       offset += np;
+
+       ret = ctdb_uint64_pull(buf+offset, buflen-offset, &val->srvid, &np);
+       if (ret != 0) {
+               goto fail;
        }
+       offset += np;
 
-       *out = pulldb;
+       *out = val;
+       *npull = offset;
        return 0;
+
+fail:
+       talloc_free(val);
+       return ret;
 }
 
 size_t ctdb_ltdb_header_len(struct ctdb_ltdb_header *header)
index 12124b6ac1c019387cf7aaaf2a02d62489cc7e28..cccf1ffcb8e24428a5f6381a0acc4e9235584f67 100644 (file)
@@ -270,11 +270,41 @@ static int ctdb_pulldb_pull_old(uint8_t *buf, size_t buflen,
        return 0;
 }
 
+static size_t ctdb_pulldb_ext_len_old(struct ctdb_pulldb_ext *in)
+{
+       return sizeof(struct ctdb_pulldb_ext);
+}
+
+static void ctdb_pulldb_ext_push_old(struct ctdb_pulldb_ext *in, uint8_t *buf)
+{
+       memcpy(buf, in, sizeof(struct ctdb_pulldb_ext));
+}
+
+static int ctdb_pulldb_ext_pull_old(uint8_t *buf, size_t buflen,
+                                   TALLOC_CTX *mem_ctx,
+                                   struct ctdb_pulldb_ext **out)
+{
+       struct ctdb_pulldb_ext *val;
+
+       if (buflen < sizeof(struct ctdb_pulldb_ext)) {
+               return EMSGSIZE;
+       }
+
+       val = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_pulldb_ext));
+       if (val == NULL) {
+               return ENOMEM;
+       }
+
+       *out = val;
+       return 0;
+}
+
 
 COMPAT_TYPE3_TEST(struct ctdb_statistics, ctdb_statistics);
 COMPAT_TYPE3_TEST(struct ctdb_vnn_map, ctdb_vnn_map);
 COMPAT_TYPE3_TEST(struct ctdb_dbid_map, ctdb_dbid_map);
 COMPAT_TYPE3_TEST(struct ctdb_pulldb, ctdb_pulldb);
+COMPAT_TYPE3_TEST(struct ctdb_pulldb_ext, ctdb_pulldb_ext);
 
 int main(int argc, char *argv[])
 {
@@ -287,6 +317,7 @@ int main(int argc, char *argv[])
        COMPAT_TEST_FUNC(ctdb_vnn_map)();
        COMPAT_TEST_FUNC(ctdb_dbid_map)();
        COMPAT_TEST_FUNC(ctdb_pulldb)();
+       COMPAT_TEST_FUNC(ctdb_pulldb_ext)();
 
        return 0;
 }
index 5d1f7c163b39c3f7f97495b5719ebea35051e745..15cd846f131a96219c5751bc4d287de282aba023 100644 (file)
@@ -68,7 +68,7 @@ PROTOCOL_TYPE3_TEST(struct ctdb_vnn_map, ctdb_vnn_map);
 PROTOCOL_TYPE3_TEST(struct ctdb_dbid, ctdb_dbid);
 PROTOCOL_TYPE3_TEST(struct ctdb_dbid_map, ctdb_dbid_map);
 PROTOCOL_TYPE3_TEST(struct ctdb_pulldb, ctdb_pulldb);
-DEFINE_TEST(struct ctdb_pulldb_ext, ctdb_pulldb_ext);
+PROTOCOL_TYPE3_TEST(struct ctdb_pulldb_ext, ctdb_pulldb_ext);
 DEFINE_TEST(struct ctdb_rec_data, ctdb_rec_data);
 DEFINE_TEST(struct ctdb_rec_buffer, ctdb_rec_buffer);
 DEFINE_TEST(struct ctdb_traverse_start, ctdb_traverse_start);