From 01051f84d9c4bf6c3d3fcea7b5fd56e535fb60fc Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Wed, 30 Jan 2019 13:27:18 +0100
Subject: [PATCH] finished net server

---
 common/cpp/src/system_io/system_io_linux.cpp           |  3 ++-
 receiver/src/main.cpp                                  |  2 +-
 .../src/receiver_data_server/receiver_data_server.cpp  |  3 ++-
 .../src/receiver_data_server/receiver_data_server.h    |  2 +-
 receiver/src/receiver_data_server/tcp_server.cpp       | 10 +++-------
 .../receiver_data_server/test_receiver_data_server.cpp |  4 ++--
 .../unittests/receiver_data_server/test_tcp_server.cpp |  4 +++-
 7 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/common/cpp/src/system_io/system_io_linux.cpp b/common/cpp/src/system_io/system_io_linux.cpp
index 2d36ce58a..be6393f3f 100644
--- a/common/cpp/src/system_io/system_io_linux.cpp
+++ b/common/cpp/src/system_io/system_io_linux.cpp
@@ -210,7 +210,8 @@ void SystemIO::ApplyNetworkOptions(SocketDescriptor socket_fd, Error* err) const
         ||*/
         setsockopt(socket_fd, SOL_SOCKET, SO_SNDBUF, (char*)&kNetBufferSize, sizeof(kNetBufferSize)) != 0
         ||
-        setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int)) != 0
+        setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int)) != 0 ||
+        setsockopt(socket_fd, SOL_SOCKET, SO_REUSEPORT, &flag, sizeof(int)) != 0
     ) {
         *err = GetLastError();
     }
diff --git a/receiver/src/main.cpp b/receiver/src/main.cpp
index 6c80cec86..c709542ed 100644
--- a/receiver/src/main.cpp
+++ b/receiver/src/main.cpp
@@ -33,7 +33,7 @@ int main (int argc, char* argv[]) {
     logger->SetLogLevel(config->log_level);
 
     static const std::string dataserver_address = "0.0.0.0:" + std::to_string(config->dataserver_listen_port);
-    asapo::ReceiverDataServer data_server{dataserver_address};
+    asapo::ReceiverDataServer data_server{dataserver_address, config->log_level};
     std::thread server_thread (&asapo::ReceiverDataServer::Run, &data_server);
 
     static const std::string address = "0.0.0.0:" + std::to_string(config->listen_port);
diff --git a/receiver/src/receiver_data_server/receiver_data_server.cpp b/receiver/src/receiver_data_server/receiver_data_server.cpp
index 65a6b0ee8..cbc55c3fb 100644
--- a/receiver/src/receiver_data_server/receiver_data_server.cpp
+++ b/receiver/src/receiver_data_server/receiver_data_server.cpp
@@ -4,8 +4,9 @@
 
 namespace asapo {
 
-ReceiverDataServer::ReceiverDataServer(std::string address) : request_pool__{new RequestPool}, net__{new TcpServer(address)},
+ReceiverDataServer::ReceiverDataServer(std::string address, LogLevel log_level) : request_pool__{new RequestPool}, net__{new TcpServer(address)},
 log__{GetDefaultReceiverDataServerLogger()} {
+    GetDefaultReceiverDataServerLogger()->SetLogLevel(log_level);
 }
 
 void ReceiverDataServer::Run() {
diff --git a/receiver/src/receiver_data_server/receiver_data_server.h b/receiver/src/receiver_data_server/receiver_data_server.h
index 74a3ce97b..8366bb048 100644
--- a/receiver/src/receiver_data_server/receiver_data_server.h
+++ b/receiver/src/receiver_data_server/receiver_data_server.h
@@ -11,7 +11,7 @@ namespace asapo {
 
 class ReceiverDataServer {
   public:
-    explicit ReceiverDataServer(std::string address);
+    explicit ReceiverDataServer(std::string address, LogLevel log_level);
     std::unique_ptr<RequestPool> request_pool__;
     std::unique_ptr<NetServer> net__;
     const AbstractLogger* log__;
diff --git a/receiver/src/receiver_data_server/tcp_server.cpp b/receiver/src/receiver_data_server/tcp_server.cpp
index 61923e006..3dcaf0bb7 100644
--- a/receiver/src/receiver_data_server/tcp_server.cpp
+++ b/receiver/src/receiver_data_server/tcp_server.cpp
@@ -10,8 +10,7 @@ TcpServer::TcpServer(std::string address) : io__{GenerateDefaultIO()}, log__{Get
     address_{std::move(address)} {}
 
 Error TcpServer::InitializeMasterSocketIfNeeded() const noexcept {
-    Error
-    err;
+    Error err;
     if (master_socket_ == kDisconnectedSocketDescriptor) {
         master_socket_ = io__->CreateAndBindIPTCPSocketListener(address_, kMaxPendingConnections, &err);
         if (!err) {
@@ -26,10 +25,6 @@ Error TcpServer::InitializeMasterSocketIfNeeded() const noexcept {
 ListSocketDescriptors TcpServer::GetActiveSockets(Error* err) const noexcept {
     std::vector<std::string> new_connections;
     auto sockets = io__->WaitSocketsActivity(master_socket_, &sockets_to_listen_, &new_connections, err);
-    if (*err) {
-        return {};
-    }
-
     for (auto& connection : new_connections) {
         log__->Debug("new connection from " + connection);
     }
@@ -39,8 +34,8 @@ ListSocketDescriptors TcpServer::GetActiveSockets(Error* err) const noexcept {
 void TcpServer::CloseSocket(SocketDescriptor socket) const noexcept {
     sockets_to_listen_.erase(std::remove(sockets_to_listen_.begin(), sockets_to_listen_.end(), socket),
                              sockets_to_listen_.end());
-    io__->CloseSocket(socket, nullptr);
     log__->Debug("connection " + io__->AddressFromSocket(socket) + " closed");
+    io__->CloseSocket(socket, nullptr);
 }
 
 Request TcpServer::ReadRequest(SocketDescriptor socket, Error* err) const noexcept {
@@ -66,6 +61,7 @@ Requests TcpServer::ReadRequests(const ListSocketDescriptors& sockets) const noe
         if (err) {
             continue;
         }
+        log__->Debug("received request opcode: " + std::to_string(request.header.op_code)+" id: "+std::to_string(request.header.data_id));
         requests.emplace_back(std::move(request));
     }
     return requests;
diff --git a/receiver/unittests/receiver_data_server/test_receiver_data_server.cpp b/receiver/unittests/receiver_data_server/test_receiver_data_server.cpp
index 5cb9bf681..c3875026e 100644
--- a/receiver/unittests/receiver_data_server/test_receiver_data_server.cpp
+++ b/receiver/unittests/receiver_data_server/test_receiver_data_server.cpp
@@ -35,7 +35,7 @@ using asapo::Error;
 namespace {
 
 TEST(ReceiverDataServer, Constructor) {
-    ReceiverDataServer data_server{""};
+    ReceiverDataServer data_server{"", asapo::LogLevel::Debug};
     ASSERT_THAT(dynamic_cast<const asapo::TcpServer*>(data_server.net__.get()), Ne(nullptr));
     ASSERT_THAT(dynamic_cast<asapo::RequestPool*>(data_server.request_pool__.get()), Ne(nullptr));
     ASSERT_THAT(dynamic_cast<const asapo::AbstractLogger*>(data_server.log__), Ne(nullptr));
@@ -45,7 +45,7 @@ TEST(ReceiverDataServer, Constructor) {
 class ReceiverDataServerTests : public Test {
   public:
     std::string expected_address = "somehost:123";
-    ReceiverDataServer data_server{expected_address};
+    ReceiverDataServer data_server{expected_address, asapo::LogLevel::Debug};
     asapo::MockNetServer mock_net;
     asapo::MockPool mock_pool;
     NiceMock<asapo::MockLogger> mock_logger;
diff --git a/receiver/unittests/receiver_data_server/test_tcp_server.cpp b/receiver/unittests/receiver_data_server/test_tcp_server.cpp
index 9dca74ee9..4ba807b49 100644
--- a/receiver/unittests/receiver_data_server/test_tcp_server.cpp
+++ b/receiver/unittests/receiver_data_server/test_tcp_server.cpp
@@ -77,7 +77,7 @@ void TCPServerTests::ExpectListenMaster(bool ok) {
 
 void TCPServerTests::WaitSockets(bool ok, ListSocketDescriptors clients) {
     EXPECT_CALL(mock_io, WaitSocketsActivity_t(expected_master_socket, testing::Pointee(clients), _, _)).WillOnce(DoAll(
-                SetArgPointee<2>(expected_new_connections),
+                SetArgPointee<2>(ok ? expected_new_connections:std::vector<std::string>{}),
                 SetArgPointee<1>(expected_client_sockets),
                 SetArgPointee<3>(ok ? nullptr : asapo::IOErrorTemplates::kUnknownIOError.Generate().release()),
                 Return(ok ? expected_client_sockets : asapo::ListSocketDescriptors{})
@@ -158,6 +158,8 @@ void TCPServerTests::ExpectReceiveOk() {
                 A_ReceiveData(asapo::kOpcodeGetBufferData, conn),
                 testing::ReturnArg<2>()
             ));
+        EXPECT_CALL(mock_logger, Debug(AllOf(HasSubstr("request"), HasSubstr("id: "+std::to_string(conn)),
+            HasSubstr("opcode: "+std::to_string(asapo::kOpcodeGetBufferData)))));
     }
 }
 
-- 
GitLab