From 5ed6940b57ce0098a9e968f8741476735a6dd2cb Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 11:17:17 -0700 Subject: [PATCH 01/17] raft: add adl specialization for transfer_leadership_request Signed-off-by: Noah Watkins --- src/v/raft/types.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/v/raft/types.h b/src/v/raft/types.h index a9878f16c0c6..ea443ef51437 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -571,4 +571,15 @@ struct adl { raft::snapshot_metadata from(iobuf_parser& in); }; +template<> +struct adl { + void to(iobuf& out, raft::transfer_leadership_request&& r) { + serialize(out, r.group, r.target); + } + raft::transfer_leadership_request from(iobuf_parser& in) { + auto group = adl{}.from(in); + auto target = adl>{}.from(in); + return {.group = group, .target = target}; + } +}; } // namespace reflection From cd779b25f879957b4ba23f37937fa093b0ca3276 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 11:13:10 -0700 Subject: [PATCH 02/17] raft: add serde support for transfer_leadership_request Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 10 ++++++++++ src/v/raft/types.h | 9 ++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index e2fa744a7082..15761aa3e937 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -17,6 +17,7 @@ #include "model/metadata.h" #include "model/tests/randoms.h" #include "model/timestamp.h" +#include "raft/types.h" #include "random/generators.h" #include "reflection/adl.h" #include "storage/types.h" @@ -1958,6 +1959,15 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { // semantics are preserved. serde_roundtrip_test(data); } + { + raft::transfer_leadership_request data{ + .group = tests::random_named_int(), + }; + if (tests::random_bool()) { + data.target = tests::random_named_int(); + } + roundtrip_test(data); + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/types.h b/src/v/raft/types.h index ea443ef51437..8c72df601582 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -483,10 +483,17 @@ struct timeout_now_reply { }; // if not target is specified then the most up-to-date node will be selected -struct transfer_leadership_request { +struct transfer_leadership_request + : serde::envelope> { group_id group; std::optional target; raft::group_id target_group() const { return group; } + + friend bool operator==( + const transfer_leadership_request&, const transfer_leadership_request&) + = default; + + auto serde_fields() { return std::tie(group, target); } }; struct transfer_leadership_reply { From 2405096724def8b2c6f6fdb3d4d298b35264a724 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 11:18:44 -0700 Subject: [PATCH 03/17] raft: add adl specialization for transfer_leadership_reply Signed-off-by: Noah Watkins --- src/v/raft/types.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 8c72df601582..1a6dbc456f54 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -589,4 +589,16 @@ struct adl { return {.group = group, .target = target}; } }; + +template<> +struct adl { + void to(iobuf& out, raft::transfer_leadership_reply&& r) { + serialize(out, r.success, r.result); + } + raft::transfer_leadership_reply from(iobuf_parser& in) { + auto success = adl{}.from(in); + auto result = adl{}.from(in); + return {.success = success, .result = result}; + } +}; } // namespace reflection From 3bf65d96244d30b7397404c025a1ab39f9fbc352 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 11:13:22 -0700 Subject: [PATCH 04/17] raft: add serde support for transfer_leadership_reply Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 7 +++++++ src/v/raft/types.h | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index 15761aa3e937..a747de9d3307 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -1968,6 +1968,13 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { } roundtrip_test(data); } + { + raft::transfer_leadership_reply data{ + .success = tests::random_bool(), + .result = raft::errc::append_entries_dispatch_error, + }; + roundtrip_test(data); + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 1a6dbc456f54..bc99d3fa8db6 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -496,9 +496,16 @@ struct transfer_leadership_request auto serde_fields() { return std::tie(group, target); } }; -struct transfer_leadership_reply { +struct transfer_leadership_reply + : serde::envelope> { bool success{false}; raft::errc result; + + friend bool operator==( + const transfer_leadership_reply&, const transfer_leadership_reply&) + = default; + + auto serde_fields() { return std::tie(success, result); } }; // key types used to store data in key-value store From 5bcc74b841f1e8aac60506e759f5f19f3849caad Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 12:06:35 -0700 Subject: [PATCH 05/17] raft: add serde support for vnode Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 6 ++++++ src/v/raft/group_configuration.h | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index a747de9d3307..4e8516744808 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -1975,6 +1975,12 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { }; roundtrip_test(data); } + { + raft::vnode data{ + tests::random_named_int(), + tests::random_named_int()}; + roundtrip_test(data); + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/group_configuration.h b/src/v/raft/group_configuration.h index 9373e03161ae..fda463826067 100644 --- a/src/v/raft/group_configuration.h +++ b/src/v/raft/group_configuration.h @@ -24,7 +24,7 @@ namespace raft { static constexpr model::revision_id no_revision{}; -class vnode { +class vnode : public serde::envelope> { public: constexpr vnode() = default; @@ -45,6 +45,8 @@ class vnode { constexpr model::node_id id() const { return _node_id; } constexpr model::revision_id revision() const { return _revision; } + auto serde_fields() { return std::tie(_node_id, _revision); } + private: model::node_id _node_id; model::revision_id _revision; From 189fc7139b4f44d90ce31aa0e169b55d78d2c07f Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 12:16:49 -0700 Subject: [PATCH 06/17] raft: add adl specialization for timeout_now_request Signed-off-by: Noah Watkins --- src/v/raft/types.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/v/raft/types.h b/src/v/raft/types.h index bc99d3fa8db6..85281e60c38f 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -608,4 +608,23 @@ struct adl { return {.success = success, .result = result}; } }; + +template<> +struct adl { + void to(iobuf& out, raft::timeout_now_request&& r) { + serialize(out, r.target_node_id, r.node_id, r.group, r.term); + } + raft::timeout_now_request from(iobuf_parser& in) { + auto target_node_id = adl{}.from(in); + auto node_id = adl{}.from(in); + auto group = adl{}.from(in); + auto term = adl{}.from(in); + return { + .target_node_id = target_node_id, + .node_id = node_id, + .group = group, + .term = term, + }; + } +}; } // namespace reflection From 0849e1926f0bed379f8cb421987f6ba446d651eb Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 12:10:15 -0700 Subject: [PATCH 07/17] raft: add serde support for timeout_now_request Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 11 +++++++++++ src/v/raft/types.h | 11 ++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index 4e8516744808..b75608ed529e 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -1981,6 +1981,17 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { tests::random_named_int()}; roundtrip_test(data); } + { + raft::timeout_now_request data{ + .target_node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .group = tests::random_named_int(), + .term = tests::random_named_int(), + }; + roundtrip_test(data); + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 85281e60c38f..ecb5083fb4ac 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -461,7 +461,8 @@ struct write_snapshot_cfg { iobuf data; }; -struct timeout_now_request { +struct timeout_now_request + : serde::envelope> { // node id to validate on receiver vnode target_node_id; @@ -471,6 +472,14 @@ struct timeout_now_request { raft::group_id target_group() const { return group; } vnode target_node() const { return target_node_id; } + + friend bool + operator==(const timeout_now_request&, const timeout_now_request&) + = default; + + auto serde_fields() { + return std::tie(target_node_id, node_id, group, term); + } }; struct timeout_now_reply { From cb11c48639f198b1296d656bdcc9641181cc9e19 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 12:18:03 -0700 Subject: [PATCH 08/17] raft: add adl specialization for timeout_now_reply Signed-off-by: Noah Watkins --- src/v/raft/types.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/v/raft/types.h b/src/v/raft/types.h index ecb5083fb4ac..192b96d36db6 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -636,4 +636,21 @@ struct adl { }; } }; + +template<> +struct adl { + void to(iobuf& out, raft::timeout_now_reply&& r) { + serialize(out, r.target_node_id, r.term, r.result); + } + raft::timeout_now_reply from(iobuf_parser& in) { + auto target_node_id = adl{}.from(in); + auto term = adl{}.from(in); + auto result = adl{}.from(in); + return { + .target_node_id = target_node_id, + .term = term, + .result = result, + }; + } +}; } // namespace reflection From 18145d879281b7b6fd9c26a631af3f488c95628e Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 12:12:43 -0700 Subject: [PATCH 09/17] raft: add serde support for timeout_now_reply Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 9 +++++++++ src/v/raft/types.h | 8 +++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index b75608ed529e..68c37d57483e 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -1992,6 +1992,15 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { }; roundtrip_test(data); } + { + raft::timeout_now_reply data{ + .target_node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .term = tests::random_named_int(), + .result = raft::timeout_now_reply::status::failure, + }; + roundtrip_test(data); + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 192b96d36db6..02dd9a0717ce 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -482,13 +482,19 @@ struct timeout_now_request } }; -struct timeout_now_reply { +struct timeout_now_reply + : serde::envelope> { enum class status : uint8_t { success, failure }; // node id to validate on receiver vnode target_node_id; model::term_id term; status result; + + friend bool operator==(const timeout_now_reply&, const timeout_now_reply&) + = default; + + auto serde_fields() { return std::tie(target_node_id, term, result); } }; // if not target is specified then the most up-to-date node will be selected From 488ea8fec71d0054b2adc214658db01f98c4ca3c Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 14:18:45 -0700 Subject: [PATCH 10/17] raft: add adl specialization for install_snapshot_request Signed-off-by: Noah Watkins --- src/v/raft/types.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 02dd9a0717ce..23f5e3087e77 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -659,4 +659,40 @@ struct adl { }; } }; + +template<> +struct adl { + void to(iobuf& out, raft::install_snapshot_request&& r) { + serialize( + out, + r.target_node_id, + r.term, + r.group, + r.node_id, + r.last_included_index, + r.file_offset, + std::move(r.chunk), + r.done); + } + raft::install_snapshot_request from(iobuf_parser& in) { + auto target_node_id = adl{}.from(in); + auto term = adl{}.from(in); + auto group = adl{}.from(in); + auto node_id = adl{}.from(in); + auto last_included_index = adl{}.from(in); + auto file_offset = adl{}.from(in); + auto chunk = adl{}.from(in); + auto done = adl{}.from(in); + return { + .target_node_id = target_node_id, + .term = term, + .group = group, + .node_id = node_id, + .last_included_index = last_included_index, + .file_offset = file_offset, + .chunk = std::move(chunk), + .done = done, + }; + } +}; } // namespace reflection From d6d6f208d60694a6f27dec16bf1d3477af75fcca Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 14:13:03 -0700 Subject: [PATCH 11/17] raft: add serde support for install_snapshot_request Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 53 ++++++++++++++++++++ src/v/raft/types.h | 19 ++++++- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index 68c37d57483e..4aab4aa821fa 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -2001,6 +2001,59 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { }; roundtrip_test(data); } + { + const raft::install_snapshot_request orig{ + .target_node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .term = tests::random_named_int(), + .group = tests::random_named_int(), + .node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .last_included_index = tests::random_named_int(), + .file_offset = random_generators::get_int(), + .chunk = bytes_to_iobuf( + random_generators::get_bytes(random_generators::get_int(1024))), + .done = tests::random_bool(), + }; + /* + * manual adl/serde test to workaround iobuf being move-only + */ + { + raft::install_snapshot_request serde_in{ + .target_node_id = orig.target_node_id, + .term = orig.term, + .group = orig.group, + .node_id = orig.node_id, + .last_included_index = orig.last_included_index, + .file_offset = orig.file_offset, + .chunk = orig.chunk.copy(), + .done = orig.done, + }; + auto serde_out = serde::to_iobuf(std::move(serde_in)); + auto from_serde = serde::from_iobuf( + std::move(serde_out)); + + BOOST_REQUIRE(orig == from_serde); + } + { + raft::install_snapshot_request adl_in{ + .target_node_id = orig.target_node_id, + .term = orig.term, + .group = orig.group, + .node_id = orig.node_id, + .last_included_index = orig.last_included_index, + .file_offset = orig.file_offset, + .chunk = orig.chunk.copy(), + .done = orig.done, + }; + auto adl_out = reflection::to_iobuf(std::move(adl_in)); + auto from_adl + = reflection::from_iobuf( + std::move(adl_out)); + + BOOST_REQUIRE(orig == from_adl); + } + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 23f5e3087e77..f890dafec226 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -374,7 +374,8 @@ struct snapshot_metadata { "version is equal to 3, please change it accordignly"); }; -struct install_snapshot_request { +struct install_snapshot_request + : serde::envelope> { // node id to validate on receiver vnode target_node_id; // leader’s term @@ -396,6 +397,22 @@ struct install_snapshot_request { vnode target_node() const { return target_node_id; } friend std::ostream& operator<<(std::ostream&, const install_snapshot_request&); + + friend bool + operator==(const install_snapshot_request&, const install_snapshot_request&) + = default; + + auto serde_fields() { + return std::tie( + target_node_id, + term, + group, + node_id, + last_included_index, + file_offset, + chunk, + done); + } }; class install_snapshot_request_foreign_wrapper { From 9d13a5f36e102fc9aa30524f9ba7ca8df933e333 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 14:23:50 -0700 Subject: [PATCH 12/17] raft: add adl specialization for install_snapshot_reply Signed-off-by: Noah Watkins --- src/v/raft/types.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/v/raft/types.h b/src/v/raft/types.h index f890dafec226..96c0c4c98177 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -712,4 +712,23 @@ struct adl { }; } }; + +template<> +struct adl { + void to(iobuf& out, raft::install_snapshot_reply&& r) { + serialize(out, r.target_node_id, r.term, r.bytes_stored, r.success); + } + raft::install_snapshot_reply from(iobuf_parser& in) { + auto target_node_id = adl{}.from(in); + auto term = adl{}.from(in); + auto bytes_stored = adl{}.from(in); + auto success = adl{}.from(in); + return { + .target_node_id = target_node_id, + .term = term, + .bytes_stored = bytes_stored, + .success = success, + }; + } +}; } // namespace reflection From 6f59a54888cbe8d3f013b8124b720406fc8d7cb6 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 14:24:06 -0700 Subject: [PATCH 13/17] raft: add serde support for install_snapshot_reply Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 10 ++++++++++ src/v/raft/types.h | 11 ++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index 4aab4aa821fa..0b0525cc880f 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -2054,6 +2054,16 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { BOOST_REQUIRE(orig == from_adl); } } + { + raft::install_snapshot_reply data{ + .target_node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .term = tests::random_named_int(), + .bytes_stored = random_generators::get_int(), + .success = tests::random_bool(), + }; + roundtrip_test(data); + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 96c0c4c98177..2a98ab0cda8d 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -443,7 +443,8 @@ class install_snapshot_request_foreign_wrapper { ptr_t _ptr; }; -struct install_snapshot_reply { +struct install_snapshot_reply + : serde::envelope> { // node id to validate on receiver vnode target_node_id; // current term, for leader to update itself @@ -462,6 +463,14 @@ struct install_snapshot_reply { friend std::ostream& operator<<(std::ostream&, const install_snapshot_reply&); + + friend bool + operator==(const install_snapshot_reply&, const install_snapshot_reply&) + = default; + + auto serde_fields() { + return std::tie(target_node_id, term, bytes_stored, success); + } }; /** From dd8a6db91598bc8a7a0576ee42a017864b2bc4c2 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 17:32:45 -0700 Subject: [PATCH 14/17] raft: add adl specialization for vote_request Signed-off-by: Noah Watkins --- src/v/raft/types.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 2a98ab0cda8d..a3a7bd4d4406 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -740,4 +740,37 @@ struct adl { }; } }; + +template<> +struct adl { + void to(iobuf& out, raft::vote_request&& r) { + serialize( + out, + r.node_id, + r.target_node_id, + r.group, + r.term, + r.prev_log_index, + r.prev_log_term, + r.leadership_transfer); + } + raft::vote_request from(iobuf_parser& in) { + auto node_id = adl{}.from(in); + auto target_node_id = adl{}.from(in); + auto group = adl{}.from(in); + auto term = adl{}.from(in); + auto prev_log_index = adl{}.from(in); + auto prev_log_term = adl{}.from(in); + auto leadership_transfer = adl{}.from(in); + return { + .node_id = node_id, + .target_node_id = target_node_id, + .group = group, + .term = term, + .prev_log_index = prev_log_index, + .prev_log_term = prev_log_term, + .leadership_transfer = leadership_transfer, + }; + } +}; } // namespace reflection From 4cb1e248db5b7d6620e4afb6b79b6f52919358ce Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 17:25:56 -0700 Subject: [PATCH 15/17] raft: add serde support for vote_request Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 14 ++++++++++++++ src/v/raft/types.h | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index 0b0525cc880f..1af76e6a755d 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -2064,6 +2064,20 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { }; roundtrip_test(data); } + { + raft::vote_request data{ + .node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .target_node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .group = tests::random_named_int(), + .term = tests::random_named_int(), + .prev_log_index = tests::random_named_int(), + .prev_log_term = tests::random_named_int(), + .leadership_transfer = tests::random_bool(), + }; + roundtrip_test(data); + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/types.h b/src/v/raft/types.h index a3a7bd4d4406..43afed3e7447 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -278,7 +278,7 @@ struct heartbeat_reply { friend std::ostream& operator<<(std::ostream& o, const heartbeat_reply& r); }; -struct vote_request { +struct vote_request : serde::envelope> { vnode node_id; // node id to validate on receiver vnode target_node_id; @@ -295,6 +295,19 @@ struct vote_request { vnode target_node() const { return target_node_id; } friend std::ostream& operator<<(std::ostream& o, const vote_request& r); + + friend bool operator==(const vote_request&, const vote_request&) = default; + + auto serde_fields() { + return std::tie( + node_id, + target_node_id, + group, + term, + prev_log_index, + prev_log_term, + leadership_transfer); + } }; struct vote_reply { From e975c1c121e366639d7a7643d46cd877873482f3 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 17:32:52 -0700 Subject: [PATCH 16/17] raft: add adl specialization for vote_reply Signed-off-by: Noah Watkins --- src/v/raft/types.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/v/raft/types.h b/src/v/raft/types.h index 43afed3e7447..bbe125858bc2 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -786,4 +786,23 @@ struct adl { }; } }; + +template<> +struct adl { + void to(iobuf& out, raft::vote_reply&& r) { + serialize(out, r.target_node_id, r.term, r.granted, r.log_ok); + } + raft::vote_reply from(iobuf_parser& in) { + auto target_node_id = adl{}.from(in); + auto term = adl{}.from(in); + auto granted = adl{}.from(in); + auto log_ok = adl{}.from(in); + return { + .target_node_id = target_node_id, + .term = term, + .granted = granted, + .log_ok = log_ok, + }; + } +}; } // namespace reflection From d3d407aeee59ff7d2f71cf2c1b468eb766ac5572 Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Tue, 5 Jul 2022 17:26:56 -0700 Subject: [PATCH 17/17] raft: add serde support for vote_reply Signed-off-by: Noah Watkins --- src/v/cluster/tests/serialization_rt_test.cc | 10 ++++++++++ src/v/raft/types.h | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/v/cluster/tests/serialization_rt_test.cc b/src/v/cluster/tests/serialization_rt_test.cc index 1af76e6a755d..99d34637f639 100644 --- a/src/v/cluster/tests/serialization_rt_test.cc +++ b/src/v/cluster/tests/serialization_rt_test.cc @@ -2078,6 +2078,16 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) { }; roundtrip_test(data); } + { + raft::vote_reply data{ + .target_node_id = raft:: + vnode{tests::random_named_int(), tests::random_named_int()}, + .term = tests::random_named_int(), + .granted = tests::random_bool(), + .log_ok = tests::random_bool(), + }; + roundtrip_test(data); + } } SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) { diff --git a/src/v/raft/types.h b/src/v/raft/types.h index bbe125858bc2..a017935fbb3d 100644 --- a/src/v/raft/types.h +++ b/src/v/raft/types.h @@ -310,7 +310,7 @@ struct vote_request : serde::envelope> { } }; -struct vote_reply { +struct vote_reply : serde::envelope> { // node id to validate on receiver vnode target_node_id; /// \brief callee's term, for the caller to upate itself @@ -325,6 +325,12 @@ struct vote_reply { bool log_ok = false; friend std::ostream& operator<<(std::ostream& o, const vote_reply& r); + + friend bool operator==(const vote_reply&, const vote_reply&) = default; + + auto serde_fields() { + return std::tie(target_node_id, term, granted, log_ok); + } }; /// This structure is used by consensus to notify other systems about group