OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
rpc_server.hpp
Go to the documentation of this file.
1// Copyright (c) 2021 MIT Digital Currency Initiative,
2// Federal Reserve Bank of Boston
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef OPENCBDC_TX_SRC_RAFT_RPC_SERVER_H_
7#define OPENCBDC_TX_SRC_RAFT_RPC_SERVER_H_
8
9#include "node.hpp"
11
12namespace cbdc::raft::rpc {
19 public:
24 void register_raft_node(std::shared_ptr<node> impl) {
25 m_impl = std::move(impl);
27 [&](buffer req, response_callback_type resp_cb) {
28 return request_handler(std::move(req), std::move(resp_cb));
29 });
30 }
31
32 // TODO: implement synchronous call method
33
34 private:
35 std::shared_ptr<node> m_impl;
36
37 using response_callback_type =
39
40 auto request_handler(buffer request_buf,
41 response_callback_type response_callback)
42 -> bool {
43 if(!m_impl->is_leader()) {
44 return false;
45 }
46
47 // TODO: make network and sockets generic over the buffer type so
48 // these copy operations for the request and response to get
49 // over the nuraft/cbdc boundary are not needed.
50 auto new_log = nuraft::buffer::alloc(request_buf.size());
51 nuraft::buffer_serializer bs(new_log);
52 bs.put_raw(request_buf.data(), request_buf.size());
53
54 auto success = m_impl->replicate(
55 new_log,
56 [&, resp_cb = std::move(response_callback), req_buf = new_log](
57 result_type& r,
58 nuraft::ptr<std::exception>& err) {
59 if(err) {
60 resp_cb(std::nullopt);
61 return;
62 }
63
64 const auto res = r.get();
65 if(!res) {
66 resp_cb(std::nullopt);
67 return;
68 }
69
70 auto resp_pkt = cbdc::buffer();
71 resp_pkt.append(res->data_begin(), res->size());
72 resp_cb(std::move(resp_pkt));
73 });
74
75 return success;
76 }
77 };
78}
79
80#endif
Buffer to store and retrieve byte data.
Definition buffer.hpp:15
Generic RPC server for raft nodes for which the replicated state machine handles the request processi...
void register_raft_node(std::shared_ptr< node > impl)
Registers the raft node whose state machine handles RPC requests for this server.
Generic asynchronous RPC server.
std::function< void(std::optional< Response >)> response_callback_type
Response callback function type.
void register_handler_callback(callback_type callback)
Register a request handler callback function for processing requests, generating responses,...
nuraft::cmd_result< nuraft::ptr< nuraft::buffer > > result_type
A NuRaft state machine execution result.
Definition node.hpp:18
@ buffer
A singular RLP value (byte array)