picloud add "-w" option for watchdog

This commit is contained in:
2024-10-15 15:04:39 +03:00
parent cd7e053fc5
commit 92a87a0c64
3 changed files with 30 additions and 6 deletions

View File

@@ -45,6 +45,7 @@ void DispatcherServer::picoutStatus() {
void DispatcherServer::cleanClients() { void DispatcherServer::cleanClients() {
wd_cnt++;
PIMutexLocker locker(map_mutex); PIMutexLocker locker(map_mutex);
for (auto s: rmrf_servers) for (auto s: rmrf_servers)
s->close(); s->close();
@@ -194,6 +195,23 @@ void DispatcherServer::setMaxConnections(uint max_count) {
} }
void DispatcherServer::startWatchdog() {
wd_cnt++;
PIThread * thread = new PIThread(
[this]() {
if (wd_cnt == 0) {
piCout << "Deadlock detected, abort";
std::abort();
return;
}
wd_cnt = 0;
},
true,
10_s);
NO_UNUSED(thread);
}
void DispatcherServer::disconnectClient(DispatcherClient * client) { void DispatcherServer::disconnectClient(DispatcherClient * client) {
PIMutexLocker locker(map_mutex); PIMutexLocker locker(map_mutex);
if (!clients.contains(client)) { if (!clients.contains(client)) {

View File

@@ -25,6 +25,8 @@ public:
uint maxConnections() const { return max_connections; } uint maxConnections() const { return max_connections; }
EVENT_HANDLER0(void, picoutStatus); EVENT_HANDLER0(void, picoutStatus);
void startWatchdog();
private: private:
EVENT_HANDLER1(void, newConnection, PIEthernet *, cl); EVENT_HANDLER1(void, newConnection, PIEthernet *, cl);
EVENT_HANDLER1(void, disconnectClient, DispatcherClient *, client); EVENT_HANDLER1(void, disconnectClient, DispatcherClient *, client);
@@ -40,6 +42,7 @@ private:
PIVector<CloudServer *> rmrf_servers; PIVector<CloudServer *> rmrf_servers;
PITimer timeout_timer; PITimer timeout_timer;
PIMutex map_mutex; PIMutex map_mutex;
std::atomic_int wd_cnt = {0};
uint client_gid; uint client_gid;
uint max_connections; uint max_connections;
}; };

View File

@@ -34,13 +34,14 @@ using namespace PICoutManipulators;
void usage() { void usage() {
piCout << Bold << "PIP Cloud Dispatcher"; piCout << Bold << "PIP Cloud Dispatcher";
piCout << Cyan << "Version" << Bold << PIPVersion() << NewLine; piCout << Cyan << "Version" << Bold << PIPVersion() << NewLine;
piCout << Green << Bold << "Usage:" << Default << "\"picloud [-hsv] [-i <ip>] [-p <port>]\"" << NewLine; piCout << Green << Bold << "Usage:" << Default << "\"picloud [-hswv] [-i <ip>] [-p <port>]\"" << NewLine;
piCout << Green << Bold << "Details:"; piCout << Green << Bold << "Details:";
piCout << "-h --help " << Green << "- display this message and exit"; piCout << "-h --help " << Green << "- display this message and exit";
piCout << "-i --ip " << Green << "- listen address, default \"0.0.0.0\""; piCout << "-i --ip " << Green << "- listen address, default \"0.0.0.0\"";
piCout << "-p --port " << Green << "- listen port, default 10101"; piCout << "-p --port " << Green << "- listen port, default 10101";
piCout << "-s --screen " << Green << "- start with console UI"; piCout << "-s --screen " << Green << "- start with console UI";
piCout << "-v --verbose" << Green << "- print state (--screen ignore this flag)"; piCout << "-w --watchdog" << Green << "- kill itself on deadlock";
piCout << "-v --verbose " << Green << "- print state (--screen ignore this flag)";
} }
@@ -64,6 +65,7 @@ int main(int argc, char * argv[]) {
cli.addArgument("ip", true); cli.addArgument("ip", true);
cli.addArgument("port", true); cli.addArgument("port", true);
cli.addArgument("screen"); cli.addArgument("screen");
cli.addArgument("watchdog");
cli.addArgument("verbose"); cli.addArgument("verbose");
if (cli.hasArgument("help")) { if (cli.hasArgument("help")) {
@@ -154,6 +156,7 @@ int main(int argc, char * argv[]) {
ls.enableExitCapture(PIKbdListener::F10); ls.enableExitCapture(PIKbdListener::F10);
ls.start(); ls.start();
server.start(); server.start();
if (cli.hasArgument("watchdog")) server.startWatchdog();
if (cli.hasArgument("verbose")) { if (cli.hasArgument("verbose")) {
CONNECTU(&status_timer, tickEvent, &server, picoutStatus); CONNECTU(&status_timer, tickEvent, &server, picoutStatus);
status_timer.start(1_Hz); status_timer.start(1_Hz);