11#pragma once
22
3+ #include < algorithm>
4+ #include < iostream>
5+ #include < map>
6+ #include < unistd.h>
7+ #include < utility>
8+
39#include < boost/asio/awaitable.hpp>
410#include < boost/asio/co_spawn.hpp>
511#include < boost/asio/detached.hpp>
612#include < boost/asio/io_context.hpp>
713#include < boost/asio/ip/tcp.hpp>
814#include < boost/asio/signal_set.hpp>
915#include < boost/system/system_error.hpp>
10- #include < iostream>
11- #include < map>
1216
1317#include " protocol/object_storage.capnp.h"
1418#include " scaler/object_storage/defs.h"
@@ -81,10 +85,10 @@ class ObjectStorageServer {
8185
8286 case reqType::GET_OBJECT: {
8387 responseHeader.respType = respType::GET_O_K;
84- if (objectIDToMeta[requestHeader.objectID ].object )
85- responseHeader. payloadLength =
86- std::min (objectIDToMeta[requestHeader. objectID ]. object -> size () , requestHeader.payloadLength );
87- else
88+ if (objectIDToMeta[requestHeader.objectID ].object ) {
89+ uint64_t objectSize = static_cast < uint64_t >(objectIDToMeta[requestHeader. objectID ]. object -> size ());
90+ responseHeader. payloadLength = std::min (objectSize , requestHeader.payloadLength );
91+ } else
8892 return false ;
8993 break ;
9094 }
@@ -106,8 +110,8 @@ class ObjectStorageServer {
106110private:
107111 awaitable<void > write_once (Meta meta) {
108112 if (meta.requestHeader .reqType == reqType::GET_OBJECT) {
109- meta.responseHeader .payloadLength =
110- std::min (objectIDToMeta[meta. responseHeader . objectID ]. object -> size () , meta.requestHeader .payloadLength );
113+ uint64_t objectSize = static_cast < uint64_t >(objectIDToMeta[ meta.responseHeader .objectID ]. object -> size ());
114+ meta. responseHeader . payloadLength = std::min (objectSize , meta.requestHeader .payloadLength );
111115 }
112116
113117 auto payload_view = getMemoryViewForResponsePayload (meta.responseHeader );
@@ -131,7 +135,8 @@ class ObjectStorageServer {
131135#ifndef NDEBUG
132136public:
133137#endif
134- int on_server_ready_fd;
138+ int _onServerReadyReader;
139+ int _onServerReadyWriter;
135140
136141 std::map<scaler::object_storage::object_id_t , ObjectWithMeta> objectIDToMeta;
137142 std::map<std::size_t , shared_object_t > objectHashToObject;
@@ -165,31 +170,46 @@ class ObjectStorageServer {
165170 }
166171 }
167172
168- static int createServerReadyEventfd () {
169- int on_server_ready_fd = eventfd (0 , EFD_SEMAPHORE);
170- if (on_server_ready_fd == -1 ) {
171- std::cerr << " create on_server_ready_fd failed: errno=" << errno << std::endl;
173+ void initServerReadyFds () {
174+ int pipeFds[2 ];
175+ int ret = pipe (pipeFds);
176+
177+ if (ret != 0 ) {
178+ std::cerr << " create on server ready FDs failed: errno=" << errno << std::endl;
172179 std::terminate ();
173180 }
174181
175- return on_server_ready_fd;
182+ this ->_onServerReadyReader = pipeFds[0 ];
183+ this ->_onServerReadyWriter = pipeFds[1 ];
176184 }
177185
178- void setServerReadyEventfd () {
186+ void setServerReadyFd () {
179187 uint64_t value = 1 ;
180- ssize_t ret = write (this ->on_server_ready_fd , &value, sizeof (uint64_t ));
188+ ssize_t ret = write (this ->_onServerReadyWriter , &value, sizeof (uint64_t ));
181189
182190 if (ret != sizeof (uint64_t )) {
183- std::cerr << " write to on_server_ready_fd failed: errno=" << errno << std::endl;
191+ std::cerr << " write to _onServerReadyWriter failed: errno=" << errno << std::endl;
184192 std::terminate ();
185193 }
186194 }
187195
196+ void closeServerReadyFds () {
197+ std::array<int , 2 > fds { this ->_onServerReadyReader , this ->_onServerReadyWriter };
198+
199+ for (auto fd : fds) {
200+ if (close (fd) != 0 ) {
201+ std::cerr << " close failed: errno=" << errno << std::endl;
202+ std::terminate ();
203+ }
204+ }
205+ }
206+
188207 awaitable<void > listener (boost::asio::ip::tcp::endpoint endpoint) {
208+
189209 auto executor = co_await boost::asio::this_coro::executor;
190210 tcp::acceptor acceptor (executor, endpoint);
191211
192- setServerReadyEventfd ();
212+ setServerReadyFd ();
193213
194214 for (;;) {
195215 auto shared_socket = std::make_shared<tcp::socket>(executor);
@@ -201,13 +221,12 @@ class ObjectStorageServer {
201221 }
202222
203223public:
204- ObjectStorageServer (int on_server_ready_fd = -1 )
205- {
206- if (on_server_ready_fd < 0 ) {
207- this ->on_server_ready_fd = createServerReadyEventfd ();
208- } else {
209- this ->on_server_ready_fd = on_server_ready_fd;
210- }
224+ ObjectStorageServer () {
225+ this ->initServerReadyFds ();
226+ }
227+
228+ ~ObjectStorageServer () {
229+ this ->closeServerReadyFds ();
211230 }
212231
213232 void run (std::string name, std::string port) {
@@ -220,7 +239,6 @@ class ObjectStorageServer {
220239 signals.async_wait ([&](auto , auto ) { io_context.stop (); });
221240
222241 co_spawn (io_context, listener (res.begin ()->endpoint ()), detached);
223-
224242 io_context.run ();
225243 } catch (std::exception& e) {
226244 std::cerr << " Exception: " << e.what () << std::endl;
@@ -230,10 +248,10 @@ class ObjectStorageServer {
230248
231249 void waitUntilReady () {
232250 uint64_t value;
233- ssize_t ret = read (this ->on_server_ready_fd , &value, sizeof (uint64_t ));
251+ ssize_t ret = read (this ->_onServerReadyReader , &value, sizeof (uint64_t ));
234252
235253 if (ret != sizeof (uint64_t )) {
236- std::cerr << " read from on_server_ready_fd failed: errno=" << errno << std::endl;
254+ std::cerr << " read from _onServerReadyReader failed: errno=" << errno << std::endl;
237255 std::terminate ();
238256 }
239257 }
0 commit comments