From 0cc96f2be14163f7bee0650781e5ce4df1b977a5 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 17 Jul 2018 11:04:25 -0700 Subject: [PATCH 1/7] Raise posix descriptor limit if necessary --- .../src/AssignmentClientMonitor.cpp | 24 +++++++++++++++++++ .../src/AssignmentClientMonitor.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 2847d4ebf1..163e5229bd 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -25,6 +25,9 @@ #include "AssignmentClientChildData.h" #include "SharedUtil.h" #include +#ifdef POSIX_SOURCE +#include +#endif const QString ASSIGNMENT_CLIENT_MONITOR_TARGET_NAME = "assignment-client-monitor"; const int WAIT_FOR_CHILD_MSECS = 1000; @@ -71,6 +74,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListener(PacketType::AssignmentClientStatus, this, "handleChildStatusPacket"); + adjustOsResources(_numAssignmentClientForks); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { spawnChildClient(); @@ -372,3 +376,23 @@ bool AssignmentClientMonitor::handleHTTPRequest(HTTPConnection* connection, cons return true; } + +void AssignmentClientMonitor::adjustOsResources(unsigned int numForks) const +{ +#ifdef _POSIX_SOURCE + // QProcess on Unix uses six descriptors, some temporarily, for each child proc. + unsigned requiredDescriptors = 30 + 6 * numForks; + struct rlimit descLimits; + if (getrlimit(RLIMIT_NOFILE, &descLimits) == 0) { + if (descLimits.rlim_cur < requiredDescriptors) { + descLimits.rlim_cur = requiredDescriptors; + if (setrlimit(RLIMIT_NOFILE, &descLimits) == 0) { + qDebug() << "Resetting descriptor limit to" << requiredDescriptors; + } else { + const char *const errorString = strerror(errno); + qDebug() << "Failed to reset descriptor limit to" << requiredDescriptors << ":" << errorString; + } + } + } +#endif +} diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index 8848d503ae..331eed4599 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -23,6 +23,7 @@ #include "AssignmentClientChildData.h" #include #include +#include extern const char* NUM_FORKS_PARAMETER; @@ -55,6 +56,7 @@ public slots: private: void spawnChildClient(); void simultaneousWaitOnChildren(int waitMsecs); + void adjustOsResources(unsigned int numForks) const; QTimer _checkSparesTimer; // every few seconds see if it need fewer or more spare children From 6098c53d32641b73dc4d2f50c6d908857c5afa36 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 17 Jul 2018 11:29:31 -0700 Subject: [PATCH 2/7] Remove #include from header --- assignment-client/src/AssignmentClientMonitor.h | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index 331eed4599..659ff4b001 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -23,7 +23,6 @@ #include "AssignmentClientChildData.h" #include #include -#include extern const char* NUM_FORKS_PARAMETER; From 7181c3ad487fd39f8760e5333e3d097798db33e5 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 17 Jul 2018 12:11:22 -0700 Subject: [PATCH 3/7] Fix typo in preprocessor symbol --- assignment-client/src/AssignmentClientMonitor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 163e5229bd..9809c1b7d6 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -25,7 +25,7 @@ #include "AssignmentClientChildData.h" #include "SharedUtil.h" #include -#ifdef POSIX_SOURCE +#ifdef _POSIX_SOURCE #include #endif From 06d1602c0dd42495acd671fe0105c5cefc719c4c Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 17 Jul 2018 14:39:21 -0700 Subject: [PATCH 4/7] Use max of --max & --n for resources; other clean-up --- assignment-client/src/AssignmentClientMonitor.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 9809c1b7d6..eb764a128c 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -74,7 +74,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListener(PacketType::AssignmentClientStatus, this, "handleChildStatusPacket"); - adjustOsResources(_numAssignmentClientForks); + adjustOsResources(std::max(_numAssignmentClientForks, _maxAssignmentClientForks)); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { spawnChildClient(); @@ -380,7 +380,8 @@ bool AssignmentClientMonitor::handleHTTPRequest(HTTPConnection* connection, cons void AssignmentClientMonitor::adjustOsResources(unsigned int numForks) const { #ifdef _POSIX_SOURCE - // QProcess on Unix uses six descriptors, some temporarily, for each child proc. + // QProcess on Unix uses six (I think) descriptors, some temporarily, for each child proc. + // Formula based on tests with a Ubuntu 16.04 VM. unsigned requiredDescriptors = 30 + 6 * numForks; struct rlimit descLimits; if (getrlimit(RLIMIT_NOFILE, &descLimits) == 0) { @@ -393,6 +394,9 @@ void AssignmentClientMonitor::adjustOsResources(unsigned int numForks) const qDebug() << "Failed to reset descriptor limit to" << requiredDescriptors << ":" << errorString; } } + } else { + const char *const errorString = strerror(errno); + qDebug() << "Failed to read descriptor limit:" << errorString; } #endif } From 187259c838cfc950192a86ab8488501294c0caf6 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 17 Jul 2018 11:04:25 -0700 Subject: [PATCH 5/7] Raise posix descriptor limit if necessary --- assignment-client/src/AssignmentClientMonitor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index 659ff4b001..331eed4599 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -23,6 +23,7 @@ #include "AssignmentClientChildData.h" #include #include +#include extern const char* NUM_FORKS_PARAMETER; From 2d653db0640832bc0875fcf01f4fc4afc7e214ea Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Tue, 17 Jul 2018 11:29:31 -0700 Subject: [PATCH 6/7] Remove #include from header --- assignment-client/src/AssignmentClientMonitor.h | 1 - 1 file changed, 1 deletion(-) diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index 331eed4599..659ff4b001 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -23,7 +23,6 @@ #include "AssignmentClientChildData.h" #include #include -#include extern const char* NUM_FORKS_PARAMETER; From 9d42a6e08fbbbb9eab4ba52335621eac2beefa02 Mon Sep 17 00:00:00 2001 From: Simon Walton Date: Wed, 1 Aug 2018 10:37:28 -0700 Subject: [PATCH 7/7] Change method name per coding standards --- assignment-client/src/AssignmentClientMonitor.cpp | 4 ++-- assignment-client/src/AssignmentClientMonitor.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index eb764a128c..330023dae0 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -74,7 +74,7 @@ AssignmentClientMonitor::AssignmentClientMonitor(const unsigned int numAssignmen auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListener(PacketType::AssignmentClientStatus, this, "handleChildStatusPacket"); - adjustOsResources(std::max(_numAssignmentClientForks, _maxAssignmentClientForks)); + adjustOSResources(std::max(_numAssignmentClientForks, _maxAssignmentClientForks)); // use QProcess to fork off a process for each of the child assignment clients for (unsigned int i = 0; i < _numAssignmentClientForks; i++) { spawnChildClient(); @@ -377,7 +377,7 @@ bool AssignmentClientMonitor::handleHTTPRequest(HTTPConnection* connection, cons return true; } -void AssignmentClientMonitor::adjustOsResources(unsigned int numForks) const +void AssignmentClientMonitor::adjustOSResources(unsigned int numForks) const { #ifdef _POSIX_SOURCE // QProcess on Unix uses six (I think) descriptors, some temporarily, for each child proc. diff --git a/assignment-client/src/AssignmentClientMonitor.h b/assignment-client/src/AssignmentClientMonitor.h index 659ff4b001..5e32c50e0d 100644 --- a/assignment-client/src/AssignmentClientMonitor.h +++ b/assignment-client/src/AssignmentClientMonitor.h @@ -55,7 +55,7 @@ public slots: private: void spawnChildClient(); void simultaneousWaitOnChildren(int waitMsecs); - void adjustOsResources(unsigned int numForks) const; + void adjustOSResources(unsigned int numForks) const; QTimer _checkSparesTimer; // every few seconds see if it need fewer or more spare children