Joedb 10.2.0
The Journal-Only Embedded Database
Loading...
Searching...
No Matches
Server.cpp
Go to the documentation of this file.
1#include "joedb/asio/Server.h"
4
5#include <boost/asio/detached.hpp>
6#include <boost/asio/co_spawn.hpp>
7#include <boost/asio/read.hpp>
8#include <boost/asio/write.hpp>
9
10namespace joedb::asio
11{
12 void Server::log(std::string_view s)
13 {
15 (
17 endpoint_path + ": " +
18 std::string(s) + '\n'
19 );
20 }
21
23 (
24 Server &server,
25 boost::asio::local::stream_protocol::socket &&socket
26 ):
27 server(server),
28 id(server.session_id++),
29 socket(std::move(socket)),
30 strand(server.thread_pool.get_executor())
31 {
32 if (server.log_level > 1)
33 log("start");
34 }
35
36 boost::asio::awaitable<size_t> Server::Session::read_buffer
37 (
38 const size_t offset,
39 const size_t size
40 )
41 {
42 const size_t result = co_await boost::asio::async_read
43 (
44 socket,
45 boost::asio::buffer(buffer.data + offset, size),
46 boost::asio::use_awaitable
47 );
48
49 buffer.index = offset;
50
51 co_return result;
52 }
53
54 boost::asio::awaitable<void> Server::Session::write_buffer()
55 {
56 co_await boost::asio::async_write
57 (
58 socket,
59 boost::asio::buffer(buffer.data, buffer.index),
60 boost::asio::use_awaitable
61 );
62 }
63
64 void Server::Session::log(std::string_view s)
65 {
66 server.log(std::to_string(id) + ": " + std::string(s));
67 }
68
69 Server::Session::~Session() = default;
70
71 boost::asio::awaitable<void> Server::listener()
72 {
73 while (true)
74 {
75 auto session = new_session
76 (
77 co_await acceptor.async_accept(boost::asio::use_awaitable)
78 );
79
80 auto* const session_ptr = session.get();
81
82 boost::asio::co_spawn
83 (
84 session_ptr->strand,
85 session_ptr->run(),
86 [ending_session = std::move(session), this]
87 (
88 std::exception_ptr exception_ptr
89 )
90 {
91 ending_session->cleanup();
92 if (log_level > 1)
93 ending_session->log("stop");
94 if (exception_ptr && log_level > 1)
95 {
96 try
97 {
98 std::rethrow_exception(exception_ptr);
99 }
100 catch (const std::exception &e)
101 {
102 if (log_level > 1)
103 ending_session->log(std::string("exception: ") + e.what());
104 }
105 catch (...)
106 {
107 }
108 }
109 }
110 );
111 }
112 }
113
115 (
116 Logger &logger,
117 int log_level,
118 int thread_count,
119 std::string endpoint_path
120 ):
121 logger(logger),
122 log_level(log_level),
123 thread_count(thread_count),
124 thread_pool(thread_count),
125 joined(false),
126 endpoint_path(std::move(endpoint_path)),
127 endpoint(this->endpoint_path),
128 acceptor(thread_pool, endpoint, false),
129 interrupt_signals(thread_pool, SIGINT, SIGTERM)
130 {
131 if (log_level > 0)
132 log("start, thread_count = " + std::to_string(thread_count));
133
134 interrupt_signals.async_wait
135 (
136 [this](const boost::system::error_code &error, int signal)
137 {
138 if (!error)
139 {
140 if (this->log_level > 0)
141 {
142 if (signal == SIGINT)
143 this->log("interrupted by SIGINT");
144 else if (signal == SIGTERM)
145 this->log("interrupted by SIGTERM");
146 }
147 this->thread_pool.stop();
148 }
149 }
150 );
151
152 boost::asio::co_spawn
153 (
155 listener(),
156 boost::asio::detached
157 );
158 }
159
161 {
162 thread_pool.stop();
163 join();
164 }
165
167 {
168 thread_pool.join();
170 std::remove(endpoint_path.c_str());
171 joined = true;
172 }
173
175 {
176 }
177
179 {
180 if (!joined)
181 {
182 Destructor_Logger::warning("Server: not joined. This is a bug.");
183 std::terminate(); // it is too late to call join, since child was destroyed already
184 }
185 }
186}
static void warning(std::string_view message) noexcept
virtual void write(std::string_view message) noexcept
Definition Logger.h:12
void log(std::string_view s)
Definition Server.cpp:64
boost::asio::awaitable< void > write_buffer()
Definition Server.cpp:54
Session(Server &server, boost::asio::local::stream_protocol::socket &&socket)
Definition Server.cpp:23
boost::asio::awaitable< size_t > read_buffer(size_t offset, size_t size)
Definition Server.cpp:37
Superclass for asio servers.
Definition Server.h:19
const std::string endpoint_path
Definition Server.h:29
virtual std::unique_ptr< Session > new_session(boost::asio::local::stream_protocol::socket &&socket)=0
void log(std::string_view s)
Definition Server.cpp:12
Logger & logger
Definition Server.h:21
boost::asio::local::stream_protocol::acceptor acceptor
Definition Server.h:31
const int thread_count
Definition Server.h:25
boost::asio::signal_set interrupt_signals
Definition Server.h:32
virtual ~Server()
Definition Server.cpp:178
boost::asio::thread_pool thread_pool
Definition Server.h:26
Server(Logger &logger, int log_level, int thread_count, std::string endpoint_path)
Definition Server.cpp:115
const int log_level
Definition Server.h:22
virtual void cleanup_after_join()
Definition Server.cpp:174
std::string get_time_string_of_now()