[COMMIT seastar master] rpc: rpc_types: make `connection_id` a class

0 views
Skip to first unread message

Commit Bot

<bot@cloudius-systems.com>
unread,
May 25, 2023, 6:29:38 AM5/25/23
to seastar-dev@googlegroups.com, Kamil Braun
From: Kamil Braun <kbr...@scylladb.com>
Committer: Kamil Braun <kbr...@scylladb.com>
Branch: master

rpc: rpc_types: make `connection_id` a class

Make the `id` field (renamed to `_id`) private, now it cannot
accidentally be mutated, and we cannot create an object of this type
with this field uninitialized.

---
diff --git a/include/seastar/rpc/rpc_impl.hh b/include/seastar/rpc/rpc_impl.hh
--- a/include/seastar/rpc/rpc_impl.hh
+++ b/include/seastar/rpc/rpc_impl.hh
@@ -176,15 +176,15 @@ maybe_add_time_point(do_want_time_point, opt_time_point& otp, std::tuple<In...>&
inline sstring serialize_connection_id(const connection_id& id) {
sstring p = uninitialized_string(sizeof(id));
auto c = p.data();
- write_le(c, id.id);
+ write_le(c, id.id());
return p;
}

inline connection_id deserialize_connection_id(const sstring& s) {
- connection_id id;
+ using id_type = decltype(connection_id{0}.id());
auto p = s.c_str();
- id.id = read_le<decltype(id.id)>(p);
- return id;
+ auto id = read_le<id_type>(p);
+ return connection_id{id};
}

template <bool IsSmartPtr>
diff --git a/include/seastar/rpc/rpc_types.hh b/include/seastar/rpc/rpc_types.hh
--- a/include/seastar/rpc/rpc_types.hh
+++ b/include/seastar/rpc/rpc_types.hh
@@ -55,23 +55,29 @@ struct stats {
counter_type timeout = 0;
};

-struct connection_id {
- uint64_t id;
+class connection_id {
+ uint64_t _id;
+
+public:
+ uint64_t id() const {
+ return _id;
+ }
bool operator==(const connection_id& o) const {
- return id == o.id;
+ return _id == o._id;
}
explicit operator bool() const {
return shard() != 0xffff;
}
size_t shard() const {
- return size_t(id & 0xffff);
+ return size_t(_id & 0xffff);
}
- constexpr static connection_id make_invalid_id(uint64_t id = 0) {
- return make_id(id, 0xffff);
+ constexpr static connection_id make_invalid_id(uint64_t _id = 0) {
+ return make_id(_id, 0xffff);
}
- constexpr static connection_id make_id(uint64_t id, uint16_t shard) {
- return {id << 16 | shard};
+ constexpr static connection_id make_id(uint64_t _id, uint16_t shard) {
+ return {_id << 16 | shard};
}
+ constexpr connection_id(uint64_t id) : _id(id) {}
};

constexpr connection_id invalid_connection_id = connection_id::make_invalid_id();
@@ -393,7 +399,7 @@ template<>
struct hash<seastar::rpc::connection_id> {
size_t operator()(const seastar::rpc::connection_id& id) const {
size_t h = 0;
- boost::hash_combine(h, std::hash<uint64_t>{}(id.id));
+ boost::hash_combine(h, std::hash<uint64_t>{}(id.id()));
return h;
}
};
diff --git a/src/rpc/rpc.cc b/src/rpc/rpc.cc
--- a/src/rpc/rpc.cc
+++ b/src/rpc/rpc.cc
@@ -1198,7 +1198,7 @@ future<> server::connection::send_unknown_verb_reply(std::optional<rpc_clock_typ
}

std::ostream& operator<<(std::ostream& os, const connection_id& id) {
- fmt::print(os, "{:x}", id.id);
+ fmt::print(os, "{:x}", id.id());
return os;
}

diff --git a/tests/unit/rpc_test.cc b/tests/unit/rpc_test.cc
--- a/tests/unit/rpc_test.cc
+++ b/tests/unit/rpc_test.cc
@@ -1445,7 +1445,7 @@ static_assert(std::is_same_v<decltype(rpc::tuple(1U, 1L)), rpc::tuple<unsigned,

SEASTAR_TEST_CASE(test_client_info) {
return rpc_test_env<>::do_with(rpc_test_config(), [] (rpc_test_env<>& env) {
- rpc::client_info info{.server{env.server()}};
+ rpc::client_info info{.server{env.server()}, .conn_id{0}};
const rpc::client_info& const_info = *const_cast<rpc::client_info*>(&info);

info.attach_auxiliary("key", 0);
Reply all
Reply to author
Forward
0 new messages