OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
parsec/ticket_machine/controller.cpp
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#include "controller.hpp"
7
8#include "state_machine.hpp"
9#include "util/rpc/format.hpp"
12
14 controller::controller(size_t node_id,
15 network::endpoint_t server_endpoint,
16 std::vector<network::endpoint_t> raft_endpoints,
17 std::shared_ptr<logging::log> logger)
18 : m_logger(std::move(logger)),
19 m_state_machine(
20 nuraft::cs_new<state_machine>(m_logger, m_batch_size)),
21 m_raft_serv(std::make_shared<raft::node>(
22 static_cast<int>(node_id),
23 raft_endpoints,
24 "ticket_machine",
25 false,
26 m_state_machine,
27 0,
28 m_logger,
29 [&](auto&& res, auto&& err) {
30 return raft_callback(std::forward<decltype(res)>(res),
31 std::forward<decltype(err)>(err));
32 })),
33 m_raft_endpoints(std::move(raft_endpoints)),
34 m_server_endpoint(std::move(server_endpoint)) {}
35
36 auto controller::init() -> bool {
37 auto params = nuraft::raft_params();
38 params.snapshot_distance_ = 0; // TODO: implement snapshots
39
40 if(!m_raft_serv->init(params)) {
41 m_logger->error("Failed to initialize raft server");
42 return false;
43 }
44
45 return true;
46 }
47
48 auto controller::raft_callback(nuraft::cb_func::Type type,
49 nuraft::cb_func::Param* /* param */)
50 -> nuraft::cb_func::ReturnCode {
51 if(type == nuraft::cb_func::Type::BecomeFollower) {
52 m_logger->warn("Became follower, stopping listener");
53 m_server.reset();
54 return nuraft::cb_func::ReturnCode::Ok;
55 }
56 if(type == nuraft::cb_func::Type::BecomeLeader) {
57 m_logger->warn("Became leader, starting listener");
58 m_server = std::make_unique<decltype(m_server)::element_type>(
59 m_server_endpoint);
60 m_server->register_raft_node(m_raft_serv);
61 if(!m_server->init()) {
62 m_logger->fatal("Couldn't start message handler server");
63 }
64 }
65 return nuraft::cb_func::ReturnCode::Ok;
66 }
67}
auto init() -> bool
Initializes the ticket machine.
NuRaft state machine implementation for a replicated ticket machine.
std::pair< ip_address, port_number_t > endpoint_t
[host name, port number].
Definition socket.hpp:19