Don't accept new connections when their number is > 800 07/319507/4
authorKrzysztof Malysa <k.malysa@samsung.com>
Thu, 24 Oct 2024 12:43:06 +0000 (14:43 +0200)
committerKrzysztof Malysa <k.malysa@samsung.com>
Thu, 24 Oct 2024 14:47:50 +0000 (16:47 +0200)
Change-Id: I2c83edd5216f43b3bb924193b55dd7cb4fe2092a

src/service/sockets/SocketManager.cpp
src/service/sockets/SocketManager.h

index 7be676be77e38f8c744ec1d18273d1aa46f51428..e17529b8fad82faef0d39f2c733fcde5b0e6ba6c 100644 (file)
@@ -364,6 +364,13 @@ void SocketManager::readyForWrite(int fd) {
 }
 
 void SocketManager::readyForAccept(int fd) {
+    if (fdsUsageIsHigh()) {
+        LOGD("SocketManger readyForAccept on fd [%d]: high memory usage -> stop listening", fd);
+        m_listenSocketsDisabledBecauseOfHighFdUsage.emplace(fd);
+        removeReadSocket(fd);
+        return;
+    }
+
     LOGD("SocketManger readyForAccept on fd [%d] start", fd);
     struct sockaddr_un clientAddr;
     unsigned int clientLen = sizeof(clientAddr);
@@ -407,6 +414,7 @@ void SocketManager::closeSocket(int fd) {
         desc.writeQueue(),
     });
 
+    bool fdUsageWasHigh = fdsUsageIsHigh();
     // Statistics
     m_stats.closeFd(fd);
 
@@ -414,6 +422,16 @@ void SocketManager::closeSocket(int fd) {
     removeWriteSocket(fd);
     desc.clear();
     close(fd);
+
+    // Restore sockets that were disabled due to high fd usage
+    if (fdUsageWasHigh && !fdsUsageIsHigh()) {
+        for (auto fd : m_listenSocketsDisabledBecauseOfHighFdUsage) {
+            LOGD("SocketManger: start listening again on fd [%d]", fd);
+            addReadSocket(fd);
+        }
+        m_listenSocketsDisabledBecauseOfHighFdUsage.clear();
+    }
+
     LOGD("SocketManger closeSocket fd [%d] done", fd);
 }
 
index 8c6be64e9f45e10371f8531fd43389d64c23de25..0035d1b580332f15ece7105e8dc248f1de474f8a 100644 (file)
@@ -28,6 +28,7 @@
 #ifndef SRC_SERVICE_SOCKETS_SOCKETMANAGER_H_
 #define SRC_SERVICE_SOCKETS_SOCKETMANAGER_H_
 
+#include <algorithm>
 #include <atomic>
 #include <cstdio>
 #include <memory>
@@ -118,6 +119,8 @@ private:
     typedef std::vector<Descriptor> FDVector;
     FDVector m_fds;
 
+    std::set<int> m_listenSocketsDisabledBecauseOfHighFdUsage;
+
     bool m_working;
 
     fd_set m_readSet;