Make socket manager counters more robust
authorKonrad Lipinski <k.lipinski2@samsung.com>
Wed, 13 Jul 2022 13:25:52 +0000 (15:25 +0200)
committerTomasz Swierczek <t.swierczek@samsung.com>
Mon, 20 Feb 2023 12:54:43 +0000 (13:54 +0100)
Now that the service no longer needs to maintain a dictionary of all
socket connections, socket counters no longer need to be globally
unique. The only remaining use for those counters now involves checking
whether a particular socket descriptor has gone stale. Per-descriptor
counters are enough for that, incremented every time a particular
descriptor is reopened.

* use per-socket counters instead of a global one
* use unsigned for guaranteed wraparound
* increment counter when closing instead of when opening to make the
  check for isOpen unnecessary when checking connections enqueued in
  m_closeQueue or m_writeBufferQueue

Change-Id: I5b9102c6fe3f9eb183ce456d1334173ac37aab4b

src/server/main/include/generic-socket-manager.h
src/server/main/include/socket-manager.h
src/server/main/socket-manager.cpp
src/server/service/base-service.cpp

index c545894a276749bd0eb62a05c46262271b2e0536..e1b4b6c61f82510daabb551248ee95f7258c5ddb 100644 (file)
 namespace SecurityManager {
 
 struct ConnectionID {
-    int sock;                                 // This is decriptor used for connection
-    int counter;                              // Unique handler per socket
-    inline bool operator<(const ConnectionID &second) const {
-        return counter < second.counter;
-    }
+    int sock;          // Socket file descriptor number.
+    unsigned counter;  // Unique counter per that descriptor number.
 };
 
 struct GenericSocketManager;
index 9e6ffa233fa08f7e1c82c64670e440efe0c06f21..7c9a7907d967660b49a26da19a4b823f63f052e5 100644 (file)
@@ -76,7 +76,7 @@ protected:
     struct SocketDescription {
         bool isOpen = false;
         bool isTimeout = false;
-        int counter = -1;
+        unsigned counter = 0;
         time_t timeout = 0;
         MessageBuffer buffer;
     };
@@ -104,7 +104,6 @@ protected:
     fd_set m_writeSet;
     int m_maxDesc = 0;
     int m_signalFd, m_listenSock = -1, m_notifyMe;
-    int m_counter = 0;
     std::mutex m_eventQueueMutex;
     std::queue<WriteBuffer> m_writeBufferQueue;
     std::queue<ConnectionID> m_closeQueue;
index 1284081e4d47645d7fa0eaa5d9130be60e572165..7950dc45151edeaf6ef6644db017d81991898336 100644 (file)
@@ -73,7 +73,6 @@ void SocketManager::CreateDefaultReadSocketDescription(int sock)
 
     auto &desc = m_socketDescriptionVector[sock];
     desc.isOpen = true;
-    desc.counter = ++m_counter;
     desc.timeout = monotonicNow() + SOCKET_TIMEOUT;
     desc.buffer.InitForInput();
 
@@ -511,15 +510,9 @@ void SocketManager::ProcessQueue() {
 
             auto &desc = m_socketDescriptionVector[buffer.connectionID.sock];
 
-            if (!desc.isOpen) {
-                LogDebug("Received packet for write but connection is closed. Packet ignored! Socket: "
-                         << buffer.connectionID.sock);
-                continue;
-            }
-
             if (desc.counter != buffer.connectionID.counter)
             {
-                LogDebug("Received packet for write but counter is broken. Packet ignored! Socket: "
+                LogDebug("Received packet for write but connection is closed. Packet ignored! Socket: "
                          << buffer.connectionID.sock);
                 continue;
             }
@@ -541,9 +534,6 @@ void SocketManager::ProcessQueue() {
             m_closeQueue.pop();
         }
 
-        if (!m_socketDescriptionVector[connection.sock].isOpen)
-            continue;
-
         if (connection.counter != m_socketDescriptionVector[connection.sock].counter)
             continue;
 
@@ -563,6 +553,7 @@ void SocketManager::CloseSocket(int sock) {
     }
 
     desc.isOpen = false;
+    desc.counter++;
     desc.buffer.Clear();
 
     close(sock);
index dc2c931ba2ef520a6b007ee93528b3f24cecbe9b..7fa175278c3ec5082364762e2fa3faabeb04ffcd 100644 (file)
@@ -46,7 +46,8 @@ BaseService::BaseService(Offline offline)
 
 void BaseService::process(MessageEvent &&event)
 {
-    LogDebug("Message event for counter: " << event.connectionID.counter);
+    LogDebug("Message event for socket " << event.connectionID.sock <<
+             " counter " << event.connectionID.counter);
 
     processOne(event.connectionID, event.creds, event.messageBuffer);
 }