File tree 2 files changed +25
-11
lines changed
2 files changed +25
-11
lines changed Original file line number Diff line number Diff line change 5
5
6
6
#include " node.hpp"
7
7
8
+ #include < future>
9
+
8
10
namespace cbdc ::raft {
9
11
node::node (int node_id,
10
12
std::vector<network::endpoint_t > raft_endpoints,
@@ -99,11 +101,26 @@ namespace cbdc::raft {
99
101
auto node::replicate_sync (const nuraft::ptr<nuraft::buffer>& new_log) const
100
102
-> std::optional<nuraft::ptr<nuraft::buffer>> {
101
103
auto ret = m_raft_instance->append_entries ({new_log});
102
- if (!ret->get_accepted ()
103
- || ret->get_result_code () != nuraft::cmd_result_code::OK) {
104
+ if (!ret->get_accepted ()) {
105
+ return std::nullopt;
106
+ }
107
+ auto result_code = nuraft::cmd_result_code::RESULT_NOT_EXIST_YET;
108
+ auto blocking_promise = std::promise<void >();
109
+ auto blocking_future = blocking_promise.get_future ();
110
+ ret->when_ready ([&result_code,
111
+ &blocking_promise](raft::result_type& r,
112
+ nuraft::ptr<std::exception >& err) {
113
+ if (err) {
114
+ result_code = nuraft::cmd_result_code::FAILED;
115
+ } else {
116
+ result_code = r.get_result_code ();
117
+ }
118
+ blocking_promise.set_value ();
119
+ });
120
+ blocking_future.wait ();
121
+ if (result_code != nuraft::cmd_result_code::OK) {
104
122
return std::nullopt;
105
123
}
106
-
107
124
return ret->get ();
108
125
}
109
126
Original file line number Diff line number Diff line change @@ -173,6 +173,10 @@ class raft_test : public ::testing::Test {
173
173
auto new_log
174
174
= cbdc::make_buffer<uint64_t , nuraft::ptr<nuraft::buffer>>(1 );
175
175
176
+ auto res = nodes[0 ]->replicate_sync (new_log);
177
+ ASSERT_TRUE (res.has_value ());
178
+ ASSERT_EQ (nodes[0 ]->last_log_idx (), 2UL );
179
+
176
180
cbdc::raft::callback_type result_fn = nullptr ;
177
181
auto result_done = std::atomic<bool >(false );
178
182
if (!blocking) {
@@ -190,14 +194,7 @@ class raft_test : public ::testing::Test {
190
194
while (!result_done) {
191
195
std::this_thread::sleep_for (std::chrono::milliseconds (250 ));
192
196
}
193
- ASSERT_EQ (nodes[0 ]->last_log_idx (), 2UL );
194
-
195
- if (blocking) {
196
- // Replicate sync will only return a value in the blocking context
197
- auto res = nodes[0 ]->replicate_sync (new_log);
198
- ASSERT_TRUE (res.has_value ());
199
- ASSERT_EQ (nodes[0 ]->last_log_idx (), 3UL );
200
- }
197
+ ASSERT_EQ (nodes[0 ]->last_log_idx (), 3UL );
201
198
202
199
for (size_t i{0 }; i < nodes.size (); i++) {
203
200
ASSERT_EQ (nodes[i]->get_sm (), sms[i].get ());
You can’t perform that action at this time.
0 commit comments