Overte C++ Documentation
AssignmentClientMonitor.h
1 //
2 // AssignmentClientMonitor.h
3 // assignment-client/src
4 //
5 // Created by Stephen Birarda on 1/10/2014.
6 // Copyright 2014 High Fidelity, Inc.
7 // Copyright 2021 Vircadia contributors.
8 //
9 // Distributed under the Apache License, Version 2.0.
10 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
11 //
12 
13 #ifndef hifi_AssignmentClientMonitor_h
14 #define hifi_AssignmentClientMonitor_h
15 
16 #include <QtCore/QCoreApplication>
17 #include <QtCore/qpointer.h>
18 #include <QtCore/QProcess>
19 #include <QtCore/QDateTime>
20 #include <QtCore/QSharedPointer>
21 #include <QDir>
22 
23 #include <Assignment.h>
24 
25 #include "AssignmentClientChildData.h"
26 #include <HTTPManager.h>
27 #include <HTTPConnection.h>
28 
29 extern const char* NUM_FORKS_PARAMETER;
30 
31 struct ACProcess {
32  QProcess* process; // looks like a dangling pointer, but is parented by the AssignmentClientMonitor
33  QString logStdoutPath;
34  QString logStderrPath;
35 };
36 
37 class AssignmentClientMonitor : public QObject, public HTTPRequestHandler {
38  Q_OBJECT
39 public:
40  AssignmentClientMonitor(const unsigned int numAssignmentClientForks, const unsigned int minAssignmentClientForks,
41  const unsigned int maxAssignmentClientForks, Assignment::Type requestAssignmentType,
42  QString assignmentPool, quint16 listenPort, quint16 childMinListenPort,
43  QString assignmentServerHostname, quint16 assignmentServerPort, quint16 httpStatusServerPort,
44  QString logDirectory, bool disableDomainPortAutoDiscovery);
45  ~AssignmentClientMonitor();
46 
47  void stopChildProcesses();
48 private slots:
49  void checkSpares();
50  void childProcessFinished(qint64 pid, quint16 port, int exitCode, QProcess::ExitStatus exitStatus);
51  void handleChildStatusPacket(QSharedPointer<ReceivedMessage> message);
52 
53  bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false) override;
54 
55 public slots:
56  void aboutToQuit();
57 
58 private:
59  void spawnChildClient();
60  void simultaneousWaitOnChildren(int waitMsecs);
61  void adjustOSResources(unsigned int numForks) const;
62 
63  QTimer _checkSparesTimer; // every few seconds see if it need fewer or more spare children
64 
65  QDir _logDirectory;
66 
67  HTTPManager _httpManager;
68 
69  const unsigned int _numAssignmentClientForks;
70  const unsigned int _minAssignmentClientForks;
71  const unsigned int _maxAssignmentClientForks;
72 
73  Assignment::Type _requestAssignmentType;
74  QString _assignmentPool;
75  QString _assignmentServerHostname;
76  quint16 _assignmentServerPort;
77 
78  QMap<qint64, ACProcess> _childProcesses;
79 
80  quint16 _childMinListenPort;
81  QSet<quint16> _childListenPorts;
82 
83  bool _wantsChildFileLogging { false };
84  bool _disableDomainPortAutoDiscovery { false };
85 };
86 
87 #endif // hifi_AssignmentClientMonitor_h
Handles a single HTTP connection.
Definition: HTTPConnection.h:43
Handles HTTP connections.
Definition: HTTPManager.h:32