Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

raft: add serde support for raft message types #5353

Merged
merged 17 commits into from
Jul 6, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions src/v/cluster/tests/serialization_rt_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -1958,6 +1959,135 @@ SEASTAR_THREAD_TEST_CASE(serde_reflection_roundtrip) {
// semantics are preserved.
serde_roundtrip_test(data);
}
{
raft::transfer_leadership_request data{
.group = tests::random_named_int<raft::group_id>(),
};
if (tests::random_bool()) {
data.target = tests::random_named_int<model::node_id>();
}
roundtrip_test(data);
}
{
raft::transfer_leadership_reply data{
.success = tests::random_bool(),
.result = raft::errc::append_entries_dispatch_error,
};
roundtrip_test(data);
}
{
raft::vnode data{
tests::random_named_int<model::node_id>(),
tests::random_named_int<model::revision_id>()};
roundtrip_test(data);
}
{
raft::timeout_now_request data{
.target_node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.group = tests::random_named_int<raft::group_id>(),
.term = tests::random_named_int<model::term_id>(),
};
roundtrip_test(data);
}
{
raft::timeout_now_reply data{
.target_node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.term = tests::random_named_int<model::term_id>(),
.result = raft::timeout_now_reply::status::failure,
};
roundtrip_test(data);
}
{
const raft::install_snapshot_request orig{
.target_node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.term = tests::random_named_int<model::term_id>(),
.group = tests::random_named_int<raft::group_id>(),
.node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.last_included_index = tests::random_named_int<model::offset>(),
.file_offset = random_generators::get_int<uint64_t>(),
.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<raft::install_snapshot_request>(
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<raft::install_snapshot_request>(
std::move(adl_out));

BOOST_REQUIRE(orig == from_adl);
}
}
{
raft::install_snapshot_reply data{
.target_node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.term = tests::random_named_int<model::term_id>(),
.bytes_stored = random_generators::get_int<uint64_t>(),
.success = tests::random_bool(),
};
roundtrip_test(data);
}
{
raft::vote_request data{
.node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.target_node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.group = tests::random_named_int<raft::group_id>(),
.term = tests::random_named_int<model::term_id>(),
.prev_log_index = tests::random_named_int<model::offset>(),
.prev_log_term = tests::random_named_int<model::term_id>(),
.leadership_transfer = tests::random_bool(),
};
roundtrip_test(data);
}
{
raft::vote_reply data{
.target_node_id = raft::
vnode{tests::random_named_int<model::node_id>(), tests::random_named_int<model::revision_id>()},
.term = tests::random_named_int<model::term_id>(),
.granted = tests::random_bool(),
.log_ok = tests::random_bool(),
};
roundtrip_test(data);
}
}

SEASTAR_THREAD_TEST_CASE(cluster_property_kv_exchangable_with_pair) {
Expand Down
4 changes: 3 additions & 1 deletion src/v/raft/group_configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
namespace raft {

static constexpr model::revision_id no_revision{};
class vnode {
class vnode : public serde::envelope<vnode, serde::version<0>> {
public:
constexpr vnode() = default;

Expand All @@ -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;
Expand Down
Loading