ctdb-protocol: Fix marshalling for ctdb_traverse_all
authorAmitay Isaacs <amitay@gmail.com>
Thu, 29 Jun 2017 13:56:02 +0000 (23:56 +1000)
committerMartin Schwenke <martins@samba.org>
Wed, 30 Aug 2017 12:59:23 +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 23ddfa39918189a5d58e34d79c4f7b90524beb5b..12d479d8feebf29fe12eb3f3b90c5e730d37b7e6 100644 (file)
@@ -487,7 +487,7 @@ static void ctdb_req_control_data_push(struct ctdb_req_control_data *cd,
                break;
 
        case CTDB_CONTROL_TRAVERSE_ALL:
-               ctdb_traverse_all_push(cd->data.traverse_all, buf);
+               ctdb_traverse_all_push(cd->data.traverse_all, buf, &np);
                break;
 
        case CTDB_CONTROL_TRAVERSE_DATA:
@@ -775,7 +775,7 @@ static int ctdb_req_control_data_pull(uint8_t *buf, size_t buflen,
 
        case CTDB_CONTROL_TRAVERSE_ALL:
                ret = ctdb_traverse_all_pull(buf, buflen, mem_ctx,
-                                            &cd->data.traverse_all);
+                                            &cd->data.traverse_all, &np);
                break;
 
        case CTDB_CONTROL_TRAVERSE_DATA:
index e69b2778e79346e8e31bc7dc7e3f6d5f23e564e6..a0f734ded5d9df1c5da1f90df2f5065e1111fb83 100644 (file)
@@ -150,10 +150,11 @@ void ctdb_traverse_start_push(struct ctdb_traverse_start *in, uint8_t *buf,
 int ctdb_traverse_start_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
                             struct ctdb_traverse_start **out, size_t *npull);
 
-size_t ctdb_traverse_all_len(struct ctdb_traverse_all *traverse);
-void ctdb_traverse_all_push(struct ctdb_traverse_all *traverse, uint8_t *buf);
+size_t ctdb_traverse_all_len(struct ctdb_traverse_all *in);
+void ctdb_traverse_all_push(struct ctdb_traverse_all *in, uint8_t *buf,
+                           size_t *npush);
 int ctdb_traverse_all_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
-                          struct ctdb_traverse_all **out);
+                          struct ctdb_traverse_all **out, size_t *npull);
 
 size_t ctdb_traverse_start_ext_len(struct ctdb_traverse_start_ext *traverse);
 void ctdb_traverse_start_ext_push(struct ctdb_traverse_start_ext *traverse,
index a3678ad8f33610985ae7dcbaeff06e66d6eee6fe..8565ecdcd3c9c5de19f7f2b923d70cb9e68d11b6 100644 (file)
@@ -1756,33 +1756,88 @@ fail:
        return ret;
 }
 
-size_t ctdb_traverse_all_len(struct ctdb_traverse_all *traverse)
+size_t ctdb_traverse_all_len(struct ctdb_traverse_all *in)
 {
-       return sizeof(struct ctdb_traverse_all);
+       return ctdb_uint32_len(&in->db_id) +
+               ctdb_uint32_len(&in->reqid) +
+               ctdb_uint32_len(&in->pnn) +
+               ctdb_uint32_len(&in->client_reqid) +
+               ctdb_uint64_len(&in->srvid);
 }
 
-void ctdb_traverse_all_push(struct ctdb_traverse_all *traverse, uint8_t *buf)
+void ctdb_traverse_all_push(struct ctdb_traverse_all *in, uint8_t *buf,
+                           size_t *npush)
 {
-       memcpy(buf, traverse, sizeof(struct ctdb_traverse_all));
+       size_t offset = 0, np;
+
+       ctdb_uint32_push(&in->db_id, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint32_push(&in->reqid, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint32_push(&in->pnn, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint32_push(&in->client_reqid, buf+offset, &np);
+       offset += np;
+
+       ctdb_uint64_push(&in->srvid, buf+offset, &np);
+       offset += np;
+
+       *npush = offset;
 }
 
 int ctdb_traverse_all_pull(uint8_t *buf, size_t buflen, TALLOC_CTX *mem_ctx,
-                          struct ctdb_traverse_all **out)
+                          struct ctdb_traverse_all **out, size_t *npull)
 {
-       struct ctdb_traverse_all *traverse;
+       struct ctdb_traverse_all *val;
+       size_t offset = 0, np;
+       int ret;
 
-       if (buflen < sizeof(struct ctdb_traverse_all)) {
-               return EMSGSIZE;
+       val = talloc(mem_ctx, struct ctdb_traverse_all);
+       if (val == NULL) {
+               return ENOMEM;
        }
 
-       traverse = talloc_memdup(mem_ctx, buf,
-                                sizeof(struct ctdb_traverse_all));
-       if (traverse == NULL) {
-               return ENOMEM;
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &val->db_id, &np);
+       if (ret != 0) {
+               goto fail;
        }
+       offset += np;
 
-       *out = traverse;
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &val->reqid, &np);
+       if (ret != 0) {
+               goto fail;
+       }
+       offset += np;
+
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &val->pnn, &np);
+       if (ret != 0) {
+               goto fail;
+       }
+       offset += np;
+
+       ret = ctdb_uint32_pull(buf+offset, buflen-offset, &val->client_reqid,
+                              &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 = val;
+       *npull = offset;
        return 0;
+
+fail:
+       talloc_free(val);
+       return ret;
 }
 
 size_t ctdb_traverse_start_ext_len(struct ctdb_traverse_start_ext *traverse)
index 4741db55f7a1b9a7d940f1bf6a3a78f5a1386c30..ce845a87c05297eb30b4b6f73cabe8ebd0d508b8 100644 (file)
@@ -554,6 +554,36 @@ static int ctdb_traverse_start_pull_old(uint8_t *buf, size_t buflen,
        return 0;
 }
 
+static size_t ctdb_traverse_all_len_old(struct ctdb_traverse_all *in)
+{
+       return sizeof(struct ctdb_traverse_all);
+}
+
+static void ctdb_traverse_all_push_old(struct ctdb_traverse_all *in,
+                                      uint8_t *buf)
+{
+       memcpy(buf, in, sizeof(struct ctdb_traverse_all));
+}
+
+static int ctdb_traverse_all_pull_old(uint8_t *buf, size_t buflen,
+                                     TALLOC_CTX *mem_ctx,
+                                     struct ctdb_traverse_all **out)
+{
+       struct ctdb_traverse_all *val;
+
+       if (buflen < sizeof(struct ctdb_traverse_all)) {
+               return EMSGSIZE;
+       }
+
+       val = talloc_memdup(mem_ctx, buf, sizeof(struct ctdb_traverse_all));
+       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);
@@ -566,6 +596,7 @@ COMPAT_TYPE1_TEST(struct ctdb_ltdb_header, ctdb_ltdb_header);
 COMPAT_TYPE3_TEST(struct ctdb_rec_data, ctdb_rec_data);
 COMPAT_TYPE3_TEST(struct ctdb_rec_buffer, ctdb_rec_buffer);
 COMPAT_TYPE3_TEST(struct ctdb_traverse_start, ctdb_traverse_start);
+COMPAT_TYPE3_TEST(struct ctdb_traverse_all, ctdb_traverse_all);
 
 int main(int argc, char *argv[])
 {
@@ -583,6 +614,7 @@ int main(int argc, char *argv[])
        COMPAT_TEST_FUNC(ctdb_rec_data)();
        COMPAT_TEST_FUNC(ctdb_rec_buffer)();
        COMPAT_TEST_FUNC(ctdb_traverse_start)();
+       COMPAT_TEST_FUNC(ctdb_traverse_all)();
 
        return 0;
 }
index 2e40d35683e5353131bdbaa0f78e8e43907539d5..889f12429e3135389bfe20b810bb7880d1a7d463 100644 (file)
@@ -57,7 +57,7 @@ PROTOCOL_TYPE1_TEST(struct ctdb_ltdb_header, ctdb_ltdb_header);
 PROTOCOL_TYPE3_TEST(struct ctdb_rec_data, ctdb_rec_data);
 PROTOCOL_TYPE3_TEST(struct ctdb_rec_buffer, ctdb_rec_buffer);
 PROTOCOL_TYPE3_TEST(struct ctdb_traverse_start, ctdb_traverse_start);
-DEFINE_TEST(struct ctdb_traverse_all, ctdb_traverse_all);
+PROTOCOL_TYPE3_TEST(struct ctdb_traverse_all, ctdb_traverse_all);
 DEFINE_TEST(struct ctdb_traverse_start_ext, ctdb_traverse_start_ext);
 DEFINE_TEST(struct ctdb_traverse_all_ext, ctdb_traverse_all_ext);
 DEFINE_TEST(ctdb_sock_addr, ctdb_sock_addr);