Skip to content

Commit

Permalink
Merge pull request #5353 from dotnwat/raft-serde
Browse files Browse the repository at this point in the history
raft: add serde support for raft message types
  • Loading branch information
dotnwat committed Jul 6, 2022
2 parents d1781ff + d3d407a commit 547af6f
Show file tree
Hide file tree
Showing 3 changed files with 381 additions and 9 deletions.
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

0 comments on commit 547af6f

Please sign in to comment.